sietch 0.12.1 → 0.16.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/acl.d.ts +6 -0
- package/dist/acl.js +8 -0
- package/dist/acl.js.map +1 -1
- package/dist/server/acl-authority.d.ts +9 -0
- package/dist/server/acl-authority.js +24 -0
- package/dist/server/acl-authority.js.map +1 -1
- package/dist/server/pg-storage.d.ts +18 -1
- package/dist/server/pg-storage.js +69 -10
- package/dist/server/pg-storage.js.map +1 -1
- package/dist/server/server.d.ts +92 -2
- package/dist/server/server.js +164 -11
- package/dist/server/server.js.map +1 -1
- package/dist/store.d.ts +31 -1
- package/dist/store.js +98 -14
- package/dist/store.js.map +1 -1
- package/dist/subtree.d.ts +113 -0
- package/dist/subtree.js +197 -0
- package/dist/subtree.js.map +1 -0
- package/dist/sync-engine.d.ts +38 -0
- package/dist/sync-engine.js +51 -1
- package/dist/sync-engine.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/yjs-engine.d.ts +16 -1
- package/dist/yjs-engine.js +19 -26
- package/dist/yjs-engine.js.map +1 -1
- package/package.json +2 -1
package/dist/acl.d.ts
CHANGED
|
@@ -47,6 +47,12 @@ export declare class AclManager {
|
|
|
47
47
|
* Set the trusted server's public key for signature verification.
|
|
48
48
|
*/
|
|
49
49
|
setServerPublicKey(pk: HybridPublicKey): void;
|
|
50
|
+
/**
|
|
51
|
+
* The trusted server public key, or null if none is configured (open mode).
|
|
52
|
+
* Reused by the AMD-013 subtree-rulebook verifier so the rulebook shares the
|
|
53
|
+
* same trust anchor as ACL reference nodes.
|
|
54
|
+
*/
|
|
55
|
+
getServerPublicKey(): HybridPublicKey | null;
|
|
50
56
|
/**
|
|
51
57
|
* Apply an ACL reference node update (from server or sync).
|
|
52
58
|
* Verifies server signature before accepting.
|
package/dist/acl.js
CHANGED
|
@@ -26,6 +26,14 @@ export class AclManager {
|
|
|
26
26
|
setServerPublicKey(pk) {
|
|
27
27
|
this.serverPublicKey = pk;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* The trusted server public key, or null if none is configured (open mode).
|
|
31
|
+
* Reused by the AMD-013 subtree-rulebook verifier so the rulebook shares the
|
|
32
|
+
* same trust anchor as ACL reference nodes.
|
|
33
|
+
*/
|
|
34
|
+
getServerPublicKey() {
|
|
35
|
+
return this.serverPublicKey;
|
|
36
|
+
}
|
|
29
37
|
/**
|
|
30
38
|
* Apply an ACL reference node update (from server or sync).
|
|
31
39
|
* Verifies server signature before accepting.
|
package/dist/acl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl.js","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acl.js","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { type HybridKeypair, type HybridPublicKey, type HybridSignature } from '../crypto.js';
|
|
12
12
|
import { type AclReferenceNode } from '../acl.js';
|
|
13
|
+
import { type SubtreeRegistryNode } from '../subtree.js';
|
|
13
14
|
import type { AclPermissions, Result } from '../types.js';
|
|
14
15
|
import type { ObservabilityContext } from '../observability.js';
|
|
15
16
|
import { AclError } from '../errors.js';
|
|
@@ -81,6 +82,14 @@ export declare class ServerAclAuthority {
|
|
|
81
82
|
* Get the current ACL reference node for a subtree.
|
|
82
83
|
*/
|
|
83
84
|
getRefNode(subtreeId: string): AclReferenceNode | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* AMD-013: sign the boundary rulebook (subtree pattern set) with the
|
|
87
|
+
* server's signing backend, producing a `SubtreeRegistryNode` that clients
|
|
88
|
+
* verify against the same trusted server public key they use for ACL nodes.
|
|
89
|
+
*
|
|
90
|
+
* @req FR-37
|
|
91
|
+
*/
|
|
92
|
+
signSubtreeRegistry(patterns: string[], version: number): SubtreeRegistryNode;
|
|
84
93
|
/**
|
|
85
94
|
* Verify that a reference node was signed by this server.
|
|
86
95
|
*/
|
|
@@ -10,7 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { sign, verify, generateCek, wrapCek, } from '../crypto.js';
|
|
12
12
|
import { serializeAclPayload, } from '../acl.js';
|
|
13
|
+
import { serializeSubtreeRegistry, } from '../subtree.js';
|
|
13
14
|
import { AclError, PermissionDeniedError } from '../errors.js';
|
|
15
|
+
// AMD-006: libp2p peerIds are base58-encoded multihashes with stable
|
|
16
|
+
// prefixes — Ed25519 starts with "12D3KooW", legacy RSA with "Qm".
|
|
17
|
+
// Sietch identity peerIds are lowercase-hex digests (no such prefix).
|
|
18
|
+
const LIBP2P_PEERID_SHAPE = /^(12D3KooW|Qm[1-9A-HJ-NP-Za-km-z]{43,46})/;
|
|
14
19
|
/** Default signing backend wrapping a HybridKeypair. */
|
|
15
20
|
export class DefaultSigningBackend {
|
|
16
21
|
keypair;
|
|
@@ -149,6 +154,17 @@ export class ServerAclAuthority {
|
|
|
149
154
|
getRefNode(subtreeId) {
|
|
150
155
|
return this.refNodes.get(subtreeId);
|
|
151
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* AMD-013: sign the boundary rulebook (subtree pattern set) with the
|
|
159
|
+
* server's signing backend, producing a `SubtreeRegistryNode` that clients
|
|
160
|
+
* verify against the same trusted server public key they use for ACL nodes.
|
|
161
|
+
*
|
|
162
|
+
* @req FR-37
|
|
163
|
+
*/
|
|
164
|
+
signSubtreeRegistry(patterns, version) {
|
|
165
|
+
const signature = this.signingBackend.sign(serializeSubtreeRegistry({ patterns, version }));
|
|
166
|
+
return { patterns, version, signature };
|
|
167
|
+
}
|
|
152
168
|
/**
|
|
153
169
|
* Verify that a reference node was signed by this server.
|
|
154
170
|
*/
|
|
@@ -171,6 +187,14 @@ export class ServerAclAuthority {
|
|
|
171
187
|
if (!request.permissions) {
|
|
172
188
|
return { ok: false, error: new AclError('Grant requires permissions', 'ACL_MISSING_PERMS') };
|
|
173
189
|
}
|
|
190
|
+
// AMD-006: warn if targetUserId looks like a libp2p peerId. Sietch
|
|
191
|
+
// identityPeerIds are 32-byte hex digests; libp2p peerIds are
|
|
192
|
+
// base58-encoded multihashes starting with `12D3` (Ed25519) or `Qm`
|
|
193
|
+
// (RSA). Grants keyed against libp2p peerIds silently no-op because
|
|
194
|
+
// the sync gate checks sietch identityPeerId.
|
|
195
|
+
if (LIBP2P_PEERID_SHAPE.test(request.targetUserId)) {
|
|
196
|
+
this.obs.logger.warn({ subtreeId: request.subtreeId, targetUserId: request.targetUserId }, '[AMD-006] ACL grant target looks like a libp2p peerId — write gate keys on sietch identityPeerId. Grants against libp2p peerIds silently no-op. Use ctx.aclTarget (== ctx.sietchIdentityPeerId) from the HandshakeHook instead.');
|
|
197
|
+
}
|
|
174
198
|
// For existing subtrees, validate requester is admin
|
|
175
199
|
if (existing) {
|
|
176
200
|
const requesterPerms = existing.acl[request.requesterId];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl-authority.js","sourceRoot":"","sources":["../../src/server/acl-authority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,WAAW,EACX,OAAO,GAIR,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,mBAAmB,GACpB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"acl-authority.js","sourceRoot":"","sources":["../../src/server/acl-authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,15 +7,24 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The pool is NOT owned by this backend — close() is a no-op.
|
|
9
9
|
* The caller owns the pool and may share it with PostgreSQLDatabaseAdapter.
|
|
10
|
+
*
|
|
11
|
+
* AMD-008: `pg.Pool` emits an `'error'` event when a connection is closed
|
|
12
|
+
* by the server (administrator command, restart, ECONNRESET); unhandled,
|
|
13
|
+
* this crashes the process. The constructor now registers a listener so
|
|
14
|
+
* such errors are logged and swallowed. All queries are wrapped in a
|
|
15
|
+
* retry-on-transient loop (3 attempts, 100/500/2500 ms backoff) so a
|
|
16
|
+
* brief PG bounce no longer fails caller writes.
|
|
10
17
|
*/
|
|
11
18
|
import pg from 'pg';
|
|
12
19
|
import type { StorageBackend } from '../storage.js';
|
|
13
20
|
import type { StorageCapacity } from '../types.js';
|
|
21
|
+
import type { ObservabilityContext } from '../observability.js';
|
|
14
22
|
export declare class PostgresStorageBackend implements StorageBackend {
|
|
15
23
|
readonly type: "postgres";
|
|
16
24
|
private pool;
|
|
17
25
|
private schemaReady;
|
|
18
|
-
|
|
26
|
+
private obs;
|
|
27
|
+
constructor(pool: pg.Pool, obs?: ObservabilityContext);
|
|
19
28
|
/**
|
|
20
29
|
* Ensure required tables exist. Idempotent — safe to call on every startup.
|
|
21
30
|
* Does NOT create `nodes`, `node_history`, `vectors`, or AGE graph —
|
|
@@ -47,4 +56,12 @@ export declare class PostgresStorageBackend implements StorageBackend {
|
|
|
47
56
|
close(): Promise<void>;
|
|
48
57
|
private kvUpsert;
|
|
49
58
|
private kvLoad;
|
|
59
|
+
/**
|
|
60
|
+
* AMD-008: per-query retry on transient PG errors.
|
|
61
|
+
*
|
|
62
|
+
* Retries up to 3 times (4 total attempts) on `terminating connection`,
|
|
63
|
+
* `ECONNRESET`, and similar disconnect classes. Backoff: 100, 500, 2500 ms.
|
|
64
|
+
* Permanent errors (auth, syntax, schema) bypass retries and throw.
|
|
65
|
+
*/
|
|
66
|
+
private runQuery;
|
|
50
67
|
}
|
|
@@ -7,14 +7,47 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The pool is NOT owned by this backend — close() is a no-op.
|
|
9
9
|
* The caller owns the pool and may share it with PostgreSQLDatabaseAdapter.
|
|
10
|
+
*
|
|
11
|
+
* AMD-008: `pg.Pool` emits an `'error'` event when a connection is closed
|
|
12
|
+
* by the server (administrator command, restart, ECONNRESET); unhandled,
|
|
13
|
+
* this crashes the process. The constructor now registers a listener so
|
|
14
|
+
* such errors are logged and swallowed. All queries are wrapped in a
|
|
15
|
+
* retry-on-transient loop (3 attempts, 100/500/2500 ms backoff) so a
|
|
16
|
+
* brief PG bounce no longer fails caller writes.
|
|
10
17
|
*/
|
|
18
|
+
// AMD-008: transient PG error class detection. We retry on:
|
|
19
|
+
// - Connection terminated by administrator (`57P01`)
|
|
20
|
+
// - Crash shutdown (`57P02`), cannot connect now (`57P03`)
|
|
21
|
+
// - Admin shutdown (`57P04`), idle session timeout (`57P05`)
|
|
22
|
+
// - ECONNRESET / EPIPE / read ECONNRESET at the socket layer
|
|
23
|
+
// - "Connection terminated unexpectedly" — node-postgres pool message
|
|
24
|
+
const TRANSIENT_PG_CODES = new Set(['57P01', '57P02', '57P03', '57P04', '57P05']);
|
|
25
|
+
const TRANSIENT_PG_MESSAGE = /terminating connection|Connection terminated|ECONNRESET|EPIPE|read ECONNRESET|server closed the connection unexpectedly/i;
|
|
26
|
+
function isTransientPgError(err) {
|
|
27
|
+
if (!err || typeof err !== 'object')
|
|
28
|
+
return false;
|
|
29
|
+
const e = err;
|
|
30
|
+
if (typeof e.code === 'string' && TRANSIENT_PG_CODES.has(e.code))
|
|
31
|
+
return true;
|
|
32
|
+
if (typeof e.message === 'string' && TRANSIENT_PG_MESSAGE.test(e.message))
|
|
33
|
+
return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const RETRY_DELAYS_MS = [100, 500, 2500];
|
|
11
37
|
// @req FR-02
|
|
12
38
|
export class PostgresStorageBackend {
|
|
13
39
|
type = 'postgres';
|
|
14
40
|
pool;
|
|
15
41
|
schemaReady = false;
|
|
16
|
-
|
|
42
|
+
obs;
|
|
43
|
+
constructor(pool, obs) {
|
|
17
44
|
this.pool = pool;
|
|
45
|
+
this.obs = obs;
|
|
46
|
+
// AMD-008: trap pool-level errors that otherwise propagate as
|
|
47
|
+
// uncaughtException and crash the process during PG restarts.
|
|
48
|
+
pool.on('error', (err) => {
|
|
49
|
+
this.obs?.logger.warn({ err: String(err), code: err.code }, '[AMD-008] pg.Pool error swallowed — query-level retry will handle reconnection');
|
|
50
|
+
});
|
|
18
51
|
}
|
|
19
52
|
/**
|
|
20
53
|
* Ensure required tables exist. Idempotent — safe to call on every startup.
|
|
@@ -24,14 +57,14 @@ export class PostgresStorageBackend {
|
|
|
24
57
|
async ensureSchema() {
|
|
25
58
|
if (this.schemaReady)
|
|
26
59
|
return;
|
|
27
|
-
await this.
|
|
60
|
+
await this.runQuery(`
|
|
28
61
|
CREATE TABLE IF NOT EXISTS subdoc_states (
|
|
29
62
|
subtree_id TEXT PRIMARY KEY,
|
|
30
63
|
yjs_state BYTEA NOT NULL,
|
|
31
64
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
32
65
|
)
|
|
33
66
|
`);
|
|
34
|
-
await this.
|
|
67
|
+
await this.runQuery(`
|
|
35
68
|
CREATE TABLE IF NOT EXISTS sietch_kv (
|
|
36
69
|
key TEXT PRIMARY KEY,
|
|
37
70
|
value BYTEA NOT NULL,
|
|
@@ -42,22 +75,22 @@ export class PostgresStorageBackend {
|
|
|
42
75
|
}
|
|
43
76
|
// ── Subdoc persistence ──────────────────────────────────
|
|
44
77
|
async persistSubdoc(subtreeId, state) {
|
|
45
|
-
await this.
|
|
78
|
+
await this.runQuery(`INSERT INTO subdoc_states (subtree_id, yjs_state, updated_at)
|
|
46
79
|
VALUES ($1, $2, now())
|
|
47
80
|
ON CONFLICT (subtree_id) DO UPDATE SET yjs_state = $2, updated_at = now()`, [subtreeId, Buffer.from(state)]);
|
|
48
81
|
}
|
|
49
82
|
async loadSubdoc(subtreeId) {
|
|
50
|
-
const result = await this.
|
|
83
|
+
const result = await this.runQuery('SELECT yjs_state FROM subdoc_states WHERE subtree_id = $1', [subtreeId]);
|
|
51
84
|
if (result.rows.length === 0)
|
|
52
85
|
return null;
|
|
53
86
|
const buf = result.rows[0].yjs_state;
|
|
54
87
|
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
55
88
|
}
|
|
56
89
|
async deleteSubdoc(subtreeId) {
|
|
57
|
-
await this.
|
|
90
|
+
await this.runQuery('DELETE FROM subdoc_states WHERE subtree_id = $1', [subtreeId]);
|
|
58
91
|
}
|
|
59
92
|
async listSubdocs() {
|
|
60
|
-
const result = await this.
|
|
93
|
+
const result = await this.runQuery('SELECT subtree_id FROM subdoc_states ORDER BY subtree_id');
|
|
61
94
|
return result.rows.map((row) => row.subtree_id);
|
|
62
95
|
}
|
|
63
96
|
// ── Capacity ────────────────────────────────────────────
|
|
@@ -94,7 +127,7 @@ export class PostgresStorageBackend {
|
|
|
94
127
|
await this.kvUpsert(`meta:${id}`, encoded);
|
|
95
128
|
}
|
|
96
129
|
async listSubdocMetadata() {
|
|
97
|
-
const result = await this.
|
|
130
|
+
const result = await this.runQuery("SELECT key, value FROM sietch_kv WHERE key LIKE 'meta:%' ORDER BY key");
|
|
98
131
|
return result.rows.map((row) => {
|
|
99
132
|
const id = row.key.slice(5); // strip 'meta:'
|
|
100
133
|
const meta = JSON.parse(row.value.toString());
|
|
@@ -107,16 +140,42 @@ export class PostgresStorageBackend {
|
|
|
107
140
|
}
|
|
108
141
|
// ── Private helpers ─────────────────────────────────────
|
|
109
142
|
async kvUpsert(key, value) {
|
|
110
|
-
await this.
|
|
143
|
+
await this.runQuery(`INSERT INTO sietch_kv (key, value, updated_at)
|
|
111
144
|
VALUES ($1, $2, now())
|
|
112
145
|
ON CONFLICT (key) DO UPDATE SET value = $2, updated_at = now()`, [key, value]);
|
|
113
146
|
}
|
|
114
147
|
async kvLoad(key) {
|
|
115
|
-
const result = await this.
|
|
148
|
+
const result = await this.runQuery('SELECT value FROM sietch_kv WHERE key = $1', [key]);
|
|
116
149
|
if (result.rows.length === 0)
|
|
117
150
|
return null;
|
|
118
151
|
const buf = result.rows[0].value;
|
|
119
152
|
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
120
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* AMD-008: per-query retry on transient PG errors.
|
|
156
|
+
*
|
|
157
|
+
* Retries up to 3 times (4 total attempts) on `terminating connection`,
|
|
158
|
+
* `ECONNRESET`, and similar disconnect classes. Backoff: 100, 500, 2500 ms.
|
|
159
|
+
* Permanent errors (auth, syntax, schema) bypass retries and throw.
|
|
160
|
+
*/
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
162
|
+
async runQuery(text, params) {
|
|
163
|
+
let lastErr;
|
|
164
|
+
for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
|
|
165
|
+
try {
|
|
166
|
+
return await this.pool.query(text, params);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
lastErr = err;
|
|
170
|
+
if (!isTransientPgError(err) || attempt === RETRY_DELAYS_MS.length) {
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
const delay = RETRY_DELAYS_MS[attempt];
|
|
174
|
+
this.obs?.logger.warn({ attempt: attempt + 1, delay, err: String(err) }, '[AMD-008] transient PG error, retrying');
|
|
175
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
throw lastErr;
|
|
179
|
+
}
|
|
121
180
|
}
|
|
122
181
|
//# sourceMappingURL=pg-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-storage.js","sourceRoot":"","sources":["../../src/server/pg-storage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pg-storage.js","sourceRoot":"","sources":["../../src/server/pg-storage.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.d.ts
CHANGED
|
@@ -16,7 +16,10 @@ import { type PublicIdentity } from '../identity.js';
|
|
|
16
16
|
import { type StorageBackend } from '../storage.js';
|
|
17
17
|
import type { SyncConfig, HandshakeHook } from '../sync-engine.js';
|
|
18
18
|
import { type DatabaseAdapter } from './query-bridge.js';
|
|
19
|
-
import { type AclSigningBackend } from './acl-authority.js';
|
|
19
|
+
import { ServerAclAuthority, type AclSigningBackend } from './acl-authority.js';
|
|
20
|
+
import { type AclReferenceNode } from '../acl.js';
|
|
21
|
+
import type { AclPermissions } from '../types.js';
|
|
22
|
+
import type { HybridPublicKey } from '../crypto.js';
|
|
20
23
|
import type { CrdtValue, EvictionPolicy, MutationEvent, StorageMetrics, StorageType, Unsubscribe, WriteConfirmation, ReadResult } from '../types.js';
|
|
21
24
|
/** Server-side eviction options (Tier 1 only — memory to disk). */
|
|
22
25
|
export interface ServerEvictionOptions extends EvictionPolicy {
|
|
@@ -67,6 +70,14 @@ export interface ServerOptions {
|
|
|
67
70
|
* See AMD-002 / FR-67.
|
|
68
71
|
*/
|
|
69
72
|
onPeerHandshake?: HandshakeHook;
|
|
73
|
+
/**
|
|
74
|
+
* Declared subtree boundary patterns (AMD-012). Slash-delimited segment
|
|
75
|
+
* globs, e.g. `['users/*', 'users/<id>/docs/<id>']` (each `<id>` is a `*`
|
|
76
|
+
* wildcard segment). MUST match the patterns
|
|
77
|
+
* configured on every client, since the boundary is the sync address.
|
|
78
|
+
* Omitted → boundary is the first dot-segment (pre-AMD-012 behavior).
|
|
79
|
+
*/
|
|
80
|
+
subtrees?: string[];
|
|
70
81
|
}
|
|
71
82
|
export declare class SietchServer {
|
|
72
83
|
private readonly yjsEngine;
|
|
@@ -76,7 +87,7 @@ export declare class SietchServer {
|
|
|
76
87
|
private readonly obs;
|
|
77
88
|
private readonly storage;
|
|
78
89
|
private queryBridge?;
|
|
79
|
-
private
|
|
90
|
+
private _aclAuthority?;
|
|
80
91
|
private evictionMgr?;
|
|
81
92
|
/** Private — use createServer(). */
|
|
82
93
|
private constructor();
|
|
@@ -124,6 +135,85 @@ export declare class SietchServer {
|
|
|
124
135
|
cleared: boolean;
|
|
125
136
|
priorDisconnects: number;
|
|
126
137
|
};
|
|
138
|
+
/**
|
|
139
|
+
* AMD-009: read-only access to the underlying `ServerAclAuthority`.
|
|
140
|
+
*
|
|
141
|
+
* `undefined` if `aclSigningBackend` was not passed to `createServer`.
|
|
142
|
+
* Use this when you need direct access to the authority primitives
|
|
143
|
+
* (e.g. low-level `processChange` or CEK handling for encrypted
|
|
144
|
+
* subtrees). For most flows the high-level `setAcl` / `grant` /
|
|
145
|
+
* `revoke` / `createOwnedSubtree` methods below are friendlier.
|
|
146
|
+
*
|
|
147
|
+
* @req FR-28
|
|
148
|
+
* @req FR-36
|
|
149
|
+
*/
|
|
150
|
+
get aclAuthority(): ServerAclAuthority | undefined;
|
|
151
|
+
/**
|
|
152
|
+
* AMD-009: persist an ACL reference node into `_keys.{subtreeId}` and
|
|
153
|
+
* apply it to the local `AclManager`. Mirrors `Store.setAcl` for the
|
|
154
|
+
* server role. Connected clients receive the update via the existing
|
|
155
|
+
* `initAclSync` listener on their side.
|
|
156
|
+
*
|
|
157
|
+
* Typically called internally by `grant` / `revoke` /
|
|
158
|
+
* `createOwnedSubtree`. Exposed for advanced integrations that compute
|
|
159
|
+
* a ref node out-of-band (e.g. signed by an external HSM).
|
|
160
|
+
*
|
|
161
|
+
* @req FR-28
|
|
162
|
+
* @req FR-36
|
|
163
|
+
*/
|
|
164
|
+
setAcl(subtreeId: string, refNode: AclReferenceNode): Promise<void>;
|
|
165
|
+
/**
|
|
166
|
+
* AMD-013: publish the boundary rulebook (subtree pattern set) as a
|
|
167
|
+
* server-signed reference node at `_system.subtrees`. Distributed to peers
|
|
168
|
+
* over the same reference-subtree sync path as `_keys` ACL nodes, so a
|
|
169
|
+
* client configured with no `subtrees` learns the boundaries from the
|
|
170
|
+
* server. Requires `aclSigningBackend` (the signer); without it the rulebook
|
|
171
|
+
* cannot be signed and clients must configure `subtrees` manually.
|
|
172
|
+
*
|
|
173
|
+
* @req FR-37
|
|
174
|
+
*/
|
|
175
|
+
publishSubtreeRegistry(patterns: string[]): Promise<void>;
|
|
176
|
+
/**
|
|
177
|
+
* AMD-009: create a server-owned subtree with an initial ACL granting
|
|
178
|
+
* only the server admin perms. Persists the ref node into `_keys` and
|
|
179
|
+
* propagates to connected peers.
|
|
180
|
+
*
|
|
181
|
+
* Throws if `aclSigningBackend` was not configured at `createServer`
|
|
182
|
+
* time — no authority to sign with.
|
|
183
|
+
*
|
|
184
|
+
* @req FR-36
|
|
185
|
+
* @req FR-72
|
|
186
|
+
*/
|
|
187
|
+
createOwnedSubtree(subtreeId: string, opts?: {
|
|
188
|
+
encrypted?: boolean;
|
|
189
|
+
userPublicKeys?: Map<string, HybridPublicKey>;
|
|
190
|
+
}): Promise<AclReferenceNode>;
|
|
191
|
+
/**
|
|
192
|
+
* AMD-009: grant permissions on a subtree to a target identity peerId.
|
|
193
|
+
*
|
|
194
|
+
* **`identityPeerId` must be the sietch identity peerId**
|
|
195
|
+
* (`ctx.aclTarget` / `ctx.sietchIdentityPeerId` from `HandshakeHook`),
|
|
196
|
+
* NOT the libp2p `ctx.peerId`. AMD-006 added a runtime WARN for the
|
|
197
|
+
* libp2p-shaped mismatch.
|
|
198
|
+
*
|
|
199
|
+
* If the subtree doesn't exist yet, it is created server-owned and
|
|
200
|
+
* unencrypted before the grant is applied. Subsequent calls add to
|
|
201
|
+
* the existing ACL.
|
|
202
|
+
*
|
|
203
|
+
* @req FR-28
|
|
204
|
+
* @req FR-36
|
|
205
|
+
* @req FR-67
|
|
206
|
+
*/
|
|
207
|
+
grant(subtreeId: string, identityPeerId: string, permissions: AclPermissions): Promise<AclReferenceNode>;
|
|
208
|
+
/**
|
|
209
|
+
* AMD-009: revoke a target identity peerId's permissions on a subtree.
|
|
210
|
+
*
|
|
211
|
+
* Throws if the subtree doesn't exist or the authority isn't configured.
|
|
212
|
+
*
|
|
213
|
+
* @req FR-28
|
|
214
|
+
* @req FR-36
|
|
215
|
+
*/
|
|
216
|
+
revoke(subtreeId: string, identityPeerId: string): Promise<AclReferenceNode>;
|
|
127
217
|
/** Get eviction metrics (requires eviction option). */
|
|
128
218
|
getEvictionMetrics(): Promise<StorageMetrics | null>;
|
|
129
219
|
/** Gracefully shut down all subsystems. */
|