@hashtree/worker 0.2.1 → 0.2.3
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/LICENSE +21 -0
- package/dist/app-runtime.d.ts +60 -0
- package/dist/app-runtime.d.ts.map +1 -0
- package/dist/app-runtime.js +271 -0
- package/dist/app-runtime.js.map +1 -0
- package/dist/capabilities/blossomBandwidthTracker.d.ts +26 -0
- package/dist/capabilities/blossomBandwidthTracker.d.ts.map +1 -0
- package/dist/capabilities/blossomBandwidthTracker.js +53 -0
- package/dist/capabilities/blossomBandwidthTracker.js.map +1 -0
- package/dist/capabilities/blossomTransport.d.ts +22 -0
- package/dist/capabilities/blossomTransport.d.ts.map +1 -0
- package/dist/capabilities/blossomTransport.js +139 -0
- package/dist/capabilities/blossomTransport.js.map +1 -0
- package/dist/capabilities/connectivity.d.ts +3 -0
- package/dist/capabilities/connectivity.d.ts.map +1 -0
- package/dist/capabilities/connectivity.js +49 -0
- package/dist/capabilities/connectivity.js.map +1 -0
- package/dist/capabilities/idbStorage.d.ts +25 -0
- package/dist/capabilities/idbStorage.d.ts.map +1 -0
- package/dist/capabilities/idbStorage.js +73 -0
- package/dist/capabilities/idbStorage.js.map +1 -0
- package/dist/capabilities/meshRouterStore.d.ts +71 -0
- package/dist/capabilities/meshRouterStore.d.ts.map +1 -0
- package/dist/capabilities/meshRouterStore.js +316 -0
- package/dist/capabilities/meshRouterStore.js.map +1 -0
- package/dist/capabilities/rootResolver.d.ts +10 -0
- package/dist/capabilities/rootResolver.d.ts.map +1 -0
- package/dist/capabilities/rootResolver.js +392 -0
- package/dist/capabilities/rootResolver.js.map +1 -0
- package/dist/client-id.d.ts +18 -0
- package/dist/client-id.d.ts.map +1 -0
- package/dist/client-id.js +98 -0
- package/dist/client-id.js.map +1 -0
- package/dist/client.d.ts +61 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +417 -0
- package/dist/client.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +3 -0
- package/dist/entry.js.map +1 -0
- package/dist/htree-path.d.ts +13 -0
- package/dist/htree-path.d.ts.map +1 -0
- package/dist/htree-path.js +38 -0
- package/dist/htree-path.js.map +1 -0
- package/dist/htree-url.d.ts +22 -0
- package/dist/htree-url.d.ts.map +1 -0
- package/dist/htree-url.js +118 -0
- package/dist/htree-url.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mediaStreaming.d.ts +7 -0
- package/dist/mediaStreaming.d.ts.map +1 -0
- package/dist/mediaStreaming.js +48 -0
- package/dist/mediaStreaming.js.map +1 -0
- package/dist/p2p/boundedQueue.d.ts +79 -0
- package/dist/p2p/boundedQueue.d.ts.map +1 -0
- package/dist/p2p/boundedQueue.js +134 -0
- package/dist/p2p/boundedQueue.js.map +1 -0
- package/dist/p2p/errorMessage.d.ts +5 -0
- package/dist/p2p/errorMessage.d.ts.map +1 -0
- package/dist/p2p/errorMessage.js +7 -0
- package/dist/p2p/errorMessage.js.map +1 -0
- package/dist/p2p/index.d.ts +8 -0
- package/dist/p2p/index.d.ts.map +1 -0
- package/dist/p2p/index.js +6 -0
- package/dist/p2p/index.js.map +1 -0
- package/dist/p2p/lruCache.d.ts +26 -0
- package/dist/p2p/lruCache.d.ts.map +1 -0
- package/dist/p2p/lruCache.js +65 -0
- package/dist/p2p/lruCache.js.map +1 -0
- package/dist/p2p/meshQueryRouter.d.ts +57 -0
- package/dist/p2p/meshQueryRouter.d.ts.map +1 -0
- package/dist/p2p/meshQueryRouter.js +264 -0
- package/dist/p2p/meshQueryRouter.js.map +1 -0
- package/dist/p2p/protocol.d.ts +10 -0
- package/dist/p2p/protocol.d.ts.map +1 -0
- package/dist/p2p/protocol.js +2 -0
- package/dist/p2p/protocol.js.map +1 -0
- package/dist/p2p/queryForwardingMachine.d.ts +46 -0
- package/dist/p2p/queryForwardingMachine.d.ts.map +1 -0
- package/dist/p2p/queryForwardingMachine.js +144 -0
- package/dist/p2p/queryForwardingMachine.js.map +1 -0
- package/dist/p2p/signaling.d.ts +63 -0
- package/dist/p2p/signaling.d.ts.map +1 -0
- package/dist/p2p/signaling.js +185 -0
- package/dist/p2p/signaling.js.map +1 -0
- package/dist/p2p/uploadRateLimiter.d.ts +21 -0
- package/dist/p2p/uploadRateLimiter.d.ts.map +1 -0
- package/dist/p2p/uploadRateLimiter.js +62 -0
- package/dist/p2p/uploadRateLimiter.js.map +1 -0
- package/dist/p2p/webrtcController.d.ts +176 -0
- package/dist/p2p/webrtcController.d.ts.map +1 -0
- package/dist/p2p/webrtcController.js +938 -0
- package/dist/p2p/webrtcController.js.map +1 -0
- package/dist/p2p/webrtcProxy.d.ts +62 -0
- package/dist/p2p/webrtcProxy.d.ts.map +1 -0
- package/dist/p2p/webrtcProxy.js +447 -0
- package/dist/p2p/webrtcProxy.js.map +1 -0
- package/dist/privacyGuards.d.ts +14 -0
- package/dist/privacyGuards.d.ts.map +1 -0
- package/dist/privacyGuards.js +27 -0
- package/dist/privacyGuards.js.map +1 -0
- package/dist/protocol.d.ts +225 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/relay/identity.d.ts +36 -0
- package/dist/relay/identity.d.ts.map +1 -0
- package/dist/relay/identity.js +78 -0
- package/dist/relay/identity.js.map +1 -0
- package/dist/relay/mediaHandler.d.ts +64 -0
- package/dist/relay/mediaHandler.d.ts.map +1 -0
- package/dist/relay/mediaHandler.js +1285 -0
- package/dist/relay/mediaHandler.js.map +1 -0
- package/dist/relay/ndk.d.ts +96 -0
- package/dist/relay/ndk.d.ts.map +1 -0
- package/dist/relay/ndk.js +502 -0
- package/dist/relay/ndk.js.map +1 -0
- package/dist/relay/nostr-wasm.d.ts +14 -0
- package/dist/relay/nostr-wasm.d.ts.map +1 -0
- package/dist/relay/nostr-wasm.js +246 -0
- package/dist/relay/nostr-wasm.js.map +1 -0
- package/dist/relay/nostr.d.ts +60 -0
- package/dist/relay/nostr.d.ts.map +1 -0
- package/dist/relay/nostr.js +207 -0
- package/dist/relay/nostr.js.map +1 -0
- package/dist/relay/protocol.d.ts +592 -0
- package/dist/relay/protocol.d.ts.map +1 -0
- package/dist/relay/protocol.js +16 -0
- package/dist/relay/protocol.js.map +1 -0
- package/dist/relay/publicAssetUrl.d.ts +6 -0
- package/dist/relay/publicAssetUrl.d.ts.map +1 -0
- package/dist/relay/publicAssetUrl.js +14 -0
- package/dist/relay/publicAssetUrl.js.map +1 -0
- package/dist/relay/rootPathResolver.d.ts +9 -0
- package/dist/relay/rootPathResolver.d.ts.map +1 -0
- package/dist/relay/rootPathResolver.js +32 -0
- package/dist/relay/rootPathResolver.js.map +1 -0
- package/dist/relay/signing.d.ts +50 -0
- package/dist/relay/signing.d.ts.map +1 -0
- package/dist/relay/signing.js +299 -0
- package/dist/relay/signing.js.map +1 -0
- package/dist/relay/treeRootCache.d.ts +86 -0
- package/dist/relay/treeRootCache.d.ts.map +1 -0
- package/dist/relay/treeRootCache.js +269 -0
- package/dist/relay/treeRootCache.js.map +1 -0
- package/dist/relay/treeRootSubscription.d.ts +55 -0
- package/dist/relay/treeRootSubscription.d.ts.map +1 -0
- package/dist/relay/treeRootSubscription.js +478 -0
- package/dist/relay/treeRootSubscription.js.map +1 -0
- package/dist/relay/utils/constants.d.ts +76 -0
- package/dist/relay/utils/constants.d.ts.map +1 -0
- package/dist/relay/utils/constants.js +113 -0
- package/dist/relay/utils/constants.js.map +1 -0
- package/dist/relay/utils/errorMessage.d.ts +5 -0
- package/dist/relay/utils/errorMessage.d.ts.map +1 -0
- package/dist/relay/utils/errorMessage.js +8 -0
- package/dist/relay/utils/errorMessage.js.map +1 -0
- package/dist/relay/utils/lruCache.d.ts +26 -0
- package/dist/relay/utils/lruCache.d.ts.map +1 -0
- package/dist/relay/utils/lruCache.js +66 -0
- package/dist/relay/utils/lruCache.js.map +1 -0
- package/dist/relay/webrtc.d.ts +2 -0
- package/dist/relay/webrtc.d.ts.map +1 -0
- package/dist/relay/webrtc.js +3 -0
- package/dist/relay/webrtc.js.map +1 -0
- package/dist/relay/webrtcSignaling.d.ts +37 -0
- package/dist/relay/webrtcSignaling.d.ts.map +1 -0
- package/dist/relay/webrtcSignaling.js +86 -0
- package/dist/relay/webrtcSignaling.js.map +1 -0
- package/dist/relay/worker.d.ts +12 -0
- package/dist/relay/worker.d.ts.map +1 -0
- package/dist/relay/worker.js +1540 -0
- package/dist/relay/worker.js.map +1 -0
- package/dist/relay-client.d.ts +31 -0
- package/dist/relay-client.d.ts.map +1 -0
- package/dist/relay-client.js +197 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay-entry.d.ts +2 -0
- package/dist/relay-entry.d.ts.map +1 -0
- package/dist/relay-entry.js +2 -0
- package/dist/relay-entry.js.map +1 -0
- package/dist/runtime-network.d.ts +23 -0
- package/dist/runtime-network.d.ts.map +1 -0
- package/dist/runtime-network.js +105 -0
- package/dist/runtime-network.js.map +1 -0
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +126 -0
- package/dist/runtime.js.map +1 -0
- package/dist/transferableBytes.d.ts +2 -0
- package/dist/transferableBytes.d.ts.map +1 -0
- package/dist/transferableBytes.js +6 -0
- package/dist/transferableBytes.js.map +1 -0
- package/dist/tree-root.d.ts +201 -0
- package/dist/tree-root.d.ts.map +1 -0
- package/dist/tree-root.js +632 -0
- package/dist/tree-root.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +9 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +793 -0
- package/dist/worker.js.map +1 -0
- package/package.json +14 -14
- package/src/capabilities/blossomTransport.ts +1 -1
- package/src/worker.ts +2 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
function defineWasmEnv(label) {
|
|
3
|
+
label += ': ';
|
|
4
|
+
let AB_HEAP;
|
|
5
|
+
let ATU8_HEAP;
|
|
6
|
+
let ATU32_HEAP;
|
|
7
|
+
const console_out = (s_channel, s_out) => console[s_channel](label + s_out.replace(/\0/g, '\n'));
|
|
8
|
+
let s_error = '';
|
|
9
|
+
// for converting bytes to text
|
|
10
|
+
const utf8 = new TextDecoder();
|
|
11
|
+
const h_fds = {
|
|
12
|
+
// stdout
|
|
13
|
+
1(s_out) {
|
|
14
|
+
console_out('debug', s_out);
|
|
15
|
+
},
|
|
16
|
+
// stderr
|
|
17
|
+
2(s_out) {
|
|
18
|
+
console_out('error', (s_error = s_out));
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const imports = {
|
|
22
|
+
abort() {
|
|
23
|
+
throw Error(label + (s_error || 'An unknown error occurred'));
|
|
24
|
+
},
|
|
25
|
+
memcpy: (ip_dst, ip_src, nb_size) => ATU8_HEAP.copyWithin(ip_dst, ip_src, ip_src + nb_size),
|
|
26
|
+
resize(w) {
|
|
27
|
+
throw Error(label + `Out of memory (resizing ${w})`);
|
|
28
|
+
},
|
|
29
|
+
write(i_fd, ip_iov, nl_iovs, ip_written) {
|
|
30
|
+
// output string
|
|
31
|
+
let s_out = '';
|
|
32
|
+
// track number of bytes read from buffers
|
|
33
|
+
let cb_read = 0;
|
|
34
|
+
// each pending iov
|
|
35
|
+
for (let i_iov = 0; i_iov < nl_iovs; i_iov++) {
|
|
36
|
+
// start of buffer in memory
|
|
37
|
+
const ip_start = ATU32_HEAP[ip_iov >> 2];
|
|
38
|
+
// size of buffer
|
|
39
|
+
const nb_len = ATU32_HEAP[(ip_iov + 4) >> 2];
|
|
40
|
+
ip_iov += 8;
|
|
41
|
+
// extract text from buffer
|
|
42
|
+
s_out += utf8.decode(ATU8_HEAP.subarray(ip_start, ip_start + nb_len));
|
|
43
|
+
// update number of bytes read
|
|
44
|
+
cb_read += nb_len;
|
|
45
|
+
}
|
|
46
|
+
// route to fd
|
|
47
|
+
if (h_fds[i_fd]) {
|
|
48
|
+
h_fds[i_fd](s_out);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// no fd found
|
|
52
|
+
throw new Error(`libsecp256k1 tried writing to non-open file descriptor: ${i_fd}\n${s_out}`);
|
|
53
|
+
}
|
|
54
|
+
// write bytes read
|
|
55
|
+
ATU32_HEAP[ip_written >> 2] = cb_read;
|
|
56
|
+
// no error
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
return [
|
|
61
|
+
imports,
|
|
62
|
+
(d_memory) => [
|
|
63
|
+
(AB_HEAP = d_memory.buffer),
|
|
64
|
+
(ATU8_HEAP = new Uint8Array(AB_HEAP)),
|
|
65
|
+
(ATU32_HEAP = new Uint32Array(AB_HEAP))
|
|
66
|
+
]
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
/*
|
|
70
|
+
* ================================
|
|
71
|
+
* GENERATED FILE WARNING
|
|
72
|
+
* Do not edit this file manually.
|
|
73
|
+
* ================================
|
|
74
|
+
*/
|
|
75
|
+
const map_wasm_imports = (g_imports) => ({
|
|
76
|
+
a: {
|
|
77
|
+
a: g_imports.abort,
|
|
78
|
+
f: g_imports.memcpy,
|
|
79
|
+
d: g_imports.resize,
|
|
80
|
+
e: () => 52, // _fd_close,
|
|
81
|
+
c: () => 70, // _fd_seek,
|
|
82
|
+
b: g_imports.write,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
const map_wasm_exports = (g_exports) => ({
|
|
86
|
+
malloc: g_exports['i'],
|
|
87
|
+
free: g_exports['j'],
|
|
88
|
+
sha256_initialize: g_exports['l'],
|
|
89
|
+
sha256_write: g_exports['m'],
|
|
90
|
+
sha256_finalize: g_exports['n'],
|
|
91
|
+
context_create: g_exports['o'],
|
|
92
|
+
xonly_pubkey_parse: g_exports['p'],
|
|
93
|
+
xonly_pubkey_serialize: g_exports['q'],
|
|
94
|
+
keypair_create: g_exports['r'],
|
|
95
|
+
keypair_xonly_pub: g_exports['s'],
|
|
96
|
+
schnorrsig_sign32: g_exports['t'],
|
|
97
|
+
schnorrsig_verify: g_exports['u'],
|
|
98
|
+
sbrk: g_exports['sbrk'],
|
|
99
|
+
memory: g_exports['g'],
|
|
100
|
+
init: () => g_exports['h'](),
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* Creates a new instance of the secp256k1 WASM and returns the Nostr wrapper
|
|
104
|
+
* @param z_src - a Response containing the WASM binary, a Promise that resolves to one,
|
|
105
|
+
* or the raw bytes to the WASM binary as a {@link BufferSource}
|
|
106
|
+
* @returns the wrapper API
|
|
107
|
+
*/
|
|
108
|
+
const NostrWasm = async (z_src) => {
|
|
109
|
+
// prepare the runtime
|
|
110
|
+
const [defs, f_bind_heap] = defineWasmEnv('nostr-wasm');
|
|
111
|
+
const g_imports = map_wasm_imports(defs);
|
|
112
|
+
// prep the wasm module
|
|
113
|
+
let d_wasm;
|
|
114
|
+
// instantiate wasm binary by streaming the response bytes
|
|
115
|
+
if (z_src instanceof Response || z_src instanceof Promise) {
|
|
116
|
+
d_wasm = await WebAssembly.instantiateStreaming(z_src, g_imports);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// instantiate using raw binary
|
|
120
|
+
d_wasm = await WebAssembly.instantiate(z_src, g_imports);
|
|
121
|
+
}
|
|
122
|
+
// create the exports struct
|
|
123
|
+
const g_wasm = map_wasm_exports(d_wasm.instance.exports);
|
|
124
|
+
// bind the heap and ref its view(s)
|
|
125
|
+
const [, ATU8_HEAP] = f_bind_heap(g_wasm.memory);
|
|
126
|
+
// call into the wasm module's init method
|
|
127
|
+
g_wasm.init();
|
|
128
|
+
const ip_sk = g_wasm.malloc(32 /* ByteLens.PRIVATE_KEY */);
|
|
129
|
+
const ip_ent = g_wasm.malloc(32 /* ByteLens.NONCE_ENTROPY */);
|
|
130
|
+
const ip_msg_hash = g_wasm.malloc(32 /* ByteLens.MSG_HASH */);
|
|
131
|
+
// scratch spaces
|
|
132
|
+
const ip_pubkey_scratch = g_wasm.malloc(32 /* ByteLens.XONLY_PUBKEY */);
|
|
133
|
+
const ip_sig_scratch = g_wasm.malloc(64 /* ByteLens.BIP340_SIG */);
|
|
134
|
+
// library handle: secp256k1_keypair;
|
|
135
|
+
const ip_keypair = g_wasm.malloc(96 /* ByteLens.KEYPAIR_LIB */);
|
|
136
|
+
// library handle: secp256k1_xonly_pubkey;
|
|
137
|
+
const ip_xonly_pubkey = g_wasm.malloc(64 /* ByteLens.XONLY_KEY_LIB */);
|
|
138
|
+
// library handle: secp256k1_sha256;
|
|
139
|
+
const ip_sha256 = g_wasm.malloc(104 /* ByteLens.SHA256_LIB */);
|
|
140
|
+
// create a reusable context
|
|
141
|
+
const ip_ctx = g_wasm.context_create(513 /* Flags.CONTEXT_SIGN */ | 257 /* Flags.CONTEXT_VERIFY */);
|
|
142
|
+
// an encoder for hashing strings
|
|
143
|
+
const utf8 = new TextEncoder();
|
|
144
|
+
/**
|
|
145
|
+
* Puts the given private key into program memory, runs the given callback, then zeroes out the key
|
|
146
|
+
* @param atu8_sk - the private key
|
|
147
|
+
* @param f_use - callback to use the key
|
|
148
|
+
* @returns whatever the callback returns
|
|
149
|
+
*/
|
|
150
|
+
const with_keypair = (atu8_sk, f_use) => {
|
|
151
|
+
// prep callback return
|
|
152
|
+
let w_return;
|
|
153
|
+
// in case of any exception..
|
|
154
|
+
try {
|
|
155
|
+
// copy input bytes into place
|
|
156
|
+
ATU8_HEAP.set(atu8_sk, ip_sk);
|
|
157
|
+
// instantiate keypair
|
|
158
|
+
g_wasm.keypair_create(ip_ctx, ip_keypair, ip_sk);
|
|
159
|
+
// use private key
|
|
160
|
+
w_return = f_use();
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
// zero-out private key and keypair
|
|
164
|
+
ATU8_HEAP.fill(1, ip_sk, ip_sk + 32 /* ByteLens.PRIVATE_KEY */);
|
|
165
|
+
ATU8_HEAP.fill(2, ip_keypair, ip_keypair + 96 /* ByteLens.KEYPAIR_LIB */);
|
|
166
|
+
}
|
|
167
|
+
// forward result
|
|
168
|
+
return w_return;
|
|
169
|
+
};
|
|
170
|
+
const compute_event_id = (event) => {
|
|
171
|
+
const message = utf8.encode(`[0,"${event.pubkey}",${event.created_at},${event.kind},${JSON.stringify(event.tags)},${JSON.stringify(event.content)}]`);
|
|
172
|
+
const ip_message = g_wasm.malloc(message.length);
|
|
173
|
+
ATU8_HEAP.set(message, ip_message);
|
|
174
|
+
g_wasm.sha256_initialize(ip_sha256);
|
|
175
|
+
g_wasm.sha256_write(ip_sha256, ip_message, message.length);
|
|
176
|
+
g_wasm.sha256_finalize(ip_sha256, ip_msg_hash);
|
|
177
|
+
g_wasm.free(ip_message);
|
|
178
|
+
return ATU8_HEAP.slice(ip_msg_hash, ip_msg_hash + 32 /* ByteLens.MSG_HASH */);
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
generateSecretKey: () => crypto.getRandomValues(new Uint8Array(32 /* ByteLens.PRIVATE_KEY */)),
|
|
182
|
+
getPublicKey(sk) {
|
|
183
|
+
if (1 /* BinaryResult.SUCCESS */ !==
|
|
184
|
+
with_keypair(sk, () => g_wasm.keypair_xonly_pub(ip_ctx, ip_xonly_pubkey, null, ip_keypair))) {
|
|
185
|
+
throw Error('failed to get pubkey from keypair');
|
|
186
|
+
}
|
|
187
|
+
// serialize the public key
|
|
188
|
+
g_wasm.xonly_pubkey_serialize(ip_ctx, ip_pubkey_scratch, ip_xonly_pubkey);
|
|
189
|
+
// extract result
|
|
190
|
+
return ATU8_HEAP.slice(ip_pubkey_scratch, ip_pubkey_scratch + 32 /* ByteLens.XONLY_PUBKEY */);
|
|
191
|
+
},
|
|
192
|
+
finalizeEvent(event, seckey, ent) {
|
|
193
|
+
with_keypair(seckey, () => {
|
|
194
|
+
// get public key (as in getPublicKey function above)
|
|
195
|
+
g_wasm.keypair_xonly_pub(ip_ctx, ip_xonly_pubkey, null, ip_keypair);
|
|
196
|
+
g_wasm.xonly_pubkey_serialize(ip_ctx, ip_pubkey_scratch, ip_xonly_pubkey);
|
|
197
|
+
const pubkey = ATU8_HEAP.slice(ip_pubkey_scratch, ip_pubkey_scratch + 32 /* ByteLens.XONLY_PUBKEY */);
|
|
198
|
+
event.pubkey = toHex(pubkey);
|
|
199
|
+
// compute event id
|
|
200
|
+
event.id = toHex(compute_event_id(event));
|
|
201
|
+
// copy entropy bytes into place, if they are provided
|
|
202
|
+
if (!ent && crypto.getRandomValues) {
|
|
203
|
+
ATU8_HEAP.set(crypto.getRandomValues(new Uint8Array(32)), ip_ent);
|
|
204
|
+
}
|
|
205
|
+
// perform signature (ip_msg_hash is already set from procedure above)
|
|
206
|
+
if (1 /* BinaryResult.SUCCESS */ !==
|
|
207
|
+
g_wasm.schnorrsig_sign32(ip_ctx, ip_sig_scratch, ip_msg_hash, ip_keypair, ip_ent)) {
|
|
208
|
+
throw Error('failed to sign');
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
const sig = ATU8_HEAP.slice(ip_sig_scratch, ip_sig_scratch + 64 /* ByteLens.BIP340_SIG */);
|
|
212
|
+
event.sig = toHex(sig);
|
|
213
|
+
},
|
|
214
|
+
verifyEvent(event) {
|
|
215
|
+
const id = fromHex(event.id);
|
|
216
|
+
// check event hash
|
|
217
|
+
const computed = compute_event_id(event);
|
|
218
|
+
for (let i = 0; i < id.length; i++) {
|
|
219
|
+
if (id[i] !== computed[i])
|
|
220
|
+
throw Error('id is invalid');
|
|
221
|
+
}
|
|
222
|
+
// copy event data into place
|
|
223
|
+
ATU8_HEAP.set(fromHex(event.sig), ip_sig_scratch);
|
|
224
|
+
ATU8_HEAP.set(fromHex(event.id), ip_msg_hash);
|
|
225
|
+
ATU8_HEAP.set(fromHex(event.pubkey), ip_pubkey_scratch);
|
|
226
|
+
// parse the public key
|
|
227
|
+
if (1 /* BinaryResult.SUCCESS */ !==
|
|
228
|
+
g_wasm.xonly_pubkey_parse(ip_ctx, ip_xonly_pubkey, ip_pubkey_scratch)) {
|
|
229
|
+
throw Error('pubkey is invalid');
|
|
230
|
+
}
|
|
231
|
+
// verify the signature
|
|
232
|
+
if (1 /* BinaryResult.SUCCESS */ !==
|
|
233
|
+
g_wasm.schnorrsig_verify(ip_ctx, ip_sig_scratch, ip_msg_hash, 32 /* ByteLens.MSG_HASH */, ip_xonly_pubkey)) {
|
|
234
|
+
throw Error('signature is invalid');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
function toHex(bytes) {
|
|
240
|
+
return bytes.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '');
|
|
241
|
+
}
|
|
242
|
+
function fromHex(hex) {
|
|
243
|
+
return new Uint8Array(hex.length / 2).map((_, i) => parseInt(hex.slice(i * 2, i * 2 + 2), 16));
|
|
244
|
+
}
|
|
245
|
+
export { NostrWasm };
|
|
246
|
+
//# sourceMappingURL=nostr-wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr-wasm.js","sourceRoot":"","sources":["../../src/relay/nostr-wasm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nostr Relay Manager for Worker
|
|
3
|
+
*
|
|
4
|
+
* Manages WebSocket connections to Nostr relays using nostr-tools.
|
|
5
|
+
* Provides subscribe/publish functionality for the worker.
|
|
6
|
+
*
|
|
7
|
+
* Used for:
|
|
8
|
+
* - WebRTC signaling (kind 25050 ephemeral)
|
|
9
|
+
* - Tree root resolution (kind 30078)
|
|
10
|
+
*/
|
|
11
|
+
import type { NostrFilter, SignedEvent, RelayStats } from './protocol';
|
|
12
|
+
export declare class NostrManager {
|
|
13
|
+
private pool;
|
|
14
|
+
private relays;
|
|
15
|
+
private subscriptions;
|
|
16
|
+
private relayStats;
|
|
17
|
+
private onEvent;
|
|
18
|
+
private onEose;
|
|
19
|
+
constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Initialize with relay URLs
|
|
22
|
+
*/
|
|
23
|
+
init(relays: string[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* Set event callback
|
|
26
|
+
*/
|
|
27
|
+
setOnEvent(callback: (subId: string, event: SignedEvent) => void): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set EOSE callback
|
|
30
|
+
*/
|
|
31
|
+
setOnEose(callback: (subId: string) => void): void;
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to events matching filters
|
|
34
|
+
*/
|
|
35
|
+
subscribe(subId: string, filters: NostrFilter[]): void;
|
|
36
|
+
/**
|
|
37
|
+
* Unsubscribe from a subscription
|
|
38
|
+
*/
|
|
39
|
+
unsubscribe(subId: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Publish an event to all relays
|
|
42
|
+
*/
|
|
43
|
+
publish(event: SignedEvent): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get relay connection stats
|
|
46
|
+
*/
|
|
47
|
+
getRelayStats(): RelayStats[];
|
|
48
|
+
/**
|
|
49
|
+
* Update relay connection status
|
|
50
|
+
* Called when connection state changes
|
|
51
|
+
*/
|
|
52
|
+
setRelayConnected(url: string, connected: boolean): void;
|
|
53
|
+
/**
|
|
54
|
+
* Close all subscriptions and connections
|
|
55
|
+
*/
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
58
|
+
export declare function getNostrManager(): NostrManager;
|
|
59
|
+
export declare function closeNostrManager(): void;
|
|
60
|
+
//# sourceMappingURL=nostr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr.d.ts","sourceRoot":"","sources":["../../src/relay/nostr.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiBvE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,OAAO,CAA8D;IAC7E,OAAO,CAAC,MAAM,CAA0C;;IAMxD;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB5B;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIvE;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;IAkEtD;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWhC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BhD;;OAEG;IACH,aAAa,IAAI,UAAU,EAAE;IAa7B;;;OAGG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAOxD;;OAEG;IACH,KAAK,IAAI,IAAI;CAWd;AAKD,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Nostr Relay Manager for Worker
|
|
4
|
+
*
|
|
5
|
+
* Manages WebSocket connections to Nostr relays using nostr-tools.
|
|
6
|
+
* Provides subscribe/publish functionality for the worker.
|
|
7
|
+
*
|
|
8
|
+
* Used for:
|
|
9
|
+
* - WebRTC signaling (kind 25050 ephemeral)
|
|
10
|
+
* - Tree root resolution (kind 30078)
|
|
11
|
+
*/
|
|
12
|
+
import { SimplePool } from 'nostr-tools';
|
|
13
|
+
export class NostrManager {
|
|
14
|
+
pool;
|
|
15
|
+
relays = [];
|
|
16
|
+
subscriptions = new Map();
|
|
17
|
+
relayStats = new Map();
|
|
18
|
+
onEvent = null;
|
|
19
|
+
onEose = null;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.pool = new SimplePool();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize with relay URLs
|
|
25
|
+
*/
|
|
26
|
+
init(relays) {
|
|
27
|
+
this.relays = relays;
|
|
28
|
+
// Initialize stats for each relay
|
|
29
|
+
for (const url of relays) {
|
|
30
|
+
this.relayStats.set(url, {
|
|
31
|
+
url,
|
|
32
|
+
connected: false,
|
|
33
|
+
eventsReceived: 0,
|
|
34
|
+
eventsSent: 0,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
console.log('[NostrManager] Initialized with relays:', relays);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set event callback
|
|
41
|
+
*/
|
|
42
|
+
setOnEvent(callback) {
|
|
43
|
+
this.onEvent = callback;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set EOSE callback
|
|
47
|
+
*/
|
|
48
|
+
setOnEose(callback) {
|
|
49
|
+
this.onEose = callback;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Subscribe to events matching filters
|
|
53
|
+
*/
|
|
54
|
+
subscribe(subId, filters) {
|
|
55
|
+
// Close existing subscription with same ID if any
|
|
56
|
+
this.unsubscribe(subId);
|
|
57
|
+
console.log('[NostrManager] Creating subscription:', subId, 'to relays:', this.relays, 'filters:', filters);
|
|
58
|
+
// Convert our NostrFilter to nostr-tools Filter
|
|
59
|
+
// Subscribe to each filter separately and track them
|
|
60
|
+
const subs = [];
|
|
61
|
+
for (const f of filters) {
|
|
62
|
+
// Build filter with any tag filters (e.g., #e, #p, #d, #l)
|
|
63
|
+
const poolFilter = {
|
|
64
|
+
ids: f.ids,
|
|
65
|
+
authors: f.authors,
|
|
66
|
+
kinds: f.kinds,
|
|
67
|
+
since: f.since,
|
|
68
|
+
until: f.until,
|
|
69
|
+
limit: f.limit,
|
|
70
|
+
};
|
|
71
|
+
// Copy any tag filters (keys starting with #)
|
|
72
|
+
for (const key of Object.keys(f)) {
|
|
73
|
+
if (key.startsWith('#') && f[key]) {
|
|
74
|
+
poolFilter[key] = f[key];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
console.log('[NostrManager] pool.subscribe called with filter:', poolFilter);
|
|
79
|
+
const sub = this.pool.subscribe(this.relays, poolFilter, {
|
|
80
|
+
onevent: (event) => {
|
|
81
|
+
console.log('[NostrManager] Received event:', event.kind, 'from:', event.pubkey?.slice(0, 8), 'id:', event.id?.slice(0, 8));
|
|
82
|
+
// Convert to SignedEvent
|
|
83
|
+
const signedEvent = {
|
|
84
|
+
id: event.id,
|
|
85
|
+
pubkey: event.pubkey,
|
|
86
|
+
kind: event.kind,
|
|
87
|
+
content: event.content,
|
|
88
|
+
tags: event.tags,
|
|
89
|
+
created_at: event.created_at,
|
|
90
|
+
sig: event.sig,
|
|
91
|
+
};
|
|
92
|
+
this.onEvent?.(subId, signedEvent);
|
|
93
|
+
},
|
|
94
|
+
oneose: () => {
|
|
95
|
+
console.log('[NostrManager] EOSE for sub:', subId);
|
|
96
|
+
this.onEose?.(subId);
|
|
97
|
+
},
|
|
98
|
+
onerror: (err) => {
|
|
99
|
+
console.error('[NostrManager] Subscription error:', subId, err);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
console.log('[NostrManager] Subscription object:', typeof sub, sub);
|
|
103
|
+
subs.push(sub);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.error('[NostrManager] Error creating subscription:', subId, err);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Store all subs for this subscription ID
|
|
110
|
+
this.subscriptions.set(subId, { id: subId, filters, subs });
|
|
111
|
+
console.log('[NostrManager] Subscribed:', subId, filters);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Unsubscribe from a subscription
|
|
115
|
+
*/
|
|
116
|
+
unsubscribe(subId) {
|
|
117
|
+
const sub = this.subscriptions.get(subId);
|
|
118
|
+
if (sub) {
|
|
119
|
+
for (const s of sub.subs) {
|
|
120
|
+
s.close();
|
|
121
|
+
}
|
|
122
|
+
this.subscriptions.delete(subId);
|
|
123
|
+
console.log('[NostrManager] Unsubscribed:', subId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Publish an event to all relays
|
|
128
|
+
*/
|
|
129
|
+
async publish(event) {
|
|
130
|
+
// Convert to nostr-tools Event
|
|
131
|
+
const poolEvent = {
|
|
132
|
+
id: event.id,
|
|
133
|
+
pubkey: event.pubkey,
|
|
134
|
+
kind: event.kind,
|
|
135
|
+
content: event.content,
|
|
136
|
+
tags: event.tags,
|
|
137
|
+
created_at: event.created_at,
|
|
138
|
+
sig: event.sig,
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
await Promise.any(this.pool.publish(this.relays, poolEvent));
|
|
142
|
+
// Update stats for successful publish
|
|
143
|
+
for (const [, stats] of this.relayStats) {
|
|
144
|
+
stats.eventsSent++;
|
|
145
|
+
}
|
|
146
|
+
console.log('[NostrManager] Published event:', event.id);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.error('[NostrManager] Failed to publish:', err);
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get relay connection stats
|
|
155
|
+
*/
|
|
156
|
+
getRelayStats() {
|
|
157
|
+
const result = [];
|
|
158
|
+
for (const [url, stats] of this.relayStats) {
|
|
159
|
+
result.push({
|
|
160
|
+
url,
|
|
161
|
+
connected: stats.connected,
|
|
162
|
+
eventsReceived: stats.eventsReceived,
|
|
163
|
+
eventsSent: stats.eventsSent,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Update relay connection status
|
|
170
|
+
* Called when connection state changes
|
|
171
|
+
*/
|
|
172
|
+
setRelayConnected(url, connected) {
|
|
173
|
+
const stats = this.relayStats.get(url);
|
|
174
|
+
if (stats) {
|
|
175
|
+
stats.connected = connected;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Close all subscriptions and connections
|
|
180
|
+
*/
|
|
181
|
+
close() {
|
|
182
|
+
for (const [subId, sub] of this.subscriptions) {
|
|
183
|
+
for (const s of sub.subs) {
|
|
184
|
+
s.close();
|
|
185
|
+
}
|
|
186
|
+
console.log('[NostrManager] Closed subscription:', subId);
|
|
187
|
+
}
|
|
188
|
+
this.subscriptions.clear();
|
|
189
|
+
this.pool.close(this.relays);
|
|
190
|
+
console.log('[NostrManager] Closed');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Singleton instance for the worker
|
|
194
|
+
let instance = null;
|
|
195
|
+
export function getNostrManager() {
|
|
196
|
+
if (!instance) {
|
|
197
|
+
instance = new NostrManager();
|
|
198
|
+
}
|
|
199
|
+
return instance;
|
|
200
|
+
}
|
|
201
|
+
export function closeNostrManager() {
|
|
202
|
+
if (instance) {
|
|
203
|
+
instance.close();
|
|
204
|
+
instance = null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=nostr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr.js","sourceRoot":"","sources":["../../src/relay/nostr.ts"],"names":[],"mappings":"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"}
|