@enbox/dwn-sdk-js 0.3.4 → 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/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/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
|
@@ -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) {
|