@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.
- package/dist/automerge/acl-filtering.d.ts +87 -0
- package/dist/automerge/acl-filtering.d.ts.map +1 -0
- package/dist/automerge/acl-filtering.js +138 -0
- package/dist/automerge/acl-filtering.test.d.ts +2 -0
- package/dist/automerge/acl-filtering.test.d.ts.map +1 -0
- package/dist/automerge/acl-filtering.test.js +302 -0
- package/dist/automerge/index.d.ts +5 -0
- package/dist/automerge/index.d.ts.map +1 -0
- package/dist/automerge/index.js +7 -0
- package/dist/automerge/iroh-network-adapter.d.ts +178 -0
- package/dist/automerge/iroh-network-adapter.d.ts.map +1 -0
- package/dist/automerge/iroh-network-adapter.js +691 -0
- package/dist/automerge/iroh-network-adapter.test.d.ts +2 -0
- package/dist/automerge/iroh-network-adapter.test.d.ts.map +1 -0
- package/dist/automerge/iroh-network-adapter.test.js +818 -0
- package/dist/automerge/types.d.ts +66 -0
- package/dist/automerge/types.d.ts.map +1 -0
- package/dist/automerge/types.js +10 -0
- package/dist/blobs/bytes-backend.d.ts +41 -0
- package/dist/blobs/bytes-backend.d.ts.map +1 -0
- package/dist/blobs/bytes-backend.js +252 -0
- package/dist/blobs/bytes-backend.test.d.ts +2 -0
- package/dist/blobs/bytes-backend.test.d.ts.map +1 -0
- package/dist/blobs/bytes-backend.test.js +241 -0
- package/dist/blobs/db.d.ts +8 -0
- package/dist/blobs/db.d.ts.map +1 -0
- package/dist/blobs/db.js +141 -0
- package/dist/blobs/db.test.d.ts +2 -0
- package/dist/blobs/db.test.d.ts.map +1 -0
- package/dist/blobs/db.test.js +120 -0
- package/dist/blobs/index.d.ts +5 -0
- package/dist/blobs/index.d.ts.map +1 -0
- package/dist/blobs/index.js +2 -0
- package/dist/blobs/store.d.ts +47 -0
- package/dist/blobs/store.d.ts.map +1 -0
- package/dist/blobs/store.js +263 -0
- package/dist/blobs/store.test.d.ts +2 -0
- package/dist/blobs/store.test.d.ts.map +1 -0
- package/dist/blobs/store.test.js +377 -0
- package/dist/blobs/types.d.ts +55 -0
- package/dist/blobs/types.d.ts.map +1 -0
- package/dist/blobs/types.js +8 -0
- package/dist/ensure/client.d.ts +19 -0
- package/dist/ensure/client.d.ts.map +1 -0
- package/dist/ensure/client.js +74 -0
- package/dist/ensure/client.test.d.ts +2 -0
- package/dist/ensure/client.test.d.ts.map +1 -0
- package/dist/ensure/client.test.js +133 -0
- package/dist/ensure/index.d.ts +4 -0
- package/dist/ensure/index.d.ts.map +1 -0
- package/dist/ensure/index.js +4 -0
- package/dist/ensure/responder.d.ts +20 -0
- package/dist/ensure/responder.d.ts.map +1 -0
- package/dist/ensure/responder.js +100 -0
- package/dist/ensure/responder.test.d.ts +2 -0
- package/dist/ensure/responder.test.d.ts.map +1 -0
- package/dist/ensure/responder.test.js +191 -0
- package/dist/ensure/types.d.ts +19 -0
- package/dist/ensure/types.d.ts.map +1 -0
- package/dist/ensure/types.js +4 -0
- package/dist/ensure/types.test.d.ts +2 -0
- package/dist/ensure/types.test.d.ts.map +1 -0
- package/dist/ensure/types.test.js +81 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +7 -0
- package/dist/solid/blob-url.d.ts +10 -0
- package/dist/solid/blob-url.d.ts.map +1 -0
- package/dist/solid/blob-url.js +34 -0
- package/dist/solid/blob-url.test.d.ts +2 -0
- package/dist/solid/blob-url.test.d.ts.map +1 -0
- package/dist/solid/blob-url.test.js +62 -0
- package/dist/solid/connection-summary.d.ts +25 -0
- package/dist/solid/connection-summary.d.ts.map +1 -0
- package/dist/solid/connection-summary.js +29 -0
- package/dist/solid/connection-summary.test.d.ts +2 -0
- package/dist/solid/connection-summary.test.d.ts.map +1 -0
- package/dist/solid/connection-summary.test.js +57 -0
- package/dist/solid/doc-store.d.ts +29 -0
- package/dist/solid/doc-store.d.ts.map +1 -0
- package/dist/solid/doc-store.js +79 -0
- package/dist/solid/doc-store.test.d.ts +2 -0
- package/dist/solid/doc-store.test.d.ts.map +1 -0
- package/dist/solid/doc-store.test.js +234 -0
- package/dist/solid/index.d.ts +4 -0
- package/dist/solid/index.d.ts.map +1 -0
- package/dist/solid/index.js +9 -0
- package/dist/solid/transfer-progress.d.ts +21 -0
- package/dist/solid/transfer-progress.d.ts.map +1 -0
- package/dist/solid/transfer-progress.js +32 -0
- package/dist/solid/transfer-progress.test.d.ts +2 -0
- package/dist/solid/transfer-progress.test.d.ts.map +1 -0
- package/dist/solid/transfer-progress.test.js +76 -0
- package/dist/testing/blob-fixtures.d.ts +19 -0
- package/dist/testing/blob-fixtures.d.ts.map +1 -0
- package/dist/testing/blob-fixtures.js +46 -0
- package/dist/testing/blob-fixtures.test.d.ts +2 -0
- package/dist/testing/blob-fixtures.test.d.ts.map +1 -0
- package/dist/testing/blob-fixtures.test.js +46 -0
- package/dist/testing/idb-harness.d.ts +10 -0
- package/dist/testing/idb-harness.d.ts.map +1 -0
- package/dist/testing/idb-harness.js +17 -0
- package/dist/testing/idb-harness.test.d.ts +2 -0
- package/dist/testing/idb-harness.test.d.ts.map +1 -0
- package/dist/testing/idb-harness.test.js +48 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/media.d.ts +15 -0
- package/dist/testing/media.d.ts.map +1 -0
- package/dist/testing/media.js +37 -0
- package/dist/testing/media.test.d.ts +2 -0
- package/dist/testing/media.test.d.ts.map +1 -0
- package/dist/testing/media.test.js +47 -0
- package/dist/testing/mock-blob-fetch.d.ts +33 -0
- package/dist/testing/mock-blob-fetch.d.ts.map +1 -0
- package/dist/testing/mock-blob-fetch.js +39 -0
- package/dist/testing/mock-blob-fetch.test.d.ts +2 -0
- package/dist/testing/mock-blob-fetch.test.d.ts.map +1 -0
- package/dist/testing/mock-blob-fetch.test.js +65 -0
- package/dist/testing/mock-node.d.ts +36 -0
- package/dist/testing/mock-node.d.ts.map +1 -0
- package/dist/testing/mock-node.js +97 -0
- package/dist/testing/mock-node.test.d.ts +2 -0
- package/dist/testing/mock-node.test.d.ts.map +1 -0
- package/dist/testing/mock-node.test.js +66 -0
- package/dist/testing/streams.d.ts +68 -0
- package/dist/testing/streams.d.ts.map +1 -0
- package/dist/testing/streams.js +99 -0
- package/dist/testing/streams.test.d.ts +2 -0
- package/dist/testing/streams.test.d.ts.map +1 -0
- package/dist/testing/streams.test.js +82 -0
- package/dist/transfer/cancellation.d.ts +8 -0
- package/dist/transfer/cancellation.d.ts.map +1 -0
- package/dist/transfer/cancellation.js +19 -0
- package/dist/transfer/index.d.ts +8 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +4 -0
- package/dist/transfer/prefetch.d.ts +38 -0
- package/dist/transfer/prefetch.d.ts.map +1 -0
- package/dist/transfer/prefetch.js +61 -0
- package/dist/transfer/prefetch.test.d.ts +2 -0
- package/dist/transfer/prefetch.test.d.ts.map +1 -0
- package/dist/transfer/prefetch.test.js +136 -0
- package/dist/transfer/serve.d.ts +66 -0
- package/dist/transfer/serve.d.ts.map +1 -0
- package/dist/transfer/serve.js +126 -0
- package/dist/transfer/serve.test.d.ts +2 -0
- package/dist/transfer/serve.test.d.ts.map +1 -0
- package/dist/transfer/serve.test.js +101 -0
- package/dist/transfer/snatch.d.ts +39 -0
- package/dist/transfer/snatch.d.ts.map +1 -0
- package/dist/transfer/snatch.js +289 -0
- package/dist/transfer/snatch.test.d.ts +2 -0
- package/dist/transfer/snatch.test.d.ts.map +1 -0
- package/dist/transfer/snatch.test.js +337 -0
- package/dist/transfer/types.d.ts +85 -0
- package/dist/transfer/types.d.ts.map +1 -0
- package/dist/transfer/types.js +15 -0
- package/dist/utils/hash.d.ts +13 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +31 -0
- package/dist/utils/hash.test.d.ts +2 -0
- package/dist/utils/hash.test.d.ts.map +1 -0
- package/dist/utils/hash.test.js +56 -0
- package/dist/utils/image-utils.d.ts +28 -0
- package/dist/utils/image-utils.d.ts.map +1 -0
- package/dist/utils/image-utils.js +113 -0
- package/dist/utils/image-utils.test.d.ts +2 -0
- package/dist/utils/image-utils.test.d.ts.map +1 -0
- package/dist/utils/image-utils.test.js +181 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/log.d.ts +22 -0
- package/dist/utils/log.d.ts.map +1 -0
- package/dist/utils/log.js +100 -0
- package/dist/utils/log.test.d.ts +2 -0
- package/dist/utils/log.test.d.ts.map +1 -0
- package/dist/utils/log.test.js +113 -0
- package/dist/worker/blob-worker-client.d.ts +118 -0
- package/dist/worker/blob-worker-client.d.ts.map +1 -0
- package/dist/worker/blob-worker-client.js +361 -0
- package/dist/worker/blob-worker-client.test.d.ts +2 -0
- package/dist/worker/blob-worker-client.test.d.ts.map +1 -0
- package/dist/worker/blob-worker-client.test.js +137 -0
- package/dist/worker/blob-worker-logic.d.ts +120 -0
- package/dist/worker/blob-worker-logic.d.ts.map +1 -0
- package/dist/worker/blob-worker-logic.js +368 -0
- package/dist/worker/blob-worker-logic.test.d.ts +2 -0
- package/dist/worker/blob-worker-logic.test.d.ts.map +1 -0
- package/dist/worker/blob-worker-logic.test.js +191 -0
- package/dist/worker/blob-worker.d.ts +21 -0
- package/dist/worker/blob-worker.d.ts.map +1 -0
- package/dist/worker/blob-worker.js +44 -0
- package/dist/worker/index.d.ts +12 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +6 -0
- package/dist/worker/midden-blake3.d.ts +23 -0
- package/dist/worker/midden-blake3.d.ts.map +1 -0
- package/dist/worker/midden-blake3.js +47 -0
- package/dist/worker/midden-blake3.test.d.ts +2 -0
- package/dist/worker/midden-blake3.test.d.ts.map +1 -0
- package/dist/worker/midden-blake3.test.js +25 -0
- package/dist/worker/midden-not-bundled.stub.d.ts +1 -0
- package/dist/worker/midden-not-bundled.stub.d.ts.map +1 -0
- package/dist/worker/midden-not-bundled.stub.js +10 -0
- package/dist/worker/midden-stub.d.ts +10 -0
- package/dist/worker/midden-stub.d.ts.map +1 -0
- package/dist/worker/midden-stub.js +31 -0
- package/dist/worker/midden-stub.test.d.ts +2 -0
- package/dist/worker/midden-stub.test.d.ts.map +1 -0
- package/dist/worker/midden-stub.test.js +25 -0
- package/dist/worker/midden-worker-client.d.ts +103 -0
- package/dist/worker/midden-worker-client.d.ts.map +1 -0
- package/dist/worker/midden-worker-client.js +246 -0
- package/dist/worker/midden-worker-client.test.d.ts +2 -0
- package/dist/worker/midden-worker-client.test.d.ts.map +1 -0
- package/dist/worker/midden-worker-client.test.js +151 -0
- package/dist/worker/midden-worker-contract.d.ts +87 -0
- package/dist/worker/midden-worker-contract.d.ts.map +1 -0
- package/dist/worker/midden-worker-contract.js +30 -0
- 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
|
+
}
|