mindoodb 0.0.57 → 0.0.59
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/README-server.md +25 -1
- package/dist/browser/index.mjs +1 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts +93 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js +260 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -0
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts +121 -0
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/IrohStreamIO.js +213 -0
- package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -0
- package/dist/core/appendonlystores/network/irohLocator.d.ts +28 -0
- package/dist/core/appendonlystores/network/irohLocator.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/irohLocator.js +94 -0
- package/dist/core/appendonlystores/network/irohLocator.js.map +1 -0
- package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.d.ts +7 -0
- package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.js +48 -0
- package/dist/core/appendonlystores/network/reactNativeIrohStreamIO.js.map +1 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts +60 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +349 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -0
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +51 -0
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -0
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js +290 -0
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -0
- package/dist/core/appendonlystores/sqlite/expoSqliteDriver.d.ts +13 -0
- package/dist/core/appendonlystores/sqlite/expoSqliteDriver.d.ts.map +1 -0
- package/dist/core/appendonlystores/sqlite/expoSqliteDriver.js +26 -0
- package/dist/core/appendonlystores/sqlite/expoSqliteDriver.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/iroh/index.d.ts +8 -0
- package/dist/iroh/index.d.ts.map +1 -0
- package/dist/iroh/index.js +25 -0
- package/dist/iroh/index.js.map +1 -0
- package/dist/node/server/IrohServerEndpoint.d.ts +23 -0
- package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -0
- package/dist/node/server/IrohServerEndpoint.js +156 -0
- package/dist/node/server/IrohServerEndpoint.js.map +1 -0
- package/dist/node/server/IrohServerRpc.d.ts +52 -0
- package/dist/node/server/IrohServerRpc.d.ts.map +1 -0
- package/dist/node/server/IrohServerRpc.js +120 -0
- package/dist/node/server/IrohServerRpc.js.map +1 -0
- package/dist/node/server/MindooDBServer.d.ts +3 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +34 -0
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +28 -0
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/serverinit.js +2 -0
- package/dist/node/server/serverinit.js.map +1 -1
- package/dist/node/server/types.d.ts +16 -0
- package/dist/node/server/types.d.ts.map +1 -1
- package/dist/node/server/types.js +6 -1
- package/dist/node/server/types.js.map +1 -1
- package/dist/reactnative/index.d.ts +5 -0
- package/dist/reactnative/index.d.ts.map +1 -1
- package/dist/reactnative/index.js +20 -1
- package/dist/reactnative/index.js.map +1 -1
- package/dist/sqlite/index.d.ts +7 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +16 -0
- package/dist/sqlite/index.js.map +1 -0
- package/package.json +14 -2
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IrohServerEndpoint = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const IrohNetworkTransport_1 = require("../../core/appendonlystores/network/IrohNetworkTransport");
|
|
8
|
+
const IrohStreamIO_1 = require("../../core/appendonlystores/network/IrohStreamIO");
|
|
9
|
+
/**
|
|
10
|
+
* Optional native Iroh listen loop. `@number0/iroh` is loaded dynamically so
|
|
11
|
+
* tests and HTTP-only installs do not need the N-API binary.
|
|
12
|
+
*/
|
|
13
|
+
class IrohServerEndpoint {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.stop = null;
|
|
16
|
+
this.status = { enabled: false };
|
|
17
|
+
}
|
|
18
|
+
getStatus() {
|
|
19
|
+
return this.status;
|
|
20
|
+
}
|
|
21
|
+
async start(options) {
|
|
22
|
+
await this.stopListening();
|
|
23
|
+
if (!options.config.enabled) {
|
|
24
|
+
this.status = { enabled: false };
|
|
25
|
+
return this.status;
|
|
26
|
+
}
|
|
27
|
+
const io = await createNativeIrohStreamIO(options.dataDir, options.config);
|
|
28
|
+
const abort = new AbortController();
|
|
29
|
+
const listen = (0, IrohNetworkTransport_1.listenForIrohPeers)(io, options.handler, { signal: abort.signal });
|
|
30
|
+
this.stop = async () => {
|
|
31
|
+
abort.abort();
|
|
32
|
+
await io.close?.();
|
|
33
|
+
};
|
|
34
|
+
void listen.catch((error) => {
|
|
35
|
+
console.error("[Iroh] listen loop failed:", error);
|
|
36
|
+
});
|
|
37
|
+
const ticket = await io.getLocalTicket();
|
|
38
|
+
this.status = {
|
|
39
|
+
enabled: true,
|
|
40
|
+
ticket,
|
|
41
|
+
endpointId: io.endpointId,
|
|
42
|
+
};
|
|
43
|
+
console.log(`[Iroh] Listening on ALPN ${IrohStreamIO_1.MINDOODB_IROH_ALPN}`);
|
|
44
|
+
console.log(`[Iroh] Endpoint id: ${this.status.endpointId ?? "(unknown)"}`);
|
|
45
|
+
console.log(`[Iroh] Ticket: ${ticket}`);
|
|
46
|
+
return this.status;
|
|
47
|
+
}
|
|
48
|
+
async stopListening() {
|
|
49
|
+
if (this.stop) {
|
|
50
|
+
const stop = this.stop;
|
|
51
|
+
this.stop = null;
|
|
52
|
+
await stop().catch((error) => {
|
|
53
|
+
console.error("[Iroh] stop failed:", error);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
this.status = { enabled: false };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.IrohServerEndpoint = IrohServerEndpoint;
|
|
60
|
+
async function createNativeIrohStreamIO(dataDir, config) {
|
|
61
|
+
let iroh;
|
|
62
|
+
try {
|
|
63
|
+
iroh = await import("@number0/iroh");
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new Error("Iroh is enabled in config.json but @number0/iroh is missing from the server image. " +
|
|
67
|
+
"Rebuild with ./serversetup.sh --update " +
|
|
68
|
+
`(${error instanceof Error ? error.message : String(error)}).`);
|
|
69
|
+
}
|
|
70
|
+
const secretBytes = loadOrCreateIrohSecret(dataDir, config.secretKeyPath);
|
|
71
|
+
const alpn = Array.from(Buffer.from(IrohStreamIO_1.MINDOODB_IROH_ALPN));
|
|
72
|
+
const secretKey = createSecretKey(iroh, secretBytes);
|
|
73
|
+
const endpoint = (await iroh.Endpoint.bind({
|
|
74
|
+
alpns: [alpn],
|
|
75
|
+
secretKey,
|
|
76
|
+
}));
|
|
77
|
+
const ticket = iroh.EndpointTicket.fromAddr(endpoint.addr()).toString();
|
|
78
|
+
const endpointId = endpoint.id().toString();
|
|
79
|
+
return {
|
|
80
|
+
endpointId,
|
|
81
|
+
async getLocalTicket() {
|
|
82
|
+
return ticket;
|
|
83
|
+
},
|
|
84
|
+
async connect(peerTicket, protocolAlpn) {
|
|
85
|
+
const addr = iroh.EndpointTicket.fromString(peerTicket).endpointAddr();
|
|
86
|
+
const conn = await endpoint.connect(addr, protocolAlpn ? Array.from(Buffer.from(protocolAlpn)) : alpn);
|
|
87
|
+
const bi = await conn.openBi();
|
|
88
|
+
return wrapNativeBiStream(bi);
|
|
89
|
+
},
|
|
90
|
+
async *listen() {
|
|
91
|
+
const acceptNext = endpoint.acceptNext.bind(endpoint);
|
|
92
|
+
while (true) {
|
|
93
|
+
const incoming = await acceptNext();
|
|
94
|
+
const connecting = await incoming.accept();
|
|
95
|
+
const conn = await connecting.connect();
|
|
96
|
+
const bi = await conn.acceptBi();
|
|
97
|
+
yield wrapNativeBiStream(bi);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
async close() {
|
|
101
|
+
await endpoint.close();
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function wrapNativeBiStream(bi) {
|
|
106
|
+
return (0, IrohStreamIO_1.wrapLengthPrefixedByteStream)({
|
|
107
|
+
async write(bytes) {
|
|
108
|
+
await bi.send.writeAll(bytes);
|
|
109
|
+
},
|
|
110
|
+
async read(max) {
|
|
111
|
+
if (typeof bi.recv.read === "function") {
|
|
112
|
+
const chunk = await bi.recv.read(max);
|
|
113
|
+
return chunk ? toUint8Array(chunk) : null;
|
|
114
|
+
}
|
|
115
|
+
const chunk = await bi.recv.readToEnd?.(max);
|
|
116
|
+
return chunk ? toUint8Array(chunk) : null;
|
|
117
|
+
},
|
|
118
|
+
async close() {
|
|
119
|
+
await bi.send.finish().catch(() => undefined);
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function toUint8Array(value) {
|
|
124
|
+
return value instanceof Uint8Array ? value : new Uint8Array(value);
|
|
125
|
+
}
|
|
126
|
+
function createSecretKey(iroh, secretBytes) {
|
|
127
|
+
const SecretKey = iroh.SecretKey;
|
|
128
|
+
if (typeof SecretKey?.fromBytes === "function") {
|
|
129
|
+
return SecretKey.fromBytes(secretBytes);
|
|
130
|
+
}
|
|
131
|
+
if (typeof SecretKey?.fromString === "function") {
|
|
132
|
+
return SecretKey.fromString(Buffer.from(secretBytes).toString("hex"));
|
|
133
|
+
}
|
|
134
|
+
throw new Error("@number0/iroh SecretKey.fromBytes is not available");
|
|
135
|
+
}
|
|
136
|
+
function loadOrCreateIrohSecret(dataDir, configuredPath) {
|
|
137
|
+
const filePath = configuredPath
|
|
138
|
+
? (0, path_1.isAbsolute)(configuredPath)
|
|
139
|
+
? configuredPath
|
|
140
|
+
: (0, path_1.join)(dataDir, configuredPath)
|
|
141
|
+
: (0, path_1.join)(dataDir, "iroh-secret.key");
|
|
142
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
143
|
+
const raw = (0, fs_1.readFileSync)(filePath, "utf-8").trim();
|
|
144
|
+
const bytes = Buffer.from(raw, raw.length === 64 ? "hex" : "base64");
|
|
145
|
+
if (bytes.length !== 32) {
|
|
146
|
+
throw new Error(`Iroh secret key at ${filePath} must be 32 bytes`);
|
|
147
|
+
}
|
|
148
|
+
return new Uint8Array(bytes);
|
|
149
|
+
}
|
|
150
|
+
const bytes = (0, crypto_1.randomBytes)(32);
|
|
151
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(filePath), { recursive: true });
|
|
152
|
+
(0, fs_1.writeFileSync)(filePath, bytes.toString("hex"), { encoding: "utf-8", mode: 0o600 });
|
|
153
|
+
console.log(`[Iroh] Wrote new secret key to ${filePath}`);
|
|
154
|
+
return new Uint8Array(bytes);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=IrohServerEndpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IrohServerEndpoint.js","sourceRoot":"","sources":["../../../src/node/server/IrohServerEndpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { StoreKind } from "../../core/appendonlystores/types";
|
|
2
|
+
import type { IrohRpcHandler } from "../../core/appendonlystores/network/IrohNetworkTransport";
|
|
3
|
+
import type { MindooDBServerInfo } from "../../core/types";
|
|
4
|
+
import { ValidationError } from "./validation";
|
|
5
|
+
export interface IrohServerAuthService {
|
|
6
|
+
generateChallenge(username?: string, options?: {
|
|
7
|
+
signingPublicKey?: string;
|
|
8
|
+
}): Promise<string>;
|
|
9
|
+
authenticate(challenge: string, signature: Uint8Array): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
token?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export interface IrohServerStore {
|
|
16
|
+
handleFindNewEntries(token: string, haveIds: string[]): Promise<unknown>;
|
|
17
|
+
handleFindNewEntriesForDoc(token: string, haveIds: string[], docId: string): Promise<unknown>;
|
|
18
|
+
handleFindEntries(token: string, type: unknown, creationDateFrom: number | null, creationDateUntil: number | null): Promise<unknown>;
|
|
19
|
+
handleScanEntriesSince(token: string, cursor: unknown, limit?: number, filters?: unknown): Promise<unknown>;
|
|
20
|
+
handleGetIdBloomSummary(token: string): Promise<unknown>;
|
|
21
|
+
handleGetStoreHead(token: string): Promise<unknown>;
|
|
22
|
+
handleGetCompactionStatus(token: string): Promise<unknown>;
|
|
23
|
+
handleGetCapabilities(token: string): Promise<unknown>;
|
|
24
|
+
handleGetEntries(token: string, ids: string[]): Promise<unknown>;
|
|
25
|
+
handleGetEntriesSessionWrapped(token: string, ids: string[]): Promise<unknown>;
|
|
26
|
+
handleGetEntryMetadata(token: string, id: string): Promise<unknown>;
|
|
27
|
+
handlePutEntries(token: string, entries: unknown[]): Promise<unknown>;
|
|
28
|
+
handleHasEntries(token: string, ids: string[]): Promise<unknown>;
|
|
29
|
+
handleGetAllIds(token: string): Promise<unknown>;
|
|
30
|
+
handleResolveDependencies(token: string, startId: string, options?: Record<string, unknown>): Promise<unknown>;
|
|
31
|
+
handlePlanDocumentMaterialization(token: string, docId: string, options?: unknown): Promise<unknown>;
|
|
32
|
+
handlePlanDocumentMaterializationBatch(token: string, docIds: string[], options?: unknown): Promise<unknown>;
|
|
33
|
+
handlePlanAttachmentReadByWalkingMetadata(token: string, lastChunkId: string, attachmentSize: number, options: unknown): Promise<unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface IrohServerRpcHost {
|
|
36
|
+
getServerPublicInfo(): MindooDBServerInfo | null;
|
|
37
|
+
getJsonBodyLimit?: () => {
|
|
38
|
+
limit: string;
|
|
39
|
+
bytes: number | null;
|
|
40
|
+
};
|
|
41
|
+
getClusterRole?: () => string;
|
|
42
|
+
listTenantPublicInfosFingerprints(tenantId: string): Promise<string[]>;
|
|
43
|
+
getAuthService(tenantId: string): Promise<IrohServerAuthService>;
|
|
44
|
+
getServerStore(tenantId: string, dbId: string, storeKind: StoreKind): Promise<IrohServerStore>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Inverse of {@link IrohNetworkTransport}: same method names, same args.
|
|
48
|
+
* Discovery methods are unauthenticated, matching `/.well-known/*`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createMindooDBServerIrohHandler(host: IrohServerRpcHost): IrohRpcHandler;
|
|
51
|
+
export declare function isIrohValidationError(error: unknown): error is ValidationError;
|
|
52
|
+
//# sourceMappingURL=IrohServerRpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IrohServerRpc.d.ts","sourceRoot":"","sources":["../../../src/node/server/IrohServerRpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMindooDBServerIrohHandler = createMindooDBServerIrohHandler;
|
|
4
|
+
exports.isIrohValidationError = isIrohValidationError;
|
|
5
|
+
const types_1 = require("../../core/appendonlystores/types");
|
|
6
|
+
const validation_1 = require("./validation");
|
|
7
|
+
function requireTenant(ctx) {
|
|
8
|
+
const tenantId = ctx?.tenantId?.trim().toLowerCase();
|
|
9
|
+
if (!tenantId) {
|
|
10
|
+
throw new Error("Iroh RPC requires ctx.tenantId");
|
|
11
|
+
}
|
|
12
|
+
(0, validation_1.validateTenantId)(tenantId);
|
|
13
|
+
return tenantId;
|
|
14
|
+
}
|
|
15
|
+
function requireStoreScope(ctx) {
|
|
16
|
+
const tenantId = requireTenant(ctx);
|
|
17
|
+
const dbId = ctx?.dbId?.trim();
|
|
18
|
+
if (!dbId) {
|
|
19
|
+
throw new Error("Iroh RPC requires ctx.dbId");
|
|
20
|
+
}
|
|
21
|
+
const storeKind = ctx?.storeKind === types_1.StoreKind.attachments ? types_1.StoreKind.attachments : types_1.StoreKind.docs;
|
|
22
|
+
return { tenantId, dbId, storeKind };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Inverse of {@link IrohNetworkTransport}: same method names, same args.
|
|
26
|
+
* Discovery methods are unauthenticated, matching `/.well-known/*`.
|
|
27
|
+
*/
|
|
28
|
+
function createMindooDBServerIrohHandler(host) {
|
|
29
|
+
return async (method, args, ctx) => {
|
|
30
|
+
switch (method) {
|
|
31
|
+
case "getServerInfo": {
|
|
32
|
+
const info = host.getServerPublicInfo();
|
|
33
|
+
if (!info) {
|
|
34
|
+
throw new Error("Server identity not initialized");
|
|
35
|
+
}
|
|
36
|
+
const limit = host.getJsonBodyLimit?.();
|
|
37
|
+
return {
|
|
38
|
+
...info,
|
|
39
|
+
clusterRole: host.getClusterRole?.() ?? "peer",
|
|
40
|
+
maxJsonRequestBodyLimit: limit?.limit,
|
|
41
|
+
maxJsonRequestBodyBytes: limit?.bytes ?? undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
case "getTenantPublicInfosFingerprints": {
|
|
45
|
+
const tenantId = String(args[0] ?? "").trim().toLowerCase();
|
|
46
|
+
(0, validation_1.validateTenantId)(tenantId);
|
|
47
|
+
const fingerprints = await host.listTenantPublicInfosFingerprints(tenantId);
|
|
48
|
+
if (fingerprints.length === 0) {
|
|
49
|
+
throw new Error("Tenant not found on server");
|
|
50
|
+
}
|
|
51
|
+
return { tenantId, fingerprints };
|
|
52
|
+
}
|
|
53
|
+
case "requestChallenge": {
|
|
54
|
+
const tenantId = requireTenant(ctx);
|
|
55
|
+
const auth = await host.getAuthService(tenantId);
|
|
56
|
+
return auth.generateChallenge(typeof args[0] === "string" ? args[0] : undefined, args[1]);
|
|
57
|
+
}
|
|
58
|
+
case "authenticate": {
|
|
59
|
+
const tenantId = requireTenant(ctx);
|
|
60
|
+
const auth = await host.getAuthService(tenantId);
|
|
61
|
+
const challenge = String(args[0] ?? "");
|
|
62
|
+
const signature = args[1];
|
|
63
|
+
return auth.authenticate(challenge, signature);
|
|
64
|
+
}
|
|
65
|
+
default:
|
|
66
|
+
return dispatchStoreMethod(host, method, args, ctx);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async function dispatchStoreMethod(host, method, args, ctx) {
|
|
71
|
+
const scope = requireStoreScope(ctx);
|
|
72
|
+
const store = await host.getServerStore(scope.tenantId, scope.dbId, scope.storeKind);
|
|
73
|
+
const token = String(args[0] ?? "");
|
|
74
|
+
switch (method) {
|
|
75
|
+
case "getCapabilities":
|
|
76
|
+
return store.handleGetCapabilities(token);
|
|
77
|
+
case "findNewEntries":
|
|
78
|
+
return store.handleFindNewEntries(token, args[1] ?? []);
|
|
79
|
+
case "findNewEntriesForDoc":
|
|
80
|
+
return store.handleFindNewEntriesForDoc(token, args[1] ?? [], String(args[2] ?? ""));
|
|
81
|
+
case "findEntries":
|
|
82
|
+
return store.handleFindEntries(token, args[1], args[2] ?? null, args[3] ?? null);
|
|
83
|
+
case "scanEntriesSince":
|
|
84
|
+
return store.handleScanEntriesSince(token, args[1], args[2], args[3]);
|
|
85
|
+
case "getIdBloomSummary":
|
|
86
|
+
return store.handleGetIdBloomSummary(token);
|
|
87
|
+
case "getStoreHead":
|
|
88
|
+
return store.handleGetStoreHead(token);
|
|
89
|
+
case "getCompactionStatus":
|
|
90
|
+
return store.handleGetCompactionStatus(token);
|
|
91
|
+
case "planDocumentMaterialization":
|
|
92
|
+
return store.handlePlanDocumentMaterialization(token, String(args[1] ?? ""), args[2]);
|
|
93
|
+
case "planDocumentMaterializationBatch":
|
|
94
|
+
return store.handlePlanDocumentMaterializationBatch(token, args[1] ?? [], args[2]);
|
|
95
|
+
case "planAttachmentReadByWalkingMetadata":
|
|
96
|
+
return store.handlePlanAttachmentReadByWalkingMetadata(token, String(args[1] ?? ""), Number(args[2] ?? 0), args[3]);
|
|
97
|
+
case "getEntries":
|
|
98
|
+
return store.handleGetEntries(token, args[1] ?? []);
|
|
99
|
+
case "getEntriesSessionWrapped":
|
|
100
|
+
return store.handleGetEntriesSessionWrapped(token, args[1] ?? []);
|
|
101
|
+
case "getEntryMetadata":
|
|
102
|
+
return store.handleGetEntryMetadata(token, String(args[1] ?? ""));
|
|
103
|
+
case "putEntries":
|
|
104
|
+
return store.handlePutEntries(token, args[1] ?? []);
|
|
105
|
+
case "hasEntries":
|
|
106
|
+
return store.handleHasEntries(token, args[1] ?? []);
|
|
107
|
+
case "getAllIds":
|
|
108
|
+
return store.handleGetAllIds(token);
|
|
109
|
+
case "resolveDependencies":
|
|
110
|
+
return store.handleResolveDependencies(token, String(args[1] ?? ""), args[2]);
|
|
111
|
+
case "subscribeToChanges":
|
|
112
|
+
throw new Error("subscribeToChanges is not implemented on the Iroh server path yet");
|
|
113
|
+
default:
|
|
114
|
+
throw new Error(`Unknown Iroh RPC method ${method}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function isIrohValidationError(error) {
|
|
118
|
+
return error instanceof validation_1.ValidationError;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=IrohServerRpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IrohServerRpc.js","sourceRoot":"","sources":["../../../src/node/server/IrohServerRpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,7 @@ export declare class MindooDBServer {
|
|
|
59
59
|
* SSRF boundary for {@link handleTimestampRequest}.
|
|
60
60
|
*/
|
|
61
61
|
private readonly tsaProviders;
|
|
62
|
+
private readonly irohEndpoint;
|
|
62
63
|
/**
|
|
63
64
|
* @param dataDir Root directory for on-disk tenant data and server identity
|
|
64
65
|
* @param serverPassword Password used to decrypt the server identity private keys
|
|
@@ -99,6 +100,8 @@ export declare class MindooDBServer {
|
|
|
99
100
|
* with Express; the `as unknown` casts bridge the type gap.
|
|
100
101
|
*/
|
|
101
102
|
listenTls(port: number, certPath: string, keyPath: string): void;
|
|
103
|
+
getIrohStatus(): import("./IrohServerEndpoint").IrohServerEndpointStatus;
|
|
104
|
+
startIrohIfEnabled(): Promise<void>;
|
|
102
105
|
/**
|
|
103
106
|
* Global middleware stack applied to every request, in order:
|
|
104
107
|
* 1. helmet — security headers (CSP, X-Frame-Options, etc.)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MindooDBServer.d.ts","sourceRoot":"","sources":["../../../src/node/server/MindooDBServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,OAAoD,MAAM,SAAS,CAAC;AAuB3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAwBvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAkB3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"MindooDBServer.d.ts","sourceRoot":"","sources":["../../../src/node/server/MindooDBServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,6 +72,8 @@ const SystemAdminAuth_1 = require("./SystemAdminAuth");
|
|
|
72
72
|
const DeviceDiscoveryService_1 = require("./DeviceDiscoveryService");
|
|
73
73
|
const config_1 = require("./config");
|
|
74
74
|
const SystemIpAllowlist_1 = require("./SystemIpAllowlist");
|
|
75
|
+
const IrohServerRpc_1 = require("./IrohServerRpc");
|
|
76
|
+
const IrohServerEndpoint_1 = require("./IrohServerEndpoint");
|
|
75
77
|
const validation_1 = require("./validation");
|
|
76
78
|
const urlSafety_1 = require("../../core/utils/urlSafety");
|
|
77
79
|
const types_4 = require("./types");
|
|
@@ -161,6 +163,7 @@ class MindooDBServer {
|
|
|
161
163
|
* @param configPath Explicit path to config.json; defaults to `<dataDir>/config.json`
|
|
162
164
|
*/
|
|
163
165
|
constructor(dataDir, serverPassword, staticDir, config, configPath) {
|
|
166
|
+
this.irohEndpoint = new IrohServerEndpoint_1.IrohServerEndpoint();
|
|
164
167
|
this.app = (0, express_1.default)();
|
|
165
168
|
this.syncEventBus = new SyncEventBus_1.SyncEventBus();
|
|
166
169
|
this.tenantManager = new TenantManager_1.TenantManager(dataDir, serverPassword);
|
|
@@ -275,6 +278,7 @@ class MindooDBServer {
|
|
|
275
278
|
console.log(`[MindooDBServer] Listening on port ${port}`);
|
|
276
279
|
});
|
|
277
280
|
server.setTimeout(DEFAULT_SERVER_SOCKET_TIMEOUT_MS);
|
|
281
|
+
void this.startIrohIfEnabled();
|
|
278
282
|
}
|
|
279
283
|
/**
|
|
280
284
|
* Start the server with TLS using HTTP/2 (with automatic HTTP/1.1 ALPN
|
|
@@ -295,6 +299,36 @@ class MindooDBServer {
|
|
|
295
299
|
console.log(`[MindooDBServer] Listening on HTTPS port ${port} with HTTP/2 enabled (HTTP/1 fallback active)`);
|
|
296
300
|
});
|
|
297
301
|
server.setTimeout(DEFAULT_SERVER_SOCKET_TIMEOUT_MS);
|
|
302
|
+
void this.startIrohIfEnabled();
|
|
303
|
+
}
|
|
304
|
+
getIrohStatus() {
|
|
305
|
+
return this.irohEndpoint.getStatus();
|
|
306
|
+
}
|
|
307
|
+
async startIrohIfEnabled() {
|
|
308
|
+
const irohConfig = this.serverConfig.iroh;
|
|
309
|
+
if (!irohConfig?.enabled) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
try {
|
|
313
|
+
await this.irohEndpoint.start({
|
|
314
|
+
dataDir: this.tenantManager.getDataDir(),
|
|
315
|
+
config: irohConfig,
|
|
316
|
+
handler: (0, IrohServerRpc_1.createMindooDBServerIrohHandler)({
|
|
317
|
+
getServerPublicInfo: () => this.tenantManager.getServerPublicInfo(),
|
|
318
|
+
getJsonBodyLimit: () => ({
|
|
319
|
+
limit: this.jsonBodyLimit,
|
|
320
|
+
bytes: this.jsonBodyLimitBytes,
|
|
321
|
+
}),
|
|
322
|
+
getClusterRole: () => this.serverConfig.cluster?.role ?? "peer",
|
|
323
|
+
listTenantPublicInfosFingerprints: (tenantId) => this.tenantManager.listTenantPublicInfosFingerprints(tenantId),
|
|
324
|
+
getAuthService: (tenantId) => this.tenantManager.getAuthService(tenantId),
|
|
325
|
+
getServerStore: (tenantId, dbId, storeKind) => this.tenantManager.getServerStore(tenantId, dbId, storeKind),
|
|
326
|
+
}),
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
console.error("[MindooDBServer] Failed to start Iroh listener:", error);
|
|
331
|
+
}
|
|
298
332
|
}
|
|
299
333
|
/**
|
|
300
334
|
* Global middleware stack applied to every request, in order:
|