@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.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app-runtime.d.ts +60 -0
  3. package/dist/app-runtime.d.ts.map +1 -0
  4. package/dist/app-runtime.js +271 -0
  5. package/dist/app-runtime.js.map +1 -0
  6. package/dist/capabilities/blossomBandwidthTracker.d.ts +26 -0
  7. package/dist/capabilities/blossomBandwidthTracker.d.ts.map +1 -0
  8. package/dist/capabilities/blossomBandwidthTracker.js +53 -0
  9. package/dist/capabilities/blossomBandwidthTracker.js.map +1 -0
  10. package/dist/capabilities/blossomTransport.d.ts +22 -0
  11. package/dist/capabilities/blossomTransport.d.ts.map +1 -0
  12. package/dist/capabilities/blossomTransport.js +139 -0
  13. package/dist/capabilities/blossomTransport.js.map +1 -0
  14. package/dist/capabilities/connectivity.d.ts +3 -0
  15. package/dist/capabilities/connectivity.d.ts.map +1 -0
  16. package/dist/capabilities/connectivity.js +49 -0
  17. package/dist/capabilities/connectivity.js.map +1 -0
  18. package/dist/capabilities/idbStorage.d.ts +25 -0
  19. package/dist/capabilities/idbStorage.d.ts.map +1 -0
  20. package/dist/capabilities/idbStorage.js +73 -0
  21. package/dist/capabilities/idbStorage.js.map +1 -0
  22. package/dist/capabilities/meshRouterStore.d.ts +71 -0
  23. package/dist/capabilities/meshRouterStore.d.ts.map +1 -0
  24. package/dist/capabilities/meshRouterStore.js +316 -0
  25. package/dist/capabilities/meshRouterStore.js.map +1 -0
  26. package/dist/capabilities/rootResolver.d.ts +10 -0
  27. package/dist/capabilities/rootResolver.d.ts.map +1 -0
  28. package/dist/capabilities/rootResolver.js +392 -0
  29. package/dist/capabilities/rootResolver.js.map +1 -0
  30. package/dist/client-id.d.ts +18 -0
  31. package/dist/client-id.d.ts.map +1 -0
  32. package/dist/client-id.js +98 -0
  33. package/dist/client-id.js.map +1 -0
  34. package/dist/client.d.ts +61 -0
  35. package/dist/client.d.ts.map +1 -0
  36. package/dist/client.js +417 -0
  37. package/dist/client.js.map +1 -0
  38. package/dist/entry.d.ts +2 -0
  39. package/dist/entry.d.ts.map +1 -0
  40. package/dist/entry.js +3 -0
  41. package/dist/entry.js.map +1 -0
  42. package/dist/htree-path.d.ts +13 -0
  43. package/dist/htree-path.d.ts.map +1 -0
  44. package/dist/htree-path.js +38 -0
  45. package/dist/htree-path.js.map +1 -0
  46. package/dist/htree-url.d.ts +22 -0
  47. package/dist/htree-url.d.ts.map +1 -0
  48. package/dist/htree-url.js +118 -0
  49. package/dist/htree-url.js.map +1 -0
  50. package/dist/index.d.ts +17 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +8 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/mediaStreaming.d.ts +7 -0
  55. package/dist/mediaStreaming.d.ts.map +1 -0
  56. package/dist/mediaStreaming.js +48 -0
  57. package/dist/mediaStreaming.js.map +1 -0
  58. package/dist/p2p/boundedQueue.d.ts +79 -0
  59. package/dist/p2p/boundedQueue.d.ts.map +1 -0
  60. package/dist/p2p/boundedQueue.js +134 -0
  61. package/dist/p2p/boundedQueue.js.map +1 -0
  62. package/dist/p2p/errorMessage.d.ts +5 -0
  63. package/dist/p2p/errorMessage.d.ts.map +1 -0
  64. package/dist/p2p/errorMessage.js +7 -0
  65. package/dist/p2p/errorMessage.js.map +1 -0
  66. package/dist/p2p/index.d.ts +8 -0
  67. package/dist/p2p/index.d.ts.map +1 -0
  68. package/dist/p2p/index.js +6 -0
  69. package/dist/p2p/index.js.map +1 -0
  70. package/dist/p2p/lruCache.d.ts +26 -0
  71. package/dist/p2p/lruCache.d.ts.map +1 -0
  72. package/dist/p2p/lruCache.js +65 -0
  73. package/dist/p2p/lruCache.js.map +1 -0
  74. package/dist/p2p/meshQueryRouter.d.ts +57 -0
  75. package/dist/p2p/meshQueryRouter.d.ts.map +1 -0
  76. package/dist/p2p/meshQueryRouter.js +264 -0
  77. package/dist/p2p/meshQueryRouter.js.map +1 -0
  78. package/dist/p2p/protocol.d.ts +10 -0
  79. package/dist/p2p/protocol.d.ts.map +1 -0
  80. package/dist/p2p/protocol.js +2 -0
  81. package/dist/p2p/protocol.js.map +1 -0
  82. package/dist/p2p/queryForwardingMachine.d.ts +46 -0
  83. package/dist/p2p/queryForwardingMachine.d.ts.map +1 -0
  84. package/dist/p2p/queryForwardingMachine.js +144 -0
  85. package/dist/p2p/queryForwardingMachine.js.map +1 -0
  86. package/dist/p2p/signaling.d.ts +63 -0
  87. package/dist/p2p/signaling.d.ts.map +1 -0
  88. package/dist/p2p/signaling.js +185 -0
  89. package/dist/p2p/signaling.js.map +1 -0
  90. package/dist/p2p/uploadRateLimiter.d.ts +21 -0
  91. package/dist/p2p/uploadRateLimiter.d.ts.map +1 -0
  92. package/dist/p2p/uploadRateLimiter.js +62 -0
  93. package/dist/p2p/uploadRateLimiter.js.map +1 -0
  94. package/dist/p2p/webrtcController.d.ts +176 -0
  95. package/dist/p2p/webrtcController.d.ts.map +1 -0
  96. package/dist/p2p/webrtcController.js +938 -0
  97. package/dist/p2p/webrtcController.js.map +1 -0
  98. package/dist/p2p/webrtcProxy.d.ts +62 -0
  99. package/dist/p2p/webrtcProxy.d.ts.map +1 -0
  100. package/dist/p2p/webrtcProxy.js +447 -0
  101. package/dist/p2p/webrtcProxy.js.map +1 -0
  102. package/dist/privacyGuards.d.ts +14 -0
  103. package/dist/privacyGuards.d.ts.map +1 -0
  104. package/dist/privacyGuards.js +27 -0
  105. package/dist/privacyGuards.js.map +1 -0
  106. package/dist/protocol.d.ts +225 -0
  107. package/dist/protocol.d.ts.map +1 -0
  108. package/dist/protocol.js +2 -0
  109. package/dist/protocol.js.map +1 -0
  110. package/dist/relay/identity.d.ts +36 -0
  111. package/dist/relay/identity.d.ts.map +1 -0
  112. package/dist/relay/identity.js +78 -0
  113. package/dist/relay/identity.js.map +1 -0
  114. package/dist/relay/mediaHandler.d.ts +64 -0
  115. package/dist/relay/mediaHandler.d.ts.map +1 -0
  116. package/dist/relay/mediaHandler.js +1285 -0
  117. package/dist/relay/mediaHandler.js.map +1 -0
  118. package/dist/relay/ndk.d.ts +96 -0
  119. package/dist/relay/ndk.d.ts.map +1 -0
  120. package/dist/relay/ndk.js +502 -0
  121. package/dist/relay/ndk.js.map +1 -0
  122. package/dist/relay/nostr-wasm.d.ts +14 -0
  123. package/dist/relay/nostr-wasm.d.ts.map +1 -0
  124. package/dist/relay/nostr-wasm.js +246 -0
  125. package/dist/relay/nostr-wasm.js.map +1 -0
  126. package/dist/relay/nostr.d.ts +60 -0
  127. package/dist/relay/nostr.d.ts.map +1 -0
  128. package/dist/relay/nostr.js +207 -0
  129. package/dist/relay/nostr.js.map +1 -0
  130. package/dist/relay/protocol.d.ts +592 -0
  131. package/dist/relay/protocol.d.ts.map +1 -0
  132. package/dist/relay/protocol.js +16 -0
  133. package/dist/relay/protocol.js.map +1 -0
  134. package/dist/relay/publicAssetUrl.d.ts +6 -0
  135. package/dist/relay/publicAssetUrl.d.ts.map +1 -0
  136. package/dist/relay/publicAssetUrl.js +14 -0
  137. package/dist/relay/publicAssetUrl.js.map +1 -0
  138. package/dist/relay/rootPathResolver.d.ts +9 -0
  139. package/dist/relay/rootPathResolver.d.ts.map +1 -0
  140. package/dist/relay/rootPathResolver.js +32 -0
  141. package/dist/relay/rootPathResolver.js.map +1 -0
  142. package/dist/relay/signing.d.ts +50 -0
  143. package/dist/relay/signing.d.ts.map +1 -0
  144. package/dist/relay/signing.js +299 -0
  145. package/dist/relay/signing.js.map +1 -0
  146. package/dist/relay/treeRootCache.d.ts +86 -0
  147. package/dist/relay/treeRootCache.d.ts.map +1 -0
  148. package/dist/relay/treeRootCache.js +269 -0
  149. package/dist/relay/treeRootCache.js.map +1 -0
  150. package/dist/relay/treeRootSubscription.d.ts +55 -0
  151. package/dist/relay/treeRootSubscription.d.ts.map +1 -0
  152. package/dist/relay/treeRootSubscription.js +478 -0
  153. package/dist/relay/treeRootSubscription.js.map +1 -0
  154. package/dist/relay/utils/constants.d.ts +76 -0
  155. package/dist/relay/utils/constants.d.ts.map +1 -0
  156. package/dist/relay/utils/constants.js +113 -0
  157. package/dist/relay/utils/constants.js.map +1 -0
  158. package/dist/relay/utils/errorMessage.d.ts +5 -0
  159. package/dist/relay/utils/errorMessage.d.ts.map +1 -0
  160. package/dist/relay/utils/errorMessage.js +8 -0
  161. package/dist/relay/utils/errorMessage.js.map +1 -0
  162. package/dist/relay/utils/lruCache.d.ts +26 -0
  163. package/dist/relay/utils/lruCache.d.ts.map +1 -0
  164. package/dist/relay/utils/lruCache.js +66 -0
  165. package/dist/relay/utils/lruCache.js.map +1 -0
  166. package/dist/relay/webrtc.d.ts +2 -0
  167. package/dist/relay/webrtc.d.ts.map +1 -0
  168. package/dist/relay/webrtc.js +3 -0
  169. package/dist/relay/webrtc.js.map +1 -0
  170. package/dist/relay/webrtcSignaling.d.ts +37 -0
  171. package/dist/relay/webrtcSignaling.d.ts.map +1 -0
  172. package/dist/relay/webrtcSignaling.js +86 -0
  173. package/dist/relay/webrtcSignaling.js.map +1 -0
  174. package/dist/relay/worker.d.ts +12 -0
  175. package/dist/relay/worker.d.ts.map +1 -0
  176. package/dist/relay/worker.js +1540 -0
  177. package/dist/relay/worker.js.map +1 -0
  178. package/dist/relay-client.d.ts +31 -0
  179. package/dist/relay-client.d.ts.map +1 -0
  180. package/dist/relay-client.js +197 -0
  181. package/dist/relay-client.js.map +1 -0
  182. package/dist/relay-entry.d.ts +2 -0
  183. package/dist/relay-entry.d.ts.map +1 -0
  184. package/dist/relay-entry.js +2 -0
  185. package/dist/relay-entry.js.map +1 -0
  186. package/dist/runtime-network.d.ts +23 -0
  187. package/dist/runtime-network.d.ts.map +1 -0
  188. package/dist/runtime-network.js +105 -0
  189. package/dist/runtime-network.js.map +1 -0
  190. package/dist/runtime.d.ts +24 -0
  191. package/dist/runtime.d.ts.map +1 -0
  192. package/dist/runtime.js +126 -0
  193. package/dist/runtime.js.map +1 -0
  194. package/dist/transferableBytes.d.ts +2 -0
  195. package/dist/transferableBytes.d.ts.map +1 -0
  196. package/dist/transferableBytes.js +6 -0
  197. package/dist/transferableBytes.js.map +1 -0
  198. package/dist/tree-root.d.ts +201 -0
  199. package/dist/tree-root.d.ts.map +1 -0
  200. package/dist/tree-root.js +632 -0
  201. package/dist/tree-root.js.map +1 -0
  202. package/dist/types.d.ts +2 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +2 -0
  205. package/dist/types.js.map +1 -0
  206. package/dist/worker.d.ts +9 -0
  207. package/dist/worker.d.ts.map +1 -0
  208. package/dist/worker.js +793 -0
  209. package/dist/worker.js.map +1 -0
  210. package/package.json +14 -14
  211. package/src/capabilities/blossomTransport.ts +1 -1
  212. package/src/worker.ts +2 -1
