@enbox/dwn-sdk-js 0.3.3 → 0.3.5
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 +8 -8
- package/dist/browser.mjs.map +3 -3
- package/dist/esm/generated/precompiled-validators.js +766 -1224
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/abstract-message.js +3 -3
- package/dist/esm/src/core/abstract-message.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +6 -2
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message.js +3 -3
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +3 -3
- package/dist/esm/src/core/protocol-authorization-action.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/protocol-authorization.js +11 -11
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/records-grant-authorization.js +1 -1
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +12 -12
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -1
- package/dist/esm/src/handlers/messages-read.js +7 -7
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +18 -18
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +1 -1
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +6 -6
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +1 -1
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +16 -16
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +2 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +9 -9
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +8 -8
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +30 -2
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +1 -1
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js.map +1 -1
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +2 -2
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/index-level-compound.js +10 -10
- package/dist/esm/src/store/index-level-compound.js.map +1 -1
- package/dist/esm/src/store/index-level.js +2 -2
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +1 -1
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +23 -10
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/permission-types.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/messages.js +1 -1
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/object.js +1 -4
- package/dist/esm/src/utils/object.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/tests/core/grant-authorization.spec.js +38 -0
- package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -0
- package/dist/esm/tests/features/permissions.spec.js +1 -1
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +422 -0
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -26
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +3 -26
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +4 -3
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +115 -0
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +15 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-suite.js +2 -0
- 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/abstract-message.d.ts +4 -4
- package/dist/types/src/core/abstract-message.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts +2 -2
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +12 -12
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +5 -5
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-read.d.ts +1 -1
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +1 -1
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +1 -1
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +1 -1
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts +1 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +1 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +5 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +2 -2
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/jose/jws/general/builder.d.ts +1 -1
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
- package/dist/types/src/jose/jws/general/verifier.d.ts +13 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -1
- package/dist/types/src/smt/smt-store-level.d.ts +1 -1
- package/dist/types/src/smt/smt-store-level.d.ts.map +1 -1
- package/dist/types/src/smt/smt-store-memory.d.ts +1 -1
- package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -1
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +1 -1
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -1
- package/dist/types/src/state-index/state-index-level.d.ts +3 -3
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +2 -2
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +19 -5
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +3 -4
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/utils/memory-cache.d.ts +2 -2
- package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
- package/dist/types/src/utils/object.d.ts.map +1 -1
- package/dist/types/src/utils/private-key-signer.d.ts +2 -2
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
- package/dist/types/tests/core/grant-authorization.spec.d.ts +2 -0
- package/dist/types/tests/core/grant-authorization.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts +29 -0
- package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
- package/dist/types/tests/store/message-store.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/abstract-message.ts +8 -8
- package/src/core/grant-authorization.ts +9 -2
- package/src/core/message.ts +3 -3
- package/src/core/protocol-authorization-action.ts +3 -3
- package/src/core/protocol-authorization-validation.ts +9 -9
- package/src/core/protocol-authorization.ts +24 -24
- package/src/core/records-grant-authorization.ts +1 -1
- package/src/core/resumable-task-manager.ts +2 -2
- package/src/dwn.ts +13 -13
- package/src/event-stream/event-emitter-event-log.ts +15 -15
- package/src/handlers/messages-read.ts +7 -7
- package/src/handlers/messages-subscribe.ts +2 -2
- package/src/handlers/messages-sync.ts +19 -19
- package/src/handlers/protocols-configure.ts +2 -2
- package/src/handlers/protocols-query.ts +1 -1
- package/src/handlers/records-count.ts +1 -1
- package/src/handlers/records-delete.ts +1 -1
- package/src/handlers/records-query.ts +1 -1
- package/src/handlers/records-read.ts +6 -6
- package/src/handlers/records-subscribe.ts +2 -2
- package/src/handlers/records-write.ts +18 -18
- package/src/index.ts +5 -5
- package/src/interfaces/protocols-configure.ts +12 -12
- package/src/interfaces/records-delete.ts +1 -1
- package/src/interfaces/records-write.ts +11 -11
- package/src/jose/jws/general/builder.ts +1 -1
- package/src/jose/jws/general/verifier.ts +44 -3
- package/src/protocols/permissions.ts +1 -1
- package/src/smt/smt-store-level.ts +1 -1
- package/src/smt/smt-store-memory.ts +1 -1
- package/src/smt/sparse-merkle-tree.ts +10 -10
- package/src/state-index/state-index-level.ts +3 -3
- package/src/store/index-level-compound.ts +11 -11
- package/src/store/index-level.ts +4 -4
- package/src/store/level-wrapper.ts +1 -1
- package/src/store/storage-controller.ts +31 -16
- package/src/types/permission-types.ts +3 -4
- package/src/utils/memory-cache.ts +2 -2
- package/src/utils/messages.ts +2 -2
- package/src/utils/object.ts +1 -5
- package/src/utils/private-key-signer.ts +2 -2
- package/src/utils/records.ts +1 -1
|
@@ -19,7 +19,7 @@ import type { Hash, SMTDiffResult, SMTInternalNode, SMTLeafNode, SMTNodeStore, S
|
|
|
19
19
|
import { getBit, hashChildren, hashEquals, hashKey, hashLeaf, initDefaultHashes, SMT_DEPTH } from './smt-utils.js';
|
|
20
20
|
|
|
21
21
|
export class SparseMerkleTree {
|
|
22
|
-
private store: SMTNodeStore;
|
|
22
|
+
private readonly store: SMTNodeStore;
|
|
23
23
|
private defaultHashes!: Hash[];
|
|
24
24
|
|
|
25
25
|
constructor(store: SMTNodeStore) {
|
|
@@ -142,13 +142,13 @@ export class SparseMerkleTree {
|
|
|
142
142
|
// subtree hash would be if this leaf were pushed down to the prefix depth.
|
|
143
143
|
// For simplicity, if we've hit a leaf, the subtree at this prefix
|
|
144
144
|
// either contains this leaf or is empty.
|
|
145
|
-
if (node
|
|
145
|
+
if (node?.type === 'leaf') {
|
|
146
146
|
return this.computeSubtreeHashForLeaf(node, i, prefix);
|
|
147
147
|
}
|
|
148
148
|
return this.defaultHashes[prefix.length];
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
const internalNode = node
|
|
151
|
+
const internalNode = node;
|
|
152
152
|
if (prefix[i]) {
|
|
153
153
|
currentHash = internalNode.rightHash;
|
|
154
154
|
} else {
|
|
@@ -186,7 +186,7 @@ export class SparseMerkleTree {
|
|
|
186
186
|
return [];
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
const internalNode = node
|
|
189
|
+
const internalNode = node;
|
|
190
190
|
if (prefix[i]) {
|
|
191
191
|
currentHash = internalNode.rightHash;
|
|
192
192
|
} else {
|
|
@@ -266,7 +266,7 @@ export class SparseMerkleTree {
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
// Internal node — recurse into the appropriate child
|
|
269
|
-
const internalNode = node
|
|
269
|
+
const internalNode = node;
|
|
270
270
|
const goRight = getBit(keyHash, depth);
|
|
271
271
|
|
|
272
272
|
let newLeftHash: Hash;
|
|
@@ -405,7 +405,7 @@ export class SparseMerkleTree {
|
|
|
405
405
|
}
|
|
406
406
|
|
|
407
407
|
// Internal node — recurse into the appropriate child
|
|
408
|
-
const internalNode = node
|
|
408
|
+
const internalNode = node;
|
|
409
409
|
const goRight = getBit(keyHash, depth);
|
|
410
410
|
|
|
411
411
|
let newLeftHash: Hash;
|
|
@@ -433,7 +433,7 @@ export class SparseMerkleTree {
|
|
|
433
433
|
if (leftIsDefault || rightIsDefault) {
|
|
434
434
|
const survivingHash = leftIsDefault ? newRightHash : newLeftHash;
|
|
435
435
|
const survivingNode = await this.store.getNode(survivingHash);
|
|
436
|
-
if (survivingNode
|
|
436
|
+
if (survivingNode?.type === 'leaf') {
|
|
437
437
|
// Collapse: remove the internal node, return the leaf hash directly
|
|
438
438
|
await this.store.deleteNode(currentHash);
|
|
439
439
|
return survivingHash;
|
|
@@ -477,7 +477,7 @@ export class SparseMerkleTree {
|
|
|
477
477
|
return hashEquals(node.keyHash, keyHash);
|
|
478
478
|
}
|
|
479
479
|
|
|
480
|
-
const internalNode = node
|
|
480
|
+
const internalNode = node;
|
|
481
481
|
const goRight = getBit(keyHash, depth);
|
|
482
482
|
|
|
483
483
|
if (goRight) {
|
|
@@ -508,7 +508,7 @@ export class SparseMerkleTree {
|
|
|
508
508
|
return { siblings: [], leafNode: node, depth };
|
|
509
509
|
}
|
|
510
510
|
|
|
511
|
-
const internalNode = node
|
|
511
|
+
const internalNode = node;
|
|
512
512
|
const goRight = getBit(keyHash, depth);
|
|
513
513
|
|
|
514
514
|
let childHash: Hash;
|
|
@@ -578,7 +578,7 @@ export class SparseMerkleTree {
|
|
|
578
578
|
return [node.valueCid];
|
|
579
579
|
}
|
|
580
580
|
|
|
581
|
-
const internalNode = node
|
|
581
|
+
const internalNode = node;
|
|
582
582
|
const leftLeaves = await this.collectLeaves(internalNode.leftHash, depth + 1);
|
|
583
583
|
const rightLeaves = await this.collectLeaves(internalNode.rightHash, depth + 1);
|
|
584
584
|
|
|
@@ -28,7 +28,7 @@ export type StateIndexLevelConfig = {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
export class StateIndexLevel implements StateIndex {
|
|
31
|
-
private config: StateIndexLevelConfig;
|
|
31
|
+
private readonly config: StateIndexLevelConfig;
|
|
32
32
|
private db!: LevelWrapper<string>;
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -36,13 +36,13 @@ export class StateIndexLevel implements StateIndex {
|
|
|
36
36
|
* Stores promises to avoid race conditions when multiple concurrent operations
|
|
37
37
|
* trigger lazy initialization of the same tenant's SMT.
|
|
38
38
|
*/
|
|
39
|
-
private globalTrees: Map<string, Promise<SparseMerkleTree>> = new Map();
|
|
39
|
+
private readonly globalTrees: Map<string, Promise<SparseMerkleTree>> = new Map();
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* Cache of per-tenant, per-protocol SMTs. Key format: `{tenant}\x00{protocol}`
|
|
43
43
|
* Stores promises to avoid race conditions (same reason as globalTrees).
|
|
44
44
|
*/
|
|
45
|
-
private protocolTrees: Map<string, Promise<SparseMerkleTree>> = new Map();
|
|
45
|
+
private readonly protocolTrees: Map<string, Promise<SparseMerkleTree>> = new Map();
|
|
46
46
|
|
|
47
47
|
constructor(config?: StateIndexLevelConfig) {
|
|
48
48
|
this.config = {
|
|
@@ -203,28 +203,28 @@ export async function queryWithCompoundIndex(
|
|
|
203
203
|
// determine the iterator bounds from the prefix
|
|
204
204
|
const iteratorOptions: LevelWrapperIteratorOptions<string> = {};
|
|
205
205
|
|
|
206
|
-
if (cursor
|
|
207
|
-
// build the full compound key for the cursor position
|
|
208
|
-
const cursorSortEncoded = encodeValue(cursor.value);
|
|
209
|
-
const cursorKey = prefix + cursorSortEncoded + delimiter + cursor.messageCid;
|
|
210
|
-
|
|
206
|
+
if (cursor === undefined) {
|
|
211
207
|
if (sortDirection === SortDirection.Ascending) {
|
|
212
|
-
iteratorOptions.gt =
|
|
213
|
-
// upper bound: everything with this prefix (prefix + \xff is past all valid compound keys with this prefix)
|
|
208
|
+
iteratorOptions.gt = prefix;
|
|
214
209
|
iteratorOptions.lt = prefix + '\xff';
|
|
215
210
|
} else {
|
|
216
|
-
|
|
211
|
+
// for descending without cursor, start from the end of the prefix range
|
|
217
212
|
iteratorOptions.gt = prefix;
|
|
213
|
+
iteratorOptions.lt = prefix + '\xff';
|
|
218
214
|
iteratorOptions.reverse = true;
|
|
219
215
|
}
|
|
220
216
|
} else {
|
|
217
|
+
// build the full compound key for the cursor position
|
|
218
|
+
const cursorSortEncoded = encodeValue(cursor.value);
|
|
219
|
+
const cursorKey = prefix + cursorSortEncoded + delimiter + cursor.messageCid;
|
|
220
|
+
|
|
221
221
|
if (sortDirection === SortDirection.Ascending) {
|
|
222
|
-
iteratorOptions.gt =
|
|
222
|
+
iteratorOptions.gt = cursorKey;
|
|
223
|
+
// upper bound: everything with this prefix (prefix + \xff is past all valid compound keys with this prefix)
|
|
223
224
|
iteratorOptions.lt = prefix + '\xff';
|
|
224
225
|
} else {
|
|
225
|
-
|
|
226
|
+
iteratorOptions.lt = cursorKey;
|
|
226
227
|
iteratorOptions.gt = prefix;
|
|
227
|
-
iteratorOptions.lt = prefix + '\xff';
|
|
228
228
|
iteratorOptions.reverse = true;
|
|
229
229
|
}
|
|
230
230
|
}
|
package/src/store/index-level.ts
CHANGED
|
@@ -53,7 +53,7 @@ export interface IndexLevelOptions {
|
|
|
53
53
|
export class IndexLevel {
|
|
54
54
|
db: LevelWrapper<string>;
|
|
55
55
|
config: IndexLevelConfig;
|
|
56
|
-
private _compoundIndexes: CompoundIndexDefinition[];
|
|
56
|
+
private readonly _compoundIndexes: CompoundIndexDefinition[];
|
|
57
57
|
|
|
58
58
|
constructor(config: IndexLevelConfig) {
|
|
59
59
|
this.config = {
|
|
@@ -498,13 +498,13 @@ export class IndexLevel {
|
|
|
498
498
|
|
|
499
499
|
const sortedValues = [...matches.values()].sort((a,b) => this.sortItems(a,b, sortProperty, sortDirection));
|
|
500
500
|
|
|
501
|
-
const start = cursorStartingKey
|
|
501
|
+
const start = cursorStartingKey === undefined ? 0 : this.findCursorStartingIndex(sortedValues, sortDirection, sortProperty, cursorStartingKey);
|
|
502
502
|
if (start < 0) {
|
|
503
503
|
// if the provided cursor does not come before any of the results, we return no results
|
|
504
504
|
return [];
|
|
505
505
|
}
|
|
506
506
|
|
|
507
|
-
const end = limit
|
|
507
|
+
const end = limit === undefined ? undefined : start + limit;
|
|
508
508
|
return sortedValues.slice(start, end);
|
|
509
509
|
}
|
|
510
510
|
|
|
@@ -735,7 +735,7 @@ export class IndexLevel {
|
|
|
735
735
|
/**
|
|
736
736
|
* Joins the given values using the `\x00` (\u0000) character.
|
|
737
737
|
*/
|
|
738
|
-
private static delimiter = `\x00`;
|
|
738
|
+
private static readonly delimiter = `\x00`;
|
|
739
739
|
private static keySegmentJoin(...values: string[]): string {
|
|
740
740
|
return values.join(IndexLevel.delimiter);
|
|
741
741
|
}
|
|
@@ -183,7 +183,7 @@ export class LevelWrapper<V> {
|
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
async isEmpty(options?: LevelWrapperOptions): Promise<boolean> {
|
|
186
|
-
for await (const _key of this.keys(options)) {
|
|
186
|
+
for await (const _key of this.keys(options)) { // NOSONAR — intentional single-iteration check
|
|
187
187
|
return false;
|
|
188
188
|
}
|
|
189
189
|
return true;
|
|
@@ -30,10 +30,10 @@ export type ResumableRecordsSquashData = {
|
|
|
30
30
|
*/
|
|
31
31
|
export class StorageController {
|
|
32
32
|
|
|
33
|
-
private messageStore: MessageStore;
|
|
34
|
-
private dataStore: DataStore;
|
|
35
|
-
private stateIndex: StateIndex;
|
|
36
|
-
private eventLog?: EventLog;
|
|
33
|
+
private readonly messageStore: MessageStore;
|
|
34
|
+
private readonly dataStore: DataStore;
|
|
35
|
+
private readonly stateIndex: StateIndex;
|
|
36
|
+
private readonly eventLog?: EventLog;
|
|
37
37
|
|
|
38
38
|
public constructor({ messageStore, dataStore, stateIndex, eventLog }: {
|
|
39
39
|
messageStore : MessageStore,
|
|
@@ -79,8 +79,13 @@ export class StorageController {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
if (message.descriptor.prune) {
|
|
82
|
-
// purge/hard-delete all
|
|
83
|
-
|
|
82
|
+
// purge/hard-delete all descendant records. Cascade is intentionally protocol-agnostic:
|
|
83
|
+
// `parentContextId` is a structural link, and a prune removes the whole subtree regardless
|
|
84
|
+
// of which protocol a descendant lives in. Cross-protocol composing children (linked via
|
|
85
|
+
// `$ref`/`uses`) participate in the cascade. See issue #298 for the design discussion.
|
|
86
|
+
await StorageController.purgeRecordDescendants(
|
|
87
|
+
tenant, message.descriptor.recordId, this.messageStore, this.dataStore, this.stateIndex
|
|
88
|
+
);
|
|
84
89
|
}
|
|
85
90
|
|
|
86
91
|
// delete all existing messages that are not newest, except for the initial write
|
|
@@ -131,10 +136,10 @@ export class StorageController {
|
|
|
131
136
|
}
|
|
132
137
|
|
|
133
138
|
const existing = recordIdToMessages.get(recordId);
|
|
134
|
-
if (existing
|
|
135
|
-
existing.push(msg);
|
|
136
|
-
} else {
|
|
139
|
+
if (existing === undefined) {
|
|
137
140
|
recordIdToMessages.set(recordId, [msg]);
|
|
141
|
+
} else {
|
|
142
|
+
existing.push(msg);
|
|
138
143
|
}
|
|
139
144
|
}
|
|
140
145
|
|
|
@@ -191,7 +196,21 @@ export class StorageController {
|
|
|
191
196
|
}
|
|
192
197
|
|
|
193
198
|
/**
|
|
194
|
-
* Purges (permanent hard-delete) all
|
|
199
|
+
* Purges (permanent hard-delete) all descendants of the given `recordId`, recursively.
|
|
200
|
+
*
|
|
201
|
+
* The cascade is intentionally protocol-agnostic: `parentContextId` is a structural link,
|
|
202
|
+
* so pruning a parent removes every record hanging off it regardless of which protocol a
|
|
203
|
+
* descendant lives in. Cross-protocol composing children (records in a different protocol
|
|
204
|
+
* that reference the parent via `$ref` / `uses`) are included in the cascade.
|
|
205
|
+
*
|
|
206
|
+
* Rationale (closes #298 as working-as-intended):
|
|
207
|
+
* - A DWN is tenant-owned storage. The tenant's prune authority extends across the whole
|
|
208
|
+
* subtree they rooted, regardless of which protocol a descendant declares itself under.
|
|
209
|
+
* - Preserving cross-protocol orphans creates a half-alive state (readable but not
|
|
210
|
+
* updatable, since `validateReferentialIntegrity` requires the pruned parent) that is
|
|
211
|
+
* worse for callers than simply cascading.
|
|
212
|
+
* - Same-protocol cascade is already protocol-agnostic at every hop via `parentId`,
|
|
213
|
+
* so treating cross-protocol boundaries differently was inconsistent.
|
|
195
214
|
*/
|
|
196
215
|
public static async purgeRecordDescendants(
|
|
197
216
|
tenant: string,
|
|
@@ -200,16 +219,15 @@ export class StorageController {
|
|
|
200
219
|
dataStore: DataStore,
|
|
201
220
|
stateIndex: StateIndex
|
|
202
221
|
): Promise<void> {
|
|
203
|
-
const filter = {
|
|
222
|
+
const filter: Filter = {
|
|
204
223
|
interface : DwnInterfaceName.Records,
|
|
205
|
-
parentId : recordId
|
|
224
|
+
parentId : recordId,
|
|
206
225
|
};
|
|
207
226
|
const { messages: childMessages } = await messageStore.query(tenant, [filter]);
|
|
208
227
|
|
|
209
228
|
// group the child messages by `recordId`
|
|
210
229
|
const recordIdToMessagesMap = new Map<string, GenericMessage[]>();
|
|
211
230
|
for (const message of childMessages) {
|
|
212
|
-
// get the recordId
|
|
213
231
|
let recordId;
|
|
214
232
|
if (Records.isRecordsWrite(message)) {
|
|
215
233
|
recordId = message.recordId;
|
|
@@ -225,13 +243,10 @@ export class StorageController {
|
|
|
225
243
|
}
|
|
226
244
|
}
|
|
227
245
|
|
|
228
|
-
// purge all child's descendants first
|
|
229
246
|
for (const childRecordId of recordIdToMessagesMap.keys()) {
|
|
230
|
-
// purge the child's descendent messages first
|
|
231
247
|
await StorageController.purgeRecordDescendants(tenant, childRecordId, messageStore, dataStore, stateIndex);
|
|
232
248
|
}
|
|
233
249
|
|
|
234
|
-
// then purge the child messages themselves
|
|
235
250
|
for (const childRecordId of recordIdToMessagesMap.keys()) {
|
|
236
251
|
await StorageController.purgeRecordMessages(tenant, recordIdToMessagesMap.get(childRecordId)!, messageStore, dataStore, stateIndex);
|
|
237
252
|
}
|
|
@@ -89,13 +89,12 @@ export type ProtocolPermissionScope = {
|
|
|
89
89
|
/**
|
|
90
90
|
* Permission scope for the Messages interface.
|
|
91
91
|
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* functionally equivalent to `Read` — new grants SHOULD use `Read` exclusively.
|
|
92
|
+
* `Read` is the only valid method and acts as a unified scope that authorizes
|
|
93
|
+
* `MessagesRead`, `MessagesSubscribe`, and `MessagesSync` operations.
|
|
95
94
|
*/
|
|
96
95
|
export type MessagesPermissionScope = {
|
|
97
96
|
interface: DwnInterfaceName.Messages;
|
|
98
|
-
method: DwnMethodName.Read
|
|
97
|
+
method: DwnMethodName.Read;
|
|
99
98
|
protocol?: string;
|
|
100
99
|
};
|
|
101
100
|
|
|
@@ -5,12 +5,12 @@ import { LRUCache } from 'lru-cache';
|
|
|
5
5
|
* A cache using local memory.
|
|
6
6
|
*/
|
|
7
7
|
export class MemoryCache implements Cache {
|
|
8
|
-
private cache: LRUCache<string, any>;
|
|
8
|
+
private readonly cache: LRUCache<string, any>;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* @param timeToLiveInSeconds time-to-live for every key-value pair set in the cache
|
|
12
12
|
*/
|
|
13
|
-
public constructor (private timeToLiveInSeconds: number) {
|
|
13
|
+
public constructor (private readonly timeToLiveInSeconds: number) {
|
|
14
14
|
this.cache = new LRUCache({
|
|
15
15
|
max : 100_000,
|
|
16
16
|
ttl : timeToLiveInSeconds * 1000
|
package/src/utils/messages.ts
CHANGED
|
@@ -21,7 +21,7 @@ export class Messages {
|
|
|
21
21
|
// normalize each filter, and only add non-empty filters to the returned array
|
|
22
22
|
for (const filter of filters) {
|
|
23
23
|
// normalize the protocol URL if it exists
|
|
24
|
-
const protocol = filter.protocol
|
|
24
|
+
const protocol = filter.protocol === undefined ? undefined : normalizeProtocolUrl(filter.protocol);
|
|
25
25
|
|
|
26
26
|
const messagesFilter = {
|
|
27
27
|
...filter,
|
|
@@ -130,6 +130,6 @@ export class Messages {
|
|
|
130
130
|
};
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
return filterCopy
|
|
133
|
+
return filterCopy;
|
|
134
134
|
}
|
|
135
135
|
}
|
package/src/utils/object.ts
CHANGED
|
@@ -30,8 +30,8 @@ export type PrivateKeySignerOptions = {
|
|
|
30
30
|
export class PrivateKeySigner implements MessageSigner {
|
|
31
31
|
public keyId;
|
|
32
32
|
public algorithm;
|
|
33
|
-
private privateJwk: PrivateKeyJwk;
|
|
34
|
-
private signatureAlgorithm;
|
|
33
|
+
private readonly privateJwk: PrivateKeyJwk;
|
|
34
|
+
private readonly signatureAlgorithm;
|
|
35
35
|
|
|
36
36
|
public constructor(options: PrivateKeySignerOptions) {
|
|
37
37
|
if (options.keyId === undefined && options.privateJwk.kid === undefined) {
|