@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.
@@ -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(\n config.optimizeDeps?.exclude,\n WASM_VITE_PACKAGES,\n ),\n },\n ssr: {\n ...config.ssr,\n external:\n config.ssr?.external === true\n ? true\n : mergeStrings(\n config.ssr?.external,\n WASM_VITE_PACKAGES,\n ),\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,aACP,OAAO,cAAc,SACrB,kBACF;EACF;EACA,KAAK;GACH,GAAG,OAAO;GACV,UACE,OAAO,KAAK,aAAa,OACrB,OACA,aACE,OAAO,KAAK,UACZ,kBACF;EACR;CACF;AACF;AAEA,SAAwB,uBAA+B;CACrD,OAAO;EACL,MAAM;EACN,OAAO,QAAQ;GACb,OAAO,4BAA4B,MAAM;EAC3C;CACF;AACF"}
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 instantiateNapiModuleSync,\n MessageHandler,\n WASI,\n emnapiAsyncWorkPlugin,\n emnapiTSFNPlugin,\n} from '@napi-rs/wasm-runtime'\n\nconst handler = new MessageHandler({\n onLoad({ wasmModule, wasmMemory }) {\n const wasi = new WASI({\n print: function () {\n // eslint-disable-next-line no-console\n console.log.apply(console, arguments)\n },\n printErr: function () {\n // eslint-disable-next-line no-console\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;GAEjB,QAAQ,IAAI,MAAM,SAAS,SAAS;EACtC;EACA,UAAU,WAAY;GAEpB,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"}
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(finishCleanup, finishCleanup);
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 __rollbackWasiInitialization() {
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
  },