@freqhole/reliquary 0.0.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.
Files changed (226) hide show
  1. package/dist/automerge/acl-filtering.d.ts +87 -0
  2. package/dist/automerge/acl-filtering.d.ts.map +1 -0
  3. package/dist/automerge/acl-filtering.js +138 -0
  4. package/dist/automerge/acl-filtering.test.d.ts +2 -0
  5. package/dist/automerge/acl-filtering.test.d.ts.map +1 -0
  6. package/dist/automerge/acl-filtering.test.js +302 -0
  7. package/dist/automerge/index.d.ts +5 -0
  8. package/dist/automerge/index.d.ts.map +1 -0
  9. package/dist/automerge/index.js +7 -0
  10. package/dist/automerge/iroh-network-adapter.d.ts +178 -0
  11. package/dist/automerge/iroh-network-adapter.d.ts.map +1 -0
  12. package/dist/automerge/iroh-network-adapter.js +691 -0
  13. package/dist/automerge/iroh-network-adapter.test.d.ts +2 -0
  14. package/dist/automerge/iroh-network-adapter.test.d.ts.map +1 -0
  15. package/dist/automerge/iroh-network-adapter.test.js +818 -0
  16. package/dist/automerge/types.d.ts +66 -0
  17. package/dist/automerge/types.d.ts.map +1 -0
  18. package/dist/automerge/types.js +10 -0
  19. package/dist/blobs/bytes-backend.d.ts +41 -0
  20. package/dist/blobs/bytes-backend.d.ts.map +1 -0
  21. package/dist/blobs/bytes-backend.js +252 -0
  22. package/dist/blobs/bytes-backend.test.d.ts +2 -0
  23. package/dist/blobs/bytes-backend.test.d.ts.map +1 -0
  24. package/dist/blobs/bytes-backend.test.js +241 -0
  25. package/dist/blobs/db.d.ts +8 -0
  26. package/dist/blobs/db.d.ts.map +1 -0
  27. package/dist/blobs/db.js +141 -0
  28. package/dist/blobs/db.test.d.ts +2 -0
  29. package/dist/blobs/db.test.d.ts.map +1 -0
  30. package/dist/blobs/db.test.js +120 -0
  31. package/dist/blobs/index.d.ts +5 -0
  32. package/dist/blobs/index.d.ts.map +1 -0
  33. package/dist/blobs/index.js +2 -0
  34. package/dist/blobs/store.d.ts +47 -0
  35. package/dist/blobs/store.d.ts.map +1 -0
  36. package/dist/blobs/store.js +263 -0
  37. package/dist/blobs/store.test.d.ts +2 -0
  38. package/dist/blobs/store.test.d.ts.map +1 -0
  39. package/dist/blobs/store.test.js +377 -0
  40. package/dist/blobs/types.d.ts +55 -0
  41. package/dist/blobs/types.d.ts.map +1 -0
  42. package/dist/blobs/types.js +8 -0
  43. package/dist/ensure/client.d.ts +19 -0
  44. package/dist/ensure/client.d.ts.map +1 -0
  45. package/dist/ensure/client.js +74 -0
  46. package/dist/ensure/client.test.d.ts +2 -0
  47. package/dist/ensure/client.test.d.ts.map +1 -0
  48. package/dist/ensure/client.test.js +133 -0
  49. package/dist/ensure/index.d.ts +4 -0
  50. package/dist/ensure/index.d.ts.map +1 -0
  51. package/dist/ensure/index.js +4 -0
  52. package/dist/ensure/responder.d.ts +20 -0
  53. package/dist/ensure/responder.d.ts.map +1 -0
  54. package/dist/ensure/responder.js +100 -0
  55. package/dist/ensure/responder.test.d.ts +2 -0
  56. package/dist/ensure/responder.test.d.ts.map +1 -0
  57. package/dist/ensure/responder.test.js +191 -0
  58. package/dist/ensure/types.d.ts +19 -0
  59. package/dist/ensure/types.d.ts.map +1 -0
  60. package/dist/ensure/types.js +4 -0
  61. package/dist/ensure/types.test.d.ts +2 -0
  62. package/dist/ensure/types.test.d.ts.map +1 -0
  63. package/dist/ensure/types.test.js +81 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +3 -0
  67. package/dist/index.test.d.ts +2 -0
  68. package/dist/index.test.d.ts.map +1 -0
  69. package/dist/index.test.js +7 -0
  70. package/dist/solid/blob-url.d.ts +10 -0
  71. package/dist/solid/blob-url.d.ts.map +1 -0
  72. package/dist/solid/blob-url.js +34 -0
  73. package/dist/solid/blob-url.test.d.ts +2 -0
  74. package/dist/solid/blob-url.test.d.ts.map +1 -0
  75. package/dist/solid/blob-url.test.js +62 -0
  76. package/dist/solid/connection-summary.d.ts +25 -0
  77. package/dist/solid/connection-summary.d.ts.map +1 -0
  78. package/dist/solid/connection-summary.js +29 -0
  79. package/dist/solid/connection-summary.test.d.ts +2 -0
  80. package/dist/solid/connection-summary.test.d.ts.map +1 -0
  81. package/dist/solid/connection-summary.test.js +57 -0
  82. package/dist/solid/doc-store.d.ts +29 -0
  83. package/dist/solid/doc-store.d.ts.map +1 -0
  84. package/dist/solid/doc-store.js +79 -0
  85. package/dist/solid/doc-store.test.d.ts +2 -0
  86. package/dist/solid/doc-store.test.d.ts.map +1 -0
  87. package/dist/solid/doc-store.test.js +234 -0
  88. package/dist/solid/index.d.ts +4 -0
  89. package/dist/solid/index.d.ts.map +1 -0
  90. package/dist/solid/index.js +9 -0
  91. package/dist/solid/transfer-progress.d.ts +21 -0
  92. package/dist/solid/transfer-progress.d.ts.map +1 -0
  93. package/dist/solid/transfer-progress.js +32 -0
  94. package/dist/solid/transfer-progress.test.d.ts +2 -0
  95. package/dist/solid/transfer-progress.test.d.ts.map +1 -0
  96. package/dist/solid/transfer-progress.test.js +76 -0
  97. package/dist/testing/blob-fixtures.d.ts +19 -0
  98. package/dist/testing/blob-fixtures.d.ts.map +1 -0
  99. package/dist/testing/blob-fixtures.js +46 -0
  100. package/dist/testing/blob-fixtures.test.d.ts +2 -0
  101. package/dist/testing/blob-fixtures.test.d.ts.map +1 -0
  102. package/dist/testing/blob-fixtures.test.js +46 -0
  103. package/dist/testing/idb-harness.d.ts +10 -0
  104. package/dist/testing/idb-harness.d.ts.map +1 -0
  105. package/dist/testing/idb-harness.js +17 -0
  106. package/dist/testing/idb-harness.test.d.ts +2 -0
  107. package/dist/testing/idb-harness.test.d.ts.map +1 -0
  108. package/dist/testing/idb-harness.test.js +48 -0
  109. package/dist/testing/index.d.ts +7 -0
  110. package/dist/testing/index.d.ts.map +1 -0
  111. package/dist/testing/index.js +11 -0
  112. package/dist/testing/media.d.ts +15 -0
  113. package/dist/testing/media.d.ts.map +1 -0
  114. package/dist/testing/media.js +37 -0
  115. package/dist/testing/media.test.d.ts +2 -0
  116. package/dist/testing/media.test.d.ts.map +1 -0
  117. package/dist/testing/media.test.js +47 -0
  118. package/dist/testing/mock-blob-fetch.d.ts +33 -0
  119. package/dist/testing/mock-blob-fetch.d.ts.map +1 -0
  120. package/dist/testing/mock-blob-fetch.js +39 -0
  121. package/dist/testing/mock-blob-fetch.test.d.ts +2 -0
  122. package/dist/testing/mock-blob-fetch.test.d.ts.map +1 -0
  123. package/dist/testing/mock-blob-fetch.test.js +65 -0
  124. package/dist/testing/mock-node.d.ts +36 -0
  125. package/dist/testing/mock-node.d.ts.map +1 -0
  126. package/dist/testing/mock-node.js +97 -0
  127. package/dist/testing/mock-node.test.d.ts +2 -0
  128. package/dist/testing/mock-node.test.d.ts.map +1 -0
  129. package/dist/testing/mock-node.test.js +66 -0
  130. package/dist/testing/streams.d.ts +68 -0
  131. package/dist/testing/streams.d.ts.map +1 -0
  132. package/dist/testing/streams.js +99 -0
  133. package/dist/testing/streams.test.d.ts +2 -0
  134. package/dist/testing/streams.test.d.ts.map +1 -0
  135. package/dist/testing/streams.test.js +82 -0
  136. package/dist/transfer/cancellation.d.ts +8 -0
  137. package/dist/transfer/cancellation.d.ts.map +1 -0
  138. package/dist/transfer/cancellation.js +19 -0
  139. package/dist/transfer/index.d.ts +8 -0
  140. package/dist/transfer/index.d.ts.map +1 -0
  141. package/dist/transfer/index.js +4 -0
  142. package/dist/transfer/prefetch.d.ts +38 -0
  143. package/dist/transfer/prefetch.d.ts.map +1 -0
  144. package/dist/transfer/prefetch.js +61 -0
  145. package/dist/transfer/prefetch.test.d.ts +2 -0
  146. package/dist/transfer/prefetch.test.d.ts.map +1 -0
  147. package/dist/transfer/prefetch.test.js +136 -0
  148. package/dist/transfer/serve.d.ts +66 -0
  149. package/dist/transfer/serve.d.ts.map +1 -0
  150. package/dist/transfer/serve.js +126 -0
  151. package/dist/transfer/serve.test.d.ts +2 -0
  152. package/dist/transfer/serve.test.d.ts.map +1 -0
  153. package/dist/transfer/serve.test.js +101 -0
  154. package/dist/transfer/snatch.d.ts +39 -0
  155. package/dist/transfer/snatch.d.ts.map +1 -0
  156. package/dist/transfer/snatch.js +289 -0
  157. package/dist/transfer/snatch.test.d.ts +2 -0
  158. package/dist/transfer/snatch.test.d.ts.map +1 -0
  159. package/dist/transfer/snatch.test.js +337 -0
  160. package/dist/transfer/types.d.ts +85 -0
  161. package/dist/transfer/types.d.ts.map +1 -0
  162. package/dist/transfer/types.js +15 -0
  163. package/dist/utils/hash.d.ts +13 -0
  164. package/dist/utils/hash.d.ts.map +1 -0
  165. package/dist/utils/hash.js +31 -0
  166. package/dist/utils/hash.test.d.ts +2 -0
  167. package/dist/utils/hash.test.d.ts.map +1 -0
  168. package/dist/utils/hash.test.js +56 -0
  169. package/dist/utils/image-utils.d.ts +28 -0
  170. package/dist/utils/image-utils.d.ts.map +1 -0
  171. package/dist/utils/image-utils.js +113 -0
  172. package/dist/utils/image-utils.test.d.ts +2 -0
  173. package/dist/utils/image-utils.test.d.ts.map +1 -0
  174. package/dist/utils/image-utils.test.js +181 -0
  175. package/dist/utils/index.d.ts +4 -0
  176. package/dist/utils/index.d.ts.map +1 -0
  177. package/dist/utils/index.js +3 -0
  178. package/dist/utils/log.d.ts +22 -0
  179. package/dist/utils/log.d.ts.map +1 -0
  180. package/dist/utils/log.js +100 -0
  181. package/dist/utils/log.test.d.ts +2 -0
  182. package/dist/utils/log.test.d.ts.map +1 -0
  183. package/dist/utils/log.test.js +113 -0
  184. package/dist/worker/blob-worker-client.d.ts +118 -0
  185. package/dist/worker/blob-worker-client.d.ts.map +1 -0
  186. package/dist/worker/blob-worker-client.js +361 -0
  187. package/dist/worker/blob-worker-client.test.d.ts +2 -0
  188. package/dist/worker/blob-worker-client.test.d.ts.map +1 -0
  189. package/dist/worker/blob-worker-client.test.js +137 -0
  190. package/dist/worker/blob-worker-logic.d.ts +120 -0
  191. package/dist/worker/blob-worker-logic.d.ts.map +1 -0
  192. package/dist/worker/blob-worker-logic.js +368 -0
  193. package/dist/worker/blob-worker-logic.test.d.ts +2 -0
  194. package/dist/worker/blob-worker-logic.test.d.ts.map +1 -0
  195. package/dist/worker/blob-worker-logic.test.js +191 -0
  196. package/dist/worker/blob-worker.d.ts +21 -0
  197. package/dist/worker/blob-worker.d.ts.map +1 -0
  198. package/dist/worker/blob-worker.js +44 -0
  199. package/dist/worker/index.d.ts +12 -0
  200. package/dist/worker/index.d.ts.map +1 -0
  201. package/dist/worker/index.js +6 -0
  202. package/dist/worker/midden-blake3.d.ts +23 -0
  203. package/dist/worker/midden-blake3.d.ts.map +1 -0
  204. package/dist/worker/midden-blake3.js +47 -0
  205. package/dist/worker/midden-blake3.test.d.ts +2 -0
  206. package/dist/worker/midden-blake3.test.d.ts.map +1 -0
  207. package/dist/worker/midden-blake3.test.js +25 -0
  208. package/dist/worker/midden-not-bundled.stub.d.ts +1 -0
  209. package/dist/worker/midden-not-bundled.stub.d.ts.map +1 -0
  210. package/dist/worker/midden-not-bundled.stub.js +10 -0
  211. package/dist/worker/midden-stub.d.ts +10 -0
  212. package/dist/worker/midden-stub.d.ts.map +1 -0
  213. package/dist/worker/midden-stub.js +31 -0
  214. package/dist/worker/midden-stub.test.d.ts +2 -0
  215. package/dist/worker/midden-stub.test.d.ts.map +1 -0
  216. package/dist/worker/midden-stub.test.js +25 -0
  217. package/dist/worker/midden-worker-client.d.ts +103 -0
  218. package/dist/worker/midden-worker-client.d.ts.map +1 -0
  219. package/dist/worker/midden-worker-client.js +246 -0
  220. package/dist/worker/midden-worker-client.test.d.ts +2 -0
  221. package/dist/worker/midden-worker-client.test.d.ts.map +1 -0
  222. package/dist/worker/midden-worker-client.test.js +151 -0
  223. package/dist/worker/midden-worker-contract.d.ts +87 -0
  224. package/dist/worker/midden-worker-contract.d.ts.map +1 -0
  225. package/dist/worker/midden-worker-contract.js +30 -0
  226. package/package.json +90 -0
