mindoodb 0.0.56 → 0.0.58

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 (80) hide show
  1. package/README-server.md +25 -1
  2. package/README.md +1 -0
  3. package/dist/browser/index.mjs +1 -0
  4. package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts +93 -0
  5. package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -0
  6. package/dist/core/appendonlystores/network/IrohNetworkTransport.js +260 -0
  7. package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -0
  8. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts +121 -0
  9. package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -0
  10. package/dist/core/appendonlystores/network/IrohStreamIO.js +213 -0
  11. package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -0
  12. package/dist/core/appendonlystores/network/irohLocator.d.ts +28 -0
  13. package/dist/core/appendonlystores/network/irohLocator.d.ts.map +1 -0
  14. package/dist/core/appendonlystores/network/irohLocator.js +94 -0
  15. package/dist/core/appendonlystores/network/irohLocator.js.map +1 -0
  16. package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.d.ts +7 -0
  17. package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.d.ts.map +1 -0
  18. package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.js +44 -0
  19. package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.js.map +1 -0
  20. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts +60 -0
  21. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -0
  22. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +349 -0
  23. package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -0
  24. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +51 -0
  25. package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -0
  26. package/dist/core/appendonlystores/sqlite/SqliteDriver.js +290 -0
  27. package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -0
  28. package/dist/core/appendonlystores/sqlite/expoSqliteDriver.d.ts +13 -0
  29. package/dist/core/appendonlystores/sqlite/expoSqliteDriver.d.ts.map +1 -0
  30. package/dist/core/appendonlystores/sqlite/expoSqliteDriver.js +26 -0
  31. package/dist/core/appendonlystores/sqlite/expoSqliteDriver.js.map +1 -0
  32. package/dist/core/index.d.ts +2 -1
  33. package/dist/core/index.d.ts.map +1 -1
  34. package/dist/core/index.js +4 -2
  35. package/dist/core/index.js.map +1 -1
  36. package/dist/core/indexing/summary/extractSummaryFields.d.ts +19 -0
  37. package/dist/core/indexing/summary/extractSummaryFields.d.ts.map +1 -1
  38. package/dist/core/indexing/summary/extractSummaryFields.js +43 -2
  39. package/dist/core/indexing/summary/extractSummaryFields.js.map +1 -1
  40. package/dist/core/indexing/summary/index.d.ts +1 -1
  41. package/dist/core/indexing/summary/index.d.ts.map +1 -1
  42. package/dist/core/indexing/summary/index.js.map +1 -1
  43. package/dist/core/indexing/summary/types.d.ts +18 -0
  44. package/dist/core/indexing/summary/types.d.ts.map +1 -1
  45. package/dist/core/indexing/summary/types.js +10 -0
  46. package/dist/core/indexing/summary/types.js.map +1 -1
  47. package/dist/iroh/index.d.ts +8 -0
  48. package/dist/iroh/index.d.ts.map +1 -0
  49. package/dist/iroh/index.js +25 -0
  50. package/dist/iroh/index.js.map +1 -0
  51. package/dist/node/server/IrohServerEndpoint.d.ts +23 -0
  52. package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -0
  53. package/dist/node/server/IrohServerEndpoint.js +156 -0
  54. package/dist/node/server/IrohServerEndpoint.js.map +1 -0
  55. package/dist/node/server/IrohServerRpc.d.ts +52 -0
  56. package/dist/node/server/IrohServerRpc.d.ts.map +1 -0
  57. package/dist/node/server/IrohServerRpc.js +120 -0
  58. package/dist/node/server/IrohServerRpc.js.map +1 -0
  59. package/dist/node/server/MindooDBServer.d.ts +3 -0
  60. package/dist/node/server/MindooDBServer.d.ts.map +1 -1
  61. package/dist/node/server/MindooDBServer.js +34 -0
  62. package/dist/node/server/MindooDBServer.js.map +1 -1
  63. package/dist/node/server/config.d.ts.map +1 -1
  64. package/dist/node/server/config.js +28 -0
  65. package/dist/node/server/config.js.map +1 -1
  66. package/dist/node/server/serverinit.js +2 -0
  67. package/dist/node/server/serverinit.js.map +1 -1
  68. package/dist/node/server/types.d.ts +16 -0
  69. package/dist/node/server/types.d.ts.map +1 -1
  70. package/dist/node/server/types.js +6 -1
  71. package/dist/node/server/types.js.map +1 -1
  72. package/dist/reactnative/index.d.ts +5 -0
  73. package/dist/reactnative/index.d.ts.map +1 -1
  74. package/dist/reactnative/index.js +20 -1
  75. package/dist/reactnative/index.js.map +1 -1
  76. package/dist/sqlite/index.d.ts +7 -0
  77. package/dist/sqlite/index.d.ts.map +1 -0
  78. package/dist/sqlite/index.js +16 -0
  79. package/dist/sqlite/index.js.map +1 -0
  80. package/package.json +14 -2