package/dist/client.js ADDED
@@ -0,0 +1,417 @@
1
+ import { generateRequestId } from '@hashtree/core';
2
+ const REQUEST_TIMEOUT_MS = 30_000;
3
+ const PUT_BLOB_TIMEOUT_MS = 15 * 60_000;
4
+ const STREAM_APPEND_TIMEOUT_MS = 60_000;
5
+ export class HashtreeWorkerClient {
6
+ workerFactory;
7
+ config;
8
+ worker = null;
9
+ initPromise = null;
10
+ pending = new Map();
11
+ connectivityListeners = new Set();
12
+ uploadProgressListeners = new Set();
13
+ blossomBandwidthListeners = new Set();
14
+ diagnosticListeners = new Set();
15
+ rootWatchListeners = new Map();
16
+ pendingRootWatchUpdates = new Map();
17
+ p2pFetchHandler = null;
18
+ constructor(workerFactory, config = {}) {
19
+ this.workerFactory = workerFactory;
20
+ this.config = config;
21
+ }
22
+ async init() {
23
+ if (this.initPromise)
24
+ return this.initPromise;
25
+ try {
26
+ this.spawnWorker();
27
+ }
28
+ catch (err) {
29
+ throw err instanceof Error ? err : new Error(String(err));
30
+ }
31
+ this.initPromise = new Promise((resolve, reject) => {
32
+ if (!this.worker) {
33
+ reject(new Error('Failed to create worker'));
34
+ return;
35
+ }
36
+ const id = generateRequestId();
37
+ const timeoutId = setTimeout(() => {
38
+ this.pending.delete(id);
39
+ reject(new Error('Worker init timed out'));
40
+ }, REQUEST_TIMEOUT_MS);
41
+ this.pending.set(id, {
42
+ resolve: (message) => {
43
+ if (message.type === 'ready') {
44
+ resolve();
45
+ return;
46
+ }
47
+ reject(new Error('Unexpected init response'));
48
+ },
49
+ reject: (error) => reject(error),
50
+ timeoutId,
51
+ });
52
+ this.worker.postMessage({
53
+ type: 'init',
54
+ id,
55
+ config: this.config,
56
+ });
57
+ });
58
+ return this.initPromise;
59
+ }
60
+ spawnWorker() {
61
+ if (this.workerFactory instanceof URL) {
62
+ this.worker = new Worker(this.workerFactory, { type: 'module' });
63
+ }
64
+ else if (typeof this.workerFactory === 'string') {
65
+ this.worker = new Worker(this.workerFactory, { type: 'module' });
66
+ }
67
+ else {
68
+ this.worker = new this.workerFactory();
69
+ }
70
+ this.worker.onmessage = (event) => {
71
+ const message = event.data;
72
+ if (message.type === 'connectivityUpdate') {
73
+ this.connectivityListeners.forEach(listener => listener(message.state));
74
+ return;
75
+ }
76
+ if (message.type === 'uploadProgress') {
77
+ this.uploadProgressListeners.forEach(listener => listener(message.progress));
78
+ return;
79
+ }
80
+ if (message.type === 'blossomBandwidth') {
81
+ this.blossomBandwidthListeners.forEach(listener => listener(message.stats));
82
+ return;
83
+ }
84
+ if (message.type === 'diagnostic') {
85
+ this.diagnosticListeners.forEach(listener => listener(message.event));
86
+ return;
87
+ }
88
+ if (message.type === 'rootUpdate') {
89
+ const listener = this.rootWatchListeners.get(message.watchId);
90
+ if (listener) {
91
+ listener(message.cid ?? null);
92
+ }
93
+ else {
94
+ this.pendingRootWatchUpdates.set(message.watchId, message.cid ?? null);
95
+ }
96
+ return;
97
+ }
98
+ if (message.type === 'p2pFetch') {
99
+ void this.handleP2PFetch(message.requestId, message.hashHex);
100
+ return;
101
+ }
102
+ if (message.type === 'error' && message.id) {
103
+ this.rejectPending(message.id, new Error(message.error));
104
+ return;
105
+ }
106
+ if ('id' in message && typeof message.id === 'string') {
107
+ this.resolvePending(message.id, message);
108
+ }
109
+ };
110
+ this.worker.onerror = (event) => {
111
+ const errorMessage = event instanceof ErrorEvent ? event.message : 'Worker error';
112
+ this.rejectAllPending(new Error(errorMessage));
113
+ };
114
+ }
115
+ rejectAllPending(error) {
116
+ for (const [id, pending] of this.pending.entries()) {
117
+ clearTimeout(pending.timeoutId);
118
+ pending.reject(error);
119
+ this.pending.delete(id);
120
+ }
121
+ }
122
+ resolvePending(id, message) {
123
+ const pending = this.pending.get(id);
124
+ if (!pending)
125
+ return;
126
+ clearTimeout(pending.timeoutId);
127
+ pending.resolve(message);
128
+ this.pending.delete(id);
129
+ }
130
+ rejectPending(id, error) {
131
+ const pending = this.pending.get(id);
132
+ if (!pending)
133
+ return;
134
+ clearTimeout(pending.timeoutId);
135
+ pending.reject(error);
136
+ this.pending.delete(id);
137
+ }
138
+ async handleP2PFetch(requestId, hashHex) {
139
+ if (!this.worker)
140
+ return;
141
+ const id = generateRequestId();
142
+ if (!this.p2pFetchHandler) {
143
+ this.worker.postMessage({
144
+ type: 'p2pFetchResult',
145
+ id,
146
+ requestId,
147
+ });
148
+ return;
149
+ }
150
+ try {
151
+ const data = await this.p2pFetchHandler(hashHex);
152
+ if (data && data.byteLength > 0) {
153
+ this.worker.postMessage({
154
+ type: 'p2pFetchResult',
155
+ id,
156
+ requestId,
157
+ data,
158
+ }, [data.buffer]);
159
+ return;
160
+ }
161
+ this.worker.postMessage({
162
+ type: 'p2pFetchResult',
163
+ id,
164
+ requestId,
165
+ });
166
+ }
167
+ catch (err) {
168
+ const error = err instanceof Error ? err.message : String(err);
169
+ this.worker.postMessage({
170
+ type: 'p2pFetchResult',
171
+ id,
172
+ requestId,
173
+ error,
174
+ });
175
+ }
176
+ }
177
+ async request(payload, timeoutMs = REQUEST_TIMEOUT_MS, transfer = []) {
178
+ await this.initIfNeeded();
179
+ if (!this.worker) {
180
+ throw new Error('Worker not initialized');
181
+ }
182
+ const id = generateRequestId();
183
+ const message = { ...payload, id };
184
+ return new Promise((resolve, reject) => {
185
+ const timeoutId = setTimeout(() => {
186
+ this.pending.delete(id);
187
+ reject(new Error(`Worker request timed out: ${payload.type}`));
188
+ }, timeoutMs);
189
+ this.pending.set(id, { resolve, reject, timeoutId });
190
+ this.worker?.postMessage(message, transfer);
191
+ });
192
+ }
193
+ async initIfNeeded() {
194
+ if (!this.initPromise) {
195
+ await this.init();
196
+ return;
197
+ }
198
+ await this.initPromise;
199
+ }
200
+ async putBlob(data, mimeType, upload = true) {
201
+ const res = await this.request({ type: 'putBlob', data, mimeType, upload }, PUT_BLOB_TIMEOUT_MS);
202
+ if (res.type !== 'blobStored') {
203
+ throw new Error('Unexpected response for putBlob');
204
+ }
205
+ if (!res.hashHex || !res.nhash) {
206
+ throw new Error('Failed to store blob');
207
+ }
208
+ return { hashHex: res.hashHex, nhash: res.nhash };
209
+ }
210
+ async beginPutBlobStream(mimeType, upload = true) {
211
+ const res = await this.request({ type: 'beginPutBlobStream', mimeType, upload });
212
+ if (res.type !== 'blobStreamStarted') {
213
+ throw new Error('Unexpected response for beginPutBlobStream');
214
+ }
215
+ if (!res.streamId) {
216
+ throw new Error('Failed to start blob stream');
217
+ }
218
+ return res.streamId;
219
+ }
220
+ async appendPutBlobStream(streamId, chunk) {
221
+ const res = await this.request({ type: 'appendPutBlobStream', streamId, chunk }, STREAM_APPEND_TIMEOUT_MS, [chunk.buffer]);
222
+ if (res.type !== 'void') {
223
+ throw new Error('Unexpected response for appendPutBlobStream');
224
+ }
225
+ if (res.error) {
226
+ throw new Error(res.error);
227
+ }
228
+ }
229
+ async finishPutBlobStream(streamId) {
230
+ const res = await this.request({ type: 'finishPutBlobStream', streamId }, PUT_BLOB_TIMEOUT_MS);
231
+ if (res.type !== 'blobStored') {
232
+ throw new Error('Unexpected response for finishPutBlobStream');
233
+ }
234
+ if (!res.hashHex || !res.nhash) {
235
+ throw new Error('Failed to finalize blob stream');
236
+ }
237
+ return { hashHex: res.hashHex, nhash: res.nhash };
238
+ }
239
+ async cancelPutBlobStream(streamId) {
240
+ const res = await this.request({ type: 'cancelPutBlobStream', streamId });
241
+ if (res.type !== 'void') {
242
+ throw new Error('Unexpected response for cancelPutBlobStream');
243
+ }
244
+ if (res.error) {
245
+ throw new Error(res.error);
246
+ }
247
+ }
248
+ async getBlob(hashHex) {
249
+ const res = await this.request({ type: 'getBlob', hashHex });
250
+ if (res.type !== 'blob') {
251
+ throw new Error('Unexpected response for getBlob');
252
+ }
253
+ if (res.error || !res.data || !res.source) {
254
+ throw new Error(res.error || 'Blob not found');
255
+ }
256
+ return { data: res.data, source: res.source };
257
+ }
258
+ async getBlobForPeer(hashHex) {
259
+ const res = await this.request({ type: 'getBlob', hashHex, forPeer: true });
260
+ if (res.type !== 'blob') {
261
+ throw new Error('Unexpected response for getBlobForPeer');
262
+ }
263
+ if (res.error || !res.data) {
264
+ return null;
265
+ }
266
+ return res.data;
267
+ }
268
+ async setBlossomServers(servers) {
269
+ const res = await this.request({ type: 'setBlossomServers', servers });
270
+ if (res.type !== 'void') {
271
+ throw new Error('Unexpected response for setBlossomServers');
272
+ }
273
+ if (res.error) {
274
+ throw new Error(res.error);
275
+ }
276
+ }
277
+ async registerMediaPort(port) {
278
+ const res = await this.request({ type: 'registerMediaPort', port }, REQUEST_TIMEOUT_MS, [port]);
279
+ if (res.type !== 'void') {
280
+ throw new Error('Unexpected response for registerMediaPort');
281
+ }
282
+ if (res.error) {
283
+ throw new Error(res.error);
284
+ }
285
+ }
286
+ async setStorageMaxBytes(maxBytes) {
287
+ const res = await this.request({ type: 'setStorageMaxBytes', maxBytes });
288
+ if (res.type !== 'void') {
289
+ throw new Error('Unexpected response for setStorageMaxBytes');
290
+ }
291
+ if (res.error) {
292
+ throw new Error(res.error);
293
+ }
294
+ }
295
+ async getStorageStats() {
296
+ const res = await this.request({ type: 'getStorageStats' });
297
+ if (res.type !== 'storageStats') {
298
+ throw new Error('Unexpected response for getStorageStats');
299
+ }
300
+ if (res.error) {
301
+ throw new Error(res.error);
302
+ }
303
+ return {
304
+ items: res.items,
305
+ bytes: res.bytes,
306
+ maxBytes: res.maxBytes,
307
+ };
308
+ }
309
+ async probeConnectivity() {
310
+ const res = await this.request({ type: 'probeConnectivity' });
311
+ if (res.type !== 'connectivity') {
312
+ throw new Error('Unexpected response for probeConnectivity');
313
+ }
314
+ if (res.error || !res.state) {
315
+ throw new Error(res.error || 'Connectivity probe failed');
316
+ }
317
+ return res.state;
318
+ }
319
+ async resolveRoot(npub, path, options = {}) {
320
+ const res = await this.request({
321
+ type: 'resolveRoot',
322
+ npub,
323
+ path,
324
+ timeoutMs: options.timeoutMs,
325
+ settleMs: options.settleMs,
326
+ });
327
+ if (res.type !== 'cid') {
328
+ throw new Error('Unexpected response for resolveRoot');
329
+ }
330
+ if (res.error) {
331
+ throw new Error(res.error);
332
+ }
333
+ return res.cid ?? null;
334
+ }
335
+ async watchRoot(npub, path, listener, options = {}) {
336
+ const res = await this.request({
337
+ type: 'watchRoot',
338
+ npub,
339
+ path,
340
+ timeoutMs: options.timeoutMs,
341
+ settleMs: options.settleMs,
342
+ });
343
+ if (res.type !== 'rootWatchStarted') {
344
+ throw new Error('Unexpected response for watchRoot');
345
+ }
346
+ if (res.error) {
347
+ throw new Error(res.error);
348
+ }
349
+ this.rootWatchListeners.set(res.watchId, listener);
350
+ if ('cid' in res) {
351
+ listener(res.cid ?? null);
352
+ }
353
+ if (this.pendingRootWatchUpdates.has(res.watchId)) {
354
+ const pendingCid = this.pendingRootWatchUpdates.get(res.watchId) ?? null;
355
+ this.pendingRootWatchUpdates.delete(res.watchId);
356
+ listener(pendingCid);
357
+ }
358
+ return async () => {
359
+ this.rootWatchListeners.delete(res.watchId);
360
+ this.pendingRootWatchUpdates.delete(res.watchId);
361
+ try {
362
+ const stopRes = await this.request({ type: 'unwatchRoot', watchId: res.watchId });
363
+ if (stopRes.type !== 'void') {
364
+ throw new Error('Unexpected response for unwatchRoot');
365
+ }
366
+ if (stopRes.error) {
367
+ throw new Error(stopRes.error);
368
+ }
369
+ }
370
+ catch {
371
+ // Ignore cleanup failures after local listener removal.
372
+ }
373
+ };
374
+ }
375
+ onConnectivityUpdate(listener) {
376
+ this.connectivityListeners.add(listener);
377
+ return () => {
378
+ this.connectivityListeners.delete(listener);
379
+ };
380
+ }
381
+ onUploadProgress(listener) {
382
+ this.uploadProgressListeners.add(listener);
383
+ return () => {
384
+ this.uploadProgressListeners.delete(listener);
385
+ };
386
+ }
387
+ onBlossomBandwidth(listener) {
388
+ this.blossomBandwidthListeners.add(listener);
389
+ return () => {
390
+ this.blossomBandwidthListeners.delete(listener);
391
+ };
392
+ }
393
+ onDiagnostic(listener) {
394
+ this.diagnosticListeners.add(listener);
395
+ return () => {
396
+ this.diagnosticListeners.delete(listener);
397
+ };
398
+ }
399
+ setP2PFetchHandler(handler) {
400
+ this.p2pFetchHandler = handler;
401
+ }
402
+ async close() {
403
+ try {
404
+ await this.request({ type: 'close' });
405
+ }
406
+ catch {
407
+ // Ignore close errors.
408
+ }
409
+ this.rootWatchListeners.clear();
410
+ this.pendingRootWatchUpdates.clear();
411
+ this.worker?.terminate();
412
+ this.worker = null;
413
+ this.initPromise = null;
414
+ this.rejectAllPending(new Error('Worker closed'));
415
+ }
416
+ }
417
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":""}
package/dist/entry.js ADDED
@@ -0,0 +1,3 @@
1
+ import { attachHashtreeWorker } from './worker.js';
2
+ attachHashtreeWorker();
3
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface ParsedMutableHtreePath {
2
+ npub: string;
3
+ treeName: string;
4
+ filePath: string;
5
+ }
6
+ export interface ParsedImmutableHtreePath {
7
+ nhash: string;
8
+ filePath: string;
9
+ }
10
+ export declare function getRawHtreePath(url: URL): string;
11
+ export declare function parseMutableHtreePath(rawPath: string): ParsedMutableHtreePath | null;
12
+ export declare function parseImmutableHtreePath(rawPath: string): ParsedImmutableHtreePath | null;
13
+ //# sourceMappingURL=htree-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htree-path.d.ts","sourceRoot":"","sources":["../src/htree-path.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAGhD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAgBpF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAUxF"}
@@ -0,0 +1,38 @@
1
+ function safeDecodePathSegment(segment) {
2
+ try {
3
+ return decodeURIComponent(segment);
4
+ }
5
+ catch {
6
+ return segment;
7
+ }
8
+ }
9
+ export function getRawHtreePath(url) {
10
+ const pathMatch = url.href.match(/^[^:]+:\/\/[^/]+(.*)$/);
11
+ return pathMatch ? (pathMatch[1]?.split('?')[0] || '') : url.pathname;
12
+ }
13
+ export function parseMutableHtreePath(rawPath) {
14
+ const parts = rawPath.replace(/^\/+/, '').split('/');
15
+ if (parts[0] !== 'htree' || parts.length < 3 || !parts[1]?.startsWith('npub1')) {
16
+ return null;
17
+ }
18
+ const treeName = safeDecodePathSegment(parts[2] || '');
19
+ if (!treeName) {
20
+ return null;
21
+ }
22
+ return {
23
+ npub: parts[1],
24
+ treeName,
25
+ filePath: parts.slice(3).map(safeDecodePathSegment).join('/'),
26
+ };
27
+ }
28
+ export function parseImmutableHtreePath(rawPath) {
29
+ const parts = rawPath.replace(/^\/+/, '').split('/');
30
+ if (parts[0] !== 'htree' || parts.length < 2 || !parts[1]?.startsWith('nhash1')) {
31
+ return null;
32
+ }
33
+ return {
34
+ nhash: parts[1],
35
+ filePath: parts.slice(2).map(safeDecodePathSegment).join('/'),
36
+ };
37
+ }
38
+ //# sourceMappingURL=htree-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htree-path.js","sourceRoot":"","sources":["../src/htree-path.ts"],"names":[],"mappings":"AAWA,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,QAAQ;QACR,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACf,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type HtreeRuntimeWindowLike } from './runtime.js';
2
+ export type ParsedHtreeUrl = {
3
+ kind: 'mutable';
4
+ npub: string;
5
+ treeName: string;
6
+ path: string;
7
+ } | {
8
+ kind: 'immutable';
9
+ nhash: string;
10
+ path: string;
11
+ };
12
+ export type MutableHtreeRequestStyle = 'htree' | 'gateway';
13
+ export interface ResolveHtreeRequestUrlOptions {
14
+ windowLike?: HtreeRuntimeWindowLike;
15
+ fallbackBaseUrl?: string | null;
16
+ baseUrl?: string | null;
17
+ mutableStyle?: MutableHtreeRequestStyle;
18
+ }
19
+ export declare function parseHtreeUrl(input: string): ParsedHtreeUrl | null;
20
+ export declare function buildHtreeRequestPath(input: string | ParsedHtreeUrl, mutableStyle?: MutableHtreeRequestStyle): string | null;
21
+ export declare function resolveHtreeRequestUrl(input: string | ParsedHtreeUrl, options?: ResolveHtreeRequestUrlOptions): string;
22
+ //# sourceMappingURL=htree-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htree-url.d.ts","sourceRoot":"","sources":["../src/htree-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC;AAwCD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA6ClE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GAAG,cAAc,EAC9B,YAAY,GAAE,wBAAkC,GAC/C,MAAM,GAAG,IAAI,CAqBf;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,cAAc,EAC9B,OAAO,GAAE,6BAAkC,GAC1C,MAAM,CAsBR"}
@@ -0,0 +1,118 @@
1
+ import { canUseInjectedHtreeServerUrl, resolveRuntimeHtreeBaseUrl, } from './runtime.js';
2
+ function safeDecodePathSegment(segment) {
3
+ try {
4
+ return decodeURIComponent(segment);
5
+ }
6
+ catch {
7
+ return segment;
8
+ }
9
+ }
10
+ function encodePath(path) {
11
+ return path
12
+ .split('/')
13
+ .filter(Boolean)
14
+ .map((segment) => encodeURIComponent(segment))
15
+ .join('/');
16
+ }
17
+ function stripQueryAndHash(path) {
18
+ const hashIndex = path.indexOf('#');
19
+ const pathWithoutHash = hashIndex === -1 ? path : path.slice(0, hashIndex);
20
+ const queryIndex = pathWithoutHash.indexOf('?');
21
+ return queryIndex === -1 ? pathWithoutHash : pathWithoutHash.slice(0, queryIndex);
22
+ }
23
+ function normalizeRelativePath(path) {
24
+ return stripQueryAndHash(path).replace(/^\/+/, '');
25
+ }
26
+ function resolveMutableRequestStyle(windowLike, baseUrl, explicitStyle) {
27
+ if (explicitStyle)
28
+ return explicitStyle;
29
+ if (!baseUrl)
30
+ return 'htree';
31
+ if (canUseInjectedHtreeServerUrl(windowLike))
32
+ return 'htree';
33
+ return 'gateway';
34
+ }
35
+ export function parseHtreeUrl(input) {
36
+ const trimmed = input.trim();
37
+ if (!trimmed)
38
+ return null;
39
+ if (trimmed.startsWith('htree://')) {
40
+ const withoutScheme = trimmed.slice('htree://'.length);
41
+ const firstSlash = withoutScheme.indexOf('/');
42
+ const head = firstSlash === -1 ? withoutScheme : withoutScheme.slice(0, firstSlash);
43
+ const tail = firstSlash === -1 ? '' : withoutScheme.slice(firstSlash + 1);
44
+ const rawSegments = normalizeRelativePath(tail).split('/').filter(Boolean);
45
+ if (head.startsWith('npub1')) {
46
+ const [rawTreeName = '', ...rawPathSegments] = rawSegments;
47
+ const treeName = safeDecodePathSegment(rawTreeName);
48
+ if (!treeName) {
49
+ return null;
50
+ }
51
+ return {
52
+ kind: 'mutable',
53
+ npub: head,
54
+ treeName,
55
+ path: rawPathSegments.map(safeDecodePathSegment).join('/'),
56
+ };
57
+ }
58
+ if (head.startsWith('nhash1')) {
59
+ return {
60
+ kind: 'immutable',
61
+ nhash: head,
62
+ path: rawSegments.map(safeDecodePathSegment).join('/'),
63
+ };
64
+ }
65
+ return null;
66
+ }
67
+ if (trimmed.startsWith('nhash1')) {
68
+ return {
69
+ kind: 'immutable',
70
+ nhash: stripQueryAndHash(trimmed),
71
+ path: '',
72
+ };
73
+ }
74
+ return null;
75
+ }
76
+ export function buildHtreeRequestPath(input, mutableStyle = 'htree') {
77
+ if (typeof input === 'string') {
78
+ const trimmed = input.trim();
79
+ if (!trimmed)
80
+ return null;
81
+ if (trimmed.startsWith('/htree/')) {
82
+ return trimmed;
83
+ }
84
+ }
85
+ const parsed = typeof input === 'string' ? parseHtreeUrl(input) : input;
86
+ if (!parsed)
87
+ return typeof input === 'string' ? input.trim() : null;
88
+ if (parsed.kind === 'mutable') {
89
+ const encodedTreeName = encodeURIComponent(parsed.treeName);
90
+ const encodedPath = encodePath(parsed.path);
91
+ const prefix = mutableStyle === 'htree' ? `/htree/${parsed.npub}` : `/${parsed.npub}`;
92
+ return `${prefix}/${encodedTreeName}${encodedPath ? `/${encodedPath}` : ''}`;
93
+ }
94
+ const encodedPath = encodePath(parsed.path);
95
+ return `/htree/${parsed.nhash}${encodedPath ? `/${encodedPath}` : ''}`;
96
+ }
97
+ export function resolveHtreeRequestUrl(input, options = {}) {
98
+ const trimmedInput = typeof input === 'string' ? input.trim() : '';
99
+ if (trimmedInput && /^https?:\/\//i.test(trimmedInput)) {
100
+ return trimmedInput;
101
+ }
102
+ const baseUrl = options.baseUrl?.trim()
103
+ ? options.baseUrl.trim().replace(/\/$/, '')
104
+ : resolveRuntimeHtreeBaseUrl({
105
+ windowLike: options.windowLike,
106
+ fallbackBaseUrl: options.fallbackBaseUrl,
107
+ });
108
+ const mutableStyle = resolveMutableRequestStyle(options.windowLike, baseUrl, options.mutableStyle);
109
+ const requestPath = buildHtreeRequestPath(input, mutableStyle);
110
+ if (!requestPath) {
111
+ return trimmedInput;
112
+ }
113
+ if (!baseUrl) {
114
+ return requestPath;
115
+ }
116
+ return `${baseUrl}${requestPath}`;
117
+ }
118
+ //# sourceMappingURL=htree-url.js.map