@stll/regex-set-wasm 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/regex-set.single-thread.wasm +0 -0
- package/dist/regex-set.wasm32-wasi.wasm +0 -0
- package/dist/single-thread-inline.d.mts +123 -0
- package/dist/single-thread-inline.mjs +1003 -0
- package/dist/single-thread-inline.mjs.map +1 -0
- package/dist/single-thread-size.json +5 -0
- package/dist/single-thread.d.mts +125 -0
- package/dist/single-thread.mjs +1015 -0
- package/dist/single-thread.mjs.map +1 -0
- package/dist/vite.mjs.map +1 -1
- package/dist/wasi-worker-browser.mjs.map +1 -1
- package/dist/wasm.mjs +105 -3
- package/dist/wasm.mjs.map +1 -1
- package/package.json +15 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-thread.mjs","names":["encoder"],"sources":["../../src/core.ts","../../src/single-thread-binding.ts","../../src/single-thread-runtime.ts","../../src/single-thread.ts"],"sourcesContent":["/* Shared core: types, helpers, and the RegexSet\n * class that uses a late-bound native backend\n * (NAPI-RS or WASM).\n * Call initBinding() before constructing classes. */\n\nconst encoder = new TextEncoder();\nconst ALTERNATION_CHUNK_MIN_BRANCHES = 64;\nconst ALTERNATION_CHUNK_SIZE = 20;\nconst ALTERNATION_CHUNK_MAX_BODY_START = 32;\n\n// -- Native binding types --------------------------------\n\nexport type NativeBinding = {\n RegexSet: new (\n patterns: string[],\n options?: NativeOptions | null,\n prepared?: Uint8Array | null,\n ) => NativeRegexSetInstance;\n _prepareRegexSet: (\n patterns: string[],\n options?: NativeOptions | null,\n ) => Uint8Array;\n _uax29Boundaries: (haystack: Buffer | Uint8Array) => number[];\n};\n\ntype NativeOptions = {\n wholeWords?: boolean;\n unicodeBoundaries?: boolean;\n};\n\ntype NativeRegexSetInstance = {\n patternCount: number;\n _enginePathCounts(): Uint32Array;\n isMatch(haystack: string): boolean;\n _isMatchBuf(haystack: Buffer | Uint8Array): boolean;\n _findIterPacked(haystack: string): Uint32Array;\n _findIterPackedBuf(haystack: Buffer | Uint8Array): Uint32Array;\n whichMatch(haystack: string): number[];\n replaceAll(haystack: string, replacements: string[]): string;\n};\n\ntype JsFallback = {\n pattern: number;\n re: RegExp;\n};\n\ntype NativeSingle = {\n pattern: number;\n inner: NativeRegexSetInstance;\n};\n\ntype BoundaryOptions = {\n wholeWords: boolean;\n unicodeBoundaries: boolean;\n};\n\ntype AlternationGroup = {\n bodyStart: number;\n bodyEnd: number;\n branches: string[];\n};\n\n// -- Late-bound native binding ---------------------------\n\nlet binding: NativeBinding;\n\n/** Set the native backend. Must be called once\n * before any class constructor. */\nexport const initBinding = (b: NativeBinding): void => {\n binding = b;\n};\n\n// -- Public types ----------------------------------------\n\n/** Options for constructing a RegexSet. */\nexport type Options = {\n /**\n * Only match whole words. Wraps each pattern\n * with `\\b...\\b`.\n * @default false\n */\n wholeWords?: boolean;\n /**\n * Use Unicode word boundaries. When `true`,\n * `\\b` treats accented letters, CJK, etc. as\n * word characters (correct for non-English text).\n * When `false` (default), `\\b` uses ASCII\n * semantics matching JS `RegExp` behavior.\n *\n * Zero performance overhead in either mode;\n * boundaries are verified inline per match.\n * Automatically uses UAX#29 segmentation for\n * Thai/CJK/Lao/Khmer/Myanmar text.\n * @default true\n */\n unicodeBoundaries?: boolean;\n /**\n * Case-insensitive matching. Wraps each pattern\n * with `(?i-u:...)` for ASCII case folding.\n * Uses `-u` to prevent DFA state explosion from\n * Unicode case tables.\n *\n * Edge `\\b`/`\\B` boundaries and leading bare-flag\n * prefixes (e.g. `(?m)`, `(?m-s)`) are extracted\n * before wrapping so they remain outside the `-u`\n * scope, preserving `unicodeBoundaries` semantics.\n * Patterns already containing any `(?{flags}-u`\n * group (from RegExp `/i`, inline `(?i)`, or\n * `scopeInlineFlags`) are not double-wrapped.\n * @default false\n */\n caseInsensitive?: boolean;\n};\n\n/** A named pattern entry. */\nexport type NamedPattern = {\n /** The regex pattern (string or RegExp). */\n pattern: string | RegExp;\n /** Optional name for this pattern. */\n name?: string;\n};\n\n/** A pattern entry: string, RegExp, or named. */\nexport type PatternEntry = string | RegExp | NamedPattern;\n\n/** A single match result. */\nexport type Match = {\n /** Index of the pattern that matched. */\n pattern: number;\n /** Start UTF-16 code unit offset. */\n start: number;\n /** End offset (exclusive). */\n end: number;\n /** The matched text. */\n text: string;\n /** Pattern name (if provided at construction). */\n name?: string;\n};\n\n// -- Unpack helper ---------------------------------------\n\nfunction unpack(\n packed: Uint32Array,\n haystack: string,\n names: (string | undefined)[] | null,\n indexMap?: number[],\n): Match[] {\n const len = packed.length;\n // eslint-disable-next-line unicorn/no-new-array\n const matches = new Array<Match>(len / 3);\n for (let i = 0, j = 0; i < len; i += 3, j++) {\n const idx = packed[i];\n const s = packed[i + 1];\n const e = packed[i + 2];\n if (idx === undefined || s === undefined || e === undefined) {\n throw new Error(`Corrupt packed match data at offset ${i}`);\n }\n const pattern = indexMap ? indexMap[idx] : idx;\n if (pattern === undefined) {\n throw new Error(`Missing native index map ${idx}`);\n }\n const m: Match = {\n pattern,\n start: s,\n end: e,\n text: haystack.slice(s, e),\n };\n if (names && names[pattern] !== undefined) m.name = names[pattern];\n matches[j] = m;\n }\n return matches;\n}\n\n// -- Regex flag helpers ----------------------------------\n\n/**\n * Replace unescaped `\\b` and `\\B` with their\n * ASCII-only equivalents `(?-u:\\b)` / `(?-u:\\B)`.\n * Skips character classes `[...]` (where `\\b` means\n * backspace) and escaped backslashes `\\\\b`.\n */\nfunction asciiBoundaries(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src.charAt(i) === \"\\\\\" && i + 1 < src.length) {\n const next = src.charAt(i + 1);\n if (!inClass && (next === \"b\" || next === \"B\")) {\n result += `(?-u:\\\\${next})`;\n } else {\n // escaped char (including \\\\) -- emit as-is\n result += src.charAt(i) + src.charAt(i + 1);\n }\n i += 2;\n } else {\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n result += src.charAt(i);\n i++;\n }\n }\n return result;\n}\n\n/**\n * Convert a RegExp to Rust regex syntax string.\n */\nfunction regexpToRust(re: RegExp): string {\n let flags = \"\";\n if (re.flags.includes(\"i\")) flags += \"i\";\n if (re.flags.includes(\"m\")) flags += \"m\";\n if (re.flags.includes(\"s\")) flags += \"s\";\n\n // JS RegExp objects can't contain inline (?i) in\n // .source -- it's a SyntaxError. No need to run\n // scopeInlineFlags here; it only matters for\n // string patterns (handled in normalizeEntry).\n if (!flags) {\n return javascriptCharacterClasses(re);\n }\n\n if (!flags.includes(\"i\")) {\n return `(?${flags})${javascriptCharacterClasses(re)}`;\n }\n\n const unicodeClasses = re.unicode || re.unicodeSets;\n let src = unicodeClasses\n ? javascriptCharacterClasses(re)\n : javascriptLegacyCaseFolding(re);\n let leading = \"\";\n let trailing = \"\";\n\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n\n return `${leading}(?${flags}:${src})${trailing}`;\n}\n\n// ECMAScript WhiteSpace and LineTerminator, including BOM but not NEL.\nconst JS_WHITESPACE =\n \"\\\\x{0009}-\\\\x{000D}\\\\x{0020}\\\\x{00A0}\\\\x{1680}\" +\n \"\\\\x{2000}-\\\\x{200A}\\\\x{2028}\\\\x{2029}\\\\x{202F}\\\\x{205F}\\\\x{3000}\\\\x{FEFF}\";\n\nfunction javascriptCharacterClasses(re: RegExp): string {\n let result = \"\";\n let classDepth = 0;\n const unicodeCase = re.ignoreCase && (re.unicode || re.unicodeSets);\n const word = \"a-zA-Z0-9_\" + (unicodeCase ? \"\\\\x{017F}\\\\x{212A}\" : \"\");\n for (let i = 0; i < re.source.length; i++) {\n const char = re.source.charAt(i);\n if (char !== \"\\\\\") {\n if (char === \"[\" && (classDepth === 0 || re.unicodeSets)) classDepth++;\n if (char === \"]\" && classDepth > 0) classDepth--;\n result += char;\n continue;\n }\n const escaped = re.source.charAt(++i);\n if (escaped === \"b\" || escaped === \"B\") {\n if (classDepth > 0) {\n result += escaped === \"b\" ? \"\\\\x{0008}\" : \"B\";\n continue;\n }\n if (!unicodeCase) {\n result += `(?-u:\\\\${escaped})`;\n continue;\n }\n const beforeWord = `(?<=[${word}])`;\n const beforeNonword = `(?<![${word}])`;\n const afterWord = `(?=[${word}])`;\n const afterNonword = `(?![${word}])`;\n // JS word membership stays independent of the Rust Unicode boundary mode\n // and of outer ignore-case scopes. /iu additionally folds Kelvin/long s.\n result +=\n escaped === \"b\"\n ? `(?-i:(?:${beforeWord}${afterNonword}|${beforeNonword}${afterWord}))`\n : `(?-i:(?:${beforeWord}${afterWord}|${beforeNonword}${afterNonword}))`;\n continue;\n }\n let members: string;\n switch (escaped.toLowerCase()) {\n case \"s\":\n members = JS_WHITESPACE;\n break;\n case \"d\":\n members = \"0-9\";\n break;\n case \"w\":\n members = word;\n break;\n default:\n result += \"\\\\\" + escaped;\n continue;\n }\n const negation = escaped === escaped.toUpperCase() ? \"^\" : \"\";\n result += `[${negation}${members}]`;\n }\n return result;\n}\n\nlet legacyUnicodeFolds: Map<string, string[]> | undefined;\n\n/** Legacy JS folding uses one UTF-16 unit's uppercase, excluding ASCII folds. */\nfunction getLegacyUnicodeFolds(): Map<string, string[]> {\n if (legacyUnicodeFolds) return legacyUnicodeFolds;\n const groups = new Map<string, string[]>();\n for (let code = 0x80; code <= 0xffff; code++) {\n const char = String.fromCharCode(code);\n const canonical = char.toUpperCase();\n if (\n canonical.length !== 1 ||\n canonical === char ||\n canonical.charCodeAt(0) < 0x80\n )\n continue;\n const members = groups.get(canonical);\n if (members) members.push(char);\n else groups.set(canonical, [canonical, char]);\n }\n legacyUnicodeFolds = groups;\n return groups;\n}\n\nfunction legacyLiteralPattern(literal: string): string {\n if (/[a-z]/i.test(literal))\n return `(?-i:[${literal.toLowerCase()}${literal.toUpperCase()}])`;\n const code = literal.codePointAt(0);\n if (code === undefined) throw new Error(\"Missing literal\");\n const canonical = literal.toUpperCase();\n const members =\n canonical.length === 1 && canonical.charCodeAt(0) >= 0x80\n ? getLegacyUnicodeFolds().get(canonical)\n : undefined;\n return members\n ? `(?-i:[${members.join(\"\")}])`\n : `(?-i:\\\\x{${code.toString(16)}})`;\n}\n\n/** Keep legacy /i folding local so dots and complements remain Unicode-safe. */\nfunction javascriptLegacyCaseFolding(re: RegExp): string {\n let result = \"\";\n for (let i = 0; i < re.source.length; i++) {\n const char = re.source.charAt(i);\n if (char === \"\\\\\") {\n const escaped = re.source.charAt(++i);\n if (\"sSwWdDbB\".includes(escaped)) {\n const token = new RegExp(\"\\\\\" + escaped, \"i\");\n result += `(?-i:${javascriptCharacterClasses(token)})`;\n continue;\n }\n const hex = re.source\n .slice(i)\n .match(/^(?:x[\\da-f]{2}|u[\\da-f]{4})/i)?.[0];\n if (hex) {\n const literal = String.fromCharCode(Number.parseInt(hex.slice(1), 16));\n result += legacyLiteralPattern(literal);\n i += hex.length - 1;\n continue;\n }\n // Preserve named backreferences as one token, including the group name.\n if (escaped === \"k\" && re.source.charAt(i + 1) === \"<\") {\n const end = re.source.indexOf(\">\", i + 2);\n if (end !== -1) {\n result += re.source.slice(i - 1, end + 1);\n i = end;\n continue;\n }\n }\n result += \"\\\\\" + escaped;\n continue;\n }\n // Named capture names are syntax, not case-insensitive literal text.\n if (\n re.source.startsWith(\"(?<\", i) &&\n !\"=!\".includes(re.source.charAt(i + 3))\n ) {\n const end = re.source.indexOf(\">\", i + 3);\n if (end !== -1) {\n result += re.source.slice(i, end + 1);\n i = end;\n continue;\n }\n }\n if (char !== \"[\") {\n const code = re.source.codePointAt(i);\n if (code !== undefined && code >= 0x80) {\n const literal = String.fromCodePoint(code);\n result += legacyLiteralPattern(literal);\n i += literal.length - 1;\n } else {\n result += /[a-z]/i.test(char) ? legacyLiteralPattern(char) : char;\n }\n continue;\n }\n const start = i;\n while (++i < re.source.length) {\n const member = re.source.charAt(i);\n if (member === \"]\") break;\n if (member !== \"\\\\\") continue;\n i++;\n }\n const original = re.source.slice(start, i + 1);\n // Legacy JS classes permit a literal hyphen next to a shortcut.\n // Rust requires that hyphen to be escaped before expanding the shortcut.\n let normalized = \"\";\n let previousShortcut = false;\n for (let j = 0; j < original.length; j++) {\n const member = original.charAt(j);\n if (member === \"\\\\\") {\n const escaped = original.charAt(++j);\n normalized += \"\\\\\" + escaped;\n previousShortcut = \"sSwWdD\".includes(escaped);\n continue;\n }\n const nextShortcut =\n original.charAt(j + 1) === \"\\\\\" &&\n \"sSwWdD\".includes(original.charAt(j + 2));\n normalized +=\n member === \"-\" && (previousShortcut || nextShortcut) ? \"\\\\-\" : member;\n previousShortcut = false;\n }\n const classRegexp = new RegExp(normalized, \"i\");\n const escapedNonAscii = [\n ...normalized.matchAll(/\\\\(?:x([\\da-f]{2})|u([\\da-f]{4}))/gi),\n ].some((match) => Number.parseInt(match[1] ?? match[2] ?? \"0\", 16) >= 128);\n const body = original.slice(original.startsWith(\"[^\") ? 2 : 1, -1);\n const positive = new RegExp(`[${body}]`, \"i\");\n let folds = \"\";\n // At most 52 construction-only oracle checks preserve ASCII folding.\n // Fold the positive body before restoring any outer class negation.\n for (const letter of \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\") {\n if (positive.test(letter)) folds += letter;\n }\n if (hasNonAscii(original) || escapedNonAscii) {\n for (const [canonical, members] of getLegacyUnicodeFolds()) {\n if (positive.test(canonical)) folds += members.join(\"\");\n }\n }\n const translated = javascriptCharacterClasses(classRegexp);\n result += `(?-i:${translated.slice(0, -1)}${folds}])`;\n }\n return result;\n}\n\n/**\n * Check if content uses character class shortcuts\n * (\\w, \\W, \\d, \\D, \\s, \\S, \\b, \\B) that have\n * Unicode-aware versions. Only these benefit from\n * -u (ASCII-only mode). Literal strings like\n * \"dollars\" produce identical DFAs with or without\n * -u, so skipping -u for them is zero-cost.\n */\nfunction needsAsciiMode(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charAt(i) !== \"\\\\\") continue;\n const escaped = s.charAt(++i);\n if (\"wWdDsSbB\".includes(escaped)) return true;\n }\n return false;\n}\n\n/**\n * Check if a string contains non-ASCII characters.\n * When true, -u MUST NOT be added: regex-automata\n * rejects (?-u) alongside non-ASCII content like\n * [ACDE] or literal zlotych.\n */\nfunction hasNonAscii(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charCodeAt(i) > 127) return true;\n }\n return false;\n}\n\n/**\n * Convert inline (?i) flags to (?i-u) for ASCII\n * case folding. Handles bare and scoped groups.\n *\n * Bare (?i) at the start of a pattern is converted\n * to a scoped group (?i-u:...) with edge \\b pulled\n * outside, matching the RegExp path behaviour. This\n * prevents -u from affecting \\b word boundary\n * semantics (which should remain Unicode when\n * unicodeBoundaries is true).\n *\n * NOTE: -u also disables Unicode character classes\n * (\\w, \\d, \\s become ASCII-only), matching the\n * behaviour of regexpToRust() for non-Unicode /i RegExps.\n */\nfunction scopeInlineFlags(src: string): string {\n // Handle bare (?i...) at the start: convert to\n // scoped (?i-u:...) with edge \\b/\\B outside.\n const leadingBare = src.match(/^\\(\\?([ims]+)(?:-([imsu]+))?\\)/);\n const enableGroup = leadingBare?.[1];\n if (leadingBare && enableGroup?.includes(\"i\")) {\n const enable = enableGroup;\n const disable = leadingBare[2] ?? \"\";\n let rest = src.slice(leadingBare[0].length);\n\n // Strip edge \\b/\\B\n let leading = \"\";\n let trailing = \"\";\n if (rest.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n rest = rest.slice(2);\n } else if (rest.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n rest = rest.slice(2);\n }\n if (rest.length >= 2) {\n const last = rest.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = rest.length - 2;\n while (k >= 0 && rest[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n rest = rest.slice(0, -2);\n }\n }\n }\n\n // Scope the flags and recurse for any nested\n // inline flags in the content.\n const inner = scopeInnerFlags(rest);\n // Only add -u when content uses char class\n // shortcuts (\\w, \\d, \\s) that benefit from it.\n const addU =\n needsAsciiMode(rest) && !hasNonAscii(rest) && !disable.includes(\"u\");\n const merged = addU ? disable + \"u\" : disable;\n const disablePart = merged ? `-${merged}` : \"\";\n return `${leading}(?${enable}${disablePart}:${inner})${trailing}`;\n }\n\n return scopeInnerFlags(src);\n}\n\n/**\n * Replace inline (?i) / (?i:...) groups with -u\n * variants. Does not handle leading bare flags\n * (that's done by scopeInlineFlags above).\n */\nfunction scopeInnerFlags(src: string): string {\n let result = \"\";\n let inClass = false;\n let i = 0;\n while (i < src.length) {\n if (src[i] === \"\\\\\" && i + 1 < src.length) {\n result += src.charAt(i) + src.charAt(i + 1);\n i += 2;\n continue;\n }\n if (src.charAt(i) === \"[\") inClass = true;\n if (src.charAt(i) === \"]\") inClass = false;\n if (!inClass && src.charAt(i) === \"(\" && src.charAt(i + 1) === \"?\") {\n let j = i + 2;\n let enable = \"\";\n while (j < src.length && \"ims\".includes(src.charAt(j))) {\n enable += src.charAt(j);\n j++;\n }\n // Handle disable part: (?i-s) or (?i-s:...)\n let disable = \"\";\n if (j < src.length && src.charAt(j) === \"-\") {\n j++; // skip -\n while (j < src.length && \"imsu\".includes(src.charAt(j))) {\n disable += src.charAt(j);\n j++;\n }\n }\n if (\n enable.length > 0 &&\n (src.charAt(j) === \")\" || src.charAt(j) === \":\")\n ) {\n if (enable.includes(\"i\")) {\n // For scoped groups (?i:content), don't add\n // -u: literal strings produce identical DFAs\n // with or without -u, and -u breaks when\n // the overall pattern has non-ASCII chars.\n // For bare flags (?i), the -u would apply to\n // the rest of the pattern which might have\n // \\w/\\d -- but bare flags are handled by\n // scopeInlineFlags, not here.\n if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n } else if (disable.length > 0) {\n result += `(?${enable}-${disable}${src.charAt(j)}`;\n } else {\n result += `(?${enable}${src.charAt(j)}`;\n }\n i = j + 1;\n continue;\n }\n }\n result += src.charAt(i);\n i++;\n }\n return result;\n}\n\n// -- Pattern normalization -------------------------------\n\ntype NormalizedEntry = {\n pattern: string;\n name: string | undefined;\n};\n\n/**\n * Normalize a pattern entry to { pattern, name }.\n */\nfunction normalizeEntry(p: unknown, i: number): NormalizedEntry {\n if (typeof p === \"string\") {\n return {\n pattern: scopeInlineFlags(p),\n name: undefined,\n };\n }\n if (p instanceof RegExp) {\n return {\n pattern: regexpToRust(p),\n name: undefined,\n };\n }\n if (typeof p !== \"object\" || p === null || !(\"pattern\" in p)) {\n throw new TypeError(\n `Pattern at index ${i} must be a string, ` +\n \"RegExp, or { pattern, name }\",\n );\n }\n\n const pattern = p.pattern;\n if (typeof pattern !== \"string\" && !(pattern instanceof RegExp)) {\n throw new TypeError(\n `Pattern at index ${i}: \"pattern\" ` + \"field must be a string or RegExp\",\n );\n }\n\n const name = \"name\" in p ? p.name : undefined;\n if (name !== undefined && typeof name !== \"string\") {\n throw new TypeError(\n `Pattern at index ${i}: \"name\" ` + \"field must be a string\",\n );\n }\n\n return {\n pattern:\n pattern instanceof RegExp\n ? regexpToRust(pattern)\n : scopeInlineFlags(pattern),\n name,\n };\n}\n\nfunction expandLargeAlternation(pattern: string): string[] {\n const group = findLargestChunkableAlternation(pattern);\n if (!group) return [pattern];\n if (group.branches.length < ALTERNATION_CHUNK_MIN_BRANCHES) {\n return [pattern];\n }\n\n const expanded: string[] = [];\n for (let i = 0; i < group.branches.length; i += ALTERNATION_CHUNK_SIZE) {\n expanded.push(\n pattern.slice(0, group.bodyStart) +\n group.branches.slice(i, i + ALTERNATION_CHUNK_SIZE).join(\"|\") +\n pattern.slice(group.bodyEnd),\n );\n }\n return expanded;\n}\n\nfunction findLargestChunkableAlternation(\n pattern: string,\n): AlternationGroup | undefined {\n let best: AlternationGroup | undefined;\n let inClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass ||\n ch !== \"(\" ||\n pattern.charAt(i + 1) !== \"?\" ||\n pattern.charAt(i + 2) !== \":\"\n ) {\n continue;\n }\n\n const bodyStart = i + 3;\n const bodyEnd = findGroupEnd(pattern, bodyStart);\n if (bodyEnd === undefined) continue;\n\n const branches = splitTopLevelAlternatives(\n pattern.slice(bodyStart, bodyEnd),\n );\n const shouldChunk =\n bodyStart <= ALTERNATION_CHUNK_MAX_BODY_START &&\n branches.length >= ALTERNATION_CHUNK_MIN_BRANCHES &&\n pattern.slice(bodyStart, bodyEnd).includes(\"(?i:\");\n\n if (shouldChunk && (!best || branches.length > best.branches.length)) {\n best = { bodyStart, bodyEnd, branches };\n }\n }\n\n return best;\n}\n\nfunction findGroupEnd(pattern: string, bodyStart: number): number | undefined {\n let depth = 0;\n let inClass = false;\n\n for (let i = bodyStart; i < pattern.length; i++) {\n const ch = pattern.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch !== \")\") continue;\n if (depth === 0) return i;\n depth--;\n }\n\n return undefined;\n}\n\nfunction splitTopLevelAlternatives(body: string): string[] {\n const branches: string[] = [];\n let depth = 0;\n let inClass = false;\n let start = 0;\n\n for (let i = 0; i < body.length; i++) {\n const ch = body.charAt(i);\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (inClass) continue;\n if (ch === \"(\") {\n depth++;\n continue;\n }\n if (ch === \")\") {\n depth--;\n continue;\n }\n if (ch === \"|\" && depth === 0) {\n branches.push(body.slice(start, i));\n start = i + 1;\n }\n }\n\n branches.push(body.slice(start));\n return branches;\n}\n\ntype NativeInput = {\n names: (string | undefined)[];\n hasNames: boolean;\n patternCount: number;\n nativePatterns: string[];\n nativeOpts: NativeOptions | undefined;\n nativeIndexMap: number[];\n jsFallbacks: JsFallback[];\n boundaryOptions: BoundaryOptions;\n};\n\nfunction buildNativeInput(\n patterns: PatternEntry[],\n options?: Options,\n): NativeInput {\n const entries = patterns.map(normalizeEntry);\n const names = entries.map((e) => e.name);\n const unicode = options?.unicodeBoundaries ?? true;\n const wholeWords = options?.wholeWords ?? false;\n const ci = options?.caseInsensitive ?? false;\n let processed = entries.map((e) => e.pattern);\n\n // Wrap with (?i-u:...) for case-insensitive\n // matching. Edge \\b/\\B are extracted first so\n // they stay outside the -u scope.\n if (ci) {\n processed = processed.map(caseInsensitivePattern);\n }\n\n if (!unicode) {\n processed = processed.map(asciiBoundaries);\n }\n\n const nativeOpts: NativeOptions | undefined = options\n ? {\n ...(options.wholeWords !== undefined\n ? { wholeWords: options.wholeWords }\n : {}),\n ...(options.unicodeBoundaries !== undefined\n ? { unicodeBoundaries: options.unicodeBoundaries }\n : {}),\n }\n : undefined;\n\n const nativePatterns: string[] = [];\n const nativeIndexMap: number[] = [];\n const jsFallbacks: JsFallback[] = [];\n\n for (let i = 0; i < processed.length; i++) {\n const pattern = processed[i];\n if (pattern === undefined) {\n throw new Error(`Missing processed pattern ${i}`);\n }\n const expanded = expandLargeAlternation(pattern);\n for (const expandedPattern of expanded) {\n const jsFallback = jsFallbackRegExp(expandedPattern, unicode);\n if (jsFallback) {\n jsFallbacks.push({\n pattern: i,\n re: jsFallback,\n });\n } else {\n nativeIndexMap.push(i);\n nativePatterns.push(expandedPattern);\n }\n }\n }\n\n return {\n names,\n hasNames: entries.some((e) => e.name !== undefined),\n patternCount: entries.length,\n nativePatterns,\n nativeOpts,\n nativeIndexMap,\n jsFallbacks,\n boundaryOptions: {\n wholeWords,\n unicodeBoundaries: unicode,\n },\n };\n}\n\nfunction caseInsensitivePattern(p: string): string {\n // Skip patterns already wrapped by regexpToRust or\n // scopeInlineFlags.\n if (\n /^(?:\\\\[bB]|\\(\\?[ims]+(?:-[imsu]+)?\\))*\\(\\?[ims]*i[ims]*(?:-[imsu]+)?[:(]/.test(\n p,\n )\n )\n return p;\n let src = p;\n let flagPrefix = \"\";\n const bareFlagMatch = src.match(/^\\(\\?[ims]+(?:-[imsu]+)?\\)/);\n if (bareFlagMatch) {\n flagPrefix = bareFlagMatch[0];\n src = src.slice(flagPrefix.length);\n }\n let leading = \"\";\n let trailing = \"\";\n if (src.startsWith(\"\\\\b\")) {\n leading = \"\\\\b\";\n src = src.slice(2);\n } else if (src.startsWith(\"\\\\B\")) {\n leading = \"\\\\B\";\n src = src.slice(2);\n }\n if (src.length >= 2) {\n const last = src.at(-1);\n if (last === \"b\" || last === \"B\") {\n let bs = 0;\n let k = src.length - 2;\n while (k >= 0 && src[k] === \"\\\\\") {\n bs++;\n k--;\n }\n if (bs > 0 && bs % 2 === 1) {\n trailing = \"\\\\\" + last;\n src = src.slice(0, -2);\n }\n }\n }\n const uFlag = needsAsciiMode(src) && !hasNonAscii(src) ? \"-u\" : \"\";\n return `${flagPrefix}${leading}(?i${uFlag}:${src})${trailing}`;\n}\n\n// -- RegexSet class --------------------------------------\n\n/**\n * Multi-pattern regex matcher.\n *\n * Compiles multiple regex patterns into a single\n * automaton for the main matching path. Standard\n * scans use Rust's DFA engine without catastrophic\n * backtracking. Some lookaround cases may use a\n * targeted fallback verifier to preserve\n * correctness. Uses Rust regex syntax for string\n * patterns (no lookaheads/backreferences).\n *\n * @example\n * ```ts\n * // Simple\n * new RegexSet([/\\d{8}/, \"\\\\+?\\\\d{9,12}\"]);\n *\n * // Named\n * new RegexSet([\n * { pattern: /\\d{8}/, name: \"ico\" },\n * { pattern: /\\d{2}\\.\\d{2}\\.\\d{4}/, name: \"date\" },\n * ]);\n * // match.name === \"date\"\n * ```\n */\nexport class RegexSet {\n private _inner: NativeRegexSetInstance;\n private _names: (string | undefined)[];\n private _hasNames: boolean;\n private _patternCount: number;\n private _nativeIndexMap: number[];\n private _jsFallbacks: JsFallback[];\n private _nativeSingles: NativeSingle[];\n private _boundaryOptions: BoundaryOptions;\n\n constructor(\n patterns: PatternEntry[],\n options?: Options,\n prepared?: Uint8Array,\n ) {\n const nativeInput = buildNativeInput(patterns, options);\n this._names = nativeInput.names;\n this._hasNames = nativeInput.hasNames;\n this._patternCount = nativeInput.patternCount;\n this._boundaryOptions = nativeInput.boundaryOptions;\n this._nativeIndexMap = nativeInput.nativeIndexMap;\n this._jsFallbacks = nativeInput.jsFallbacks;\n this._nativeSingles = [];\n this._inner = new binding.RegexSet(\n nativeInput.nativePatterns,\n nativeInput.nativeOpts,\n prepared,\n );\n if (this._jsFallbacks.length > 0) {\n this._nativeSingles = nativeInput.nativePatterns.map((pattern, i) => {\n const original = this._nativeIndexMap[i];\n if (original === undefined) {\n throw new Error(`Missing native index map ${i}`);\n }\n return {\n pattern: original,\n inner: new binding.RegexSet([pattern], nativeInput.nativeOpts),\n };\n });\n }\n }\n\n static prepare(patterns: PatternEntry[], options?: Options): Uint8Array {\n const nativeInput = buildNativeInput(patterns, options);\n return binding._prepareRegexSet(\n nativeInput.nativePatterns,\n nativeInput.nativeOpts,\n );\n }\n\n /** Number of patterns. */\n get patternCount(): number {\n return this._patternCount;\n }\n\n /** Internal diagnostics: fast DFA, verified DFA, and fallback pattern counts. */\n _enginePathCounts(): number[] {\n return [...this._inner._enginePathCounts()];\n }\n\n /** Returns `true` if any pattern matches. */\n isMatch(haystack: string): boolean {\n if (this._inner._isMatchBuf(encoder.encode(haystack))) {\n return true;\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb)) return true;\n }\n return false;\n }\n\n /** Find all non-overlapping matches. */\n findIter(haystack: string): Match[] {\n if (this._jsFallbacks.length > 0) {\n const all = this.findNativeSingles(haystack).concat(\n this.findJsFallbacks(haystack),\n );\n return selectNonOverlapping(all);\n }\n\n const native = unpack(\n this._inner._findIterPackedBuf(encoder.encode(haystack)),\n haystack,\n this._hasNames ? this._names : null,\n this._nativeIndexMap,\n );\n return native;\n }\n\n /** Which pattern indices matched (not where). */\n whichMatch(haystack: string): number[] {\n const seen = new Set<number>();\n for (const pattern of this._inner.whichMatch(haystack)) {\n const original = this._nativeIndexMap[pattern];\n if (original === undefined) {\n throw new Error(`Missing native index map ${pattern}`);\n }\n seen.add(original);\n }\n for (const fb of this._jsFallbacks) {\n if (this.findFirstJsFallback(haystack, fb)) {\n seen.add(fb.pattern);\n }\n }\n return [...seen];\n }\n\n /**\n * Replace all non-overlapping matches.\n * `replacements[i]` replaces pattern `i`.\n */\n replaceAll(haystack: string, replacements: string[]): string {\n if (\n this._jsFallbacks.length === 0 &&\n this._nativeIndexMap.length === this._patternCount &&\n this._nativeIndexMap.every((idx, i) => idx === i)\n ) {\n return this._inner.replaceAll(haystack, replacements);\n }\n if (replacements.length !== this._patternCount) {\n throw new Error(\n `Expected ${this._patternCount} ` +\n `replacements, got ${replacements.length}`,\n );\n }\n\n const matches = this.findIter(haystack);\n let result = \"\";\n let last = 0;\n\n for (const m of matches) {\n result += haystack.slice(last, m.start);\n const replacement = replacements[m.pattern];\n if (replacement === undefined) {\n throw new Error(`Missing replacement for pattern ${m.pattern}`);\n }\n result += replacement;\n last = m.end;\n }\n\n result += haystack.slice(last);\n return result;\n }\n\n private findJsFallbacks(haystack: string): Match[] {\n const matches: Match[] = [];\n for (const fb of this._jsFallbacks) {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) break;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (this.acceptJsFallbackMatch(haystack, start, end)) {\n const match: Match = {\n pattern: fb.pattern,\n start,\n end,\n text,\n };\n const name = this._names[fb.pattern];\n if (name !== undefined) match.name = name;\n matches.push(match);\n if (text.length === 0) {\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n } else {\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n }\n return matches;\n }\n\n private findNativeSingles(haystack: string): Match[] {\n const encoded = encoder.encode(haystack);\n const matches: Match[] = [];\n for (const single of this._nativeSingles) {\n matches.push(\n ...unpack(\n single.inner._findIterPackedBuf(encoded),\n haystack,\n this._hasNames ? this._names : null,\n [single.pattern],\n ),\n );\n }\n return matches;\n }\n\n private findFirstJsFallback(haystack: string, fb: JsFallback): boolean {\n fb.re.lastIndex = 0;\n for (;;) {\n const m = fb.re.exec(haystack);\n if (!m) return false;\n const text = m[0];\n const start = m.index;\n const end = start + text.length;\n if (this.acceptJsFallbackMatch(haystack, start, end)) {\n return true;\n }\n fb.re.lastIndex = nextRegexStart(haystack, start);\n }\n }\n\n private acceptJsFallbackMatch(\n haystack: string,\n start: number,\n end: number,\n ): boolean {\n if (!this._boundaryOptions.wholeWords) return true;\n return (\n isWordBoundary(\n haystack,\n start,\n this._boundaryOptions.unicodeBoundaries,\n ) &&\n isWordBoundary(haystack, end, this._boundaryOptions.unicodeBoundaries)\n );\n }\n}\n\nfunction jsFallbackRegExp(\n pattern: string,\n unicodeBoundaries: boolean,\n): RegExp | undefined {\n if (\n !hasLookaround(pattern) ||\n (unicodeBoundaries && hasRegexWordBoundary(pattern)) ||\n hasRustUnicodeShorthand(pattern) ||\n hasRustClassSetOperation(pattern) ||\n countAlternations(pattern) < 128\n ) {\n return undefined;\n }\n try {\n return new RegExp(pattern, \"gu\");\n } catch {\n return undefined;\n }\n}\n\nfunction hasLookaround(pattern: string): boolean {\n return (\n pattern.includes(\"(?=\") ||\n pattern.includes(\"(?!\") ||\n pattern.includes(\"(?<=\") ||\n pattern.includes(\"(?<!\")\n );\n}\n\nfunction countAlternations(pattern: string): number {\n let count = 0;\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n else if (ch === \"|\" && !inClass) count++;\n }\n return count;\n}\n\nfunction hasRegexWordBoundary(pattern: string): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n const next = pattern[i + 1];\n if (!inClass && (next === \"b\" || next === \"B\")) {\n return true;\n }\n i++;\n continue;\n }\n if (ch === \"[\") inClass = true;\n else if (ch === \"]\") inClass = false;\n }\n return false;\n}\n\nfunction hasRustUnicodeShorthand(pattern: string): boolean {\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch !== \"\\\\\") continue;\n const next = pattern[i + 1];\n if (\n next === \"d\" ||\n next === \"D\" ||\n next === \"w\" ||\n next === \"W\" ||\n next === \"s\" ||\n next === \"S\"\n ) {\n return true;\n }\n i++;\n }\n return false;\n}\n\nfunction hasRustClassSetOperation(pattern: string): boolean {\n let inClass = false;\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n if (ch === \"\\\\\") {\n i++;\n continue;\n }\n if (ch === \"[\") {\n inClass = true;\n continue;\n }\n if (ch === \"]\") {\n inClass = false;\n continue;\n }\n if (\n inClass &&\n i + 1 < pattern.length &&\n ((ch === \"&\" && pattern[i + 1] === \"&\") ||\n (ch === \"-\" && pattern[i + 1] === \"-\") ||\n (ch === \"~\" && pattern[i + 1] === \"~\"))\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction nextRegexStart(text: string, index: number): number {\n if (index >= text.length) return index + 1;\n const first = text.charCodeAt(index);\n if (first >= 0xd800 && first <= 0xdbff && index + 1 < text.length) {\n const second = text.charCodeAt(index + 1);\n if (second >= 0xdc00 && second <= 0xdfff) {\n return index + 2;\n }\n }\n return index + 1;\n}\n\nfunction selectNonOverlapping(matches: Match[]): Match[] {\n if (matches.length <= 1) return matches;\n\n matches.sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start;\n const lengthOrder = b.end - b.start - (a.end - a.start);\n if (lengthOrder !== 0) return lengthOrder;\n return a.pattern - b.pattern;\n });\n\n const selected: Match[] = [];\n let lastEnd = 0;\n for (const m of matches) {\n if (m.start >= lastEnd) {\n selected.push(m);\n lastEnd = m.end;\n }\n }\n return selected;\n}\n\nfunction isWordBoundary(text: string, pos: number, unicode: boolean): boolean {\n const before = previousCodePoint(text, pos);\n const after = nextCodePoint(text, pos);\n return isWordChar(before, unicode) !== isWordChar(after, unicode);\n}\n\nfunction previousCodePoint(text: string, pos: number): string | undefined {\n if (pos <= 0) return undefined;\n return Array.from(text.slice(0, pos)).at(-1);\n}\n\nfunction nextCodePoint(text: string, pos: number): string | undefined {\n if (pos >= text.length) return undefined;\n const cp = text.codePointAt(pos);\n return cp === undefined ? undefined : String.fromCodePoint(cp);\n}\n\nfunction isWordChar(ch: string | undefined, unicode: boolean): boolean {\n if (ch === undefined) return false;\n return unicode\n ? /^[\\p{Alphabetic}\\p{Number}_]$/u.test(ch)\n : /^[A-Za-z0-9_]$/.test(ch);\n}\n","import type { NativeBinding } from \"./core\";\nimport type { WasmExports } from \"./single-thread-runtime\";\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst LONE_SURROGATE =\n /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/gu;\nconst REINITIALIZE =\n \"The single-thread WebAssembly instance trapped; call init() or initSync() again\";\n\ntype Reply = {\n ok: boolean;\n value?: unknown;\n error?: string;\n};\n\nconst napiString = (value: string) =>\n value.replaceAll(LONE_SURROGATE, \"\\uFFFD\");\n\nexport const createSingleThreadBinding = (\n wasm: WasmExports,\n onTrap: () => void,\n): NativeBinding => {\n let trapped = false;\n\n const request = (body: object): unknown => {\n if (trapped) throw new Error(REINITIALIZE);\n const bytes = encoder.encode(\n JSON.stringify(body, (_key, value: unknown) =>\n typeof value === \"string\" ? napiString(value) : value,\n ),\n );\n try {\n const pointer = wasm.alloc(bytes.length);\n new Uint8Array(wasm.memory.buffer, pointer, bytes.length).set(bytes);\n wasm.dispatch(pointer, bytes.length);\n const output = new Uint8Array(\n wasm.memory.buffer,\n wasm.output_pointer(),\n wasm.output_length(),\n );\n const reply: Reply = JSON.parse(decoder.decode(output));\n if (!reply.ok) throw new Error(reply.error ?? \"WASM operation failed\");\n return reply.value;\n } catch (error) {\n if (error instanceof WebAssembly.RuntimeError) {\n trapped = true;\n onTrap();\n }\n throw error;\n }\n };\n\n const numbers = (value: unknown): number[] => {\n if (!Array.isArray(value) || !value.every(Number.isInteger)) {\n throw new TypeError(\n \"Invalid numeric response from single-thread WebAssembly\",\n );\n }\n return value;\n };\n const bytes = (value: Uint8Array) => [...value];\n const options = (\n opts?: {\n wholeWords?: boolean;\n unicodeBoundaries?: boolean;\n } | null,\n ) => ({\n whole_words: opts?.wholeWords ?? false,\n unicode_boundaries: opts?.unicodeBoundaries ?? true,\n });\n\n class WasmRegexSet {\n readonly handle: number;\n readonly patternCount: number;\n constructor(\n patterns: string[],\n opts?: {\n wholeWords?: boolean;\n unicodeBoundaries?: boolean;\n } | null,\n prepared?: Uint8Array | null,\n ) {\n this.patternCount = patterns.length;\n const value = request({\n op: \"create\",\n patterns,\n ...options(opts),\n prepared: prepared ? bytes(prepared) : null,\n });\n if (!Number.isInteger(value))\n throw new TypeError(\n \"Invalid matcher handle from single-thread WebAssembly\",\n );\n this.handle = Number(value);\n finalizers.register(this, this.handle);\n }\n _enginePathCounts() {\n return Uint32Array.from(\n numbers(request({ op: \"counts\", handle: this.handle })),\n );\n }\n isMatch(haystack: string) {\n return Boolean(\n request({\n op: \"is_match\",\n handle: this.handle,\n haystack,\n }),\n );\n }\n _isMatchBuf(haystack: Uint8Array) {\n return Boolean(\n request({\n op: \"is_match_buf\",\n handle: this.handle,\n haystack: bytes(haystack),\n }),\n );\n }\n _findIterPacked(haystack: string) {\n return Uint32Array.from(\n numbers(\n request({\n op: \"find\",\n handle: this.handle,\n haystack,\n }),\n ),\n );\n }\n _findIterPackedBuf(haystack: Uint8Array) {\n return Uint32Array.from(\n numbers(\n request({\n op: \"find_buf\",\n handle: this.handle,\n haystack: bytes(haystack),\n }),\n ),\n );\n }\n whichMatch(haystack: string) {\n return numbers(\n request({\n op: \"which\",\n handle: this.handle,\n haystack,\n }),\n );\n }\n replaceAll(haystack: string, replacements: string[]) {\n const value = request({\n op: \"replace\",\n handle: this.handle,\n haystack,\n replacements,\n });\n if (typeof value !== \"string\")\n throw new TypeError(\n \"Invalid replacement response from single-thread WebAssembly\",\n );\n return value;\n }\n }\n\n const finalizers = new FinalizationRegistry<number>((handle) => {\n if (!trapped) request({ op: \"free\", handle });\n });\n\n return {\n RegexSet: WasmRegexSet,\n _prepareRegexSet(patterns, opts) {\n return Uint8Array.from(\n numbers(\n request({\n op: \"prepare\",\n patterns,\n ...options(opts),\n }),\n ),\n );\n },\n _uax29Boundaries(haystack) {\n return numbers(\n request({\n op: \"boundaries\",\n haystack: bytes(haystack),\n }),\n );\n },\n };\n};\n","export type WasmExports = {\n memory: WebAssembly.Memory;\n alloc: (length: number) => number;\n dispatch: (pointer: number, length: number) => void;\n output_pointer: () => number;\n output_length: () => number;\n};\n\nexport const isWasmExports = (\n value: Record<string, unknown>,\n): value is Record<string, unknown> & WasmExports =>\n value[\"memory\"] instanceof WebAssembly.Memory &&\n typeof value[\"alloc\"] === \"function\" &&\n typeof value[\"dispatch\"] === \"function\" &&\n typeof value[\"output_pointer\"] === \"function\" &&\n typeof value[\"output_length\"] === \"function\";\n\nexport const requireWasmExports = (instance: {\n exports: Record<string, unknown>;\n}): WasmExports => {\n if (!isWasmExports(instance.exports)) {\n throw new TypeError(\n \"Invalid single-thread WebAssembly exports: expected memory and alloc, dispatch, output_pointer, and output_length functions\",\n );\n }\n return instance.exports;\n};\n","import { initBinding } from \"./core\";\nimport { createSingleThreadBinding } from \"./single-thread-binding\";\nimport { requireWasmExports } from \"./single-thread-runtime\";\n\nexport type InitSource =\n ArrayBuffer | ArrayBufferView | URL | string | Request | Response;\n\nlet generation = 0;\n\nconst install = (instance: WebAssembly.Instance) => {\n const current = ++generation;\n initBinding(\n createSingleThreadBinding(requireWasmExports(instance), () => {\n if (generation === current) generation++;\n }),\n );\n};\n\nconst isBufferSource = (\n source: InitSource,\n): source is ArrayBuffer | ArrayBufferView =>\n Object.prototype.toString.call(source) === \"[object ArrayBuffer]\" ||\n ArrayBuffer.isView(source);\n\nconst isResponse = (source: InitSource): source is Response =>\n typeof source === \"object\" &&\n \"arrayBuffer\" in source &&\n \"ok\" in source &&\n \"status\" in source;\n\nexport const initSync = (source: ArrayBuffer | ArrayBufferView): void => {\n install(new WebAssembly.Instance(new WebAssembly.Module(source), {}));\n};\n\nexport const init = async (source: InitSource): Promise<void> => {\n let bytes: ArrayBuffer | ArrayBufferView;\n if (isBufferSource(source)) bytes = source;\n else if (isResponse(source)) {\n if (!source.ok)\n throw new Error(`Unable to load WebAssembly: HTTP ${source.status}`);\n bytes = await source.arrayBuffer();\n } else {\n const response = await fetch(source);\n if (!response.ok)\n throw new Error(`Unable to load WebAssembly: HTTP ${response.status}`);\n bytes = await response.arrayBuffer();\n }\n const result = await WebAssembly.instantiate(bytes, {});\n install(result.instance);\n};\n\nexport { RegexSet } from \"./core\";\nexport type { Match, NamedPattern, Options, PatternEntry } from \"./core\";\n"],"mappings":"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"}
|
package/dist/vite.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.mjs","names":[],"sources":["../../src/vite.ts"],"sourcesContent":["/* Vite plugin that wires up @stll/regex-set-wasm so its napi-rs-generated\n * wasm loader survives Vite's dep pre-bundler. Excludes the browser entry\n * and sibling wasm package from pre-bundling and SSR externalization so\n * relative asset URLs keep working. */\nimport type { Plugin, UserConfig } from \"vite\";\n\nexport const WASM_VITE_PACKAGES = [\n \"@stll/regex-set-wasm\",\n \"@stll/regex-set-wasm32-wasi\",\n] as const;\n\nfunction mergeStrings(\n existing: string[] | undefined,\n additions: readonly string[],\n): string[] {\n return [...new Set([...(existing ?? []), ...additions])];\n}\n\nexport function buildRegexSetWasmViteConfig(\n config: UserConfig = {},\n): UserConfig {\n return {\n optimizeDeps: {\n ...config.optimizeDeps,\n exclude: mergeStrings(
|
|
1
|
+
{"version":3,"file":"vite.mjs","names":[],"sources":["../../src/vite.ts"],"sourcesContent":["/* Vite plugin that wires up @stll/regex-set-wasm so its napi-rs-generated\n * wasm loader survives Vite's dep pre-bundler. Excludes the browser entry\n * and sibling wasm package from pre-bundling and SSR externalization so\n * relative asset URLs keep working. */\nimport type { Plugin, UserConfig } from \"vite\";\n\nexport const WASM_VITE_PACKAGES = [\n \"@stll/regex-set-wasm\",\n \"@stll/regex-set-wasm32-wasi\",\n] as const;\n\nfunction mergeStrings(\n existing: string[] | undefined,\n additions: readonly string[],\n): string[] {\n return [...new Set([...(existing ?? []), ...additions])];\n}\n\nexport function buildRegexSetWasmViteConfig(\n config: UserConfig = {},\n): UserConfig {\n return {\n optimizeDeps: {\n ...config.optimizeDeps,\n exclude: mergeStrings(config.optimizeDeps?.exclude, WASM_VITE_PACKAGES),\n },\n ssr: {\n ...config.ssr,\n external:\n config.ssr?.external === true\n ? true\n : mergeStrings(config.ssr?.external, WASM_VITE_PACKAGES),\n },\n };\n}\n\nexport default function stllRegexSetWasmVite(): Plugin {\n return {\n name: \"stll-regex-set-wasm\",\n config(config) {\n return buildRegexSetWasmViteConfig(config);\n },\n };\n}\n"],"mappings":";AAMA,MAAa,qBAAqB,CAChC,wBACA,6BACF;AAEA,SAAS,aACP,UACA,WACU;CACV,OAAO,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAI,YAAY,CAAC,GAAI,GAAG,SAAS,CAAC,CAAC;AACzD;AAEA,SAAgB,4BACd,SAAqB,CAAC,GACV;CACZ,OAAO;EACL,cAAc;GACZ,GAAG,OAAO;GACV,SAAS,aAAa,OAAO,cAAc,SAAS,kBAAkB;EACxE;EACA,KAAK;GACH,GAAG,OAAO;GACV,UACE,OAAO,KAAK,aAAa,OACrB,OACA,aAAa,OAAO,KAAK,UAAU,kBAAkB;EAC7D;CACF;AACF;AAEA,SAAwB,uBAA+B;CACrD,OAAO;EACL,MAAM;EACN,OAAO,QAAQ;GACb,OAAO,4BAA4B,MAAM;EAC3C;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wasi-worker-browser.mjs","names":[],"sources":["../../wasi-worker-browser.mjs"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"file":"wasi-worker-browser.mjs","names":[],"sources":["../../wasi-worker-browser.mjs"],"sourcesContent":["import {\n emnapiAsyncWorkPlugin,\n emnapiTSFNPlugin,\n instantiateNapiModuleSync,\n MessageHandler,\n WASI,\n} from \"@napi-rs/wasm-runtime\";\n\nconst handler = new MessageHandler({\n onLoad({ wasmModule, wasmMemory }) {\n const wasi = new WASI({\n print: function () {\n console.log.apply(console, arguments);\n },\n printErr: function () {\n console.error.apply(console, arguments);\n },\n });\n return instantiateNapiModuleSync(wasmModule, {\n childThread: true,\n wasi,\n // The wasm links a \"basic\" emnapi archive (no C async-work /\n // threadsafe-function implementations), so every thread that\n // instantiates it must provide the JavaScript implementations\n // through the emnapi plugins.\n plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],\n overwriteImports(importObject) {\n importObject.env = {\n ...importObject.env,\n ...importObject.napi,\n ...importObject.emnapi,\n memory: wasmMemory,\n };\n },\n });\n },\n});\n\n// When this wasm thread dies, raise the addon's crash flag before emnapi reports\n// it. The loader thread may be inside wasm, in a cleanup call that waits on this\n// thread; the flag is what those waits check between short slices, and once it\n// is up they trap instead of waiting for good. It is a word in the shared wasm\n// memory, and the loader posts a view of it (see\n// napi_wasm_thread_crash_flag_address) after it instantiated the wasm, or right\n// after it created this worker. No view, no flag: an addon built with an older\n// napi, or a failure before the view arrived.\nlet __addonCrashFlag;\nconst __beforeReportError = handler.beforeReportError;\nhandler.beforeReportError = function (...args) {\n if (__addonCrashFlag !== undefined) {\n try {\n Atomics.store(__addonCrashFlag, 0, 1);\n } catch {}\n }\n return __beforeReportError.apply(this, args);\n};\n\nglobalThis.onmessage = function (e) {\n const data = e && e.data;\n if (data && data.__napiRsAddonCrashFlag instanceof Int32Array) {\n __addonCrashFlag = data.__napiRsAddonCrashFlag;\n return;\n }\n handler.handle(e);\n};\n"],"mappings":";;AAQA,MAAM,UAAU,IAAI,eAAe,EACjC,OAAO,EAAE,YAAY,cAAc;CACjC,MAAM,OAAO,IAAI,KAAK;EACpB,OAAO,WAAY;GACjB,QAAQ,IAAI,MAAM,SAAS,SAAS;EACtC;EACA,UAAU,WAAY;GACpB,QAAQ,MAAM,MAAM,SAAS,SAAS;EACxC;CACF,CAAC;CACD,OAAO,0BAA0B,YAAY;EAC3C,aAAa;EACb;EAKA,SAAS,CAAC,uBAAuB,gBAAgB;EACjD,iBAAiB,cAAc;GAC7B,aAAa,MAAM;IACjB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,QAAQ;GACV;EACF;CACF,CAAC;AACH,EACF,CAAC;AAUD,IAAI;AACJ,MAAM,sBAAsB,QAAQ;AACpC,QAAQ,oBAAoB,SAAU,GAAG,MAAM;CAC7C,IAAI,qBAAqB,KAAA,GACvB,IAAI;EACF,QAAQ,MAAM,kBAAkB,GAAG,CAAC;CACtC,QAAQ,CAAC;CAEX,OAAO,oBAAoB,MAAM,MAAM,IAAI;AAC7C;AAEA,WAAW,YAAY,SAAU,GAAG;CAClC,MAAM,OAAO,KAAK,EAAE;CACpB,IAAI,QAAQ,KAAK,kCAAkC,YAAY;EAC7D,mBAAmB,KAAK;EACxB;CACF;CACA,QAAQ,OAAO,CAAC;AAClB"}
|
package/dist/wasm.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { WASI, emnapiAsyncWorkPlugin, emnapiTSFNPlugin, instantiateNapiModule } from "@napi-rs/wasm-runtime";
|
|
2
1
|
import { createContext } from "@emnapi/runtime";
|
|
2
|
+
import { WASI, emnapiAsyncWorkPlugin, emnapiTSFNPlugin, instantiateNapiModule } from "@napi-rs/wasm-runtime";
|
|
3
3
|
//#region regex-set.wasi-browser.js
|
|
4
4
|
const __napiBindingTarget = "wasm32-wasi";
|
|
5
5
|
function __napiStampBindingTarget(exportsObject, target) {
|
|
@@ -60,6 +60,54 @@ let __emnapiWasmEnvCleanupDrainPromise;
|
|
|
60
60
|
let __wasiDisposed = false;
|
|
61
61
|
let __wasiAsyncWorkDrainPromise;
|
|
62
62
|
let __wasiDisposePromise;
|
|
63
|
+
let __wasiThreadCrashDisposePromise;
|
|
64
|
+
let __wasiInitializationRollbackActive = false;
|
|
65
|
+
let __wasiThreadCrashed = false;
|
|
66
|
+
let __wasiThreadCrashWorkerError;
|
|
67
|
+
function __recordWasiThreadCrashError(error) {
|
|
68
|
+
__wasiThreadCrashed = true;
|
|
69
|
+
if (__wasiThreadCrashWorkerError === void 0 && error !== void 0) __wasiThreadCrashWorkerError = error;
|
|
70
|
+
}
|
|
71
|
+
function __hasWasiThreadCrashed() {
|
|
72
|
+
if (__wasiThreadCrashed || __wasiAddonCrashFlag !== void 0 && Atomics.load(__wasiAddonCrashFlag, 0) !== 0) return true;
|
|
73
|
+
const manager = typeof __getWasiThreadManager === "function" ? __getWasiThreadManager() : void 0;
|
|
74
|
+
return Boolean(manager && manager._fatalError);
|
|
75
|
+
}
|
|
76
|
+
function __getWasiThreadCrashError() {
|
|
77
|
+
const error = /* @__PURE__ */ new Error("napi-rs: WASI binding cannot be disposed after a worker thread crashed");
|
|
78
|
+
const manager = typeof __getWasiThreadManager === "function" ? __getWasiThreadManager() : void 0;
|
|
79
|
+
const cause = __wasiThreadCrashWorkerError ?? (manager ? manager._fatalError : void 0);
|
|
80
|
+
if (cause !== void 0 && cause !== null) error.cause = cause;
|
|
81
|
+
return error;
|
|
82
|
+
}
|
|
83
|
+
function __disposeWasiBindingAfterThreadCrash() {
|
|
84
|
+
if (__wasiThreadCrashDisposePromise) return __wasiThreadCrashDisposePromise;
|
|
85
|
+
let workerResult;
|
|
86
|
+
try {
|
|
87
|
+
workerResult = __terminateWasiWorkers();
|
|
88
|
+
} catch (error) {
|
|
89
|
+
workerResult = Promise.reject(error);
|
|
90
|
+
}
|
|
91
|
+
__wasiThreadCrashDisposePromise = Promise.resolve(workerResult).then(() => {
|
|
92
|
+
throw __getWasiThreadCrashError();
|
|
93
|
+
}, (error) => {
|
|
94
|
+
throw error;
|
|
95
|
+
});
|
|
96
|
+
return __wasiThreadCrashDisposePromise;
|
|
97
|
+
}
|
|
98
|
+
function __abortWasiDisposalIfThreadCrashed() {
|
|
99
|
+
if ((__wasiDisposePromise !== void 0 || __wasiInitializationRollbackActive) && __hasWasiThreadCrashed()) throw __getWasiThreadCrashError();
|
|
100
|
+
}
|
|
101
|
+
function __settleWasiDisposalAfterThreadCrash(resolve, reject) {
|
|
102
|
+
if (!__hasWasiThreadCrashed()) return false;
|
|
103
|
+
__disposeWasiBindingAfterThreadCrash().then(resolve, reject);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
function __rollbackWasiInitializationAfterThreadCrash() {
|
|
107
|
+
const crashError = __getWasiThreadCrashError();
|
|
108
|
+
__disposeWasiBindingAfterThreadCrash().catch(() => {});
|
|
109
|
+
return [crashError];
|
|
110
|
+
}
|
|
63
111
|
let __completeWasiDisposal = function() {};
|
|
64
112
|
function __isThenable(value) {
|
|
65
113
|
return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
|
|
@@ -111,6 +159,7 @@ function __wrapEmnapiContextDestroyForSettlement(context, prepareEnvCleanup, isP
|
|
|
111
159
|
enumerable: false,
|
|
112
160
|
writable: true,
|
|
113
161
|
value: function() {
|
|
162
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
114
163
|
if (isPreparingEnvCleanup?.()) return;
|
|
115
164
|
prepareEnvCleanup?.();
|
|
116
165
|
return Reflect.apply(destroy, this, arguments);
|
|
@@ -123,6 +172,7 @@ function __isPreparingWasmEnvCleanup() {
|
|
|
123
172
|
return __emnapiWasmEnvCleanupPreparing;
|
|
124
173
|
}
|
|
125
174
|
function __prepareWasmEnvCleanup() {
|
|
175
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
126
176
|
if (__emnapiWasmEnvCleanupPrepared) return;
|
|
127
177
|
const finishParked = __finishParkedWasmEnvCleanup;
|
|
128
178
|
if (finishParked !== void 0) {
|
|
@@ -388,6 +438,7 @@ function __prepareWasmEnvCleanupWithTurns() {
|
|
|
388
438
|
__emnapiWasmEnvCleanupPreparing = true;
|
|
389
439
|
let live;
|
|
390
440
|
try {
|
|
441
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
391
442
|
live = begin();
|
|
392
443
|
} catch (error) {
|
|
393
444
|
__emnapiWasmEnvCleanupPreparing = false;
|
|
@@ -395,6 +446,7 @@ function __prepareWasmEnvCleanupWithTurns() {
|
|
|
395
446
|
}
|
|
396
447
|
__emnapiWasmEnvCleanupRan = true;
|
|
397
448
|
const finishCleanup = () => {
|
|
449
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
398
450
|
if (__emnapiWasmEnvCleanupPrepared) return;
|
|
399
451
|
__finishParkedWasmEnvCleanup = void 0;
|
|
400
452
|
try {
|
|
@@ -409,17 +461,27 @@ function __prepareWasmEnvCleanupWithTurns() {
|
|
|
409
461
|
return;
|
|
410
462
|
}
|
|
411
463
|
__finishParkedWasmEnvCleanup = finishCleanup;
|
|
464
|
+
const finishCleanupUnlessCrashed = () => {
|
|
465
|
+
try {
|
|
466
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
467
|
+
} catch (error) {
|
|
468
|
+
__finishParkedWasmEnvCleanup = void 0;
|
|
469
|
+
throw error;
|
|
470
|
+
}
|
|
471
|
+
finishCleanup();
|
|
472
|
+
};
|
|
412
473
|
return (async () => {
|
|
413
474
|
const pace = __createWasmRuntimePollPace();
|
|
414
475
|
for (;;) {
|
|
415
476
|
await __yieldWasmRuntimePollTurn(pace);
|
|
477
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
416
478
|
try {
|
|
417
479
|
if (!workPending()) return;
|
|
418
480
|
} catch {
|
|
419
481
|
return;
|
|
420
482
|
}
|
|
421
483
|
}
|
|
422
|
-
})().then(
|
|
484
|
+
})().then(finishCleanupUnlessCrashed, finishCleanupUnlessCrashed);
|
|
423
485
|
}
|
|
424
486
|
const __WASM_ENV_CLEANUP_DRAIN_TURNS = 128;
|
|
425
487
|
const __WASM_ENV_CLEANUP_BLIND_DRAIN_TURNS = 4;
|
|
@@ -500,6 +562,7 @@ function __drainWasmEnvCleanup() {
|
|
|
500
562
|
return drainPromise;
|
|
501
563
|
}
|
|
502
564
|
function __destroyEmnapiContext() {
|
|
565
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
503
566
|
if (__emnapiContextDestroyed || __emnapiContext === void 0) {
|
|
504
567
|
__emnapiContextDestroyed = true;
|
|
505
568
|
return;
|
|
@@ -692,16 +755,19 @@ function __finishWasiDisposal() {
|
|
|
692
755
|
if (__isThenable(workerResult)) return Promise.resolve(workerResult).then(__completeWasiDisposal);
|
|
693
756
|
}
|
|
694
757
|
function __continueWasiDisposal() {
|
|
758
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
695
759
|
const destroyResult = __destroyEmnapiContext();
|
|
696
760
|
if (__isThenable(destroyResult)) return Promise.resolve(destroyResult).then(__finishWasiDisposal);
|
|
697
761
|
return __finishWasiDisposal();
|
|
698
762
|
}
|
|
699
763
|
function __drainWasmEnvForWasiDisposal() {
|
|
764
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
700
765
|
const drainResult = __drainWasmEnvCleanup();
|
|
701
766
|
if (__isThenable(drainResult)) return Promise.resolve(drainResult).then(__continueWasiDisposal);
|
|
702
767
|
return __continueWasiDisposal();
|
|
703
768
|
}
|
|
704
769
|
function __cleanUpWasmEnvForWasiDisposal() {
|
|
770
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
705
771
|
const prepareResult = __prepareWasmEnvCleanupWithTurns();
|
|
706
772
|
if (__isThenable(prepareResult)) return Promise.resolve(prepareResult).then(__drainWasmEnvForWasiDisposal);
|
|
707
773
|
return __drainWasmEnvForWasiDisposal();
|
|
@@ -719,6 +785,7 @@ function __startWasiDisposal() {
|
|
|
719
785
|
*/
|
|
720
786
|
function __disposeWasiBinding() {
|
|
721
787
|
if (__wasiDisposePromise) return __wasiDisposePromise;
|
|
788
|
+
if (!__wasiDisposed && __hasWasiThreadCrashed()) return __disposeWasiBindingAfterThreadCrash();
|
|
722
789
|
if (__wasiDisposed) return Promise.resolve();
|
|
723
790
|
let resolveDispose;
|
|
724
791
|
let rejectDispose;
|
|
@@ -731,6 +798,7 @@ function __disposeWasiBinding() {
|
|
|
731
798
|
try {
|
|
732
799
|
result = __startWasiDisposal();
|
|
733
800
|
} catch (error) {
|
|
801
|
+
if (__settleWasiDisposalAfterThreadCrash(resolveDispose, rejectDispose)) return disposePromise;
|
|
734
802
|
__wasiDisposePromise = void 0;
|
|
735
803
|
rejectDispose(error);
|
|
736
804
|
return disposePromise;
|
|
@@ -739,6 +807,7 @@ function __disposeWasiBinding() {
|
|
|
739
807
|
__wasiDisposed = true;
|
|
740
808
|
resolveDispose(value);
|
|
741
809
|
}, (error) => {
|
|
810
|
+
if (__settleWasiDisposalAfterThreadCrash(resolveDispose, rejectDispose)) return;
|
|
742
811
|
__wasiDisposePromise = void 0;
|
|
743
812
|
rejectDispose(error);
|
|
744
813
|
});
|
|
@@ -766,6 +835,7 @@ function __finishWasiInitializationRollback(cleanupErrors) {
|
|
|
766
835
|
return cleanupErrors;
|
|
767
836
|
}
|
|
768
837
|
function __destroyContextForWasiRollback(cleanupErrors) {
|
|
838
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
769
839
|
let destroyResult;
|
|
770
840
|
try {
|
|
771
841
|
destroyResult = __destroyEmnapiContext();
|
|
@@ -823,8 +893,9 @@ function __retainFailedWasiRollback(cleanupErrors) {
|
|
|
823
893
|
* goes away. That is the deliberate choice: a hung promise is a silent liveness
|
|
824
894
|
* bug with no upper bound, while the retained bookkeeping is bounded by the page.
|
|
825
895
|
*/
|
|
826
|
-
function
|
|
896
|
+
function __runWasiInitializationRollbackSteps() {
|
|
827
897
|
function __rollbackWasmEnvForWasiInitialization() {
|
|
898
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
828
899
|
const cleanupErrors = [];
|
|
829
900
|
let prepareResult;
|
|
830
901
|
try {
|
|
@@ -840,6 +911,7 @@ function __rollbackWasiInitialization() {
|
|
|
840
911
|
return __drainWasmEnvForWasiRollback(cleanupErrors);
|
|
841
912
|
}
|
|
842
913
|
function __drainWasmEnvForWasiRollback(cleanupErrors) {
|
|
914
|
+
__abortWasiDisposalIfThreadCrashed();
|
|
843
915
|
let drainResult;
|
|
844
916
|
try {
|
|
845
917
|
drainResult = __drainWasmEnvCleanup();
|
|
@@ -863,6 +935,30 @@ function __rollbackWasiInitialization() {
|
|
|
863
935
|
if (__isThenable(asyncWorkResult)) return Promise.resolve(asyncWorkResult).then(__rollbackWasmEnvForWasiInitialization, __retainAfterAsyncWorkDrainFailure);
|
|
864
936
|
return __rollbackWasmEnvForWasiInitialization();
|
|
865
937
|
}
|
|
938
|
+
function __rollbackWasiInitialization() {
|
|
939
|
+
if (__hasWasiThreadCrashed()) return __rollbackWasiInitializationAfterThreadCrash();
|
|
940
|
+
__wasiInitializationRollbackActive = true;
|
|
941
|
+
let result;
|
|
942
|
+
try {
|
|
943
|
+
result = __runWasiInitializationRollbackSteps();
|
|
944
|
+
} catch (error) {
|
|
945
|
+
__wasiInitializationRollbackActive = false;
|
|
946
|
+
if (__hasWasiThreadCrashed()) return __rollbackWasiInitializationAfterThreadCrash();
|
|
947
|
+
throw error;
|
|
948
|
+
}
|
|
949
|
+
if (!__isThenable(result)) {
|
|
950
|
+
__wasiInitializationRollbackActive = false;
|
|
951
|
+
return __hasWasiThreadCrashed() ? __rollbackWasiInitializationAfterThreadCrash() : result;
|
|
952
|
+
}
|
|
953
|
+
return Promise.resolve(result).then((cleanupErrors) => {
|
|
954
|
+
__wasiInitializationRollbackActive = false;
|
|
955
|
+
return __hasWasiThreadCrashed() ? __rollbackWasiInitializationAfterThreadCrash() : cleanupErrors;
|
|
956
|
+
}, (error) => {
|
|
957
|
+
__wasiInitializationRollbackActive = false;
|
|
958
|
+
if (__hasWasiThreadCrashed()) return __rollbackWasiInitializationAfterThreadCrash();
|
|
959
|
+
throw error;
|
|
960
|
+
});
|
|
961
|
+
}
|
|
866
962
|
let __wasiAddonCrashFlag;
|
|
867
963
|
function __captureWasiAddonCrashFlag(instance) {
|
|
868
964
|
try {
|
|
@@ -898,6 +994,12 @@ try {
|
|
|
898
994
|
onCreateWorker() {
|
|
899
995
|
const worker = new Worker(new URL("./wasi-worker-browser.mjs", import.meta.url), { type: "module" });
|
|
900
996
|
__wasiWorkers.add(worker);
|
|
997
|
+
worker.addEventListener("error", (event) => {
|
|
998
|
+
__recordWasiThreadCrashError(event.error ?? event);
|
|
999
|
+
});
|
|
1000
|
+
worker.addEventListener("messageerror", (event) => {
|
|
1001
|
+
__recordWasiThreadCrashError(event);
|
|
1002
|
+
});
|
|
901
1003
|
__shareWasiAddonCrashFlag(worker);
|
|
902
1004
|
return worker;
|
|
903
1005
|
},
|