package/README-server.md CHANGED
@@ -48,7 +48,7 @@ bash serversetup.sh --update
48
48
  docker compose up -d --build
49
49
  ```
50
50
 
51
- `bash serversetup.sh --update` preserves the existing `server.identity.json`, `server.keybag`, `config.json`, tenant data, `trusted-servers.json`, and `.server_unlock`, while still rebuilding the Docker image and regenerating `docker-compose.override.yml`. Before the override is rewritten, the script now saves the previous file as `docker-compose.override.<timestamp>.yml`.
51
+ `bash serversetup.sh --update` preserves the existing `server.identity.json`, `server.keybag`, `config.json`, tenant data, `trusted-servers.json`, and `.server_unlock`, while still rebuilding the Docker image (including `@number0/iroh`) and regenerating `docker-compose.override.yml`. Before the override is rewritten, the script now saves the previous file as `docker-compose.override.<timestamp>.yml`. Existing `config.json` files are not patched — add `"iroh": { "enabled": true, "secretKeyPath": "iroh-secret.key" }` yourself if you want the rebuilt image to join the Iroh network.
52
52
 
53
53
  The setup and update flows now prompt for a separate `Host port`. This lets you keep MindooDB listening on its internal container port `1661` while publishing a different host port such as `80`.
54
54
 
@@ -104,6 +104,10 @@ The most important file for day-to-day operations is **`config.json`**. After a
104
104
  "publicsignkey": "-----BEGIN PUBLIC KEY-----\nMCow...base64...\n-----END PUBLIC KEY-----"
105
105
  }
106
106
  ]
107
+ },
108
+ "iroh": {
109
+ "enabled": false,
110
+ "secretKeyPath": "iroh-secret.key"
107
111
  }
108
112
  }
109
113
  ```