@@ -0,0 +1,151 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { WorkerBiStream, WorkerImportSession, WorkerMiddenNode } from "./midden-worker-client.js";
3
+ import { log } from "../utils/log.js";
4
+ // `WorkerBiStream`/`WorkerImportSession` are the parts of the comlink
5
+ // facade that are meaningfully unit-testable without a real worker thread:
6
+ // pure message construction/parsing over a fake api object.
7
+ // `WorkerMiddenNode.create`'s ready-handshake is covered below against a
8
+ // minimal fake `Worker`.
9
+ /** minimal fake `Worker`: enough of the `EventTarget`-based message/error
10
+ * surface for the ready-handshake tests below, without a real thread. */
11
+ class FakeWorker extends EventTarget {
12
+ postMessage = vi.fn();
13
+ terminate = vi.fn();
14
+ }
15
+ function makeFakeApi(overrides = {}) {
16
+ return {
17
+ init: vi.fn(),
18
+ openBi: vi.fn(),
19
+ accept: vi.fn(),
20
+ streamReadMessage: vi.fn(async () => null),
21
+ streamWriteMessage: vi.fn(async () => undefined),
22
+ streamReadToEnd: vi.fn(async () => new Uint8Array()),
23
+ streamWriteRawAndFinish: vi.fn(async () => undefined),
24
+ streamClose: vi.fn(async () => undefined),
25
+ importBlob: vi.fn(),
26
+ importBlobAndExportBao: vi.fn(),
27
+ importBao: vi.fn(),
28
+ hasActiveBlob: vi.fn(),
29
+ hasCompleteBlob: vi.fn(),
30
+ releaseBlob: vi.fn(),
31
+ restrictBlobToPeers: vi.fn(),
32
+ clearBlobRestriction: vi.fn(),
33
+ startImport: vi.fn(async () => 1),
34
+ importPush: vi.fn(async () => undefined),
35
+ importFinish: vi.fn(async () => "blake3-hex"),
36
+ importAbort: vi.fn(async () => undefined),
37
+ ensureBlob: vi.fn(),
38
+ downloadVerifiedWithEnsure: vi.fn(),
39
+ downloadVerifiedWithEnsureProgress: vi.fn(),
40
+ downloadVerifiedById: vi.fn(),
41
+ downloadVerifiedByIdProgress: vi.fn(),
42
+ downloadVerifiedStreamingWithEnsure: vi.fn(),
43
+ downloadCancel: vi.fn(),
44
+ protectBlob: vi.fn(),
45
+ unprotectBlob: vi.fn(),
46
+ computeBlake3: vi.fn(),
47
+ proxyRequest: vi.fn(),
48
+ ...overrides,
49
+ };
50
+ }
51
+ const STREAM_INFO = { streamId: 7, peerNodeId: "peer-abc", alpn: "test/1" };
52
+ describe("WorkerMiddenNode.create", () => {
53
+ it("rejects quickly (not after the full ready-timeout) when the worker script fails to load, and logs a warning", async () => {
54
+ vi.useFakeTimers();
55
+ const warnSpy = vi.spyOn(log, "warn");
56
+ const worker = new FakeWorker();
57
+ const createPromise = WorkerMiddenNode.create(null, () => worker);
58
+ // a worker script that fails to load fires an `error` event, never a
59
+ // `message` - this must reject right away, not after the 20s
60
+ // ready-timeout (proven by asserting the result WITHOUT advancing fake
61
+ // timers at all).
62
+ worker.dispatchEvent(new Event("error"));
63
+ await expect(createPromise).rejects.toThrow(/did not become ready/);
64
+ expect(warnSpy).toHaveBeenCalled();
65
+ expect(worker.terminate).toHaveBeenCalled();
66
+ vi.useRealTimers();
67
+ });
68
+ });
69
+ describe("WorkerBiStream", () => {
70
+ it("exposes the stream's peer id and alpn synchronously", () => {
71
+ const stream = new WorkerBiStream(makeFakeApi(), STREAM_INFO);
72
+ expect(stream.peer_node_id()).toBe("peer-abc");
73
+ expect(stream.alpn()).toBe("test/1");
74
+ });
75
+ it("read_message delegates to streamReadMessage with the stream id", async () => {
76
+ const api = makeFakeApi({ streamReadMessage: vi.fn(async () => new Uint8Array([1, 2])) });
77
+ const stream = new WorkerBiStream(api, STREAM_INFO);
78
+ const result = await stream.read_message();
79
+ expect(api.streamReadMessage).toHaveBeenCalledWith(7);
80
+ expect(Array.from(result)).toEqual([1, 2]);
81
+ });
82
+ it("write_message copies the buffer before sending (caller's buffer is untouched)", async () => {
83
+ const api = makeFakeApi();
84
+ const stream = new WorkerBiStream(api, STREAM_INFO);
85
+ const original = new Uint8Array([5, 6, 7]);
86
+ await stream.write_message(original);
87
+ expect(api.streamWriteMessage).toHaveBeenCalledTimes(1);
88
+ const [calledStreamId, sentBytes] = api.streamWriteMessage.mock
89
+ .calls[0];
90
+ expect(calledStreamId).toBe(7);
91
+ expect(Array.from(sentBytes)).toEqual([5, 6, 7]);
92
+ expect(sentBytes.buffer).not.toBe(original.buffer);
93
+ expect(original).toEqual(new Uint8Array([5, 6, 7]));
94
+ });
95
+ it("read_to_end delegates with the stream id and max size", async () => {
96
+ const api = makeFakeApi({ streamReadToEnd: vi.fn(async () => new Uint8Array([9])) });
97
+ const stream = new WorkerBiStream(api, STREAM_INFO);
98
+ await stream.read_to_end(4096);
99
+ expect(api.streamReadToEnd).toHaveBeenCalledWith(7, 4096);
100
+ });
101
+ it("write_raw_and_finish copies the buffer before sending", async () => {
102
+ const api = makeFakeApi();
103
+ const stream = new WorkerBiStream(api, STREAM_INFO);
104
+ const original = new Uint8Array([1, 1, 1]);
105
+ await stream.write_raw_and_finish(original);
106
+ const [calledStreamId, sentBytes] = api.streamWriteRawAndFinish.mock.calls[0];
107
+ expect(calledStreamId).toBe(7);
108
+ expect(sentBytes.buffer).not.toBe(original.buffer);
109
+ expect(Array.from(sentBytes)).toEqual([1, 1, 1]);
110
+ });
111
+ it("close() is fire-and-forget and swallows a rejection", () => {
112
+ const api = makeFakeApi({ streamClose: vi.fn(async () => Promise.reject(new Error("gone"))) });
113
+ const stream = new WorkerBiStream(api, STREAM_INFO);
114
+ expect(() => stream.close()).not.toThrow();
115
+ expect(api.streamClose).toHaveBeenCalledWith(7);
116
+ });
117
+ });
118
+ describe("WorkerImportSession", () => {
119
+ it("resolves start_import lazily, then push()es against that session id", async () => {
120
+ const api = makeFakeApi({ startImport: vi.fn(async () => 42) });
121
+ const session = new WorkerImportSession(api);
122
+ const original = new Uint8Array([3, 3, 3]);
123
+ await session.push(original);
124
+ expect(api.startImport).toHaveBeenCalledTimes(1);
125
+ const [sessionId, sentBytes] = api.importPush.mock.calls[0];
126
+ expect(sessionId).toBe(42);
127
+ expect(sentBytes.buffer).not.toBe(original.buffer);
128
+ expect(Array.from(sentBytes)).toEqual([3, 3, 3]);
129
+ });
130
+ it("finish() awaits the session id and returns the resulting hash", async () => {
131
+ const api = makeFakeApi({
132
+ startImport: vi.fn(async () => 5),
133
+ importFinish: vi.fn(async () => "abc123"),
134
+ });
135
+ const session = new WorkerImportSession(api);
136
+ const hash = await session.finish();
137
+ expect(api.importFinish).toHaveBeenCalledWith(5);
138
+ expect(hash).toBe("abc123");
139
+ });
140
+ it("abort() is fire-and-forget and swallows a rejection", async () => {
141
+ const api = makeFakeApi({
142
+ startImport: vi.fn(async () => 9),
143
+ importAbort: vi.fn(async () => Promise.reject(new Error("already finished"))),
144
+ });
145
+ const session = new WorkerImportSession(api);
146
+ expect(() => session.abort()).not.toThrow();
147
+ // let the fire-and-forget promise chain settle before the test ends
148
+ await new Promise((resolve) => setTimeout(resolve, 0));
149
+ expect(api.importAbort).toHaveBeenCalledWith(9);
150
+ });
151
+ });
@@ -0,0 +1,87 @@
1
+ /** identifies a stream registered on the entry side; opaque to the client
2
+ * beyond routing subsequent read/write/close calls back to it. */
3
+ export interface StreamInfo {
4
+ streamId: number;
5
+ peerNodeId: string;
6
+ alpn: string;
7
+ }
8
+ /** result of `init`: the node's identity, cached on the client so the
9
+ * sync `node_id()`/`secret_key()` getters don't need a round trip. */
10
+ export interface MiddenWorkerIdentity {
11
+ nodeId: string;
12
+ secretKey: Uint8Array;
13
+ }
14
+ /**
15
+ * the entry's comlink-exposed surface. every method here runs on the
16
+ * worker thread; callback arguments (`onProgress`, `onChunk`) arrive as
17
+ * comlink proxies and are invoked fire-and-forget from the entry side.
18
+ *
19
+ * transfer discipline: Uint8Array/ArrayBuffer arguments and return values
20
+ * are expected to travel as transferables (see `Comlink.transfer`) rather
21
+ * than structured-cloned copies wherever the sender doesn't need to reuse
22
+ * the buffer afterwards - the client's `toTransferable` helper enforces
23
+ * this on the way in.
24
+ */
25
+ export interface MiddenWorkerApi {
26
+ /** create the node (restoring from a persisted secret key when given). */
27
+ init(secretKey: Uint8Array | null): Promise<MiddenWorkerIdentity>;
28
+ openBi(peerAddr: string, alpn: string): Promise<StreamInfo>;
29
+ /** long-poll: resolves with the next accepted stream, or null when the
30
+ * endpoint closes. */
31
+ accept(): Promise<StreamInfo | null>;
32
+ streamReadMessage(streamId: number): Promise<Uint8Array | null>;
33
+ streamWriteMessage(streamId: number, data: Uint8Array): Promise<void>;
34
+ streamReadToEnd(streamId: number, maxSize: number): Promise<Uint8Array>;
35
+ streamWriteRawAndFinish(streamId: number, data: Uint8Array): Promise<void>;
36
+ /** idempotent - closing an already-closed/dead stream id is a no-op. */
37
+ streamClose(streamId: number): Promise<void>;
38
+ importBlob(data: Uint8Array): Promise<string>;
39
+ importBlobAndExportBao(data: Uint8Array): Promise<{
40
+ hash: string;
41
+ bao: Uint8Array;
42
+ }>;
43
+ importBao(blake3Hash: string, baoData: Uint8Array): Promise<string>;
44
+ hasActiveBlob(blake3Hash: string): Promise<boolean>;
45
+ /** true when a COMPLETE blob with this hash exists in the blob store
46
+ * itself - with a persistent store this survives reloads even without
47
+ * an active temp-tag. */
48
+ hasCompleteBlob(blake3Hash: string): Promise<boolean>;
49
+ releaseBlob(blake3Hash: string): Promise<void>;
50
+ restrictBlobToPeers(blake3Hash: string, peerNodeIds: string[]): Promise<void>;
51
+ clearBlobRestriction(blake3Hash: string): Promise<void>;
52
+ startImport(): Promise<number>;
53
+ importPush(sessionId: number, chunk: Uint8Array): Promise<void>;
54
+ importFinish(sessionId: number): Promise<string>;
55
+ importAbort(sessionId: number): Promise<void>;
56
+ ensureBlob(peerAddr: string, blake3Hash: string): Promise<boolean>;
57
+ downloadVerifiedWithEnsure(peerAddr: string, blake3Hash: string): Promise<Uint8Array>;
58
+ downloadVerifiedWithEnsureProgress(peerAddr: string, blake3Hash: string, totalSize: number, onProgress: (fraction: number) => void, downloadId?: string): Promise<Uint8Array>;
59
+ downloadVerifiedById(peerAddr: string, blobId: string): Promise<[Uint8Array, string]>;
60
+ downloadVerifiedByIdProgress(peerAddr: string, blobId: string, totalSize: number, onProgress: (fraction: number) => void): Promise<[Uint8Array, string]>;
61
+ downloadVerifiedStreamingWithEnsure(peerAddr: string, blake3Hash: string, totalSize: number, onChunk: (chunk: Uint8Array, offset: number) => void, onProgress: (fraction: number) => void, downloadId?: string): Promise<number>;
62
+ /** pause/cancel an in-flight download by the id passed to the download
63
+ * call. returns false when the download already settled. the partial
64
+ * stays in the store, pinned against gc - a later download of the same
65
+ * hash resumes from the persisted bitfield. */
66
+ downloadCancel(downloadId: string): Promise<boolean>;
67
+ /** pin a hash against gc (keep a paused partial download alive). */
68
+ protectBlob(blake3Hash: string): Promise<void>;
69
+ /** remove a gc pin added by protectBlob or a cancelled download. */
70
+ unprotectBlob(blake3Hash: string): Promise<void>;
71
+ computeBlake3(peerAddr: string, blobId: string): Promise<string | null>;
72
+ proxyRequest(peerAddr: string, method: string, path: string, body: string | null): Promise<{
73
+ status: number;
74
+ body: string;
75
+ }>;
76
+ }
77
+ /** message the entry must `postMessage` immediately after `Comlink.expose()`
78
+ * registers its message listener - and not a moment before. an rpc call
79
+ * sent before that listener exists fires with nothing attached and is
80
+ * dropped forever, so the client waits for this exact literal before
81
+ * handing out its comlink proxy. */
82
+ export declare const MIDDEN_WORKER_READY_MESSAGE = "midden-worker-ready";
83
+ /** how long the client waits for `MIDDEN_WORKER_READY_MESSAGE` before
84
+ * giving up. generous: the entry's top level typically awaits a large
85
+ * wasm module's instantiation before it can register that listener. */
86
+ export declare const MIDDEN_WORKER_READY_TIMEOUT_MS = 20000;
87
+ //# sourceMappingURL=midden-worker-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"midden-worker-contract.d.ts","sourceRoot":"","sources":["../../src/worker/midden-worker-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ // documented comlink message-shape contract between a midden worker entry
2
+ // and this package's main-thread client facade (`midden-worker-client.ts`).
3
+ //
4
+ // the entry itself - the module that owns the iroh endpoint, the blob
5
+ // store, the web-lock guarding single-tab OPFS ownership, and boot/identity
6
+ // wiring - is not part of this package. it stays with whichever app hosts
7
+ // it, since its lifecycle is entangled with that app's own identity/boot
8
+ // flow. this file is the seam: it pins down every method name, argument
9
+ // shape, and transfer-ownership rule the entry and the client must agree
10
+ // on, so the two can be developed independently as long as both sides
11
+ // keep implementing this exact interface.
12
+ //
13
+ // stream/session state (BiStream, ImportSession) never crosses the
14
+ // comlink boundary as objects - the entry holds them in id-keyed
15
+ // registries and exposes flat functions over those ids; the client's
16
+ // `WorkerBiStream` / `WorkerImportSession` classes reconstruct the
17
+ // stateful object interfaces callers expect.
18
+ //
19
+ // any change to this file must be made in lockstep with the entry-side
20
+ // implementation - there is no runtime version negotiation.
21
+ /** message the entry must `postMessage` immediately after `Comlink.expose()`
22
+ * registers its message listener - and not a moment before. an rpc call
23
+ * sent before that listener exists fires with nothing attached and is
24
+ * dropped forever, so the client waits for this exact literal before
25
+ * handing out its comlink proxy. */
26
+ export const MIDDEN_WORKER_READY_MESSAGE = "midden-worker-ready";
27
+ /** how long the client waits for `MIDDEN_WORKER_READY_MESSAGE` before
28
+ * giving up. generous: the entry's top level typically awaits a large
29
+ * wasm module's instantiation before it can register that listener. */
30
+ export const MIDDEN_WORKER_READY_TIMEOUT_MS = 20_000;
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@freqhole/reliquary",
3
+ "version": "0.0.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "freqhole media blob storage domain: content-addressed blobs, transfer, worker, solid helpers",
7
+ "license": "UNLICENSED",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/freqhole/tomb"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./blobs": {
21
+ "types": "./dist/blobs/index.d.ts",
22
+ "import": "./dist/blobs/index.js"
23
+ },
24
+ "./transfer": {
25
+ "types": "./dist/transfer/index.d.ts",
26
+ "import": "./dist/transfer/index.js"
27
+ },
28
+ "./automerge": {
29
+ "types": "./dist/automerge/index.d.ts",
30
+ "import": "./dist/automerge/index.js"
31
+ },
32
+ "./ensure": {
33
+ "types": "./dist/ensure/index.d.ts",
34
+ "import": "./dist/ensure/index.js"
35
+ },
36
+ "./worker": {
37
+ "types": "./dist/worker/index.d.ts",
38
+ "import": "./dist/worker/index.js"
39
+ },
40
+ "./utils": {
41
+ "types": "./dist/utils/index.d.ts",
42
+ "import": "./dist/utils/index.js"
43
+ },
44
+ "./solid": {
45
+ "types": "./dist/solid/index.d.ts",
46
+ "import": "./dist/solid/index.js"
47
+ },
48
+ "./testing": {
49
+ "types": "./dist/testing/index.d.ts",
50
+ "import": "./dist/testing/index.js"
51
+ }
52
+ },
53
+ "scripts": {
54
+ "build": "tsc -p tsconfig.json",
55
+ "typecheck": "tsc --noEmit",
56
+ "test": "vitest run"
57
+ },
58
+ "dependencies": {
59
+ "comlink": "^4.4.2"
60
+ },
61
+ "peerDependencies": {
62
+ "@automerge/automerge-repo": "^2.5.6",
63
+ "fake-indexeddb": "^6.0.0",
64
+ "solid-js": "^1.9.0",
65
+ "vitest": "^2.1.0"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "@automerge/automerge-repo": {
69
+ "optional": true
70
+ },
71
+ "fake-indexeddb": {
72
+ "optional": true
73
+ },
74
+ "solid-js": {
75
+ "optional": true
76
+ },
77
+ "vitest": {
78
+ "optional": true
79
+ }
80
+ },
81
+ "devDependencies": {
82
+ "@automerge/automerge": "^3.2.6",
83
+ "@automerge/automerge-repo": "^2.5.6",
84
+ "fake-indexeddb": "^6.0.0",
85
+ "happy-dom": "^20.10.6",
86
+ "solid-js": "^1.9.0",
87
+ "typescript": "^5.6.0",
88
+ "vitest": "^2.1.0"
89
+ }
90
+ }