@enbox/dwn-sdk-js 0.3.8 → 0.4.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/browser.mjs +11 -11
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +175 -512
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +1 -3
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +1 -17
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
- package/dist/esm/src/core/replication-apply.js +200 -0
- package/dist/esm/src/core/replication-apply.js.map +1 -0
- package/dist/esm/src/dwn.js +212 -0
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +66 -369
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +18 -12
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +1 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +0 -11
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
- package/dist/esm/tests/core/replication-apply.spec.js +220 -0
- package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +139 -2
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +14 -0
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +1 -684
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +43 -2
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/test-suite.js +0 -2
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +1 -3
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +0 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/replication-apply.d.ts +93 -0
- package/dist/types/src/core/replication-apply.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +22 -1
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts +10 -54
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +0 -3
- package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +0 -18
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
- package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/dwn-error.ts +1 -3
- package/src/core/messages-grant-authorization.ts +1 -31
- package/src/core/protocol-authorization-validation.ts +2 -2
- package/src/core/replication-apply.ts +272 -0
- package/src/dwn.ts +296 -2
- package/src/handlers/messages-sync.ts +92 -585
- package/src/handlers/records-write.ts +18 -13
- package/src/index.ts +3 -4
- package/src/interfaces/messages-sync.ts +8 -25
- package/src/types/messages-types.ts +0 -20
- package/dist/esm/src/sync/records-projection.js +0 -228
- package/dist/esm/src/sync/records-projection.js.map +0 -1
- package/dist/esm/tests/sync/records-projection.spec.js +0 -245
- package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
- package/dist/types/src/sync/records-projection.d.ts +0 -98
- package/dist/types/src/sync/records-projection.d.ts.map +0 -1
- package/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
- package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
- package/src/sync/records-projection.ts +0 -328
package/dist/esm/src/dwn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dwn.js","sourceRoot":"","sources":["../../../src/dwn.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dwn.js","sourceRoot":"","sources":["../../../src/dwn.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,21 +7,15 @@ import { messageReplyFromError } from '../core/message-reply.js';
|
|
|
7
7
|
import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
|
|
8
8
|
import { MessagesSync } from '../interfaces/messages-sync.js';
|
|
9
9
|
import { Records } from '../utils/records.js';
|
|
10
|
-
import { RecordsProjection } from '../sync/records-projection.js';
|
|
11
|
-
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
12
|
-
import { SortDirection } from '../types/query-types.js';
|
|
13
10
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
14
|
-
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
15
11
|
/**
|
|
16
|
-
* Maximum inline data size for diff responses
|
|
17
|
-
* {@link DwnConstant.maxDataSizeAllowedToBeEncoded} threshold
|
|
18
|
-
* RecordsWrite data payloads smaller than this are base64url-encoded and
|
|
19
|
-
* included directly in the diff reply. Larger payloads must be fetched
|
|
20
|
-
* separately via MessagesRead.
|
|
12
|
+
* Maximum inline data size for diff responses, aligned with the
|
|
13
|
+
* {@link DwnConstant.maxDataSizeAllowedToBeEncoded} threshold.
|
|
21
14
|
*/
|
|
22
15
|
const DEFAULT_MAX_INLINE_DATA_SIZE = DwnConstant.maxDataSizeAllowedToBeEncoded;
|
|
23
16
|
export class MessagesSyncHandler {
|
|
24
17
|
deps;
|
|
18
|
+
_defaultHashHexCache;
|
|
25
19
|
constructor(deps) {
|
|
26
20
|
this.deps = deps;
|
|
27
21
|
}
|
|
@@ -40,190 +34,120 @@ export class MessagesSyncHandler {
|
|
|
40
34
|
catch (e) {
|
|
41
35
|
return messageReplyFromError(e, 401);
|
|
42
36
|
}
|
|
43
|
-
const { action } = message.descriptor;
|
|
44
|
-
const projectionScopes = MessagesSyncHandler.getProjectionScopes(message);
|
|
45
37
|
try {
|
|
46
|
-
switch (action) {
|
|
47
|
-
case 'root':
|
|
48
|
-
return await this.handleRoot(tenant, message
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
case '
|
|
54
|
-
return await this.handleLeaves(tenant, message, projectionScopes);
|
|
55
|
-
}
|
|
56
|
-
case 'diff': {
|
|
38
|
+
switch (message.descriptor.action) {
|
|
39
|
+
case 'root':
|
|
40
|
+
return await this.handleRoot(tenant, message);
|
|
41
|
+
case 'subtree':
|
|
42
|
+
return await this.handleSubtree(tenant, message);
|
|
43
|
+
case 'leaves':
|
|
44
|
+
return await this.handleLeaves(tenant, message);
|
|
45
|
+
case 'diff':
|
|
57
46
|
return await this.handleDiff(tenant, message);
|
|
58
|
-
|
|
59
|
-
default: {
|
|
47
|
+
default:
|
|
60
48
|
return {
|
|
61
|
-
status: { code: 400, detail: `Unknown action: ${action}` },
|
|
49
|
+
status: { code: 400, detail: `Unknown action: ${message.descriptor.action}` },
|
|
62
50
|
};
|
|
63
|
-
}
|
|
64
51
|
}
|
|
65
52
|
}
|
|
66
53
|
catch (e) {
|
|
67
54
|
return messageReplyFromError(e, 500);
|
|
68
55
|
}
|
|
69
56
|
}
|
|
70
|
-
async handleRoot(tenant, message
|
|
71
|
-
const root = await this.
|
|
57
|
+
async handleRoot(tenant, message) {
|
|
58
|
+
const root = hashToHex(await this.getIndexedRootHash(tenant, message.descriptor.protocol));
|
|
72
59
|
return {
|
|
73
60
|
status: { code: 200, detail: 'OK' },
|
|
74
|
-
root
|
|
61
|
+
root,
|
|
75
62
|
};
|
|
76
63
|
}
|
|
77
|
-
async
|
|
78
|
-
if (projectionScopes === undefined) {
|
|
79
|
-
const rootHash = await this.getIndexedRootHash(tenant, protocol);
|
|
80
|
-
return hashToHex(rootHash);
|
|
81
|
-
}
|
|
82
|
-
return this.withProjectionSnapshot(tenant, projectionScopes, snapshot => snapshot.getRootHex());
|
|
83
|
-
}
|
|
84
|
-
async getIndexedRootHash(tenant, protocol) {
|
|
85
|
-
if (protocol === undefined) {
|
|
86
|
-
return this.deps.stateIndex.getRoot(tenant);
|
|
87
|
-
}
|
|
88
|
-
return this.deps.stateIndex.getProtocolRoot(tenant, protocol);
|
|
89
|
-
}
|
|
90
|
-
async handleSubtree(tenant, message, projectionScopes) {
|
|
64
|
+
async handleSubtree(tenant, message) {
|
|
91
65
|
const bitPath = MessagesSyncHandler.parseBitPrefix(message.descriptor.prefix);
|
|
92
|
-
const hash = await this.
|
|
66
|
+
const hash = await MessagesSyncHandler.getIndexedSubtreeHash(this.deps.stateIndex, tenant, message.descriptor.protocol, bitPath);
|
|
93
67
|
return {
|
|
94
68
|
status: { code: 200, detail: 'OK' },
|
|
95
69
|
hash: hashToHex(hash),
|
|
96
70
|
};
|
|
97
71
|
}
|
|
98
|
-
async handleLeaves(tenant, message
|
|
72
|
+
async handleLeaves(tenant, message) {
|
|
99
73
|
const bitPath = MessagesSyncHandler.parseBitPrefix(message.descriptor.prefix);
|
|
100
|
-
const leaves = await this.
|
|
74
|
+
const leaves = await MessagesSyncHandler.getIndexedLeaves(this.deps.stateIndex, tenant, message.descriptor.protocol, bitPath);
|
|
101
75
|
return {
|
|
102
76
|
status: { code: 200, detail: 'OK' },
|
|
103
77
|
entries: leaves,
|
|
104
78
|
};
|
|
105
79
|
}
|
|
106
|
-
async getSubtreeHash(tenant, protocol, projectionScopes, bitPath) {
|
|
107
|
-
if (projectionScopes === undefined) {
|
|
108
|
-
return this.getIndexedSubtreeHash(tenant, protocol, bitPath);
|
|
109
|
-
}
|
|
110
|
-
return this.withProjectionSnapshot(tenant, projectionScopes, snapshot => snapshot.getSubtreeHash(bitPath));
|
|
111
|
-
}
|
|
112
|
-
async getLeaves(tenant, protocol, projectionScopes, bitPath) {
|
|
113
|
-
if (projectionScopes === undefined) {
|
|
114
|
-
return this.getIndexedLeaves(tenant, protocol, bitPath);
|
|
115
|
-
}
|
|
116
|
-
return this.withProjectionSnapshot(tenant, projectionScopes, snapshot => snapshot.getLeaves(bitPath));
|
|
117
|
-
}
|
|
118
|
-
async getIndexedSubtreeHash(tenant, protocol, bitPath) {
|
|
119
|
-
return MessagesSyncHandler.getIndexedSubtreeHashFromStateIndex(this.deps.stateIndex, tenant, protocol, bitPath);
|
|
120
|
-
}
|
|
121
|
-
async getIndexedLeaves(tenant, protocol, bitPath) {
|
|
122
|
-
return MessagesSyncHandler.getIndexedLeavesFromStateIndex(this.deps.stateIndex, tenant, protocol, bitPath);
|
|
123
|
-
}
|
|
124
80
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* set difference in a single round-trip.
|
|
128
|
-
*
|
|
129
|
-
* Response includes:
|
|
130
|
-
* - `onlyRemote`: messages the server has that the client doesn't, with
|
|
131
|
-
* inline data for small payloads.
|
|
132
|
-
* - `onlyLocal`: bit prefixes where the client has entries the server
|
|
133
|
-
* doesn't (client can enumerate its own leaves for these prefixes).
|
|
81
|
+
* Computes a single-round diff between the client's sparse Merkle tree view
|
|
82
|
+
* and this DWN's full/protocol StateIndex tree.
|
|
134
83
|
*/
|
|
135
84
|
async handleDiff(tenant, message) {
|
|
136
85
|
const { protocol, hashes: clientHashes, depth } = message.descriptor;
|
|
137
|
-
const projectionScopes = MessagesSyncHandler.getProjectionScopes(message);
|
|
138
86
|
if (!clientHashes || depth === undefined) {
|
|
139
87
|
return {
|
|
140
88
|
status: { code: 400, detail: 'diff action requires hashes and depth' },
|
|
141
89
|
};
|
|
142
90
|
}
|
|
143
|
-
const stateIndex = this.deps.stateIndex;
|
|
144
|
-
const projectionSnapshot = await this.createProjectionSnapshot(tenant, projectionScopes);
|
|
145
91
|
const onlyRemoteCids = [];
|
|
146
92
|
const onlyLocalPrefixes = [];
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// Build the set of all prefixes at the given depth that either side has.
|
|
152
|
-
// Filter out client prefixes whose hash equals the default (empty subtree)
|
|
153
|
-
// hash — these represent empty subtrees and should be treated the same as
|
|
154
|
-
// omitted prefixes.
|
|
155
|
-
const allPrefixes = new Set();
|
|
156
|
-
for (const [pfx, hash] of Object.entries(clientHashes)) {
|
|
157
|
-
if (hash !== defaultHashHex) {
|
|
158
|
-
allPrefixes.add(pfx);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
// Enumerate server-side non-empty prefixes by walking the server's
|
|
162
|
-
// tree to the given depth and collecting leaf prefixes.
|
|
163
|
-
const serverHashes = await this.collectSubtreeHashes(tenant, protocol, projectionSnapshot, depth);
|
|
164
|
-
for (const prefix of Object.keys(serverHashes)) {
|
|
93
|
+
const defaultHashHex = await this.getDefaultHashHex(depth);
|
|
94
|
+
const allPrefixes = new Set();
|
|
95
|
+
for (const [prefix, hash] of Object.entries(clientHashes)) {
|
|
96
|
+
if (hash !== defaultHashHex) {
|
|
165
97
|
allPrefixes.add(prefix);
|
|
166
98
|
}
|
|
167
|
-
// Compare each prefix's hash between client and server.
|
|
168
|
-
for (const pfx of allPrefixes) {
|
|
169
|
-
const clientHash = clientHashes[pfx]; // undefined if client has empty subtree
|
|
170
|
-
const serverHash = serverHashes[pfx]; // undefined if server has empty subtree
|
|
171
|
-
if (clientHash === serverHash) {
|
|
172
|
-
// Identical subtree — skip.
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (serverHash === undefined) {
|
|
176
|
-
// Client has entries the server doesn't.
|
|
177
|
-
onlyLocalPrefixes.push(pfx);
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
const bitPath = MessagesSyncHandler.parseBitPrefix(pfx);
|
|
181
|
-
const serverLeaves = await MessagesSyncHandler.getServerLeaves(stateIndex, tenant, protocol, projectionSnapshot, bitPath);
|
|
182
|
-
onlyRemoteCids.push(...serverLeaves);
|
|
183
|
-
if (clientHash !== undefined) {
|
|
184
|
-
// Both sides have entries but they differ. The client will enumerate
|
|
185
|
-
// its own leaves for this prefix and de-duplicate server leaves.
|
|
186
|
-
onlyLocalPrefixes.push(pfx);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
99
|
}
|
|
190
|
-
|
|
191
|
-
|
|
100
|
+
const serverHashes = await this.collectSubtreeHashes(tenant, protocol, depth);
|
|
101
|
+
for (const prefix of Object.keys(serverHashes)) {
|
|
102
|
+
allPrefixes.add(prefix);
|
|
103
|
+
}
|
|
104
|
+
for (const prefix of allPrefixes) {
|
|
105
|
+
const clientHash = clientHashes[prefix];
|
|
106
|
+
const serverHash = serverHashes[prefix];
|
|
107
|
+
if (clientHash === serverHash) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (serverHash === undefined) {
|
|
111
|
+
onlyLocalPrefixes.push(prefix);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
|
|
115
|
+
const serverLeaves = await MessagesSyncHandler.getIndexedLeaves(this.deps.stateIndex, tenant, protocol, bitPath);
|
|
116
|
+
onlyRemoteCids.push(...serverLeaves);
|
|
117
|
+
if (clientHash !== undefined) {
|
|
118
|
+
onlyLocalPrefixes.push(prefix);
|
|
119
|
+
}
|
|
192
120
|
}
|
|
193
|
-
// Build response entries with inline message data where possible.
|
|
194
|
-
const onlyRemote = await this.buildDiffEntries(tenant, onlyRemoteCids);
|
|
195
|
-
const dependencies = projectionScopes === undefined
|
|
196
|
-
? []
|
|
197
|
-
: await this.buildProjectedDependencyEntries(tenant, onlyRemote);
|
|
198
121
|
return {
|
|
199
122
|
status: { code: 200, detail: 'OK' },
|
|
200
|
-
onlyRemote,
|
|
123
|
+
onlyRemote: await this.buildDiffEntries(tenant, onlyRemoteCids),
|
|
201
124
|
onlyLocal: onlyLocalPrefixes,
|
|
202
|
-
...(dependencies.length > 0 ? { dependencies } : {}),
|
|
203
125
|
};
|
|
204
126
|
}
|
|
127
|
+
async getIndexedRootHash(tenant, protocol) {
|
|
128
|
+
if (protocol === undefined) {
|
|
129
|
+
return this.deps.stateIndex.getRoot(tenant);
|
|
130
|
+
}
|
|
131
|
+
return this.deps.stateIndex.getProtocolRoot(tenant, protocol);
|
|
132
|
+
}
|
|
205
133
|
/**
|
|
206
|
-
*
|
|
207
|
-
* subtree hashes
|
|
134
|
+
* Walks this DWN's StateIndex tree to the requested depth and returns only
|
|
135
|
+
* non-empty subtree hashes keyed by bit prefix.
|
|
208
136
|
*/
|
|
209
|
-
async collectSubtreeHashes(tenant, protocol,
|
|
210
|
-
const stateIndex = this.deps.stateIndex;
|
|
137
|
+
async collectSubtreeHashes(tenant, protocol, depth) {
|
|
211
138
|
const result = {};
|
|
212
139
|
const walk = async (prefix, currentDepth) => {
|
|
213
140
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
|
|
214
|
-
const hash = await MessagesSyncHandler.
|
|
141
|
+
const hash = await MessagesSyncHandler.getIndexedSubtreeHash(this.deps.stateIndex, tenant, protocol, bitPath);
|
|
215
142
|
const hexHash = hashToHex(hash);
|
|
216
143
|
const defaultHashHex = await this.getDefaultHashHex(currentDepth);
|
|
217
144
|
if (hexHash === defaultHashHex) {
|
|
218
|
-
// Empty subtree — don't include in the result.
|
|
219
145
|
return;
|
|
220
146
|
}
|
|
221
147
|
if (currentDepth >= depth) {
|
|
222
|
-
// Reached target depth with a non-empty subtree.
|
|
223
148
|
result[prefix] = hexHash;
|
|
224
149
|
return;
|
|
225
150
|
}
|
|
226
|
-
// Recurse into children.
|
|
227
151
|
await Promise.all([
|
|
228
152
|
walk(prefix + '0', currentDepth + 1),
|
|
229
153
|
walk(prefix + '1', currentDepth + 1),
|
|
@@ -232,44 +156,18 @@ export class MessagesSyncHandler {
|
|
|
232
156
|
await walk('', 0);
|
|
233
157
|
return result;
|
|
234
158
|
}
|
|
235
|
-
async
|
|
236
|
-
if (projectionScopes === undefined) {
|
|
237
|
-
return undefined;
|
|
238
|
-
}
|
|
239
|
-
return RecordsProjection.createSnapshot({
|
|
240
|
-
tenant,
|
|
241
|
-
messageStore: this.deps.messageStore,
|
|
242
|
-
scopes: projectionScopes,
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
static async getServerLeaves(stateIndex, tenant, protocol, projectionSnapshot, bitPath) {
|
|
246
|
-
if (projectionSnapshot === undefined) {
|
|
247
|
-
return MessagesSyncHandler.getIndexedLeavesFromStateIndex(stateIndex, tenant, protocol, bitPath);
|
|
248
|
-
}
|
|
249
|
-
return projectionSnapshot.getLeaves(bitPath);
|
|
250
|
-
}
|
|
251
|
-
static async getServerSubtreeHash(stateIndex, tenant, protocol, projectionSnapshot, bitPath) {
|
|
252
|
-
if (projectionSnapshot === undefined) {
|
|
253
|
-
return MessagesSyncHandler.getIndexedSubtreeHashFromStateIndex(stateIndex, tenant, protocol, bitPath);
|
|
254
|
-
}
|
|
255
|
-
return projectionSnapshot.getSubtreeHash(bitPath);
|
|
256
|
-
}
|
|
257
|
-
static async getIndexedLeavesFromStateIndex(stateIndex, tenant, protocol, bitPath) {
|
|
159
|
+
static async getIndexedLeaves(stateIndex, tenant, protocol, bitPath) {
|
|
258
160
|
if (protocol === undefined) {
|
|
259
161
|
return stateIndex.getLeaves(tenant, bitPath);
|
|
260
162
|
}
|
|
261
163
|
return stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
|
|
262
164
|
}
|
|
263
|
-
static async
|
|
165
|
+
static async getIndexedSubtreeHash(stateIndex, tenant, protocol, bitPath) {
|
|
264
166
|
if (protocol === undefined) {
|
|
265
167
|
return stateIndex.getSubtreeHash(tenant, bitPath);
|
|
266
168
|
}
|
|
267
169
|
return stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath);
|
|
268
170
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Get the hex-encoded default hash for a given depth. Lazily cached.
|
|
271
|
-
*/
|
|
272
|
-
_defaultHashHexCache;
|
|
273
171
|
async getDefaultHashHex(depth) {
|
|
274
172
|
if (this._defaultHashHexCache === undefined) {
|
|
275
173
|
const { initDefaultHashes } = await import('../smt/smt-utils.js');
|
|
@@ -282,220 +180,46 @@ export class MessagesSyncHandler {
|
|
|
282
180
|
return this._defaultHashHexCache.get(depth) ?? '';
|
|
283
181
|
}
|
|
284
182
|
/**
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
* payloads, inlines the data as base64url.
|
|
183
|
+
* Builds diff entries and inlines data when it is small enough for the
|
|
184
|
+
* MessagesSync response. Large record data remains fetch-by-CID.
|
|
288
185
|
*/
|
|
289
186
|
async buildDiffEntries(tenant, messageCids) {
|
|
290
187
|
const entries = [];
|
|
291
188
|
for (const messageCid of messageCids) {
|
|
292
189
|
const { message, encodedData: inlineData, data } = await this.readMessageByCid(tenant, messageCid);
|
|
293
190
|
if (!message) {
|
|
294
|
-
// Message was deleted between diff computation and read — skip.
|
|
295
191
|
continue;
|
|
296
192
|
}
|
|
297
193
|
const entry = { messageCid, message };
|
|
298
|
-
// Use inline data from the MessageStore if available (small payloads).
|
|
299
194
|
if (inlineData) {
|
|
300
195
|
entry.encodedData = inlineData;
|
|
301
196
|
}
|
|
302
197
|
else if (data) {
|
|
303
|
-
// Data is in the DataStore — inline it if small enough.
|
|
304
198
|
const bytes = await MessagesSyncHandler.streamToBytes(data);
|
|
305
199
|
if (bytes.byteLength <= DEFAULT_MAX_INLINE_DATA_SIZE) {
|
|
306
200
|
entry.encodedData = Encoder.bytesToBase64Url(bytes);
|
|
307
201
|
}
|
|
308
|
-
// Large payloads are NOT inlined — client fetches via MessagesRead.
|
|
309
202
|
}
|
|
310
203
|
entries.push(entry);
|
|
311
204
|
}
|
|
312
205
|
return entries;
|
|
313
206
|
}
|
|
314
|
-
async buildProjectedDependencyEntries(tenant, primaryEntries) {
|
|
315
|
-
const dependenciesByCid = new Map();
|
|
316
|
-
const configsByProtocol = new Map();
|
|
317
|
-
for (const primaryEntry of primaryEntries) {
|
|
318
|
-
const protocolMetadata = MessagesSyncHandler.recordsWriteProtocolMetadata(primaryEntry.message);
|
|
319
|
-
if (protocolMetadata !== undefined) {
|
|
320
|
-
await this.addProtocolConfigClosureDependencies(tenant, protocolMetadata.protocol, protocolMetadata.messageTimestamp, primaryEntry.messageCid, configsByProtocol, dependenciesByCid);
|
|
321
|
-
continue;
|
|
322
|
-
}
|
|
323
|
-
const initialWrite = await this.readRecordsDeleteInitialWrite(tenant, primaryEntry.message);
|
|
324
|
-
if (initialWrite === undefined) {
|
|
325
|
-
continue;
|
|
326
|
-
}
|
|
327
|
-
await MessagesSyncHandler.addRecordsInitialWriteDependency(primaryEntry.messageCid, initialWrite, dependenciesByCid);
|
|
328
|
-
const initialWriteMetadata = MessagesSyncHandler.recordsWriteProtocolMetadata(initialWrite);
|
|
329
|
-
if (initialWriteMetadata === undefined) {
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
await this.addProtocolConfigClosureDependencies(tenant, initialWriteMetadata.protocol, initialWriteMetadata.messageTimestamp, primaryEntry.messageCid, configsByProtocol, dependenciesByCid);
|
|
333
|
-
}
|
|
334
|
-
return [...dependenciesByCid.values()];
|
|
335
|
-
}
|
|
336
|
-
async readRecordsDeleteInitialWrite(tenant, message) {
|
|
337
|
-
const recordId = MessagesSyncHandler.recordsDeleteRecordId(message);
|
|
338
|
-
if (recordId === undefined) {
|
|
339
|
-
return undefined;
|
|
340
|
-
}
|
|
341
|
-
const { messages } = await this.deps.messageStore.query(tenant, [{
|
|
342
|
-
interface: DwnInterfaceName.Records,
|
|
343
|
-
method: DwnMethodName.Write,
|
|
344
|
-
recordId,
|
|
345
|
-
}]);
|
|
346
|
-
const initialWrite = await RecordsWrite.getInitialWrite(messages);
|
|
347
|
-
return initialWrite === undefined ? undefined : MessagesSyncHandler.toWireMessage(initialWrite);
|
|
348
|
-
}
|
|
349
|
-
static async addRecordsInitialWriteDependency(rootMessageCid, dependency, dependenciesByCid) {
|
|
350
|
-
const dependencyCid = await Message.getCid(dependency);
|
|
351
|
-
if (dependenciesByCid.has(dependencyCid)) {
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
dependenciesByCid.set(dependencyCid, {
|
|
355
|
-
dependencyClass: 'recordsInitialWrite',
|
|
356
|
-
messageCid: dependencyCid,
|
|
357
|
-
message: dependency,
|
|
358
|
-
rootMessageCid,
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
async addProtocolConfigClosureDependencies(tenant, rootProtocol, rootMessageTimestamp, rootMessageCid, configsByProtocol, dependenciesByCid) {
|
|
362
|
-
// Dependency hints are not part of the projected root; they are advisory
|
|
363
|
-
// bootstrap data for the receiver. Bound each closure to the primary
|
|
364
|
-
// RecordsWrite timestamp because protocol authorization uses the definition
|
|
365
|
-
// active when that record was created, not whatever config is newest today.
|
|
366
|
-
const visitedProtocols = new Set();
|
|
367
|
-
const pendingProtocols = [rootProtocol];
|
|
368
|
-
for (let protocol = MessagesSyncHandler.takeNextUnvisitedProtocol(pendingProtocols, visitedProtocols); protocol !== undefined; protocol = MessagesSyncHandler.takeNextUnvisitedProtocol(pendingProtocols, visitedProtocols)) {
|
|
369
|
-
const configs = await this.getCachedGoverningProtocolsConfigure(tenant, protocol, rootMessageTimestamp, configsByProtocol);
|
|
370
|
-
await MessagesSyncHandler.addProtocolConfigDependencies({
|
|
371
|
-
configs,
|
|
372
|
-
rootMessageCid,
|
|
373
|
-
visitedProtocols,
|
|
374
|
-
pendingProtocols,
|
|
375
|
-
dependenciesByCid,
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
async getCachedGoverningProtocolsConfigure(tenant, protocol, messageTimestamp, configsByProtocol) {
|
|
380
|
-
const configCacheKey = JSON.stringify([protocol, messageTimestamp]);
|
|
381
|
-
const cachedConfigs = configsByProtocol.get(configCacheKey);
|
|
382
|
-
if (cachedConfigs !== undefined) {
|
|
383
|
-
return cachedConfigs;
|
|
384
|
-
}
|
|
385
|
-
const configs = await this.readGoverningProtocolsConfigure(tenant, protocol, messageTimestamp);
|
|
386
|
-
configsByProtocol.set(configCacheKey, configs);
|
|
387
|
-
return configs;
|
|
388
|
-
}
|
|
389
|
-
static async addProtocolConfigDependencies({ configs, rootMessageCid, visitedProtocols, pendingProtocols, dependenciesByCid, }) {
|
|
390
|
-
for (const dependency of configs) {
|
|
391
|
-
await MessagesSyncHandler.addProtocolConfigDependency(rootMessageCid, dependency, dependenciesByCid);
|
|
392
|
-
MessagesSyncHandler.queueUnvisitedProtocols(MessagesSyncHandler.protocolsConfigureUses(dependency), visitedProtocols, pendingProtocols);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
static async addProtocolConfigDependency(rootMessageCid, dependency, dependenciesByCid) {
|
|
396
|
-
const dependencyCid = await Message.getCid(dependency);
|
|
397
|
-
if (dependenciesByCid.has(dependencyCid)) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
dependenciesByCid.set(dependencyCid, {
|
|
401
|
-
dependencyClass: 'protocolsConfigure',
|
|
402
|
-
messageCid: dependencyCid,
|
|
403
|
-
message: dependency,
|
|
404
|
-
rootMessageCid,
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
static takeNextUnvisitedProtocol(pendingProtocols, visitedProtocols) {
|
|
408
|
-
while (pendingProtocols.length > 0) {
|
|
409
|
-
const protocol = pendingProtocols.shift();
|
|
410
|
-
if (visitedProtocols.has(protocol)) {
|
|
411
|
-
continue;
|
|
412
|
-
}
|
|
413
|
-
visitedProtocols.add(protocol);
|
|
414
|
-
return protocol;
|
|
415
|
-
}
|
|
416
|
-
return undefined;
|
|
417
|
-
}
|
|
418
|
-
static queueUnvisitedProtocols(protocols, visitedProtocols, pendingProtocols) {
|
|
419
|
-
for (const protocol of protocols) {
|
|
420
|
-
if (!visitedProtocols.has(protocol)) {
|
|
421
|
-
pendingProtocols.push(protocol);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
static protocolsConfigureUses(message) {
|
|
426
|
-
if (message.descriptor.interface !== DwnInterfaceName.Protocols ||
|
|
427
|
-
message.descriptor.method !== DwnMethodName.Configure) {
|
|
428
|
-
return [];
|
|
429
|
-
}
|
|
430
|
-
const uses = message.descriptor.definition?.uses;
|
|
431
|
-
return uses === undefined
|
|
432
|
-
? []
|
|
433
|
-
: Object.values(uses).filter((protocol) => typeof protocol === 'string');
|
|
434
|
-
}
|
|
435
|
-
async readGoverningProtocolsConfigure(tenant, protocol, messageTimestamp) {
|
|
436
|
-
const { messages } = await this.deps.messageStore.query(tenant, [{
|
|
437
|
-
interface: DwnInterfaceName.Protocols,
|
|
438
|
-
method: DwnMethodName.Configure,
|
|
439
|
-
protocol,
|
|
440
|
-
messageTimestamp: { lte: messageTimestamp },
|
|
441
|
-
}], { messageTimestamp: SortDirection.Descending });
|
|
442
|
-
const governingMessage = await Message.getNewestMessage(messages);
|
|
443
|
-
return governingMessage === undefined ? [] : [governingMessage];
|
|
444
|
-
}
|
|
445
|
-
static recordsWriteProtocolMetadata(message) {
|
|
446
|
-
if (message?.descriptor.interface !== DwnInterfaceName.Records ||
|
|
447
|
-
message.descriptor.method !== DwnMethodName.Write) {
|
|
448
|
-
return undefined;
|
|
449
|
-
}
|
|
450
|
-
const protocol = message.descriptor.protocol;
|
|
451
|
-
return typeof protocol === 'string'
|
|
452
|
-
? { protocol, messageTimestamp: message.descriptor.messageTimestamp }
|
|
453
|
-
: undefined;
|
|
454
|
-
}
|
|
455
|
-
static recordsDeleteRecordId(message) {
|
|
456
|
-
if (message?.descriptor.interface !== DwnInterfaceName.Records ||
|
|
457
|
-
message.descriptor.method !== DwnMethodName.Delete) {
|
|
458
|
-
return undefined;
|
|
459
|
-
}
|
|
460
|
-
const recordId = message.descriptor.recordId;
|
|
461
|
-
return typeof recordId === 'string' ? recordId : undefined;
|
|
462
|
-
}
|
|
463
|
-
static toWireMessage(message) {
|
|
464
|
-
const { encodedData: _encodedData, initialWrite: _initialWrite, ...wireMessage } = message;
|
|
465
|
-
return wireMessage;
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* Read a message and its data from the MessageStore + DataStore by CID.
|
|
469
|
-
*/
|
|
470
207
|
async readMessageByCid(tenant, messageCid) {
|
|
471
208
|
const storedMessage = await this.deps.messageStore.get(tenant, messageCid);
|
|
472
209
|
if (!storedMessage) {
|
|
473
210
|
return {};
|
|
474
211
|
}
|
|
475
|
-
// Extract and strip `encodedData` from the stored message.
|
|
476
|
-
// `encodedData` is an internal storage optimization for small payloads
|
|
477
|
-
// that are stored inline in the MessageStore rather than in the DataStore.
|
|
478
|
-
// It must not be included in the wire-format message (the recipient's
|
|
479
|
-
// DWN would reject it as an unexpected top-level property).
|
|
480
212
|
let inlineEncodedData;
|
|
481
213
|
if (MessagesSyncHandler.hasEncodedData(storedMessage)) {
|
|
482
214
|
inlineEncodedData = storedMessage.encodedData;
|
|
483
215
|
delete storedMessage.encodedData;
|
|
484
216
|
}
|
|
485
217
|
let data;
|
|
486
|
-
// Check if this is a RecordsWrite with data that is small enough to inline.
|
|
487
218
|
if (inlineEncodedData === undefined && Records.isRecordsWrite(storedMessage)) {
|
|
488
219
|
const { dataCid, dataSize } = storedMessage.descriptor;
|
|
489
|
-
if (dataSize <= DEFAULT_MAX_INLINE_DATA_SIZE) {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
// DataStore uses recordId, not messageCid. For RecordsWrite,
|
|
493
|
-
// recordId is a top-level message property.
|
|
494
|
-
const dataResult = await this.deps.dataStore.get(tenant, storedMessage.recordId, dataCid);
|
|
495
|
-
if (dataResult?.dataStream) {
|
|
496
|
-
data = dataResult.dataStream;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
220
|
+
if (dataSize <= DEFAULT_MAX_INLINE_DATA_SIZE && this.deps.dataStore) {
|
|
221
|
+
const dataResult = await this.deps.dataStore.get(tenant, storedMessage.recordId, dataCid);
|
|
222
|
+
data = dataResult?.dataStream;
|
|
499
223
|
}
|
|
500
224
|
}
|
|
501
225
|
return { message: storedMessage, encodedData: inlineEncodedData, data };
|
|
@@ -503,29 +227,6 @@ export class MessagesSyncHandler {
|
|
|
503
227
|
static hasEncodedData(message) {
|
|
504
228
|
return 'encodedData' in message && typeof message.encodedData === 'string';
|
|
505
229
|
}
|
|
506
|
-
static getProjectionScopes(message) {
|
|
507
|
-
const { projectionScopes } = message.descriptor;
|
|
508
|
-
if (projectionScopes === undefined) {
|
|
509
|
-
return undefined;
|
|
510
|
-
}
|
|
511
|
-
return projectionScopes;
|
|
512
|
-
}
|
|
513
|
-
async withProjectionSnapshot(tenant, scopes, fn) {
|
|
514
|
-
const snapshot = await RecordsProjection.createSnapshot({
|
|
515
|
-
tenant: tenant,
|
|
516
|
-
messageStore: this.deps.messageStore,
|
|
517
|
-
scopes: scopes,
|
|
518
|
-
});
|
|
519
|
-
try {
|
|
520
|
-
return await fn(snapshot);
|
|
521
|
-
}
|
|
522
|
-
finally {
|
|
523
|
-
await snapshot.close();
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* Read a ReadableStream to completion and return the bytes.
|
|
528
|
-
*/
|
|
529
230
|
static async streamToBytes(stream) {
|
|
530
231
|
const reader = stream.getReader();
|
|
531
232
|
const chunks = [];
|
|
@@ -546,9 +247,6 @@ export class MessagesSyncHandler {
|
|
|
546
247
|
}
|
|
547
248
|
return result;
|
|
548
249
|
}
|
|
549
|
-
/**
|
|
550
|
-
* Parse a bit prefix string (e.g. "0110101") into a boolean array.
|
|
551
|
-
*/
|
|
552
250
|
static parseBitPrefix(prefix) {
|
|
553
251
|
if (!/^[01]*$/.test(prefix)) {
|
|
554
252
|
throw new DwnError(DwnErrorCode.MessagesSyncInvalidPrefix, `Invalid prefix: must contain only '0' and '1' characters, got: ${prefix}`);
|
|
@@ -572,10 +270,9 @@ export class MessagesSyncHandler {
|
|
|
572
270
|
permissionGrants,
|
|
573
271
|
messageStore
|
|
574
272
|
});
|
|
273
|
+
return;
|
|
575
274
|
}
|
|
576
|
-
|
|
577
|
-
throw new DwnError(DwnErrorCode.MessagesSyncAuthorizationFailed, 'message failed authorization');
|
|
578
|
-
}
|
|
275
|
+
throw new DwnError(DwnErrorCode.MessagesSyncAuthorizationFailed, 'message failed authorization');
|
|
579
276
|
}
|
|
580
277
|
}
|
|
581
278
|
//# sourceMappingURL=messages-sync.js.map
|