@@ -615,6 +619,26 @@ Controls which system admins can call which `/system/*` endpoints. See [How `con
615
619
  }
616
620
  ```
617
621
 
622
+ Optional Iroh listen (off by default). The Docker image already contains
623
+ `@number0/iroh`; you do not install it on the host. New servers get the block
624
+ below with `"enabled": false` in `config.json`. `--update` never rewrites an
625
+ existing `config.json` — add or flip the block yourself, then restart.
626
+
627
+ When `"enabled": true` the process joins the Iroh network with ALPN
628
+ `mindoodb/sync-v5` and logs a ticket. The secret key is created at
629
+ `iroh-secret.key` in the data directory on first start. Haven pastes
630
+ `iroh:<ticket>` into the server URL field.
631
+
632
+ ```json
633
+ {
634
+ "capabilities": {},
635
+ "iroh": {
636
+ "enabled": true,
637
+ "secretKeyPath": "iroh-secret.key"
638
+ }
639
+ }
640
+ ```
641
+
618
642
  ### `server.identity.json` (global)
619
643
 
620
644
  Generated by `pnpm server:init`. Contains a `PrivateUserId` with encrypted private keys:
package/README.md CHANGED
@@ -339,6 +339,7 @@ See: [Use Cases Documentation](./docs/usecases/README.md)
339
339
 
340
340
  - [Haven Handbook](./docs/haven-handbook.md) — Complete guide to Haven, the graphical MindooDB collaboration client
341
341
  - [Getting Started](./docs/getting-started.md) — Fast setup for Node.js, Web, and React Native
342
+ - [Best Practices](./docs/best-practices.md) — What append-only storage, local-first replicas, client-side-only querying, and encryption-based read access mean for application design: summary-first querying, patch-sized writes, growth planning, collaboration expectations, and Haven app mappings
342
343
  - [Example Snippets](./docs/examples/README.md) — Copy-paste Todo starters for all runtimes
343
344
  - [Architecture Specification](./docs/specification.md) — Full technical details
344
345
  - [React Native Guide](./docs/reactnative.md) — Native Automerge setup and troubleshooting
@@ -88,6 +88,7 @@ export const SUMMARY_SETUP_FIELD = browser["SUMMARY_SETUP_FIELD"];
88
88
  export const SYNC_SETUP_POLICY_MODES = browser["SYNC_SETUP_POLICY_MODES"];
89
89
  export const SYNC_SETUP_POLICY_TYPE = browser["SYNC_SETUP_POLICY_TYPE"];
90
90
  export const SelectedOnly = browser["SelectedOnly"];
91
+ export const ServerNetworkContentAddressedStore = browser["ServerNetworkContentAddressedStore"];
91
92
  export const StoreKind = browser["StoreKind"];
92
93
  export const SummaryVirtualViewDataProvider = browser["SummaryVirtualViewDataProvider"];
93
94
  export const SymmetricKeyNotFoundError = browser["SymmetricKeyNotFoundError"];
@@ -0,0 +1,93 @@
1
+ import type { StoreEntry, StoreEntryMetadata, StoreEntryType, StoreScanCursor, StoreScanFilters, StoreScanResult, StoreIdBloomSummary, StoreCompactionStatus } from "../../types";
2
+ import type { AttachmentReadPlan, AttachmentReadPlanOptions, ContentAddressedStore, DocumentMaterializationBatchPlan, DocumentMaterializationPlan, MaterializationPlanOptions, PutEntriesAck, StoreHead } from "../types";
3
+ import type { NetworkTransport, NetworkTransportConfig } from "./NetworkTransport";
4
+ import type { AuthResult, NetworkEncryptedEntry, NetworkSyncCapabilities, SessionEncryptedEntriesBatch, StoreChangeEvent } from "./types";
5
+ import { type IrohByteStream, type IrohStreamIO, type IrohRpcContext } from "./IrohStreamIO";
6
+ export type { IrohRpcContext };
7
+ /**
8
+ * NetworkTransport over Iroh QUIC streams (ALPN {@link MINDOODB_IROH_ALPN}).
9
+ * Each method is one framed request/response. Pairing uses Iroh tickets.
10
+ */
11
+ export declare class IrohNetworkTransport implements NetworkTransport {
12
+ private readonly io;
13
+ private readonly peerTicket;
14
+ private readonly config;
15
+ private nextId;
16
+ private stream;
17
+ constructor(io: IrohStreamIO, peerTicket: string, config: NetworkTransportConfig);
18
+ getIdentity(): string;
19
+ private rpcContext;
20
+ private session;
21
+ private call;
22
+ getServerInfo(): Promise<unknown>;
23
+ getTenantPublicInfosFingerprints(tenantId: string): Promise<{
24
+ tenantId: string;
25
+ fingerprints: string[];
26
+ }>;
27
+ requestChallenge(username?: string, options?: {
28
+ signingPublicKey?: string;
29
+ }): Promise<string>;
30
+ authenticate(challenge: string, signature: Uint8Array): Promise<AuthResult>;
31
+ getCapabilities(token: string): Promise<NetworkSyncCapabilities>;
32
+ findNewEntries(token: string, haveIds: string[]): Promise<StoreEntryMetadata[]>;
33
+ findNewEntriesForDoc(token: string, haveIds: string[], docId: string): Promise<StoreEntryMetadata[]>;
34
+ findEntries(token: string, type: StoreEntryType, creationDateFrom: number | null, creationDateUntil: number | null): Promise<StoreEntryMetadata[]>;
35
+ scanEntriesSince(token: string, cursor: StoreScanCursor | null, limit?: number, filters?: StoreScanFilters): Promise<StoreScanResult>;
36
+ getIdBloomSummary(token: string): Promise<StoreIdBloomSummary>;
37
+ getStoreHead(token: string): Promise<StoreHead>;
38
+ getCompactionStatus(token: string): Promise<StoreCompactionStatus>;
39
+ planDocumentMaterialization(token: string, docId: string, options?: MaterializationPlanOptions): Promise<DocumentMaterializationPlan>;
40
+ planDocumentMaterializationBatch(token: string, docIds: string[], options?: MaterializationPlanOptions): Promise<DocumentMaterializationBatchPlan>;
41
+ planAttachmentReadByWalkingMetadata(token: string, lastChunkId: string, attachmentSize: number, options: AttachmentReadPlanOptions): Promise<AttachmentReadPlan>;
42
+ getEntries(token: string, ids: string[]): Promise<NetworkEncryptedEntry[]>;
43
+ getEntriesSessionWrapped(token: string, ids: string[]): Promise<SessionEncryptedEntriesBatch>;
44
+ getEntryMetadata(token: string, id: string): Promise<StoreEntryMetadata | null>;
45
+ putEntries(token: string, entries: StoreEntry[]): Promise<PutEntriesAck>;
46
+ hasEntries(token: string, ids: string[]): Promise<string[]>;
47
+ getAllIds(token: string): Promise<string[]>;
48
+ resolveDependencies(token: string, startId: string, options?: Record<string, unknown>): Promise<string[]>;
49
+ subscribeToChanges(token: string, onEvent: (event: StoreChangeEvent) => void, options?: {
50
+ signal?: AbortSignal;
51
+ }): Promise<void>;
52
+ }
53
+ /**
54
+ * ContentAddressedStore proxy over Iroh. Entries stay E2E-encrypted; no extra
55
+ * RSA wrap. Use with `pullChangesFrom` / `pushChangesTo` between devices.
56
+ */
57
+ export declare class IrohPeerStore implements ContentAddressedStore {
58
+ private readonly io;
59
+ private readonly peerTicket;
60
+ private readonly dbId;
61
+ private readonly storeKind;
62
+ private nextId;
63
+ private stream;
64
+ constructor(io: IrohStreamIO, peerTicket: string, dbId: string, storeKind: ReturnType<ContentAddressedStore["getStoreKind"]>);
65
+ getId(): string;
66
+ getStoreKind(): import("../types").StoreKind;
67
+ getCacheIdentity(): string;
68
+ private session;
69
+ private call;
70
+ putEntries(entries: StoreEntry[]): Promise<void>;
71
+ applyWitnessReceipts(receipts: StoreEntryMetadata[]): Promise<void>;
72
+ getEntries(ids: string[]): Promise<StoreEntry[]>;
73
+ getEntryMetadata(id: string): Promise<StoreEntryMetadata | null>;
74
+ hasEntries(ids: string[]): Promise<string[]>;
75
+ findNewEntries(knownIds: string[]): Promise<StoreEntryMetadata[]>;
76
+ findNewEntriesForDoc(knownIds: string[], docId: string): Promise<StoreEntryMetadata[]>;
77
+ findEntries(type: StoreEntry["entryType"], from: number | null, until: number | null): Promise<StoreEntryMetadata[]>;
78
+ getAllIds(): Promise<string[]>;
79
+ scanEntriesSince(cursor: StoreScanCursor | null, limit?: number, filters?: StoreScanFilters): Promise<StoreScanResult>;
80
+ getIdBloomSummary(): Promise<StoreIdBloomSummary>;
81
+ getStoreHead(): Promise<StoreHead>;
82
+ planDocumentMaterialization(docId: string, options?: MaterializationPlanOptions): Promise<DocumentMaterializationPlan>;
83
+ planDocumentMaterializationBatch(docIds: string[], options?: MaterializationPlanOptions): Promise<DocumentMaterializationBatchPlan>;
84
+ resolveDependencies(startId: string, options?: Record<string, unknown>): Promise<string[]>;
85
+ purgeDocHistory(docId: string): Promise<void>;
86
+ }
87
+ export type IrohRpcHandler = (method: string, args: unknown[], ctx?: IrohRpcContext) => Promise<unknown>;
88
+ export declare function createStoreIrohHandler(store: ContentAddressedStore): IrohRpcHandler;
89
+ export declare function serveIrohRpc(stream: IrohByteStream, handler: IrohRpcHandler): Promise<void>;
90
+ export declare function listenForIrohPeers(io: IrohStreamIO, handler: IrohRpcHandler, options?: {
91
+ signal?: AbortSignal;
92
+ }): Promise<void>;
93
+ //# sourceMappingURL=IrohNetworkTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IrohNetworkTransport.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/IrohNetworkTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IrohPeerStore = exports.IrohNetworkTransport = void 0;
4
+ exports.createStoreIrohHandler = createStoreIrohHandler;
5
+ exports.serveIrohRpc = serveIrohRpc;
6
+ exports.listenForIrohPeers = listenForIrohPeers;
7
+ const types_1 = require("./types");
8
+ const IrohStreamIO_1 = require("./IrohStreamIO");
9
+ async function rpcCall(stream, method, args, id, ctx) {
10
+ const request = { id, method, args, ctx };
11
+ await stream.send((0, IrohStreamIO_1.encodeIrohFrame)(request));
12
+ const bytes = await stream.recv();
13
+ if (!bytes) {
14
+ throw new types_1.NetworkError(types_1.NetworkErrorType.NETWORK_ERROR, "Iroh stream closed");
15
+ }
16
+ const response = (0, IrohStreamIO_1.decodeIrohFrame)(bytes);
17
+ if (!response.ok) {
18
+ throw new types_1.NetworkError(types_1.NetworkErrorType.NETWORK_ERROR, response.error ?? "Iroh RPC failed");
19
+ }
20
+ return response.result;
21
+ }
22
+ /**
23
+ * NetworkTransport over Iroh QUIC streams (ALPN {@link MINDOODB_IROH_ALPN}).
24
+ * Each method is one framed request/response. Pairing uses Iroh tickets.
25
+ */
26
+ class IrohNetworkTransport {
27
+ constructor(io, peerTicket, config) {
28
+ this.io = io;
29
+ this.peerTicket = peerTicket;
30
+ this.config = config;
31
+ this.nextId = 1;
32
+ this.stream = null;
33
+ }
34
+ getIdentity() {
35
+ return `iroh:${this.peerTicket}`;
36
+ }
37
+ rpcContext() {
38
+ return {
39
+ tenantId: this.config.tenantId,
40
+ dbId: this.config.dbId,
41
+ storeKind: this.config.storeKind,
42
+ };
43
+ }
44
+ async session() {
45
+ if (!this.stream) {
46
+ this.stream = await this.io.connect(this.peerTicket, IrohStreamIO_1.MINDOODB_IROH_ALPN);
47
+ }
48
+ return this.stream;
49
+ }
50
+ async call(method, args) {
51
+ return rpcCall(await this.session(), method, args, this.nextId++, this.rpcContext());
52
+ }
53
+ getServerInfo() {
54
+ return this.call("getServerInfo", []);
55
+ }
56
+ getTenantPublicInfosFingerprints(tenantId) {
57
+ return this.call("getTenantPublicInfosFingerprints", [tenantId]);
58
+ }
59
+ requestChallenge(username, options) {
60
+ return this.call("requestChallenge", [username, options]);
61
+ }
62
+ authenticate(challenge, signature) {
63
+ return this.call("authenticate", [challenge, signature]);
64
+ }
65
+ getCapabilities(token) {
66
+ return this.call("getCapabilities", [token]);
67
+ }
68
+ findNewEntries(token, haveIds) {
69
+ return this.call("findNewEntries", [token, haveIds]);
70
+ }
71
+ findNewEntriesForDoc(token, haveIds, docId) {
72
+ return this.call("findNewEntriesForDoc", [token, haveIds, docId]);
73
+ }
74
+ findEntries(token, type, creationDateFrom, creationDateUntil) {
75
+ return this.call("findEntries", [token, type, creationDateFrom, creationDateUntil]);
76
+ }
77
+ scanEntriesSince(token, cursor, limit, filters) {
78
+ return this.call("scanEntriesSince", [token, cursor, limit, filters]);
79
+ }
80
+ getIdBloomSummary(token) {
81
+ return this.call("getIdBloomSummary", [token]);
82
+ }
83
+ getStoreHead(token) {
84
+ return this.call("getStoreHead", [token]);
85
+ }
86
+ getCompactionStatus(token) {
87
+ return this.call("getCompactionStatus", [token]);
88
+ }
89
+ planDocumentMaterialization(token, docId, options) {
90
+ return this.call("planDocumentMaterialization", [token, docId, options]);
91
+ }
92
+ planDocumentMaterializationBatch(token, docIds, options) {
93
+ return this.call("planDocumentMaterializationBatch", [token, docIds, options]);
94
+ }
95
+ planAttachmentReadByWalkingMetadata(token, lastChunkId, attachmentSize, options) {
96
+ return this.call("planAttachmentReadByWalkingMetadata", [token, lastChunkId, attachmentSize, options]);
97
+ }
98
+ getEntries(token, ids) {
99
+ return this.call("getEntries", [token, ids]);
100
+ }
101
+ getEntriesSessionWrapped(token, ids) {
102
+ return this.call("getEntriesSessionWrapped", [token, ids]);
103
+ }
104
+ getEntryMetadata(token, id) {
105
+ return this.call("getEntryMetadata", [token, id]);
106
+ }
107
+ putEntries(token, entries) {
108
+ return this.call("putEntries", [token, entries]);
109
+ }
110
+ hasEntries(token, ids) {
111
+ return this.call("hasEntries", [token, ids]);
112
+ }
113
+ getAllIds(token) {
114
+ return this.call("getAllIds", [token]);
115
+ }
116
+ resolveDependencies(token, startId, options) {
117
+ return this.call("resolveDependencies", [token, startId, options]);
118
+ }
119
+ async subscribeToChanges(token, onEvent, options) {
120
+ const stream = await this.session();
121
+ await stream.send((0, IrohStreamIO_1.encodeIrohFrame)({ id: this.nextId++, method: "subscribeToChanges", args: [token] }));
122
+ while (!options?.signal?.aborted) {
123
+ const bytes = await stream.recv();
124
+ if (!bytes) {
125
+ return;
126
+ }
127
+ const frame = (0, IrohStreamIO_1.decodeIrohFrame)(bytes);
128
+ if ("dbId" in frame && "storeKind" in frame) {
129
+ onEvent(frame);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ exports.IrohNetworkTransport = IrohNetworkTransport;
135
+ /**
136
+ * ContentAddressedStore proxy over Iroh. Entries stay E2E-encrypted; no extra
137
+ * RSA wrap. Use with `pullChangesFrom` / `pushChangesTo` between devices.
138
+ */
139
+ class IrohPeerStore {
140
+ constructor(io, peerTicket, dbId, storeKind) {
141
+ this.io = io;
142
+ this.peerTicket = peerTicket;
143
+ this.dbId = dbId;
144
+ this.storeKind = storeKind;
145
+ this.nextId = 1;
146
+ this.stream = null;
147
+ }
148
+ getId() {
149
+ return this.dbId;
150
+ }
151
+ getStoreKind() {
152
+ return this.storeKind;
153
+ }
154
+ getCacheIdentity() {
155
+ return `iroh:${this.peerTicket}:${this.dbId}:${this.storeKind}`;
156
+ }
157
+ async session() {
158
+ if (!this.stream) {
159
+ this.stream = await this.io.connect(this.peerTicket, IrohStreamIO_1.MINDOODB_IROH_ALPN);
160
+ }
161
+ return this.stream;
162
+ }
163
+ async call(method, args) {
164
+ return rpcCall(await this.session(), method, args, this.nextId++);
165
+ }
166
+ putEntries(entries) {
167
+ return this.call("store.putEntries", [entries]);
168
+ }
169
+ applyWitnessReceipts(receipts) {
170
+ return this.call("store.applyWitnessReceipts", [receipts]);
171
+ }
172
+ getEntries(ids) {
173
+ return this.call("store.getEntries", [ids]);
174
+ }
175
+ getEntryMetadata(id) {
176
+ return this.call("store.getEntryMetadata", [id]);
177
+ }
178
+ hasEntries(ids) {
179
+ return this.call("store.hasEntries", [ids]);
180
+ }
181
+ findNewEntries(knownIds) {
182
+ return this.call("store.findNewEntries", [knownIds]);
183
+ }
184
+ findNewEntriesForDoc(knownIds, docId) {
185
+ return this.call("store.findNewEntriesForDoc", [knownIds, docId]);
186
+ }
187
+ findEntries(type, from, until) {
188
+ return this.call("store.findEntries", [type, from, until]);
189
+ }
190
+ getAllIds() {
191
+ return this.call("store.getAllIds", []);
192
+ }
193
+ scanEntriesSince(cursor, limit, filters) {
194
+ return this.call("store.scanEntriesSince", [cursor, limit, filters]);
195
+ }
196
+ getIdBloomSummary() {
197
+ return this.call("store.getIdBloomSummary", []);
198
+ }
199
+ getStoreHead() {
200
+ return this.call("store.getStoreHead", []);
201
+ }
202
+ planDocumentMaterialization(docId, options) {
203
+ return this.call("store.planDocumentMaterialization", [docId, options]);
204
+ }
205
+ planDocumentMaterializationBatch(docIds, options) {
206
+ return this.call("store.planDocumentMaterializationBatch", [docIds, options]);
207
+ }
208
+ resolveDependencies(startId, options) {
209
+ return this.call("store.resolveDependencies", [startId, options]);
210
+ }
211
+ purgeDocHistory(docId) {
212
+ return this.call("store.purgeDocHistory", [docId]);
213
+ }
214
+ }
215
+ exports.IrohPeerStore = IrohPeerStore;
216
+ function createStoreIrohHandler(store) {
217
+ return async (method, args) => {
218
+ const name = method.startsWith("store.") ? method.slice(6) : method;
219
+ const fn = store[name];
220
+ if (typeof fn !== "function") {
221
+ throw new Error(`Unknown Iroh store method ${method}`);
222
+ }
223
+ return fn.apply(store, args);
224
+ };
225
+ }
226
+ async function serveIrohRpc(stream, handler) {
227
+ while (true) {
228
+ const bytes = await stream.recv();
229
+ if (!bytes) {
230
+ return;
231
+ }
232
+ const request = (0, IrohStreamIO_1.decodeIrohFrame)(bytes);
233
+ try {
234
+ const result = await handler(request.method, request.args, request.ctx);
235
+ const response = { id: request.id, ok: true, result };
236
+ await stream.send((0, IrohStreamIO_1.encodeIrohFrame)(response));
237
+ }
238
+ catch (error) {
239
+ const response = {
240
+ id: request.id,
241
+ ok: false,
242
+ error: error instanceof Error ? error.message : String(error),
243
+ };
244
+ await stream.send((0, IrohStreamIO_1.encodeIrohFrame)(response));
245
+ }
246
+ }
247
+ }
248
+ async function listenForIrohPeers(io, handler, options) {
249
+ if (!io.listen) {
250
+ throw new Error("IrohStreamIO.listen is required to accept peers");
251
+ }
252
+ for await (const stream of io.listen(IrohStreamIO_1.MINDOODB_IROH_ALPN)) {
253
+ if (options?.signal?.aborted) {
254
+ await stream.close();
255
+ return;
256
+ }
257
+ void serveIrohRpc(stream, handler);
258
+ }
259
+ }
260
+ //# sourceMappingURL=IrohNetworkTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IrohNetworkTransport.js","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/IrohNetworkTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Byte-stream IO used by {@link IrohNetworkTransport}.
3
+ *
4
+ * `react-native-iroh` implements this with `endpoint.streams` (ALPN
5
+ * `mindoodb/sync-v5`). The Node server uses `@number0/iroh`. Tests use
6
+ * {@link createLoopbackIrohPair}.
7
+ */
8
+ export declare const MINDOODB_IROH_ALPN = "mindoodb/sync-v5";
9
+ /**
10
+ * One bidirectional QUIC/byte stream between two Iroh endpoints.
11
+ * {@link IrohNetworkTransport} sends one framed RPC request and reads one
12
+ * response on the same stream.
13
+ */
14
+ export interface IrohByteStream {
15
+ /**
16
+ * Write one complete message. Native QUIC adapters should wrap this with
17
+ * {@link wrapLengthPrefixedByteStream} so `recv` can reassemble frames.
18
+ *
19
+ * @param bytes Encoded frame, typically from {@link encodeIrohFrame}
20
+ */
21
+ send(bytes: Uint8Array): Promise<void>;
22
+ /**
23
+ * Read the next complete message, or `null` when the peer closed the stream.
24
+ *
25
+ * @returns The next frame, or `null` on clean close
26
+ */
27
+ recv(): Promise<Uint8Array | null>;
28
+ /** Finish the send side and release the stream. */
29
+ close(): Promise<void>;
30
+ }
31
+ /**
32
+ * Local Iroh endpoint: publish a ticket, dial a peer, and optionally accept
33
+ * inbound streams on {@link MINDOODB_IROH_ALPN}.
34
+ */
35
+ export interface IrohStreamIO {
36
+ /**
37
+ * Return the stable local ticket (or endpoint id) other peers can dial.
38
+ * Native bindings usually return an `endpoint…` ticket; loopback uses
39
+ * `loopback:a` / `loopback:b`.
40
+ */
41
+ getLocalTicket(): Promise<string>;
42
+ /**
43
+ * Open an outbound stream to `peerTicket`.
44
+ *
45
+ * @param peerTicket Remote Iroh ticket or loopback id
46
+ * @param alpn Protocol, defaults to {@link MINDOODB_IROH_ALPN}
47
+ */
48
+ connect(peerTicket: string, alpn?: string): Promise<IrohByteStream>;
49
+ /**
50
+ * Yield inbound streams. Required on the server / listener side; a
51
+ * client-only IO may omit it.
52
+ *
53
+ * @param alpn Protocol, defaults to {@link MINDOODB_IROH_ALPN}
54
+ */
55
+ listen?(alpn?: string): AsyncIterable<IrohByteStream>;
56
+ }
57
+ /**
58
+ * Tenant / store scope sent with every Iroh RPC. HTTP puts the same values
59
+ * in the URL (`/t/:tenantId/d/:dbId/…`).
60
+ */
61
+ export interface IrohRpcContext {
62
+ tenantId?: string;
63
+ dbId?: string;
64
+ storeKind?: string;
65
+ }
66
+ /** One JSON-RPC-style request written as a single {@link IrohByteStream} frame. */
67
+ export interface IrohRpcRequest {
68
+ /** Correlation id; the response echoes the same value. */
69
+ id: number;
70
+ method: string;
71
+ args: unknown[];
72
+ ctx?: IrohRpcContext;
73
+ }
74
+ /** Matching response for {@link IrohRpcRequest.id}. */
75
+ export interface IrohRpcResponse {
76
+ id: number;
77
+ ok: boolean;
78
+ result?: unknown;
79
+ error?: string;
80
+ }
81
+ /**
82
+ * Serialize an RPC request or response to UTF-8 JSON. `Uint8Array` fields
83
+ * become `{ $bytes: "<base64>" }` so they survive `JSON.stringify`.
84
+ *
85
+ * @param payload {@link IrohRpcRequest} or {@link IrohRpcResponse}
86
+ */
87
+ export declare function encodeIrohFrame(payload: unknown): Uint8Array;
88
+ /**
89
+ * Length-prefix a message-oriented {@link IrohByteStream} on top of a raw
90
+ * QUIC/byte stream. Each `send` writes a big-endian uint32 length plus the
91
+ * payload; `recv` reads that header and then exactly that many bytes.
92
+ * Frames larger than 32 MiB are rejected. Loopback tests stay
93
+ * message-oriented and do not use this.
94
+ *
95
+ * @param raw Unframed write/read/close used by `@number0/iroh` (and similar)
96
+ */
97
+ export declare function wrapLengthPrefixedByteStream(raw: {
98
+ write(bytes: Uint8Array): Promise<void>;
99
+ read(max: number): Promise<Uint8Array | null>;
100
+ close(): Promise<void>;
101
+ }): IrohByteStream;
102
+ /**
103
+ * Inverse of {@link encodeIrohFrame}: parse UTF-8 JSON and restore
104
+ * `{ $bytes }` objects to `Uint8Array`.
105
+ *
106
+ * @param bytes One complete frame from {@link IrohByteStream.recv}
107
+ */
108
+ export declare function decodeIrohFrame(bytes: Uint8Array): unknown;
109
+ /**
110
+ * Two {@link IrohStreamIO} instances that dial each other in-process
111
+ * (`loopback:a` ↔ `loopback:b`). Used by unit tests and the Expo two-peer
112
+ * spike without native Iroh. Streams are already message-oriented; do not
113
+ * wrap them with {@link wrapLengthPrefixedByteStream}.
114
+ *
115
+ * @returns Pair whose `connect` only accepts the other side's ticket
116
+ */
117
+ export declare function createLoopbackIrohPair(): {
118
+ a: IrohStreamIO;
119
+ b: IrohStreamIO;
120
+ };
121
+ //# sourceMappingURL=IrohStreamIO.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IrohStreamIO.d.ts","sourceRoot":"","sources":["../../../../src/core/appendonlystores/network/IrohStreamIO.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnC,mDAAmD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE;;;;;OAKG;IACH,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE;IAChD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,GAAG,cAAc,CAyCjB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE1D;AAoFD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,CAAC,EAAE,YAAY,CAAC;IAAC,CAAC,EAAE,YAAY,CAAA;CAAE,CAmD7E"}