@arcjet/analyze
Advanced tools
Comparing version 1.0.0-alpha.18 to 1.0.0-alpha.19
@@ -27,3 +27,3 @@ // @generated by wasm2module - DO NOT EDIT | ||
const wasmBase64 = "data:application/wasm;base64,AGFzbQEAAAABBgFgAn9/AAMDAgAABAUBcAECAgcUAwEwAAABMQABCCRpbXBvcnRzAQAKGQILACAAIAFBABEAAAsLACAAIAFBAREAAAsALwlwcm9kdWNlcnMBDHByb2Nlc3NlZC1ieQENd2l0LWNvbXBvbmVudAcwLjIxMC4wAGcEbmFtZQATEndpdC1jb21wb25lbnQ6c2hpbQFLAgAjaW5kaXJlY3QtYXJjamV0OmpzLXJlcS9sb2dnZXItZGVidWcBI2luZGlyZWN0LWFyY2pldDpqcy1yZXEvbG9nZ2VyLWVycm9y"; | ||
const wasmBase64 = "data:application/wasm;base64,AGFzbQEAAAABDAJgAn9/AGACf38BfwMHBgAAAQEBAQQFAXABBgYHJAcBMAAAATEAAQEyAAIBMwADATQABAE1AAUIJGltcG9ydHMBAApJBgsAIAAgAUEAEQAACwsAIAAgAUEBEQAACwsAIAAgAUECEQEACwsAIAAgAUEDEQEACwsAIAAgAUEEEQEACwsAIAAgAUEFEQEACwAvCXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AQ13aXQtY29tcG9uZW50BzAuMjEwLjAA7gIEbmFtZQATEndpdC1jb21wb25lbnQ6c2hpbQHRAgYAI2luZGlyZWN0LWFyY2pldDpqcy1yZXEvbG9nZ2VyLWRlYnVnASNpbmRpcmVjdC1hcmNqZXQ6anMtcmVxL2xvZ2dlci1lcnJvcgI+aW5kaXJlY3QtYXJjamV0OmpzLXJlcS9lbWFpbC12YWxpZGF0b3Itb3ZlcnJpZGVzLWlzLWZyZWUtZW1haWwDRGluZGlyZWN0LWFyY2pldDpqcy1yZXEvZW1haWwtdmFsaWRhdG9yLW92ZXJyaWRlcy1pcy1kaXNwb3NhYmxlLWVtYWlsBD9pbmRpcmVjdC1hcmNqZXQ6anMtcmVxL2VtYWlsLXZhbGlkYXRvci1vdmVycmlkZXMtaGFzLW14LXJlY29yZHMFPWluZGlyZWN0LWFyY2pldDpqcy1yZXEvZW1haWwtdmFsaWRhdG9yLW92ZXJyaWRlcy1oYXMtZ3JhdmF0YXI="; | ||
/** | ||
@@ -30,0 +30,0 @@ * Returns a WebAssembly.Module for an Arcjet Wasm binary, decoded from a base64 |
@@ -27,3 +27,3 @@ // @generated by wasm2module - DO NOT EDIT | ||
const wasmBase64 = "data:application/wasm;base64,AGFzbQEAAAABBgFgAn9/AAIaAwABMAAAAAExAAAACCRpbXBvcnRzAXABAgIJCAEAQQALAgABAC8JcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkBDXdpdC1jb21wb25lbnQHMC4yMTAuMAAcBG5hbWUAFRR3aXQtY29tcG9uZW50OmZpeHVwcw=="; | ||
const wasmBase64 = "data:application/wasm;base64,AGFzbQEAAAABDAJgAn9/AGACf38BfwIuBwABMAAAAAExAAAAATIAAQABMwABAAE0AAEAATUAAQAIJGltcG9ydHMBcAEGBgkMAQBBAAsGAAECAwQFAC8JcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkBDXdpdC1jb21wb25lbnQHMC4yMTAuMAAcBG5hbWUAFRR3aXQtY29tcG9uZW50OmZpeHVwcw=="; | ||
/** | ||
@@ -30,0 +30,0 @@ * Returns a WebAssembly.Module for an Arcjet Wasm binary, decoded from a base64 |
import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType, EmailValidationResult } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
interface AnalyzeContext { | ||
@@ -29,3 +29,3 @@ log: ArcjetLogger; | ||
export declare function generateFingerprint(context: AnalyzeContext, request: Partial<ArcjetRequestDetails>): Promise<string>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<boolean>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<EmailValidationResult>; | ||
export declare function detectBot(context: AnalyzeContext, headers: string, patterns_add: string, patterns_remove: string): Promise<BotDetectionResult>; |
@@ -6,2 +6,9 @@ import { instantiate } from './wasm/arcjet_analyze_js_req.component.js'; | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
async function moduleFromPath(path) { | ||
@@ -30,2 +37,19 @@ if (path === "arcjet_analyze_js_req.component.core.wasm") { | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -55,8 +79,17 @@ try { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} | ||
else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -63,0 +96,0 @@ } |
@@ -9,2 +9,3 @@ import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
BotType, | ||
EmailValidationResult, | ||
} from "./wasm/arcjet_analyze_js_req.component.js"; | ||
@@ -16,2 +17,10 @@ | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
interface AnalyzeContext { | ||
@@ -48,2 +57,19 @@ log: ArcjetLogger; | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -103,10 +129,19 @@ | ||
options?: EmailValidationConfig, | ||
) { | ||
): Promise<EmailValidationResult> { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -113,0 +148,0 @@ } |
import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType, EmailValidationResult } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
interface AnalyzeContext { | ||
@@ -29,3 +29,3 @@ log: ArcjetLogger; | ||
export declare function generateFingerprint(context: AnalyzeContext, request: Partial<ArcjetRequestDetails>): Promise<string>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<boolean>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<EmailValidationResult>; | ||
export declare function detectBot(context: AnalyzeContext, headers: string, patterns_add: string, patterns_remove: string): Promise<BotDetectionResult>; |
39
index.js
@@ -6,2 +6,9 @@ import { instantiate } from './wasm/arcjet_analyze_js_req.component.js'; | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
// TODO: Do we actually need this wasmCache or does `import` cache correctly? | ||
@@ -42,2 +49,19 @@ const wasmCache = new Map(); | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -67,8 +91,17 @@ try { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} | ||
else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -75,0 +108,0 @@ } |
43
index.ts
@@ -9,2 +9,3 @@ import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
BotType, | ||
EmailValidationResult, | ||
} from "./wasm/arcjet_analyze_js_req.component.js"; | ||
@@ -16,2 +17,10 @@ | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
interface AnalyzeContext { | ||
@@ -62,2 +71,19 @@ log: ArcjetLogger; | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -117,10 +143,19 @@ | ||
options?: EmailValidationConfig, | ||
) { | ||
): Promise<EmailValidationResult> { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -127,0 +162,0 @@ } |
{ | ||
"name": "@arcjet/analyze", | ||
"version": "1.0.0-alpha.18", | ||
"version": "1.0.0-alpha.19", | ||
"description": "Arcjet local analysis engine", | ||
@@ -54,14 +54,14 @@ "license": "Apache-2.0", | ||
"dependencies": { | ||
"@arcjet/protocol": "1.0.0-alpha.18" | ||
"@arcjet/protocol": "1.0.0-alpha.19" | ||
}, | ||
"devDependencies": { | ||
"@arcjet/eslint-config": "1.0.0-alpha.18", | ||
"@arcjet/rollup-config": "1.0.0-alpha.18", | ||
"@arcjet/tsconfig": "1.0.0-alpha.18", | ||
"@arcjet/eslint-config": "1.0.0-alpha.19", | ||
"@arcjet/rollup-config": "1.0.0-alpha.19", | ||
"@arcjet/tsconfig": "1.0.0-alpha.19", | ||
"@bytecodealliance/jco": "1.2.4", | ||
"@jest/globals": "29.7.0", | ||
"@rollup/wasm-node": "4.18.0", | ||
"@rollup/wasm-node": "4.18.1", | ||
"@types/node": "18.18.0", | ||
"jest": "29.7.0", | ||
"typescript": "5.5.2" | ||
"typescript": "5.5.3" | ||
}, | ||
@@ -68,0 +68,0 @@ "publishConfig": { |
@@ -21,8 +21,23 @@ /** | ||
} | ||
/** | ||
* # Variants | ||
* | ||
* ## `"valid"` | ||
* | ||
* ## `"invalid"` | ||
*/ | ||
export type EmailValidity = 'valid' | 'invalid'; | ||
export interface EmailValidationResult { | ||
validity: EmailValidity, | ||
blocked: string[], | ||
} | ||
export interface EmailValidationConfig { | ||
requireTopLevelDomain?: boolean, | ||
allowDomainLiteral?: boolean, | ||
requireTopLevelDomain: boolean, | ||
allowDomainLiteral: boolean, | ||
blockedEmails: string[], | ||
} | ||
import { ArcjetJsReqEmailValidatorOverrides } from './interfaces/arcjet-js-req-email-validator-overrides.js'; | ||
import { ArcjetJsReqLogger } from './interfaces/arcjet-js-req-logger.js'; | ||
export interface ImportObject { | ||
'arcjet:js-req/email-validator-overrides': typeof ArcjetJsReqEmailValidatorOverrides, | ||
'arcjet:js-req/logger': typeof ArcjetJsReqLogger, | ||
@@ -33,3 +48,3 @@ } | ||
generateFingerprint(request: string, characteristics: string[]): string, | ||
isValidEmail(candidate: string, options: EmailValidationConfig | undefined): boolean, | ||
isValidEmail(candidate: string, options: EmailValidationConfig): EmailValidationResult, | ||
} | ||
@@ -36,0 +51,0 @@ |
@@ -17,6 +17,2 @@ function clampGuest(i, min, max) { | ||
function throwInvalidBool() { | ||
throw new TypeError('invalid variant discriminant for bool'); | ||
} | ||
const utf8Decoder = new TextDecoder(); | ||
@@ -55,2 +51,3 @@ | ||
const { hasGravatar, hasMxRecords, isDisposableEmail, isFreeEmail } = imports['arcjet:js-req/email-validator-overrides']; | ||
const { debug, error } = imports['arcjet:js-req/logger']; | ||
@@ -74,8 +71,139 @@ let exports0; | ||
} | ||
function trampoline2(arg0, arg1) { | ||
var ptr0 = arg0; | ||
var len0 = arg1; | ||
var result0 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr0, len0)); | ||
const ret = isFreeEmail(result0); | ||
var val1 = ret; | ||
let enum1; | ||
switch (val1) { | ||
case 'yes': { | ||
enum1 = 0; | ||
break; | ||
} | ||
case 'no': { | ||
enum1 = 1; | ||
break; | ||
} | ||
case 'unknown': { | ||
enum1 = 2; | ||
break; | ||
} | ||
default: { | ||
if ((ret) instanceof Error) { | ||
console.error(ret); | ||
} | ||
throw new TypeError(`"${val1}" is not one of the cases of validator-response`); | ||
} | ||
} | ||
return enum1; | ||
} | ||
function trampoline3(arg0, arg1) { | ||
var ptr0 = arg0; | ||
var len0 = arg1; | ||
var result0 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr0, len0)); | ||
const ret = isDisposableEmail(result0); | ||
var val1 = ret; | ||
let enum1; | ||
switch (val1) { | ||
case 'yes': { | ||
enum1 = 0; | ||
break; | ||
} | ||
case 'no': { | ||
enum1 = 1; | ||
break; | ||
} | ||
case 'unknown': { | ||
enum1 = 2; | ||
break; | ||
} | ||
default: { | ||
if ((ret) instanceof Error) { | ||
console.error(ret); | ||
} | ||
throw new TypeError(`"${val1}" is not one of the cases of validator-response`); | ||
} | ||
} | ||
return enum1; | ||
} | ||
function trampoline4(arg0, arg1) { | ||
var ptr0 = arg0; | ||
var len0 = arg1; | ||
var result0 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr0, len0)); | ||
const ret = hasMxRecords(result0); | ||
var val1 = ret; | ||
let enum1; | ||
switch (val1) { | ||
case 'yes': { | ||
enum1 = 0; | ||
break; | ||
} | ||
case 'no': { | ||
enum1 = 1; | ||
break; | ||
} | ||
case 'unknown': { | ||
enum1 = 2; | ||
break; | ||
} | ||
default: { | ||
if ((ret) instanceof Error) { | ||
console.error(ret); | ||
} | ||
throw new TypeError(`"${val1}" is not one of the cases of validator-response`); | ||
} | ||
} | ||
return enum1; | ||
} | ||
function trampoline5(arg0, arg1) { | ||
var ptr0 = arg0; | ||
var len0 = arg1; | ||
var result0 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr0, len0)); | ||
const ret = hasGravatar(result0); | ||
var val1 = ret; | ||
let enum1; | ||
switch (val1) { | ||
case 'yes': { | ||
enum1 = 0; | ||
break; | ||
} | ||
case 'no': { | ||
enum1 = 1; | ||
break; | ||
} | ||
case 'unknown': { | ||
enum1 = 2; | ||
break; | ||
} | ||
default: { | ||
if ((ret) instanceof Error) { | ||
console.error(ret); | ||
} | ||
throw new TypeError(`"${val1}" is not one of the cases of validator-response`); | ||
} | ||
} | ||
return enum1; | ||
} | ||
let realloc0; | ||
let postReturn0; | ||
let postReturn1; | ||
let postReturn2; | ||
Promise.all([module0, module1, module2]).catch(() => {}); | ||
({ exports: exports0 } = await instantiateCore(await module1)); | ||
({ exports: exports1 } = await instantiateCore(await module0, { | ||
'arcjet:js-req/email-validator-overrides': { | ||
'has-gravatar': exports0['5'], | ||
'has-mx-records': exports0['4'], | ||
'is-disposable-email': exports0['3'], | ||
'is-free-email': exports0['2'], | ||
}, | ||
'arcjet:js-req/logger': { | ||
@@ -92,2 +220,6 @@ debug: exports0['0'], | ||
'1': trampoline1, | ||
'2': trampoline2, | ||
'3': trampoline3, | ||
'4': trampoline4, | ||
'5': trampoline5, | ||
}, | ||
@@ -98,2 +230,3 @@ })); | ||
postReturn1 = exports1['cabi_post_generate-fingerprint']; | ||
postReturn2 = exports1['cabi_post_is-valid-email']; | ||
@@ -195,53 +328,47 @@ function detectBot(arg0, arg1, arg2) { | ||
var len0 = utf8EncodedLen; | ||
var variant4 = arg1; | ||
let variant4_0; | ||
let variant4_1; | ||
let variant4_2; | ||
let variant4_3; | ||
let variant4_4; | ||
if (variant4 === null || variant4=== undefined) { | ||
variant4_0 = 0; | ||
variant4_1 = 0; | ||
variant4_2 = 0; | ||
variant4_3 = 0; | ||
variant4_4 = 0; | ||
} else { | ||
const e = variant4; | ||
var {requireTopLevelDomain: v1_0, allowDomainLiteral: v1_1 } = e; | ||
var variant2 = v1_0; | ||
let variant2_0; | ||
let variant2_1; | ||
if (variant2 === null || variant2=== undefined) { | ||
variant2_0 = 0; | ||
variant2_1 = 0; | ||
} else { | ||
const e = variant2; | ||
variant2_0 = 1; | ||
variant2_1 = e ? 1 : 0; | ||
} | ||
var variant3 = v1_1; | ||
let variant3_0; | ||
let variant3_1; | ||
if (variant3 === null || variant3=== undefined) { | ||
variant3_0 = 0; | ||
variant3_1 = 0; | ||
} else { | ||
const e = variant3; | ||
variant3_0 = 1; | ||
variant3_1 = e ? 1 : 0; | ||
} | ||
variant4_0 = 1; | ||
variant4_1 = variant2_0; | ||
variant4_2 = variant2_1; | ||
variant4_3 = variant3_0; | ||
variant4_4 = variant3_1; | ||
var {requireTopLevelDomain: v1_0, allowDomainLiteral: v1_1, blockedEmails: v1_2 } = arg1; | ||
var vec3 = v1_2; | ||
var len3 = vec3.length; | ||
var result3 = realloc0(0, 0, 4, len3 * 8); | ||
for (let i = 0; i < vec3.length; i++) { | ||
const e = vec3[i]; | ||
const base = result3 + i * 8;var ptr2 = utf8Encode(e, realloc0, memory0); | ||
var len2 = utf8EncodedLen; | ||
dataView(memory0).setInt32(base + 4, len2, true); | ||
dataView(memory0).setInt32(base + 0, ptr2, true); | ||
} | ||
const ret = exports1['is-valid-email'](ptr0, len0, variant4_0, variant4_1, variant4_2, variant4_3, variant4_4); | ||
let variant7; | ||
const ret = exports1['is-valid-email'](ptr0, len0, v1_0 ? 1 : 0, v1_1 ? 1 : 0, result3, len3); | ||
let variant8; | ||
switch (dataView(memory0).getUint8(ret + 0, true)) { | ||
case 0: { | ||
var bool5 = dataView(memory0).getUint8(ret + 4, true); | ||
variant7= { | ||
let enum4; | ||
switch (dataView(memory0).getUint8(ret + 4, true)) { | ||
case 0: { | ||
enum4 = 'valid'; | ||
break; | ||
} | ||
case 1: { | ||
enum4 = 'invalid'; | ||
break; | ||
} | ||
default: { | ||
throw new TypeError('invalid discriminant specified for EmailValidity'); | ||
} | ||
} | ||
var len6 = dataView(memory0).getInt32(ret + 12, true); | ||
var base6 = dataView(memory0).getInt32(ret + 8, true); | ||
var result6 = []; | ||
for (let i = 0; i < len6; i++) { | ||
const base = base6 + i * 8; | ||
var ptr5 = dataView(memory0).getInt32(base + 0, true); | ||
var len5 = dataView(memory0).getInt32(base + 4, true); | ||
var result5 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr5, len5)); | ||
result6.push(result5); | ||
} | ||
variant8= { | ||
tag: 'ok', | ||
val: bool5 == 0 ? false : (bool5 == 1 ? true : throwInvalidBool()) | ||
val: { | ||
validity: enum4, | ||
blocked: result6, | ||
} | ||
}; | ||
@@ -251,8 +378,8 @@ break; | ||
case 1: { | ||
var ptr6 = dataView(memory0).getInt32(ret + 4, true); | ||
var len6 = dataView(memory0).getInt32(ret + 8, true); | ||
var result6 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr6, len6)); | ||
variant7= { | ||
var ptr7 = dataView(memory0).getInt32(ret + 4, true); | ||
var len7 = dataView(memory0).getInt32(ret + 8, true); | ||
var result7 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr7, len7)); | ||
variant8= { | ||
tag: 'err', | ||
val: result6 | ||
val: result7 | ||
}; | ||
@@ -265,7 +392,7 @@ break; | ||
} | ||
postReturn0(ret); | ||
if (variant7.tag === 'err') { | ||
throw new ComponentError(variant7.val); | ||
postReturn2(ret); | ||
if (variant8.tag === 'err') { | ||
throw new ComponentError(variant8.val); | ||
} | ||
return variant7.val; | ||
return variant8.val; | ||
} | ||
@@ -272,0 +399,0 @@ |
import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
import type { EmailValidationConfig, BotDetectionResult, BotType, EmailValidationResult } from "./wasm/arcjet_analyze_js_req.component.js"; | ||
interface AnalyzeContext { | ||
@@ -29,3 +29,3 @@ log: ArcjetLogger; | ||
export declare function generateFingerprint(context: AnalyzeContext, request: Partial<ArcjetRequestDetails>): Promise<string>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<boolean>; | ||
export declare function isValidEmail(context: AnalyzeContext, candidate: string, options?: EmailValidationConfig): Promise<EmailValidationResult>; | ||
export declare function detectBot(context: AnalyzeContext, headers: string, patterns_add: string, patterns_remove: string): Promise<BotDetectionResult>; |
@@ -6,2 +6,9 @@ import { instantiate } from './wasm/arcjet_analyze_js_req.component.js'; | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
async function moduleFromPath(path) { | ||
@@ -30,2 +37,19 @@ if (path === "arcjet_analyze_js_req.component.core.wasm") { | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -55,8 +79,17 @@ try { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} | ||
else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -63,0 +96,0 @@ } |
@@ -9,2 +9,3 @@ import type { ArcjetLogger, ArcjetRequestDetails } from "@arcjet/protocol"; | ||
BotType, | ||
EmailValidationResult, | ||
} from "./wasm/arcjet_analyze_js_req.component.js"; | ||
@@ -16,2 +17,10 @@ | ||
const FREE_EMAIL_PROVIDERS = [ | ||
"gmail.com", | ||
"yahoo.com", | ||
"hotmail.com", | ||
"aol.com", | ||
"hotmail.co.uk", | ||
]; | ||
interface AnalyzeContext { | ||
@@ -48,2 +57,19 @@ log: ArcjetLogger; | ||
}, | ||
"arcjet:js-req/email-validator-overrides": { | ||
isFreeEmail(domain) { | ||
if (FREE_EMAIL_PROVIDERS.includes(domain)) { | ||
return "yes"; | ||
} | ||
return "unknown"; | ||
}, | ||
isDisposableEmail() { | ||
return "unknown"; | ||
}, | ||
hasMxRecords() { | ||
return "unknown"; | ||
}, | ||
hasGravatar() { | ||
return "unknown"; | ||
}, | ||
}, | ||
}; | ||
@@ -103,10 +129,19 @@ | ||
options?: EmailValidationConfig, | ||
) { | ||
): Promise<EmailValidationResult> { | ||
const analyze = await init(context); | ||
const optionsOrDefault = { | ||
requireTopLevelDomain: true, | ||
allowDomainLiteral: false, | ||
blockedEmails: [], | ||
...options, | ||
}; | ||
if (typeof analyze !== "undefined") { | ||
return analyze.isValidEmail(candidate, options); | ||
return analyze.isValidEmail(candidate, optionsOrDefault); | ||
} else { | ||
// TODO: Fallback to JS if we don't have WASM? | ||
return true; | ||
// Skip the local evaluation of the rule if WASM is not available | ||
return { | ||
validity: "valid", | ||
blocked: [], | ||
}; | ||
} | ||
@@ -113,0 +148,0 @@ } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
24
10509
5847677
+ Added@arcjet/protocol@1.0.0-alpha.19(transitive)
+ Addedtypeid-js@1.0.0(transitive)
- Removed@arcjet/protocol@1.0.0-alpha.18(transitive)
- Removedtypeid-js@0.7.0(transitive)