@qntx/nostr 0.9.0 → 0.10.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.
@@ -1,220 +0,0 @@
1
- import { b as WasmPoisonedError, m as CryptoError } from "./util-DMF9AIO0.mjs";
2
- import { t as createEventVerifier } from "./verifier-uC_jd-Nw.mjs";
3
- //#region src/wasm/abi.ts
4
- /** Imports 0.2.122 may request. Instantiation fails if anything else appears. */
5
- const ALLOWED_WASM_IMPORTS = [{
6
- module: "wbg",
7
- name: "__wbindgen_throw"
8
- }, {
9
- module: "./nostr_crypto_wasm_bg.js",
10
- name: "__wbindgen_throw"
11
- }];
12
- const utf8 = new TextDecoder();
13
- function decodeUtf8(memory, ptr, len) {
14
- return utf8.decode(new Uint8Array(memory.buffer, ptr, len));
15
- }
16
- function makeWbgImports(holder) {
17
- const throwRuntime = (ptr, len) => {
18
- const mem = holder.exports?.memory;
19
- const msg = mem ? decodeUtf8(mem, ptr, len) : "wasm panic";
20
- throw new WebAssembly.RuntimeError(msg);
21
- };
22
- const wbg = { __wbindgen_throw: throwRuntime };
23
- return {
24
- wbg,
25
- "./nostr_crypto_wasm_bg.js": wbg
26
- };
27
- }
28
- /** Fail if the module imports anything outside {@link ALLOWED_WASM_IMPORTS}. */
29
- function assertAllowedWasmImports(mod) {
30
- const allowed = new Set(ALLOWED_WASM_IMPORTS.map((item) => `${item.module}\0${item.name}`));
31
- for (const imp of WebAssembly.Module.imports(mod)) {
32
- if (imp.kind !== "function") throw new TypeError(`unexpected wasm import kind ${imp.kind}: ${imp.module}.${imp.name}`);
33
- if (!allowed.has(`${imp.module}\0${imp.name}`)) throw new TypeError(`unexpected wasm import ${imp.module}.${imp.name}`);
34
- }
35
- }
36
- function requireMemory(value) {
37
- if (!(value instanceof WebAssembly.Memory)) throw new TypeError("wasm missing memory export");
38
- return value;
39
- }
40
- function requireFn(value, name) {
41
- if (typeof value !== "function") throw new TypeError(`wasm missing ${name} export`);
42
- return value;
43
- }
44
- function asExports(raw) {
45
- const exports = {
46
- memory: requireMemory(raw["memory"]),
47
- verify: requireFn(raw["verify"], "verify"),
48
- verify_serialized: requireFn(raw["verify_serialized"], "verify_serialized"),
49
- sign: requireFn(raw["sign"], "sign"),
50
- public_key: requireFn(raw["public_key"], "public_key"),
51
- __wbindgen_export: requireFn(raw["__wbindgen_export"], "__wbindgen_export"),
52
- __wbindgen_export2: requireFn(raw["__wbindgen_export2"], "__wbindgen_export2"),
53
- __wbindgen_add_to_stack_pointer: requireFn(raw["__wbindgen_add_to_stack_pointer"], "__wbindgen_add_to_stack_pointer")
54
- };
55
- const start = raw["__wbindgen_start"];
56
- if (typeof start === "function") exports.__wbindgen_start = requireFn(start, "__wbindgen_start");
57
- return exports;
58
- }
59
- function passBytes(exports, bytes) {
60
- const len = bytes.length;
61
- const ptr = exports.__wbindgen_export(len, 1) >>> 0;
62
- new Uint8Array(exports.memory.buffer, ptr, len).set(bytes);
63
- return {
64
- ptr,
65
- len
66
- };
67
- }
68
- function wasmVerify(exports, id, pubkey, sig) {
69
- const idP = passBytes(exports, id);
70
- const pkP = passBytes(exports, pubkey);
71
- const sigP = passBytes(exports, sig);
72
- return exports.verify(idP.ptr, idP.len, pkP.ptr, pkP.len, sigP.ptr, sigP.len) !== 0;
73
- }
74
- function wasmVerifySerialized(exports, serialized, id, pubkey, sig) {
75
- const serP = passBytes(exports, serialized);
76
- const idP = passBytes(exports, id);
77
- const pkP = passBytes(exports, pubkey);
78
- const sigP = passBytes(exports, sig);
79
- return exports.verify_serialized(serP.ptr, serP.len, idP.ptr, idP.len, pkP.ptr, pkP.len, sigP.ptr, sigP.len) !== 0;
80
- }
81
- function takeBytes(exports, ptr, len) {
82
- const out = new Uint8Array(len);
83
- if (len > 0) {
84
- out.set(new Uint8Array(exports.memory.buffer, ptr, len));
85
- exports.__wbindgen_export2(ptr, len, 1);
86
- }
87
- return out;
88
- }
89
- function callReturningBytes(exports, invoke) {
90
- const retptr = exports.__wbindgen_add_to_stack_pointer(-16);
91
- try {
92
- invoke(retptr);
93
- const view = new DataView(exports.memory.buffer);
94
- return takeBytes(exports, view.getUint32(retptr, true), view.getUint32(retptr + 4, true));
95
- } finally {
96
- exports.__wbindgen_add_to_stack_pointer(16);
97
- }
98
- }
99
- function wasmSign(exports, id, seckey, aux) {
100
- const idP = passBytes(exports, id);
101
- const skP = passBytes(exports, seckey);
102
- const auxP = passBytes(exports, aux);
103
- return callReturningBytes(exports, (retptr) => {
104
- exports.sign(retptr, idP.ptr, idP.len, skP.ptr, skP.len, auxP.ptr, auxP.len);
105
- });
106
- }
107
- function wasmPublicKey(exports, seckey) {
108
- const skP = passBytes(exports, seckey);
109
- return callReturningBytes(exports, (retptr) => {
110
- exports.public_key(retptr, skP.ptr, skP.len);
111
- });
112
- }
113
- async function instantiateCryptoWasm(bytes) {
114
- const holder = {};
115
- const { module, instance } = await WebAssembly.instantiate(bytes, makeWbgImports(holder));
116
- assertAllowedWasmImports(module);
117
- holder.exports = asExports(instance.exports);
118
- holder.exports.__wbindgen_start?.();
119
- return holder.exports;
120
- }
121
- //#endregion
122
- //#region src/wasm/adapter.ts
123
- /**
124
- * Run `fn` unless the instance is already poisoned; a `WebAssembly.RuntimeError` aborts the
125
- * instance, so it is converted to {@link WasmPoisonedError} and rethrown on every later call.
126
- */
127
- function runPoisoned(poison, fn) {
128
- if (poison.error !== void 0) throw poison.error;
129
- try {
130
- return fn();
131
- } catch (error) {
132
- if (error instanceof WebAssembly.RuntimeError) {
133
- poison.error = new WasmPoisonedError("wasm instance aborted", { cause: error });
134
- throw poison.error;
135
- }
136
- throw error;
137
- }
138
- }
139
- /**
140
- * Build the WASM event verifier on {@link createEventVerifier}. A `WebAssembly.RuntimeError` from
141
- * the module means the instance aborted — it poisons every later call with the same
142
- * `WasmPoisonedError`; any other backend error verifies `false` (the event is marked failed).
143
- */
144
- function createWasmEventVerifier(verifySerialized, poison) {
145
- const backend = (serializedUtf8, id, pubkey, sig) => {
146
- try {
147
- return runPoisoned(poison, () => verifySerialized(serializedUtf8, id, pubkey, sig));
148
- } catch (error) {
149
- if (error instanceof WasmPoisonedError) throw error;
150
- return false;
151
- }
152
- };
153
- return createEventVerifier(backend);
154
- }
155
- //#endregion
156
- //#region src/wasm/instance.ts
157
- function isWasmBytes(value) {
158
- return value instanceof ArrayBuffer || ArrayBuffer.isView(value);
159
- }
160
- async function fetchWasmUrl(url) {
161
- const res = await fetch(url);
162
- if (!res.ok) throw new CryptoError(`failed to fetch wasm: ${res.status} ${url.href}`);
163
- return new Uint8Array(await res.arrayBuffer());
164
- }
165
- function requireByteLength(bytes, expected, label) {
166
- if (bytes.length !== expected) throw new CryptoError(`invalid ${label} length: expected ${expected}, got ${bytes.length}`);
167
- }
168
- function bindExports(exports) {
169
- const poison = {};
170
- const rawSerialized = (serializedUtf8, id, pubkey, sig) => wasmVerifySerialized(exports, serializedUtf8, id, pubkey, sig);
171
- return {
172
- verify: (id, pubkey, sig) => runPoisoned(poison, () => wasmVerify(exports, id, pubkey, sig)),
173
- verifySerialized: (serializedUtf8, id, pubkey, sig) => runPoisoned(poison, () => rawSerialized(serializedUtf8, id, pubkey, sig)),
174
- verifyEvent: createWasmEventVerifier(rawSerialized, poison),
175
- sign: (id, seckey, aux) => runPoisoned(poison, () => {
176
- requireByteLength(id, 32, "id");
177
- requireByteLength(seckey, 32, "secret key");
178
- requireByteLength(aux, 32, "aux");
179
- const sig = wasmSign(exports, id, seckey, aux);
180
- if (sig.length !== 64) throw new CryptoError("wasm sign failed");
181
- return sig;
182
- }),
183
- publicKey: (seckey) => runPoisoned(poison, () => {
184
- requireByteLength(seckey, 32, "secret key");
185
- const pk = wasmPublicKey(exports, seckey);
186
- if (pk.length !== 32) throw new CryptoError("wasm publicKey failed");
187
- return pk;
188
- })
189
- };
190
- }
191
- /** Builds a loader that interns a single instance per module slot. */
192
- function createNostrWasmLoader(wasmBytes) {
193
- let interned;
194
- async function instantiate(opts) {
195
- return bindExports(await instantiateCryptoWasm(await wasmBytes(opts)));
196
- }
197
- /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */
198
- async function loadNostrWasm(opts) {
199
- if (interned) return interned;
200
- const pending = instantiate(opts);
201
- interned = pending;
202
- try {
203
- return await pending;
204
- } catch (error) {
205
- if (interned === pending) interned = void 0;
206
- throw error;
207
- }
208
- }
209
- function resetNostrWasm() {
210
- interned = void 0;
211
- }
212
- return {
213
- loadNostrWasm,
214
- resetNostrWasm
215
- };
216
- }
217
- //#endregion
218
- export { fetchWasmUrl as n, isWasmBytes as r, createNostrWasmLoader as t };
219
-
220
- //# sourceMappingURL=instance-CI_IaZpf.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instance-CI_IaZpf.mjs","names":[],"sources":["../src/wasm/abi.ts","../src/wasm/adapter.ts","../src/wasm/instance.ts"],"sourcesContent":["/** Wasm-bindgen 0.2.122 bundler-produced exports used by interned TS glue. */\nexport type CryptoWasmExports = {\n memory: WebAssembly.Memory;\n verify: (\n idPtr: number,\n idLen: number,\n pkPtr: number,\n pkLen: number,\n sigPtr: number,\n sigLen: number,\n ) => number;\n verify_serialized: (\n serPtr: number,\n serLen: number,\n idPtr: number,\n idLen: number,\n pkPtr: number,\n pkLen: number,\n sigPtr: number,\n sigLen: number,\n ) => number;\n sign: (\n retptr: number,\n idPtr: number,\n idLen: number,\n skPtr: number,\n skLen: number,\n auxPtr: number,\n auxLen: number,\n ) => void;\n public_key: (retptr: number, skPtr: number, skLen: number) => void;\n /** 0.2.122 name for `__wbindgen_malloc(size, align)`. */\n __wbindgen_export: (size: number, align: number) => number;\n /** 0.2.122 name for `__wbindgen_free(ptr, size, align)` after malloc claimed `__wbindgen_export`. */\n __wbindgen_export2: (ptr: number, size: number, align: number) => void;\n __wbindgen_add_to_stack_pointer: (delta: number) => number;\n __wbindgen_start?: () => void;\n};\n\n/** Imports 0.2.122 may request. Instantiation fails if anything else appears. */\nexport const ALLOWED_WASM_IMPORTS: ReadonlyArray<{ module: string; name: string }> = [\n { module: \"wbg\", name: \"__wbindgen_throw\" },\n { module: \"./nostr_crypto_wasm_bg.js\", name: \"__wbindgen_throw\" },\n];\n\nconst utf8 = new TextDecoder();\n\nfunction decodeUtf8(memory: WebAssembly.Memory, ptr: number, len: number): string {\n return utf8.decode(new Uint8Array(memory.buffer, ptr, len));\n}\n\nfunction makeWbgImports(holder: { exports?: CryptoWasmExports }): WebAssembly.Imports {\n const throwRuntime = (ptr: number, len: number): never => {\n const mem = holder.exports?.memory;\n const msg = mem ? decodeUtf8(mem, ptr, len) : \"wasm panic\";\n throw new WebAssembly.RuntimeError(msg);\n };\n const wbg = {\n __wbindgen_throw: throwRuntime,\n };\n return {\n wbg,\n \"./nostr_crypto_wasm_bg.js\": wbg,\n };\n}\n\n/** Fail if the module imports anything outside {@link ALLOWED_WASM_IMPORTS}. */\nexport function assertAllowedWasmImports(mod: WebAssembly.Module): void {\n const allowed = new Set(ALLOWED_WASM_IMPORTS.map((item) => `${item.module}\\0${item.name}`));\n for (const imp of WebAssembly.Module.imports(mod)) {\n if (imp.kind !== \"function\") {\n throw new TypeError(`unexpected wasm import kind ${imp.kind}: ${imp.module}.${imp.name}`);\n }\n if (!allowed.has(`${imp.module}\\0${imp.name}`)) {\n throw new TypeError(`unexpected wasm import ${imp.module}.${imp.name}`);\n }\n }\n}\n\nfunction requireMemory(value: WebAssembly.ExportValue | undefined): WebAssembly.Memory {\n if (!(value instanceof WebAssembly.Memory)) {\n throw new TypeError(\"wasm missing memory export\");\n }\n return value;\n}\n\n// oxlint-disable-next-line no-unnecessary-type-parameters -- T binds the declared ABI signature at each call site\nfunction requireFn<T extends (...args: number[]) => unknown>(\n value: WebAssembly.ExportValue | undefined,\n name: string,\n): T {\n if (typeof value !== \"function\") {\n throw new TypeError(`wasm missing ${name} export`);\n }\n // oxlint-disable-next-line no-unsafe-type-assertion -- wasm exports are opaque; each name is bound to the signature the ABI contract requires\n return value as T;\n}\n\nfunction asExports(raw: WebAssembly.Exports): CryptoWasmExports {\n const exports: CryptoWasmExports = {\n memory: requireMemory(raw[\"memory\"]),\n verify: requireFn(raw[\"verify\"], \"verify\"),\n verify_serialized: requireFn(raw[\"verify_serialized\"], \"verify_serialized\"),\n sign: requireFn(raw[\"sign\"], \"sign\"),\n public_key: requireFn(raw[\"public_key\"], \"public_key\"),\n __wbindgen_export: requireFn(raw[\"__wbindgen_export\"], \"__wbindgen_export\"),\n __wbindgen_export2: requireFn(raw[\"__wbindgen_export2\"], \"__wbindgen_export2\"),\n __wbindgen_add_to_stack_pointer: requireFn(\n raw[\"__wbindgen_add_to_stack_pointer\"],\n \"__wbindgen_add_to_stack_pointer\",\n ),\n };\n const start = raw[\"__wbindgen_start\"];\n if (typeof start === \"function\") {\n exports.__wbindgen_start = requireFn<() => void>(start, \"__wbindgen_start\");\n }\n return exports;\n}\n\nfunction passBytes(exports: CryptoWasmExports, bytes: Uint8Array): { ptr: number; len: number } {\n const len = bytes.length;\n const ptr = exports.__wbindgen_export(len, 1) >>> 0;\n new Uint8Array(exports.memory.buffer, ptr, len).set(bytes);\n return { ptr, len };\n}\n\nexport function wasmVerify(\n exports: CryptoWasmExports,\n id: Uint8Array,\n pubkey: Uint8Array,\n sig: Uint8Array,\n): boolean {\n const idP = passBytes(exports, id);\n const pkP = passBytes(exports, pubkey);\n const sigP = passBytes(exports, sig);\n return exports.verify(idP.ptr, idP.len, pkP.ptr, pkP.len, sigP.ptr, sigP.len) !== 0;\n}\n\nexport function wasmVerifySerialized(\n exports: CryptoWasmExports,\n serialized: Uint8Array,\n id: Uint8Array,\n pubkey: Uint8Array,\n sig: Uint8Array,\n): boolean {\n const serP = passBytes(exports, serialized);\n const idP = passBytes(exports, id);\n const pkP = passBytes(exports, pubkey);\n const sigP = passBytes(exports, sig);\n return (\n exports.verify_serialized(\n serP.ptr,\n serP.len,\n idP.ptr,\n idP.len,\n pkP.ptr,\n pkP.len,\n sigP.ptr,\n sigP.len,\n ) !== 0\n );\n}\n\nfunction takeBytes(exports: CryptoWasmExports, ptr: number, len: number): Uint8Array {\n const out = new Uint8Array(len);\n if (len > 0) {\n out.set(new Uint8Array(exports.memory.buffer, ptr, len));\n exports.__wbindgen_export2(ptr, len, 1);\n }\n return out;\n}\n\nfunction callReturningBytes(\n exports: CryptoWasmExports,\n invoke: (retptr: number) => void,\n): Uint8Array {\n const retptr = exports.__wbindgen_add_to_stack_pointer(-16);\n try {\n invoke(retptr);\n const view = new DataView(exports.memory.buffer);\n const ptr = view.getUint32(retptr, true);\n const len = view.getUint32(retptr + 4, true);\n return takeBytes(exports, ptr, len);\n } finally {\n exports.__wbindgen_add_to_stack_pointer(16);\n }\n}\n\nexport function wasmSign(\n exports: CryptoWasmExports,\n id: Uint8Array,\n seckey: Uint8Array,\n aux: Uint8Array,\n): Uint8Array {\n const idP = passBytes(exports, id);\n const skP = passBytes(exports, seckey);\n const auxP = passBytes(exports, aux);\n return callReturningBytes(exports, (retptr) => {\n exports.sign(retptr, idP.ptr, idP.len, skP.ptr, skP.len, auxP.ptr, auxP.len);\n });\n}\n\nexport function wasmPublicKey(exports: CryptoWasmExports, seckey: Uint8Array): Uint8Array {\n const skP = passBytes(exports, seckey);\n return callReturningBytes(exports, (retptr) => {\n exports.public_key(retptr, skP.ptr, skP.len);\n });\n}\n\nexport async function instantiateCryptoWasm(\n bytes: ArrayBuffer | ArrayBufferView,\n): Promise<CryptoWasmExports> {\n const holder: { exports?: CryptoWasmExports } = {};\n const { module, instance } = await WebAssembly.instantiate(bytes, makeWbgImports(holder));\n assertAllowedWasmImports(module);\n holder.exports = asExports(instance.exports);\n holder.exports.__wbindgen_start?.();\n return holder.exports;\n}\n","import { WasmPoisonedError } from \"../core/error.ts\";\nimport { createEventVerifier } from \"../core/verifier.ts\";\nimport type { EventVerifier, SerializedEventVerifier } from \"../core/verifier.ts\";\n\nexport { WasmPoisonedError } from \"../core/error.ts\";\n\n/**\n * Run `fn` unless the instance is already poisoned; a `WebAssembly.RuntimeError` aborts the\n * instance, so it is converted to {@link WasmPoisonedError} and rethrown on every later call.\n */\nexport function runPoisoned<T>(poison: { error?: Error }, fn: () => T): T {\n if (poison.error !== undefined) {\n throw poison.error;\n }\n try {\n return fn();\n } catch (error) {\n if (error instanceof WebAssembly.RuntimeError) {\n poison.error = new WasmPoisonedError(\"wasm instance aborted\", {\n cause: error,\n });\n throw poison.error;\n }\n throw error;\n }\n}\n\n/**\n * Build the WASM event verifier on {@link createEventVerifier}. A `WebAssembly.RuntimeError` from\n * the module means the instance aborted — it poisons every later call with the same\n * `WasmPoisonedError`; any other backend error verifies `false` (the event is marked failed).\n */\nexport function createWasmEventVerifier(\n verifySerialized: SerializedEventVerifier,\n poison: { error?: Error },\n): EventVerifier {\n const backend: SerializedEventVerifier = (serializedUtf8, id, pubkey, sig) => {\n try {\n return runPoisoned(poison, () => verifySerialized(serializedUtf8, id, pubkey, sig));\n } catch (error) {\n if (error instanceof WasmPoisonedError) {\n throw error;\n }\n return false;\n }\n };\n return createEventVerifier(backend);\n}\n","import { CryptoError } from \"../core/error.ts\";\nimport type { SigningBackend } from \"../core/key.ts\";\nimport type { EventVerifier } from \"../core/verifier.ts\";\nimport {\n instantiateCryptoWasm,\n wasmPublicKey,\n wasmSign,\n wasmVerify,\n wasmVerifySerialized,\n} from \"./abi.ts\";\nimport type { CryptoWasmExports } from \"./abi.ts\";\nimport { createWasmEventVerifier, runPoisoned } from \"./adapter.ts\";\n\nexport type LoadNostrWasmOptions = {\n /** Bytes, or a URL whose bytes will be read by the platform loader. */\n module?: ArrayBuffer | ArrayBufferView | URL | undefined;\n};\n\nexport type NostrWasm = SigningBackend & {\n verify: (id: Uint8Array, pubkey: Uint8Array, sig: Uint8Array) => boolean;\n verifySerialized: (\n serializedUtf8: Uint8Array,\n id: Uint8Array,\n pubkey: Uint8Array,\n sig: Uint8Array,\n ) => boolean;\n verifyEvent: EventVerifier;\n};\n\nexport function isWasmBytes(value: unknown): value is ArrayBuffer | ArrayBufferView {\n return value instanceof ArrayBuffer || ArrayBuffer.isView(value);\n}\n\nexport async function fetchWasmUrl(url: URL): Promise<Uint8Array> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new CryptoError(`failed to fetch wasm: ${res.status} ${url.href}`);\n }\n return new Uint8Array(await res.arrayBuffer());\n}\n\nfunction requireByteLength(bytes: Uint8Array, expected: number, label: string): void {\n if (bytes.length !== expected) {\n throw new CryptoError(`invalid ${label} length: expected ${expected}, got ${bytes.length}`);\n }\n}\n\nfunction bindExports(exports: CryptoWasmExports): NostrWasm {\n const poison: { error?: Error } = {};\n const rawSerialized = (\n serializedUtf8: Uint8Array,\n id: Uint8Array,\n pubkey: Uint8Array,\n sig: Uint8Array,\n ): boolean => wasmVerifySerialized(exports, serializedUtf8, id, pubkey, sig);\n return {\n verify: (id, pubkey, sig) => runPoisoned(poison, () => wasmVerify(exports, id, pubkey, sig)),\n verifySerialized: (serializedUtf8, id, pubkey, sig) =>\n runPoisoned(poison, () => rawSerialized(serializedUtf8, id, pubkey, sig)),\n verifyEvent: createWasmEventVerifier(rawSerialized, poison),\n sign: (id, seckey, aux) =>\n runPoisoned(poison, () => {\n requireByteLength(id, 32, \"id\");\n requireByteLength(seckey, 32, \"secret key\");\n requireByteLength(aux, 32, \"aux\");\n const sig = wasmSign(exports, id, seckey, aux);\n if (sig.length !== 64) {\n throw new CryptoError(\"wasm sign failed\");\n }\n return sig;\n }),\n publicKey: (seckey) =>\n runPoisoned(poison, () => {\n requireByteLength(seckey, 32, \"secret key\");\n const pk = wasmPublicKey(exports, seckey);\n if (pk.length !== 32) {\n throw new CryptoError(\"wasm publicKey failed\");\n }\n return pk;\n }),\n };\n}\n\n/** Builds a loader that interns a single instance per module slot. */\nexport function createNostrWasmLoader(\n wasmBytes: (opts?: LoadNostrWasmOptions) => Promise<ArrayBuffer | ArrayBufferView>,\n): {\n loadNostrWasm: (opts?: LoadNostrWasmOptions) => Promise<NostrWasm>;\n resetNostrWasm: () => void;\n} {\n let interned: Promise<NostrWasm> | undefined;\n\n async function instantiate(opts?: LoadNostrWasmOptions): Promise<NostrWasm> {\n const bytes = await wasmBytes(opts);\n const exports = await instantiateCryptoWasm(bytes);\n return bindExports(exports);\n }\n\n /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */\n async function loadNostrWasm(opts?: LoadNostrWasmOptions): Promise<NostrWasm> {\n if (interned) {\n return interned;\n }\n const pending = instantiate(opts);\n interned = pending;\n try {\n return await pending;\n } catch (error) {\n if (interned === pending) {\n interned = undefined;\n }\n throw error;\n }\n }\n\n function resetNostrWasm(): void {\n interned = undefined;\n }\n\n return { loadNostrWasm, resetNostrWasm };\n}\n"],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import { a as SigningBackend } from "./key-CyKN1RTi.mjs";
2
- import { t as EventVerifier } from "./verifier-BjL2M0ka.mjs";
3
- //#region src/wasm/instance.d.ts
4
- type LoadNostrWasmOptions = {
5
- /** Bytes, or a URL whose bytes will be read by the platform loader. */
6
- module?: ArrayBuffer | ArrayBufferView | URL | undefined;
7
- };
8
- type NostrWasm = SigningBackend & {
9
- verify: (id: Uint8Array, pubkey: Uint8Array, sig: Uint8Array) => boolean;
10
- verifySerialized: (serializedUtf8: Uint8Array, id: Uint8Array, pubkey: Uint8Array, sig: Uint8Array) => boolean;
11
- verifyEvent: EventVerifier;
12
- };
13
- //#endregion
14
- export { NostrWasm as n, LoadNostrWasmOptions as t };
15
- //# sourceMappingURL=instance-X_WkCnpR.d.mts.map
@@ -1,4 +0,0 @@
1
- //#region \0wasm-url:/home/runner/work/nostr.js/nostr.js/src/wasm/nostr_crypto_wasm_bg.wasm
2
- var nostr_crypto_wasm_bg_default = new URL("nostr_crypto_wasm_bg.wasm", import.meta.url).href;
3
- //#endregion
4
- export { nostr_crypto_wasm_bg_default as default };
Binary file
@@ -1,22 +0,0 @@
1
- import { t as Event } from "./event-j3BwI5dF.mjs";
2
- //#region src/core/verifier.d.ts
3
- /**
4
- * Verification backend: return true iff `sha256(serializedUtf8)` equals `id` and `sig` is a valid
5
- * BIP-340 signature of `id` by the x-only `pubkey`. Inputs are raw bytes (`id`/`pubkey` 32, `sig`
6
- * 64). Exceptions propagate through the built verifier unmarked — a throwing backend is broken and
7
- * must surface.
8
- */
9
- type SerializedEventVerifier = (serializedUtf8: Uint8Array, id: Uint8Array, pubkey: Uint8Array, sig: Uint8Array) => boolean;
10
- /** Whole-event verifier: return true iff the event's id and BIP-340 signature verify. */
11
- type EventVerifier = (event: Event) => boolean;
12
- /**
13
- * Build an event verifier with exactly the semantics of {@link verifyEvent}, delegating the hash and
14
- * signature check to `backend`. Verified/failed results share `verifyEvent`'s WeakSet caches, so
15
- * verifiers built this way and `verifyEvent` agree on (and reuse) each other's results.
16
- */
17
- declare function createEventVerifier(backend: SerializedEventVerifier): EventVerifier;
18
- /** Verify event id and BIP-340 signature. Uses WeakSet cache (does not mutate the event). */
19
- declare const verifyEvent: EventVerifier;
20
- //#endregion
21
- export { verifyEvent as i, SerializedEventVerifier as n, createEventVerifier as r, EventVerifier as t };
22
- //# sourceMappingURL=verifier-BjL2M0ka.d.mts.map
@@ -1,8 +0,0 @@
1
- import { s as WasmPoisonedError } from "./error-BquXDmIN.mjs";
2
- import { n as NostrWasm, t as LoadNostrWasmOptions } from "./instance-X_WkCnpR.mjs";
3
- //#region src/wasm/load.browser.d.ts
4
- /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */
5
- export declare function loadNostrWasm(opts?: LoadNostrWasmOptions): Promise<NostrWasm>;
6
- //#endregion
7
- export { type LoadNostrWasmOptions, type NostrWasm, WasmPoisonedError };
8
- //# sourceMappingURL=wasm.browser.d.mts.map
@@ -1,19 +0,0 @@
1
- import { b as WasmPoisonedError, m as CryptoError } from "./util-DMF9AIO0.mjs";
2
- import { n as fetchWasmUrl, r as isWasmBytes, t as createNostrWasmLoader } from "./instance-CI_IaZpf.mjs";
3
- //#region src/wasm/load.browser.ts
4
- async function wasmBytes(opts) {
5
- const source = opts?.module;
6
- if (source !== void 0 && isWasmBytes(source)) return source;
7
- if (source instanceof URL && source.protocol !== "file:") return fetchWasmUrl(source);
8
- if (source instanceof URL) throw new CryptoError(`cannot fetch wasm from ${source.href}`);
9
- return fetchWasmUrl(new URL("nostr_crypto_wasm_bg.wasm", import.meta.url));
10
- }
11
- const loader = createNostrWasmLoader(wasmBytes);
12
- /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */
13
- async function loadNostrWasm(opts) {
14
- return loader.loadNostrWasm(opts);
15
- }
16
- //#endregion
17
- export { WasmPoisonedError, loadNostrWasm };
18
-
19
- //# sourceMappingURL=wasm.browser.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasm.browser.mjs","names":[],"sources":["../src/wasm/load.browser.ts"],"sourcesContent":["import { CryptoError } from \"../core/error.ts\";\nimport { createNostrWasmLoader, fetchWasmUrl, isWasmBytes } from \"./instance.ts\";\nimport type { LoadNostrWasmOptions, NostrWasm } from \"./instance.ts\";\n\nexport type { LoadNostrWasmOptions, NostrWasm } from \"./instance.ts\";\n\nasync function wasmBytes(opts?: LoadNostrWasmOptions): Promise<ArrayBuffer | ArrayBufferView> {\n const source = opts?.module;\n if (source !== undefined && isWasmBytes(source)) {\n return source;\n }\n if (source instanceof URL && source.protocol !== \"file:\") {\n return fetchWasmUrl(source);\n }\n if (source instanceof URL) {\n throw new CryptoError(`cannot fetch wasm from ${source.href}`);\n }\n return fetchWasmUrl(new URL(\"nostr_crypto_wasm_bg.wasm\", import.meta.url));\n}\n\nconst loader = createNostrWasmLoader(wasmBytes);\n\n/** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */\nexport async function loadNostrWasm(opts?: LoadNostrWasmOptions): Promise<NostrWasm> {\n return loader.loadNostrWasm(opts);\n}\n"],"mappings":";;;AAMA,eAAe,UAAU,MAAqE;CAC5F,MAAM,SAAS,MAAM;CACrB,IAAI,WAAW,KAAA,KAAa,YAAY,MAAM,GAC5C,OAAO;CAET,IAAI,kBAAkB,OAAO,OAAO,aAAa,SAC/C,OAAO,aAAa,MAAM;CAE5B,IAAI,kBAAkB,KACpB,MAAM,IAAI,YAAY,0BAA0B,OAAO,MAAM;CAE/D,OAAO,aAAa,IAAI,IAAI,6BAA6B,YAAY,GAAG,CAAC;AAC3E;AAEA,MAAM,SAAS,sBAAsB,SAAS;;AAG9C,eAAsB,cAAc,MAAiD;CACnF,OAAO,OAAO,cAAc,IAAI;AAClC"}
package/dist/wasm.d.mts DELETED
@@ -1,8 +0,0 @@
1
- import { s as WasmPoisonedError } from "./error-BquXDmIN.mjs";
2
- import { n as NostrWasm, t as LoadNostrWasmOptions } from "./instance-X_WkCnpR.mjs";
3
- //#region src/wasm/load.d.ts
4
- /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */
5
- export declare function loadNostrWasm(opts?: LoadNostrWasmOptions): Promise<NostrWasm>;
6
- //#endregion
7
- export { type LoadNostrWasmOptions, type NostrWasm, WasmPoisonedError };
8
- //# sourceMappingURL=wasm.d.mts.map
package/dist/wasm.mjs DELETED
@@ -1,28 +0,0 @@
1
- import { b as WasmPoisonedError } from "./util-DMF9AIO0.mjs";
2
- import { n as fetchWasmUrl, r as isWasmBytes, t as createNostrWasmLoader } from "./instance-CI_IaZpf.mjs";
3
- //#region src/wasm/load.ts
4
- async function defaultWasmHref() {
5
- return (await import("./nostr_crypto_wasm_bg-Czrdty7Q.mjs")).default;
6
- }
7
- async function readWasmUrl(url) {
8
- if (url.protocol === "file:") {
9
- const { readFile } = await import("node:fs/promises");
10
- const { fileURLToPath } = await import("node:url");
11
- return new Uint8Array(await readFile(fileURLToPath(url)));
12
- }
13
- return fetchWasmUrl(url);
14
- }
15
- async function wasmBytes(opts) {
16
- const source = opts?.module;
17
- if (source !== void 0 && isWasmBytes(source)) return source;
18
- return readWasmUrl(source instanceof URL ? source : new URL(await defaultWasmHref(), import.meta.url));
19
- }
20
- const loader = createNostrWasmLoader(wasmBytes);
21
- /** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */
22
- async function loadNostrWasm(opts) {
23
- return loader.loadNostrWasm(opts);
24
- }
25
- //#endregion
26
- export { WasmPoisonedError, loadNostrWasm };
27
-
28
- //# sourceMappingURL=wasm.mjs.map
package/dist/wasm.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"wasm.mjs","names":[],"sources":["../src/wasm/load.ts"],"sourcesContent":["import { createNostrWasmLoader, fetchWasmUrl, isWasmBytes } from \"./instance.ts\";\nimport type { LoadNostrWasmOptions, NostrWasm } from \"./instance.ts\";\n\nexport { WasmPoisonedError } from \"./adapter.ts\";\nexport type { LoadNostrWasmOptions, NostrWasm } from \"./instance.ts\";\n\nasync function defaultWasmHref(): Promise<string> {\n const mod = await import(\"./nostr_crypto_wasm_bg.wasm?url\");\n return mod.default;\n}\n\nasync function readWasmUrl(url: URL): Promise<Uint8Array> {\n if (url.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n return new Uint8Array(await readFile(fileURLToPath(url)));\n }\n return fetchWasmUrl(url);\n}\n\nasync function wasmBytes(opts?: LoadNostrWasmOptions): Promise<ArrayBuffer | ArrayBufferView> {\n const source = opts?.module;\n if (source !== undefined && isWasmBytes(source)) {\n return source;\n }\n const href = source instanceof URL ? source : new URL(await defaultWasmHref(), import.meta.url);\n return readWasmUrl(href);\n}\n\nconst loader = createNostrWasmLoader(wasmBytes);\n\n/** Instantiate once. Repeats reuse the same module. Failure throws; no noble fallback. */\nexport async function loadNostrWasm(opts?: LoadNostrWasmOptions): Promise<NostrWasm> {\n return loader.loadNostrWasm(opts);\n}\n"],"mappings":";;;AAMA,eAAe,kBAAmC;CAEhD,QAAO,MADW,OAAO,uCAAA,CACd;AACb;AAEA,eAAe,YAAY,KAA+B;CACxD,IAAI,IAAI,aAAa,SAAS;EAC5B,MAAM,EAAE,aAAa,MAAM,OAAO;EAClC,MAAM,EAAE,kBAAkB,MAAM,OAAO;EACvC,OAAO,IAAI,WAAW,MAAM,SAAS,cAAc,GAAG,CAAC,CAAC;CAC1D;CACA,OAAO,aAAa,GAAG;AACzB;AAEA,eAAe,UAAU,MAAqE;CAC5F,MAAM,SAAS,MAAM;CACrB,IAAI,WAAW,KAAA,KAAa,YAAY,MAAM,GAC5C,OAAO;CAGT,OAAO,YADM,kBAAkB,MAAM,SAAS,IAAI,IAAI,MAAM,gBAAgB,GAAG,YAAY,GAAG,CACvE;AACzB;AAEA,MAAM,SAAS,sBAAsB,SAAS;;AAG9C,eAAsB,cAAc,MAAiD;CACnF,OAAO,OAAO,cAAc,IAAI;AAClC"}
File without changes