@hot-updater/bsdiff 0.25.13 → 0.26.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/assets/hdiff.wasm CHANGED
Binary file
@@ -70,7 +70,7 @@ async function loadBsdiffWasm() {
70
70
  const directExports = asBsdiffExports(precompiled);
71
71
  if (directExports) return directExports;
72
72
  if (isWasmModuleLike(precompiled)) return toBsdiffExports((await WebAssembly.instantiate(precompiled)).exports);
73
- throw new HdiffError("PATCH_FAILED", "No precompiled bsdiff WASM configured. Import a runtime entry such as hermes-bundle-diff/node, /bun, /deno, or /worker.");
73
+ throw new HdiffError("PATCH_FAILED", "No precompiled bsdiff WASM configured. Import a runtime entry such as @hot-updater/bsdiff/node, /bun, /deno, or /worker.");
74
74
  }
75
75
  function getPrecompiledBsdiffModule() {
76
76
  const hdiffGlobal = globalThis;
@@ -1 +1 @@
1
- {"version":3,"file":"bsdiff.js","names":[],"sources":["../../src/internal/bsdiff.ts"],"sourcesContent":["import { HdiffError } from \"../errors.js\";\n\ntype BsdiffExports = {\n memory: WebAssembly.Memory;\n alloc: (len: number) => number;\n dealloc: (ptr: number, len: number) => void;\n create_patch: (\n basePtr: number,\n baseLen: number,\n nextPtr: number,\n nextLen: number,\n ) => number;\n apply_patch: (\n basePtr: number,\n baseLen: number,\n patchPtr: number,\n patchLen: number,\n ) => number;\n output_ptr: () => number;\n output_len: () => number;\n free_output: () => void;\n};\n\nenum BsdiffStatus {\n OK = 0,\n INVALID_INPUT = 1,\n PATCH_FAILED = 2,\n INVALID_PATCH = 3,\n}\n\nlet wasmPromise: Promise<BsdiffExports> | undefined;\n\nexport async function createBsdiffPatch(\n base: Uint8Array,\n next: Uint8Array,\n): Promise<Uint8Array> {\n const wasm = await getBsdiffWasm();\n\n const status = runBinaryOperation(\n wasm,\n base,\n next,\n (basePtr, baseLen, nextPtr, nextLen) =>\n wasm.create_patch(basePtr, baseLen, nextPtr, nextLen),\n );\n\n if (status !== BsdiffStatus.OK) {\n throw mapPatchError(status);\n }\n\n return readAndFreeOutput(wasm);\n}\n\nexport async function applyBsdiffPatch(\n base: Uint8Array,\n patch: Uint8Array,\n): Promise<Uint8Array> {\n const wasm = await getBsdiffWasm();\n\n const status = runBinaryOperation(\n wasm,\n base,\n patch,\n (basePtr, baseLen, patchPtr, patchLen) =>\n wasm.apply_patch(basePtr, baseLen, patchPtr, patchLen),\n );\n\n if (status !== BsdiffStatus.OK) {\n throw mapApplyError(status);\n }\n\n return readAndFreeOutput(wasm);\n}\n\nfunction runBinaryOperation(\n wasm: BsdiffExports,\n left: Uint8Array,\n right: Uint8Array,\n run: (\n leftPtr: number,\n leftLen: number,\n rightPtr: number,\n rightLen: number,\n ) => number,\n): number {\n const leftPtr = wasm.alloc(left.byteLength);\n const rightPtr = wasm.alloc(right.byteLength);\n\n try {\n writeBytesToMemory(wasm.memory, leftPtr, left);\n writeBytesToMemory(wasm.memory, rightPtr, right);\n return run(leftPtr, left.byteLength, rightPtr, right.byteLength);\n } finally {\n if (left.byteLength > 0) {\n wasm.dealloc(leftPtr, left.byteLength);\n }\n if (right.byteLength > 0) {\n wasm.dealloc(rightPtr, right.byteLength);\n }\n }\n}\n\nfunction writeBytesToMemory(\n memory: WebAssembly.Memory,\n ptr: number,\n bytes: Uint8Array,\n): void {\n if (bytes.byteLength === 0) {\n return;\n }\n new Uint8Array(memory.buffer, ptr, bytes.byteLength).set(bytes);\n}\n\nfunction readAndFreeOutput(wasm: BsdiffExports): Uint8Array {\n const outPtr = wasm.output_ptr();\n const outLen = wasm.output_len();\n\n if (outLen === 0) {\n wasm.free_output();\n return new Uint8Array();\n }\n\n const output = new Uint8Array(wasm.memory.buffer, outPtr, outLen);\n const copied = new Uint8Array(output);\n wasm.free_output();\n return copied;\n}\n\nfunction mapPatchError(status: number): HdiffError {\n if (status === BsdiffStatus.INVALID_INPUT) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Invalid input bytes provided to bsdiff wasm\",\n );\n }\n if (status === BsdiffStatus.PATCH_FAILED) {\n return new HdiffError(\"PATCH_FAILED\", \"Failed to generate BSDIFF40 patch\");\n }\n if (status === BsdiffStatus.INVALID_PATCH) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Unexpected patch-validation status while creating patch\",\n );\n }\n return new HdiffError(\n \"PATCH_FAILED\",\n `Unknown bsdiff wasm status: ${status}`,\n );\n}\n\nfunction mapApplyError(status: number): HdiffError {\n if (status === BsdiffStatus.INVALID_INPUT) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Invalid input bytes provided to bspatch wasm\",\n );\n }\n if (status === BsdiffStatus.INVALID_PATCH) {\n return new HdiffError(\"PATCH_FAILED\", \"Invalid BSDIFF40 patch bytes\");\n }\n if (status === BsdiffStatus.PATCH_FAILED) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Unexpected patch-generation status while applying patch\",\n );\n }\n return new HdiffError(\n \"PATCH_FAILED\",\n `Unknown bspatch wasm status: ${status}`,\n );\n}\n\nasync function getBsdiffWasm(): Promise<BsdiffExports> {\n wasmPromise ??= loadBsdiffWasm();\n return wasmPromise;\n}\n\nasync function loadBsdiffWasm(): Promise<BsdiffExports> {\n const precompiled = getPrecompiledBsdiffModule();\n const directExports = asBsdiffExports(precompiled);\n if (directExports) {\n return directExports;\n }\n\n if (isWasmModuleLike(precompiled)) {\n const instance = await WebAssembly.instantiate(precompiled);\n return toBsdiffExports(instance.exports);\n }\n\n throw new HdiffError(\n \"PATCH_FAILED\",\n \"No precompiled bsdiff WASM configured. Import a runtime entry such as hermes-bundle-diff/node, /bun, /deno, or /worker.\",\n );\n}\n\nfunction getPrecompiledBsdiffModule(): unknown {\n const hdiffGlobal = globalThis as {\n __HDIFF_PRECOMPILED_WASM__?: unknown;\n __HDIFF_PRECOMPILED_BSDIFF_WASM__?: unknown;\n };\n\n const mod =\n hdiffGlobal.__HDIFF_PRECOMPILED_BSDIFF_WASM__ ??\n hdiffGlobal.__HDIFF_PRECOMPILED_WASM__;\n if (mod && typeof mod === \"object\" && \"default\" in mod) {\n return (mod as { default?: unknown }).default;\n }\n return mod;\n}\n\nfunction isWasmModuleLike(mod: unknown): mod is WebAssembly.Module {\n if (mod instanceof WebAssembly.Module) {\n return true;\n }\n return Object.prototype.toString.call(mod) === \"[object WebAssembly.Module]\";\n}\n\nfunction isWasmMemoryLike(memory: unknown): memory is WebAssembly.Memory {\n if (memory instanceof WebAssembly.Memory) {\n return true;\n }\n return (\n Object.prototype.toString.call(memory) === \"[object WebAssembly.Memory]\"\n );\n}\n\nfunction toBsdiffExports(source: unknown): BsdiffExports {\n const direct = asBsdiffExports(source);\n if (direct) {\n return direct;\n }\n\n throw new HdiffError(\"PATCH_FAILED\", \"bsdiff wasm exports are incomplete\");\n}\n\nfunction asBsdiffExports(source: unknown): BsdiffExports | undefined {\n if (source && typeof source === \"object\") {\n const maybe = source as Partial<BsdiffExports>;\n if (\n isWasmMemoryLike(maybe.memory) &&\n typeof maybe.alloc === \"function\" &&\n typeof maybe.dealloc === \"function\" &&\n typeof maybe.create_patch === \"function\" &&\n typeof maybe.apply_patch === \"function\" &&\n typeof maybe.output_ptr === \"function\" &&\n typeof maybe.output_len === \"function\" &&\n typeof maybe.free_output === \"function\"\n ) {\n return maybe as BsdiffExports;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bsdiff.js","names":[],"sources":["../../src/internal/bsdiff.ts"],"sourcesContent":["import { HdiffError } from \"../errors.js\";\n\ntype BsdiffExports = {\n memory: WebAssembly.Memory;\n alloc: (len: number) => number;\n dealloc: (ptr: number, len: number) => void;\n create_patch: (\n basePtr: number,\n baseLen: number,\n nextPtr: number,\n nextLen: number,\n ) => number;\n apply_patch: (\n basePtr: number,\n baseLen: number,\n patchPtr: number,\n patchLen: number,\n ) => number;\n output_ptr: () => number;\n output_len: () => number;\n free_output: () => void;\n};\n\nenum BsdiffStatus {\n OK = 0,\n INVALID_INPUT = 1,\n PATCH_FAILED = 2,\n INVALID_PATCH = 3,\n}\n\nlet wasmPromise: Promise<BsdiffExports> | undefined;\n\nexport async function createBsdiffPatch(\n base: Uint8Array,\n next: Uint8Array,\n): Promise<Uint8Array> {\n const wasm = await getBsdiffWasm();\n\n const status = runBinaryOperation(\n wasm,\n base,\n next,\n (basePtr, baseLen, nextPtr, nextLen) =>\n wasm.create_patch(basePtr, baseLen, nextPtr, nextLen),\n );\n\n if (status !== BsdiffStatus.OK) {\n throw mapPatchError(status);\n }\n\n return readAndFreeOutput(wasm);\n}\n\nexport async function applyBsdiffPatch(\n base: Uint8Array,\n patch: Uint8Array,\n): Promise<Uint8Array> {\n const wasm = await getBsdiffWasm();\n\n const status = runBinaryOperation(\n wasm,\n base,\n patch,\n (basePtr, baseLen, patchPtr, patchLen) =>\n wasm.apply_patch(basePtr, baseLen, patchPtr, patchLen),\n );\n\n if (status !== BsdiffStatus.OK) {\n throw mapApplyError(status);\n }\n\n return readAndFreeOutput(wasm);\n}\n\nfunction runBinaryOperation(\n wasm: BsdiffExports,\n left: Uint8Array,\n right: Uint8Array,\n run: (\n leftPtr: number,\n leftLen: number,\n rightPtr: number,\n rightLen: number,\n ) => number,\n): number {\n const leftPtr = wasm.alloc(left.byteLength);\n const rightPtr = wasm.alloc(right.byteLength);\n\n try {\n writeBytesToMemory(wasm.memory, leftPtr, left);\n writeBytesToMemory(wasm.memory, rightPtr, right);\n return run(leftPtr, left.byteLength, rightPtr, right.byteLength);\n } finally {\n if (left.byteLength > 0) {\n wasm.dealloc(leftPtr, left.byteLength);\n }\n if (right.byteLength > 0) {\n wasm.dealloc(rightPtr, right.byteLength);\n }\n }\n}\n\nfunction writeBytesToMemory(\n memory: WebAssembly.Memory,\n ptr: number,\n bytes: Uint8Array,\n): void {\n if (bytes.byteLength === 0) {\n return;\n }\n new Uint8Array(memory.buffer, ptr, bytes.byteLength).set(bytes);\n}\n\nfunction readAndFreeOutput(wasm: BsdiffExports): Uint8Array {\n const outPtr = wasm.output_ptr();\n const outLen = wasm.output_len();\n\n if (outLen === 0) {\n wasm.free_output();\n return new Uint8Array();\n }\n\n const output = new Uint8Array(wasm.memory.buffer, outPtr, outLen);\n const copied = new Uint8Array(output);\n wasm.free_output();\n return copied;\n}\n\nfunction mapPatchError(status: number): HdiffError {\n if (status === BsdiffStatus.INVALID_INPUT) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Invalid input bytes provided to bsdiff wasm\",\n );\n }\n if (status === BsdiffStatus.PATCH_FAILED) {\n return new HdiffError(\"PATCH_FAILED\", \"Failed to generate BSDIFF40 patch\");\n }\n if (status === BsdiffStatus.INVALID_PATCH) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Unexpected patch-validation status while creating patch\",\n );\n }\n return new HdiffError(\n \"PATCH_FAILED\",\n `Unknown bsdiff wasm status: ${status}`,\n );\n}\n\nfunction mapApplyError(status: number): HdiffError {\n if (status === BsdiffStatus.INVALID_INPUT) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Invalid input bytes provided to bspatch wasm\",\n );\n }\n if (status === BsdiffStatus.INVALID_PATCH) {\n return new HdiffError(\"PATCH_FAILED\", \"Invalid BSDIFF40 patch bytes\");\n }\n if (status === BsdiffStatus.PATCH_FAILED) {\n return new HdiffError(\n \"PATCH_FAILED\",\n \"Unexpected patch-generation status while applying patch\",\n );\n }\n return new HdiffError(\n \"PATCH_FAILED\",\n `Unknown bspatch wasm status: ${status}`,\n );\n}\n\nasync function getBsdiffWasm(): Promise<BsdiffExports> {\n wasmPromise ??= loadBsdiffWasm();\n return wasmPromise;\n}\n\nasync function loadBsdiffWasm(): Promise<BsdiffExports> {\n const precompiled = getPrecompiledBsdiffModule();\n const directExports = asBsdiffExports(precompiled);\n if (directExports) {\n return directExports;\n }\n\n if (isWasmModuleLike(precompiled)) {\n const instance = await WebAssembly.instantiate(precompiled);\n return toBsdiffExports(instance.exports);\n }\n\n throw new HdiffError(\n \"PATCH_FAILED\",\n \"No precompiled bsdiff WASM configured. Import a runtime entry such as @hot-updater/bsdiff/node, /bun, /deno, or /worker.\",\n );\n}\n\nfunction getPrecompiledBsdiffModule(): unknown {\n const hdiffGlobal = globalThis as {\n __HDIFF_PRECOMPILED_WASM__?: unknown;\n __HDIFF_PRECOMPILED_BSDIFF_WASM__?: unknown;\n };\n\n const mod =\n hdiffGlobal.__HDIFF_PRECOMPILED_BSDIFF_WASM__ ??\n hdiffGlobal.__HDIFF_PRECOMPILED_WASM__;\n if (mod && typeof mod === \"object\" && \"default\" in mod) {\n return (mod as { default?: unknown }).default;\n }\n return mod;\n}\n\nfunction isWasmModuleLike(mod: unknown): mod is WebAssembly.Module {\n if (mod instanceof WebAssembly.Module) {\n return true;\n }\n return Object.prototype.toString.call(mod) === \"[object WebAssembly.Module]\";\n}\n\nfunction isWasmMemoryLike(memory: unknown): memory is WebAssembly.Memory {\n if (memory instanceof WebAssembly.Memory) {\n return true;\n }\n return (\n Object.prototype.toString.call(memory) === \"[object WebAssembly.Memory]\"\n );\n}\n\nfunction toBsdiffExports(source: unknown): BsdiffExports {\n const direct = asBsdiffExports(source);\n if (direct) {\n return direct;\n }\n\n throw new HdiffError(\"PATCH_FAILED\", \"bsdiff wasm exports are incomplete\");\n}\n\nfunction asBsdiffExports(source: unknown): BsdiffExports | undefined {\n if (source && typeof source === \"object\") {\n const maybe = source as Partial<BsdiffExports>;\n if (\n isWasmMemoryLike(maybe.memory) &&\n typeof maybe.alloc === \"function\" &&\n typeof maybe.dealloc === \"function\" &&\n typeof maybe.create_patch === \"function\" &&\n typeof maybe.apply_patch === \"function\" &&\n typeof maybe.output_ptr === \"function\" &&\n typeof maybe.output_len === \"function\" &&\n typeof maybe.free_output === \"function\"\n ) {\n return maybe as BsdiffExports;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
@@ -38,7 +38,7 @@ async function loadHermesValidator() {
38
38
  const directExports = asHermesExports(precompiled);
39
39
  if (directExports) return directExports;
40
40
  if (isWasmModuleLike(precompiled)) return toHermesExports((await WebAssembly.instantiate(precompiled)).exports);
41
- throw new HdiffError("INVALID_HBC", "No precompiled Hermes validator WASM configured. Import a runtime entry such as hermes-bundle-diff/node, /bun, /deno, or /worker.");
41
+ throw new HdiffError("INVALID_HBC", "No precompiled Hermes validator WASM configured. Import a runtime entry such as @hot-updater/bsdiff/node, /bun, /deno, or /worker.");
42
42
  }
43
43
  function getPrecompiledHermesModule() {
44
44
  const hdiffGlobal = globalThis;
@@ -1 +1 @@
1
- {"version":3,"file":"hermes-validate.js","names":[],"sources":["../../src/internal/hermes-validate.ts"],"sourcesContent":["import { HdiffError } from \"../errors.js\";\n\ntype HermesValidateExports = {\n memory: WebAssembly.Memory;\n validate: (ptr: number, len: number) => number;\n version: (ptr: number) => number;\n alloc?: (len: number) => number;\n dealloc?: (ptr: number, len: number) => void;\n};\n\ntype ValidatedHbc = {\n version: number;\n};\n\nenum ValidateCode {\n OK = 0,\n TOO_SMALL = 1,\n INVALID_MAGIC = 2,\n DELTA_MAGIC = 3,\n INVALID_LENGTH = 4,\n}\n\nlet wasmPromise: Promise<HermesValidateExports> | undefined;\n\nexport async function validateExecutionHbc(\n input: Uint8Array,\n): Promise<ValidatedHbc> {\n const wasm = await getHermesValidator();\n if (typeof wasm.alloc === \"function\" && typeof wasm.dealloc === \"function\") {\n const ptr = wasm.alloc(input.byteLength);\n try {\n if (input.byteLength > 0) {\n new Uint8Array(wasm.memory.buffer, ptr, input.byteLength).set(input);\n }\n\n const code = wasm.validate(ptr, input.byteLength);\n if (code !== ValidateCode.OK) {\n throw mapValidationError(code);\n }\n\n return { version: wasm.version(ptr) >>> 0 };\n } finally {\n if (input.byteLength > 0) {\n wasm.dealloc(ptr, input.byteLength);\n }\n }\n }\n\n ensureMemorySize(wasm.memory, input.byteLength);\n const view = new Uint8Array(wasm.memory.buffer, 0, input.byteLength);\n view.set(input);\n\n const code = wasm.validate(0, input.byteLength);\n if (code !== ValidateCode.OK) {\n throw mapValidationError(code);\n }\n\n return { version: wasm.version(0) >>> 0 };\n}\n\nasync function getHermesValidator(): Promise<HermesValidateExports> {\n wasmPromise ??= loadHermesValidator();\n return wasmPromise;\n}\n\nasync function loadHermesValidator(): Promise<HermesValidateExports> {\n const precompiled = getPrecompiledHermesModule();\n const directExports = asHermesExports(precompiled);\n if (directExports) {\n return directExports;\n }\n\n if (isWasmModuleLike(precompiled)) {\n const instance = await WebAssembly.instantiate(precompiled);\n return toHermesExports(instance.exports);\n }\n\n throw new HdiffError(\n \"INVALID_HBC\",\n \"No precompiled Hermes validator WASM configured. Import a runtime entry such as hermes-bundle-diff/node, /bun, /deno, or /worker.\",\n );\n}\n\nfunction getPrecompiledHermesModule(): unknown {\n const hdiffGlobal = globalThis as {\n __HDIFF_PRECOMPILED_WASM__?: unknown;\n __HDIFF_PRECOMPILED_HERMES_HBC_WASM__?: unknown;\n };\n\n const mod =\n hdiffGlobal.__HDIFF_PRECOMPILED_HERMES_HBC_WASM__ ??\n hdiffGlobal.__HDIFF_PRECOMPILED_WASM__;\n if (mod && typeof mod === \"object\" && \"default\" in mod) {\n return (mod as { default?: unknown }).default;\n }\n return mod;\n}\n\nfunction ensureMemorySize(\n memory: WebAssembly.Memory,\n requiredBytes: number,\n): void {\n const pageSize = 64 * 1024;\n const currentBytes = memory.buffer.byteLength;\n if (currentBytes >= requiredBytes) {\n return;\n }\n\n const bytesNeeded = requiredBytes - currentBytes;\n const additionalPages = Math.ceil(bytesNeeded / pageSize);\n memory.grow(additionalPages);\n}\n\nfunction mapValidationError(code: number): HdiffError {\n if (code === ValidateCode.DELTA_MAGIC) {\n return new HdiffError(\n \"NON_EXECUTION_FORM\",\n \"Input HBC is delta-form. execution-form HBC is required.\",\n );\n }\n if (\n code === ValidateCode.TOO_SMALL ||\n code === ValidateCode.INVALID_MAGIC ||\n code === ValidateCode.INVALID_LENGTH\n ) {\n return new HdiffError(\n \"INVALID_HBC\",\n \"Input is not a valid execution-form HBC\",\n );\n }\n return new HdiffError(\n \"INVALID_HBC\",\n `Unknown Hermes validation error: ${code}`,\n );\n}\n\nfunction isWasmModuleLike(mod: unknown): mod is WebAssembly.Module {\n if (mod instanceof WebAssembly.Module) {\n return true;\n }\n return Object.prototype.toString.call(mod) === \"[object WebAssembly.Module]\";\n}\n\nfunction isWasmMemoryLike(memory: unknown): memory is WebAssembly.Memory {\n if (memory instanceof WebAssembly.Memory) {\n return true;\n }\n return (\n Object.prototype.toString.call(memory) === \"[object WebAssembly.Memory]\"\n );\n}\n\nfunction toHermesExports(source: unknown): HermesValidateExports {\n const direct = asHermesExports(source);\n if (direct) {\n return direct;\n }\n\n throw new HdiffError(\n \"INVALID_HBC\",\n \"Hermes validator WASM exports are incomplete\",\n );\n}\n\nfunction asHermesExports(source: unknown): HermesValidateExports | undefined {\n if (source && typeof source === \"object\") {\n const maybe = source as Partial<HermesValidateExports>;\n if (\n isWasmMemoryLike(maybe.memory) &&\n typeof maybe.validate === \"function\" &&\n typeof maybe.version === \"function\"\n ) {\n return maybe as HermesValidateExports;\n }\n }\n return undefined;\n}\n"],"mappings":";;;AAcA,IAAK,eAAL;AACE;AACA;AACA;AACA;AACA;;EALG,mBAMJ;AAED,IAAI;AAEJ,eAAsB,qBACpB,OACuB;CACvB,MAAM,OAAO,MAAM,oBAAoB;AACvC,KAAI,OAAO,KAAK,UAAU,cAAc,OAAO,KAAK,YAAY,YAAY;EAC1E,MAAM,MAAM,KAAK,MAAM,MAAM,WAAW;AACxC,MAAI;AACF,OAAI,MAAM,aAAa,EACrB,KAAI,WAAW,KAAK,OAAO,QAAQ,KAAK,MAAM,WAAW,CAAC,IAAI,MAAM;GAGtE,MAAM,OAAO,KAAK,SAAS,KAAK,MAAM,WAAW;AACjD,OAAI,SAAS,aAAa,GACxB,OAAM,mBAAmB,KAAK;AAGhC,UAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,KAAK,GAAG;YACnC;AACR,OAAI,MAAM,aAAa,EACrB,MAAK,QAAQ,KAAK,MAAM,WAAW;;;AAKzC,kBAAiB,KAAK,QAAQ,MAAM,WAAW;AAE/C,CADa,IAAI,WAAW,KAAK,OAAO,QAAQ,GAAG,MAAM,WAAW,CAC/D,IAAI,MAAM;CAEf,MAAM,OAAO,KAAK,SAAS,GAAG,MAAM,WAAW;AAC/C,KAAI,SAAS,aAAa,GACxB,OAAM,mBAAmB,KAAK;AAGhC,QAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,KAAK,GAAG;;AAG3C,eAAe,qBAAqD;AAClE,iBAAgB,qBAAqB;AACrC,QAAO;;AAGT,eAAe,sBAAsD;CACnE,MAAM,cAAc,4BAA4B;CAChD,MAAM,gBAAgB,gBAAgB,YAAY;AAClD,KAAI,cACF,QAAO;AAGT,KAAI,iBAAiB,YAAY,CAE/B,QAAO,iBADU,MAAM,YAAY,YAAY,YAAY,EAC3B,QAAQ;AAG1C,OAAM,IAAI,WACR,eACA,oIACD;;AAGH,SAAS,6BAAsC;CAC7C,MAAM,cAAc;CAKpB,MAAM,MACJ,YAAY,yCACZ,YAAY;AACd,KAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,IACjD,QAAQ,IAA8B;AAExC,QAAO;;AAGT,SAAS,iBACP,QACA,eACM;CACN,MAAM,WAAW,KAAK;CACtB,MAAM,eAAe,OAAO,OAAO;AACnC,KAAI,gBAAgB,cAClB;CAGF,MAAM,cAAc,gBAAgB;CACpC,MAAM,kBAAkB,KAAK,KAAK,cAAc,SAAS;AACzD,QAAO,KAAK,gBAAgB;;AAG9B,SAAS,mBAAmB,MAA0B;AACpD,KAAI,SAAS,aAAa,YACxB,QAAO,IAAI,WACT,sBACA,2DACD;AAEH,KACE,SAAS,aAAa,aACtB,SAAS,aAAa,iBACtB,SAAS,aAAa,eAEtB,QAAO,IAAI,WACT,eACA,0CACD;AAEH,QAAO,IAAI,WACT,eACA,oCAAoC,OACrC;;AAGH,SAAS,iBAAiB,KAAyC;AACjE,KAAI,eAAe,YAAY,OAC7B,QAAO;AAET,QAAO,OAAO,UAAU,SAAS,KAAK,IAAI,KAAK;;AAGjD,SAAS,iBAAiB,QAA+C;AACvE,KAAI,kBAAkB,YAAY,OAChC,QAAO;AAET,QACE,OAAO,UAAU,SAAS,KAAK,OAAO,KAAK;;AAI/C,SAAS,gBAAgB,QAAwC;CAC/D,MAAM,SAAS,gBAAgB,OAAO;AACtC,KAAI,OACF,QAAO;AAGT,OAAM,IAAI,WACR,eACA,+CACD;;AAGH,SAAS,gBAAgB,QAAoD;AAC3E,KAAI,UAAU,OAAO,WAAW,UAAU;EACxC,MAAM,QAAQ;AACd,MACE,iBAAiB,MAAM,OAAO,IAC9B,OAAO,MAAM,aAAa,cAC1B,OAAO,MAAM,YAAY,WAEzB,QAAO"}
1
+ {"version":3,"file":"hermes-validate.js","names":[],"sources":["../../src/internal/hermes-validate.ts"],"sourcesContent":["import { HdiffError } from \"../errors.js\";\n\ntype HermesValidateExports = {\n memory: WebAssembly.Memory;\n validate: (ptr: number, len: number) => number;\n version: (ptr: number) => number;\n alloc?: (len: number) => number;\n dealloc?: (ptr: number, len: number) => void;\n};\n\ntype ValidatedHbc = {\n version: number;\n};\n\nenum ValidateCode {\n OK = 0,\n TOO_SMALL = 1,\n INVALID_MAGIC = 2,\n DELTA_MAGIC = 3,\n INVALID_LENGTH = 4,\n}\n\nlet wasmPromise: Promise<HermesValidateExports> | undefined;\n\nexport async function validateExecutionHbc(\n input: Uint8Array,\n): Promise<ValidatedHbc> {\n const wasm = await getHermesValidator();\n if (typeof wasm.alloc === \"function\" && typeof wasm.dealloc === \"function\") {\n const ptr = wasm.alloc(input.byteLength);\n try {\n if (input.byteLength > 0) {\n new Uint8Array(wasm.memory.buffer, ptr, input.byteLength).set(input);\n }\n\n const code = wasm.validate(ptr, input.byteLength);\n if (code !== ValidateCode.OK) {\n throw mapValidationError(code);\n }\n\n return { version: wasm.version(ptr) >>> 0 };\n } finally {\n if (input.byteLength > 0) {\n wasm.dealloc(ptr, input.byteLength);\n }\n }\n }\n\n ensureMemorySize(wasm.memory, input.byteLength);\n const view = new Uint8Array(wasm.memory.buffer, 0, input.byteLength);\n view.set(input);\n\n const code = wasm.validate(0, input.byteLength);\n if (code !== ValidateCode.OK) {\n throw mapValidationError(code);\n }\n\n return { version: wasm.version(0) >>> 0 };\n}\n\nasync function getHermesValidator(): Promise<HermesValidateExports> {\n wasmPromise ??= loadHermesValidator();\n return wasmPromise;\n}\n\nasync function loadHermesValidator(): Promise<HermesValidateExports> {\n const precompiled = getPrecompiledHermesModule();\n const directExports = asHermesExports(precompiled);\n if (directExports) {\n return directExports;\n }\n\n if (isWasmModuleLike(precompiled)) {\n const instance = await WebAssembly.instantiate(precompiled);\n return toHermesExports(instance.exports);\n }\n\n throw new HdiffError(\n \"INVALID_HBC\",\n \"No precompiled Hermes validator WASM configured. Import a runtime entry such as @hot-updater/bsdiff/node, /bun, /deno, or /worker.\",\n );\n}\n\nfunction getPrecompiledHermesModule(): unknown {\n const hdiffGlobal = globalThis as {\n __HDIFF_PRECOMPILED_WASM__?: unknown;\n __HDIFF_PRECOMPILED_HERMES_HBC_WASM__?: unknown;\n };\n\n const mod =\n hdiffGlobal.__HDIFF_PRECOMPILED_HERMES_HBC_WASM__ ??\n hdiffGlobal.__HDIFF_PRECOMPILED_WASM__;\n if (mod && typeof mod === \"object\" && \"default\" in mod) {\n return (mod as { default?: unknown }).default;\n }\n return mod;\n}\n\nfunction ensureMemorySize(\n memory: WebAssembly.Memory,\n requiredBytes: number,\n): void {\n const pageSize = 64 * 1024;\n const currentBytes = memory.buffer.byteLength;\n if (currentBytes >= requiredBytes) {\n return;\n }\n\n const bytesNeeded = requiredBytes - currentBytes;\n const additionalPages = Math.ceil(bytesNeeded / pageSize);\n memory.grow(additionalPages);\n}\n\nfunction mapValidationError(code: number): HdiffError {\n if (code === ValidateCode.DELTA_MAGIC) {\n return new HdiffError(\n \"NON_EXECUTION_FORM\",\n \"Input HBC is delta-form. execution-form HBC is required.\",\n );\n }\n if (\n code === ValidateCode.TOO_SMALL ||\n code === ValidateCode.INVALID_MAGIC ||\n code === ValidateCode.INVALID_LENGTH\n ) {\n return new HdiffError(\n \"INVALID_HBC\",\n \"Input is not a valid execution-form HBC\",\n );\n }\n return new HdiffError(\n \"INVALID_HBC\",\n `Unknown Hermes validation error: ${code}`,\n );\n}\n\nfunction isWasmModuleLike(mod: unknown): mod is WebAssembly.Module {\n if (mod instanceof WebAssembly.Module) {\n return true;\n }\n return Object.prototype.toString.call(mod) === \"[object WebAssembly.Module]\";\n}\n\nfunction isWasmMemoryLike(memory: unknown): memory is WebAssembly.Memory {\n if (memory instanceof WebAssembly.Memory) {\n return true;\n }\n return (\n Object.prototype.toString.call(memory) === \"[object WebAssembly.Memory]\"\n );\n}\n\nfunction toHermesExports(source: unknown): HermesValidateExports {\n const direct = asHermesExports(source);\n if (direct) {\n return direct;\n }\n\n throw new HdiffError(\n \"INVALID_HBC\",\n \"Hermes validator WASM exports are incomplete\",\n );\n}\n\nfunction asHermesExports(source: unknown): HermesValidateExports | undefined {\n if (source && typeof source === \"object\") {\n const maybe = source as Partial<HermesValidateExports>;\n if (\n isWasmMemoryLike(maybe.memory) &&\n typeof maybe.validate === \"function\" &&\n typeof maybe.version === \"function\"\n ) {\n return maybe as HermesValidateExports;\n }\n }\n return undefined;\n}\n"],"mappings":";;;AAcA,IAAK,eAAL;AACE;AACA;AACA;AACA;AACA;;EALG,mBAMJ;AAED,IAAI;AAEJ,eAAsB,qBACpB,OACuB;CACvB,MAAM,OAAO,MAAM,oBAAoB;AACvC,KAAI,OAAO,KAAK,UAAU,cAAc,OAAO,KAAK,YAAY,YAAY;EAC1E,MAAM,MAAM,KAAK,MAAM,MAAM,WAAW;AACxC,MAAI;AACF,OAAI,MAAM,aAAa,EACrB,KAAI,WAAW,KAAK,OAAO,QAAQ,KAAK,MAAM,WAAW,CAAC,IAAI,MAAM;GAGtE,MAAM,OAAO,KAAK,SAAS,KAAK,MAAM,WAAW;AACjD,OAAI,SAAS,aAAa,GACxB,OAAM,mBAAmB,KAAK;AAGhC,UAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,KAAK,GAAG;YACnC;AACR,OAAI,MAAM,aAAa,EACrB,MAAK,QAAQ,KAAK,MAAM,WAAW;;;AAKzC,kBAAiB,KAAK,QAAQ,MAAM,WAAW;AAE/C,CADa,IAAI,WAAW,KAAK,OAAO,QAAQ,GAAG,MAAM,WAAW,CAC/D,IAAI,MAAM;CAEf,MAAM,OAAO,KAAK,SAAS,GAAG,MAAM,WAAW;AAC/C,KAAI,SAAS,aAAa,GACxB,OAAM,mBAAmB,KAAK;AAGhC,QAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,KAAK,GAAG;;AAG3C,eAAe,qBAAqD;AAClE,iBAAgB,qBAAqB;AACrC,QAAO;;AAGT,eAAe,sBAAsD;CACnE,MAAM,cAAc,4BAA4B;CAChD,MAAM,gBAAgB,gBAAgB,YAAY;AAClD,KAAI,cACF,QAAO;AAGT,KAAI,iBAAiB,YAAY,CAE/B,QAAO,iBADU,MAAM,YAAY,YAAY,YAAY,EAC3B,QAAQ;AAG1C,OAAM,IAAI,WACR,eACA,qIACD;;AAGH,SAAS,6BAAsC;CAC7C,MAAM,cAAc;CAKpB,MAAM,MACJ,YAAY,yCACZ,YAAY;AACd,KAAI,OAAO,OAAO,QAAQ,YAAY,aAAa,IACjD,QAAQ,IAA8B;AAExC,QAAO;;AAGT,SAAS,iBACP,QACA,eACM;CACN,MAAM,WAAW,KAAK;CACtB,MAAM,eAAe,OAAO,OAAO;AACnC,KAAI,gBAAgB,cAClB;CAGF,MAAM,cAAc,gBAAgB;CACpC,MAAM,kBAAkB,KAAK,KAAK,cAAc,SAAS;AACzD,QAAO,KAAK,gBAAgB;;AAG9B,SAAS,mBAAmB,MAA0B;AACpD,KAAI,SAAS,aAAa,YACxB,QAAO,IAAI,WACT,sBACA,2DACD;AAEH,KACE,SAAS,aAAa,aACtB,SAAS,aAAa,iBACtB,SAAS,aAAa,eAEtB,QAAO,IAAI,WACT,eACA,0CACD;AAEH,QAAO,IAAI,WACT,eACA,oCAAoC,OACrC;;AAGH,SAAS,iBAAiB,KAAyC;AACjE,KAAI,eAAe,YAAY,OAC7B,QAAO;AAET,QAAO,OAAO,UAAU,SAAS,KAAK,IAAI,KAAK;;AAGjD,SAAS,iBAAiB,QAA+C;AACvE,KAAI,kBAAkB,YAAY,OAChC,QAAO;AAET,QACE,OAAO,UAAU,SAAS,KAAK,OAAO,KAAK;;AAI/C,SAAS,gBAAgB,QAAwC;CAC/D,MAAM,SAAS,gBAAgB,OAAO;AACtC,KAAI,OACF,QAAO;AAGT,OAAM,IAAI,WACR,eACA,+CACD;;AAGH,SAAS,gBAAgB,QAAoD;AAC3E,KAAI,UAAU,OAAO,WAAW,UAAU;EACxC,MAAM,QAAQ;AACd,MACE,iBAAiB,MAAM,OAAO,IAC9B,OAAO,MAAM,aAAa,cAC1B,OAAO,MAAM,YAAY,WAEzB,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hot-updater/bsdiff",
3
- "version": "0.25.13",
3
+ "version": "0.26.0",
4
4
  "description": "Hot Updater BSdiff library that produces BSDIFF40 patches for RN bspatch flows",
5
5
  "type": "module",
6
6
  "main": "./dist/node.js",
@@ -51,6 +51,7 @@
51
51
  "bspatch",
52
52
  "react-native"
53
53
  ],
54
+ "repository": "https://github.com/gronxb/hot-updater",
54
55
  "devDependencies": {
55
56
  "@types/node": "^25.3.2",
56
57
  "tsdown": "0.21.0-beta.2",
@@ -16,18 +16,41 @@ const config = JSON.parse(readFileSync(configPath, "utf8"));
16
16
  const cargoBin = config.tools?.cargo || "cargo";
17
17
  const rustupBin = config.tools?.rustup || "rustup";
18
18
  const target = resolveBuildTarget(config.wasm || {});
19
+ const missingRustTools = getMissingRustTools(cargoBin, rustupBin);
20
+
21
+ if (missingRustTools.length > 0) {
22
+ if (!existsSync(target.outputWasm)) {
23
+ throw new Error(
24
+ `[wasm] missing Rust toolchain binaries (${missingRustTools.join(", ")}). Install rustup/cargo or restore precompiled wasm at ${target.outputWasm}`,
25
+ );
26
+ }
27
+
28
+ console.log(
29
+ `[wasm] skipping Rust build; missing binaries: ${missingRustTools.join(", ")}`,
30
+ );
31
+ console.log(`[wasm] using precompiled ${target.outputWasm}`);
32
+ console.log(`[wasm] sha256 ${sha256File(target.outputWasm)}`);
33
+ process.exit(0);
34
+ }
19
35
 
20
36
  ensureRustTargetInstalled(rustupBin, target.rustTarget);
21
37
 
22
38
  console.log(`[wasm] building ${target.manifestPath}`);
23
- execFileSync(
24
- cargoBin,
25
- ["build", "--manifest-path", target.manifestPath, "--target", target.rustTarget, "--release"],
26
- { stdio: "inherit" }
27
- );
39
+ execFileSync(cargoBin, [
40
+ "build",
41
+ "--manifest-path",
42
+ target.manifestPath,
43
+ "--target",
44
+ target.rustTarget,
45
+ "--release",
46
+ ], {
47
+ stdio: "inherit",
48
+ });
28
49
 
29
50
  if (!existsSync(target.sourceWasm)) {
30
- throw new Error(`[wasm] build succeeded but wasm output is missing: ${target.sourceWasm}`);
51
+ throw new Error(
52
+ `[wasm] build succeeded but wasm output is missing: ${target.sourceWasm}`,
53
+ );
31
54
  }
32
55
 
33
56
  mkdirSync(path.dirname(target.outputWasm), { recursive: true });
@@ -77,6 +100,26 @@ function ensureRustTargetInstalled(rustup, target) {
77
100
  execFileSync(rustup, ["target", "add", target], { stdio: "inherit" });
78
101
  }
79
102
 
103
+ function getMissingRustTools(cargo, rustup) {
104
+ const missing = [];
105
+ if (!canRun(cargo, ["--version"])) {
106
+ missing.push(cargo);
107
+ }
108
+ if (!canRun(rustup, ["--version"])) {
109
+ missing.push(rustup);
110
+ }
111
+ return missing;
112
+ }
113
+
114
+ function canRun(bin, args) {
115
+ try {
116
+ execFileSync(bin, args, { stdio: ["ignore", "ignore", "ignore"] });
117
+ return true;
118
+ } catch {
119
+ return false;
120
+ }
121
+ }
122
+
80
123
  function readCargoPackageName(manifestPath) {
81
124
  const raw = readFileSync(manifestPath, "utf8");
82
125
  const packageSection = raw.match(/\[package\]([\s\S]*?)(?:\n\s*\[|$)/)?.[1] ?? "";