@enbox/dwn-sdk-js 0.3.4 → 0.3.6
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 +4 -4
- 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 +4 -4
- 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 +9 -4
- 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 +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/messages-subscribe.js +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +1 -1
- package/dist/esm/src/interfaces/messages-sync.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/protocols-query.js +1 -1
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +1 -1
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +1 -1
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +1 -1
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +1 -1
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-signing.js +1 -1
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +9 -9
- 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 +3 -3
- 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 +2 -2
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/records.js +1 -1
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/time.js +5 -9
- package/dist/esm/src/utils/time.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/fuzz/object.fuzz.spec.js +1 -1
- package/dist/esm/tests/fuzz/object.fuzz.spec.js.map +1 -1
- 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/handlers/records-subscribe.spec.js +2 -1
- package/dist/esm/tests/handlers/records-subscribe.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/esm/tests/utils/poller.js +2 -2
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +1 -1
- package/dist/esm/tests/utils/test-data-generator.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/private-key-signer.d.ts +2 -2
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
- package/dist/types/src/utils/time.d.ts +3 -6
- package/dist/types/src/utils/time.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/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/core/abstract-message.ts +8 -8
- package/src/core/grant-authorization.ts +9 -2
- package/src/core/message.ts +4 -4
- 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 +34 -17
- 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 +2 -2
- 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/messages-subscribe.ts +1 -1
- package/src/interfaces/messages-sync.ts +1 -1
- package/src/interfaces/protocols-configure.ts +12 -12
- package/src/interfaces/protocols-query.ts +1 -1
- package/src/interfaces/records-count.ts +1 -1
- package/src/interfaces/records-delete.ts +2 -2
- package/src/interfaces/records-query.ts +1 -1
- package/src/interfaces/records-read.ts +1 -1
- package/src/interfaces/records-subscribe.ts +1 -1
- package/src/interfaces/records-write-signing.ts +1 -1
- package/src/interfaces/records-write.ts +13 -13
- 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 +5 -5
- 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 +3 -3
- package/src/utils/private-key-signer.ts +2 -2
- package/src/utils/records.ts +2 -2
- package/src/utils/time.ts +5 -10
- package/dist/esm/src/utils/object.js +0 -40
- package/dist/esm/src/utils/object.js.map +0 -1
- package/dist/esm/tests/utils/object.spec.js +0 -36
- package/dist/esm/tests/utils/object.spec.js.map +0 -1
- package/dist/types/src/utils/object.d.ts +0 -13
- package/dist/types/src/utils/object.d.ts.map +0 -1
- package/dist/types/tests/utils/object.spec.d.ts +0 -2
- package/dist/types/tests/utils/object.spec.d.ts.map +0 -1
- package/src/utils/object.ts +0 -43
package/src/dwn.ts
CHANGED
|
@@ -33,21 +33,33 @@ import { StorageController } from './store/storage-controller.js';
|
|
|
33
33
|
import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
34
34
|
import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Structural shape for `DidResolver` implementations that expose
|
|
38
|
+
* optional lifecycle hooks (e.g. cache-backed resolvers that need to
|
|
39
|
+
* open/close a store). The base `DidResolver` interface in
|
|
40
|
+
* `@enbox/dids` doesn't declare these methods, so `Dwn.open()` /
|
|
41
|
+
* `Dwn.close()` probe via this narrowly-typed cast (no `any`).
|
|
42
|
+
*/
|
|
43
|
+
type LifecycleResolver = {
|
|
44
|
+
open: () => Promise<void>;
|
|
45
|
+
close: () => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
|
|
36
48
|
export class Dwn {
|
|
37
|
-
private methodHandlers: { [key:string]: MethodHandler };
|
|
38
|
-
private didResolver: DidResolver;
|
|
39
|
-
private messageStore: MessageStore;
|
|
40
|
-
private dataStore: DataStore;
|
|
41
|
-
private resumableTaskStore: ResumableTaskStore;
|
|
42
|
-
private stateIndex: StateIndex;
|
|
43
|
-
private tenantGate: TenantGate;
|
|
44
|
-
private eventLog?: EventLog;
|
|
45
|
-
private storageController: StorageController;
|
|
46
|
-
private resumableTaskManager: ResumableTaskManager;
|
|
47
|
-
private _coreProtocols: CoreProtocolRegistry;
|
|
49
|
+
private readonly methodHandlers: { [key:string]: MethodHandler };
|
|
50
|
+
private readonly didResolver: DidResolver;
|
|
51
|
+
private readonly messageStore: MessageStore;
|
|
52
|
+
private readonly dataStore: DataStore;
|
|
53
|
+
private readonly resumableTaskStore: ResumableTaskStore;
|
|
54
|
+
private readonly stateIndex: StateIndex;
|
|
55
|
+
private readonly tenantGate: TenantGate;
|
|
56
|
+
private readonly eventLog?: EventLog;
|
|
57
|
+
private readonly storageController: StorageController;
|
|
58
|
+
private readonly resumableTaskManager: ResumableTaskManager;
|
|
59
|
+
private readonly _coreProtocols: CoreProtocolRegistry;
|
|
48
60
|
|
|
49
61
|
/** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
|
|
50
|
-
private ownsResolver: boolean;
|
|
62
|
+
private readonly ownsResolver: boolean;
|
|
51
63
|
|
|
52
64
|
private constructor(config: DwnConfig) {
|
|
53
65
|
this.didResolver = config.didResolver!;
|
|
@@ -125,8 +137,12 @@ export class Dwn {
|
|
|
125
137
|
*/
|
|
126
138
|
public async open(): Promise<void> {
|
|
127
139
|
// Open the resolver's cache if the DWN owns it (created via defaults).
|
|
128
|
-
|
|
129
|
-
|
|
140
|
+
// The base `DidResolver` interface in `@enbox/dids` doesn't declare
|
|
141
|
+
// optional lifecycle hooks; cache-backed implementations expose them
|
|
142
|
+
// structurally. Narrowly-typed probe (no `any`).
|
|
143
|
+
const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
|
|
144
|
+
if (this.ownsResolver && typeof lifecycleResolver.open === 'function') {
|
|
145
|
+
await lifecycleResolver.open();
|
|
130
146
|
}
|
|
131
147
|
|
|
132
148
|
await this.messageStore.open();
|
|
@@ -146,8 +162,9 @@ export class Dwn {
|
|
|
146
162
|
await this.stateIndex.close();
|
|
147
163
|
|
|
148
164
|
// Close the resolver's cache if the DWN owns it.
|
|
149
|
-
|
|
150
|
-
|
|
165
|
+
const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
|
|
166
|
+
if (this.ownsResolver && typeof lifecycleResolver.close === 'function') {
|
|
167
|
+
await lifecycleResolver.close();
|
|
151
168
|
}
|
|
152
169
|
}
|
|
153
170
|
|
|
@@ -204,7 +221,7 @@ export class Dwn {
|
|
|
204
221
|
const handlerKey = rawMessage.descriptor.interface + rawMessage.descriptor.method;
|
|
205
222
|
const methodHandlerReply = await this.methodHandlers[handlerKey].handle({
|
|
206
223
|
tenant,
|
|
207
|
-
message: rawMessage
|
|
224
|
+
message: rawMessage,
|
|
208
225
|
dataStream,
|
|
209
226
|
subscriptionHandler
|
|
210
227
|
});
|
|
@@ -65,21 +65,21 @@ export interface EventEmitterEventLogConfig {
|
|
|
65
65
|
* For multi-node deployments, use a distributed implementation (NATS, Redis, etc.).
|
|
66
66
|
*/
|
|
67
67
|
export class EventEmitterEventLog implements EventLog {
|
|
68
|
-
private emitter = mitt<EmitterEvents>();
|
|
68
|
+
private readonly emitter = mitt<EmitterEvents>();
|
|
69
69
|
private isOpen: boolean = false;
|
|
70
|
-
private errorHandler: (error: any) => void = (error): void => { console.error('event log error', error); };
|
|
71
|
-
private maxEventsPerTenant: number;
|
|
70
|
+
private readonly errorHandler: (error: any) => void = (error): void => { console.error('event log error', error); };
|
|
71
|
+
private readonly maxEventsPerTenant: number;
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* Per-tenant ordered event storage.
|
|
75
75
|
* Key: tenant DID → Map of seq → StoredEntry.
|
|
76
76
|
*/
|
|
77
|
-
private tenantLogs: Map<string, Map<number, StoredEntry>> = new Map();
|
|
77
|
+
private readonly tenantLogs: Map<string, Map<number, StoredEntry>> = new Map();
|
|
78
78
|
|
|
79
79
|
/**
|
|
80
80
|
* Per-tenant monotonic sequence counter.
|
|
81
81
|
*/
|
|
82
|
-
private tenantSeqs: Map<string, number> = new Map();
|
|
82
|
+
private readonly tenantSeqs: Map<string, number> = new Map();
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
85
|
* Epoch for this EventLog instance. Generated once at construction as a
|
|
@@ -131,9 +131,7 @@ export class EventEmitterEventLog implements EventLog {
|
|
|
131
131
|
let reason: ProgressGapReason;
|
|
132
132
|
if (cursor.streamId !== expectedStreamId) {
|
|
133
133
|
reason = 'stream_mismatch';
|
|
134
|
-
} else if (cursor.epoch
|
|
135
|
-
reason = 'epoch_mismatch';
|
|
136
|
-
} else {
|
|
134
|
+
} else if (cursor.epoch === this.epoch) {
|
|
137
135
|
// Check if position is still within replay bounds.
|
|
138
136
|
const log = this.tenantLogs.get(tenant);
|
|
139
137
|
if (log !== undefined && log.size > 0) {
|
|
@@ -148,6 +146,8 @@ export class EventEmitterEventLog implements EventLog {
|
|
|
148
146
|
} else {
|
|
149
147
|
return; // No events for tenant — cursor is vacuously valid (will get empty catch-up + EOSE).
|
|
150
148
|
}
|
|
149
|
+
} else {
|
|
150
|
+
reason = 'epoch_mismatch';
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// Build gap metadata.
|
|
@@ -226,7 +226,7 @@ export class EventEmitterEventLog implements EventLog {
|
|
|
226
226
|
await this.validateCursor(tenant, cursor);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
const cursorSeq = cursor
|
|
229
|
+
const cursorSeq = cursor === undefined ? undefined : EventEmitterEventLog.parsePosition(cursor.position);
|
|
230
230
|
const log = this.tenantLogs.get(tenant);
|
|
231
231
|
|
|
232
232
|
if (log === undefined || log.size === 0) {
|
|
@@ -319,12 +319,12 @@ export class EventEmitterEventLog implements EventLog {
|
|
|
319
319
|
if (filters !== undefined && filters.length > 0) {
|
|
320
320
|
if (!FilterUtility.matchAnyFilter(payload.indexes, filters)) { return; }
|
|
321
321
|
}
|
|
322
|
-
if (
|
|
323
|
-
pendingLiveEvents.push({ event: payload.event, seq: payload.seq, messageCid: payload.messageCid });
|
|
324
|
-
} else {
|
|
322
|
+
if (catchUpComplete) {
|
|
325
323
|
void tokenFromPayload(payload).then((token) => {
|
|
326
324
|
listener({ type: 'event', cursor: token, event: payload.event });
|
|
327
325
|
});
|
|
326
|
+
} else {
|
|
327
|
+
pendingLiveEvents.push({ event: payload.event, seq: payload.seq, messageCid: payload.messageCid });
|
|
328
328
|
}
|
|
329
329
|
};
|
|
330
330
|
|
|
@@ -334,9 +334,9 @@ export class EventEmitterEventLog implements EventLog {
|
|
|
334
334
|
const readResult = await this.read(tenant, { cursor, filters });
|
|
335
335
|
// The read cursor is the token of the last read event, or the input cursor if nothing new.
|
|
336
336
|
const eoseCursor = readResult.cursor ?? cursor;
|
|
337
|
-
const lastCatchUpSeq = readResult.cursor
|
|
338
|
-
?
|
|
339
|
-
:
|
|
337
|
+
const lastCatchUpSeq = readResult.cursor === undefined
|
|
338
|
+
? cursorSeq
|
|
339
|
+
: EventEmitterEventLog.parsePosition(readResult.cursor.position);
|
|
340
340
|
|
|
341
341
|
// Use the messageCid captured by read() during its synchronous iteration.
|
|
342
342
|
// This eliminates re-lookup races: read() populates entry.messageCid before
|
|
@@ -18,7 +18,7 @@ type HandleArgs = { tenant: string, message: MessagesReadMessage };
|
|
|
18
18
|
|
|
19
19
|
export class MessagesReadHandler implements MethodHandler {
|
|
20
20
|
|
|
21
|
-
constructor(private deps: HandlerDependencies) {}
|
|
21
|
+
constructor(private readonly deps: HandlerDependencies) {}
|
|
22
22
|
|
|
23
23
|
public async handle({ tenant, message }: HandleArgs): Promise<MessagesReadReply> {
|
|
24
24
|
let messagesRead: MessagesRead;
|
|
@@ -52,16 +52,16 @@ export class MessagesReadHandler implements MethodHandler {
|
|
|
52
52
|
const recordsWrite = entry.message as RecordsQueryReplyEntry;
|
|
53
53
|
// RecordsWrite specific handling, if MessageStore has embedded `encodedData` return it with the entry.
|
|
54
54
|
// we store `encodedData` along with the message if the data is below a certain threshold.
|
|
55
|
-
if (recordsWrite.encodedData
|
|
56
|
-
|
|
57
|
-
entry.data = DataStream.fromBytes(dataBytes);
|
|
58
|
-
delete recordsWrite.encodedData;
|
|
59
|
-
} else {
|
|
60
|
-
// otherwise check the data store for the associated data
|
|
55
|
+
if (recordsWrite.encodedData === undefined) {
|
|
56
|
+
// check the data store for the associated data
|
|
61
57
|
const result = await this.deps.dataStore!.get(tenant, recordsWrite.recordId, recordsWrite.descriptor.dataCid);
|
|
62
58
|
if (result?.dataStream !== undefined) {
|
|
63
59
|
entry.data = result.dataStream;
|
|
64
60
|
}
|
|
61
|
+
} else {
|
|
62
|
+
const dataBytes = Encoder.base64UrlToBytes(recordsWrite.encodedData);
|
|
63
|
+
entry.data = DataStream.fromBytes(dataBytes);
|
|
64
|
+
delete recordsWrite.encodedData;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
@@ -14,7 +14,7 @@ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
|
14
14
|
|
|
15
15
|
export class MessagesSubscribeHandler implements MethodHandler {
|
|
16
16
|
|
|
17
|
-
constructor(private deps: HandlerDependencies) {}
|
|
17
|
+
constructor(private readonly deps: HandlerDependencies) {}
|
|
18
18
|
|
|
19
19
|
public async handle({
|
|
20
20
|
tenant,
|
|
@@ -65,7 +65,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
65
65
|
const gapInfo = (error as any).gapInfo as ProgressGapInfo | undefined;
|
|
66
66
|
return {
|
|
67
67
|
status : { code: 410, detail: 'Progress token gap' },
|
|
68
|
-
error : gapInfo
|
|
68
|
+
error : gapInfo === undefined ? undefined : { code: 'ProgressGap' as const, ...gapInfo },
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
return messageReplyFromError(error, 500);
|
|
@@ -25,7 +25,7 @@ const DEFAULT_MAX_INLINE_DATA_SIZE = DwnConstant.maxDataSizeAllowedToBeEncoded;
|
|
|
25
25
|
|
|
26
26
|
export class MessagesSyncHandler implements MethodHandler {
|
|
27
27
|
|
|
28
|
-
constructor(private deps: HandlerDependencies) { }
|
|
28
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
29
29
|
|
|
30
30
|
public async handle({
|
|
31
31
|
tenant,
|
|
@@ -51,9 +51,9 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
51
51
|
try {
|
|
52
52
|
switch (action) {
|
|
53
53
|
case 'root': {
|
|
54
|
-
const rootHash = protocol
|
|
55
|
-
? await this.deps.stateIndex!.
|
|
56
|
-
: await this.deps.stateIndex!.
|
|
54
|
+
const rootHash = protocol === undefined
|
|
55
|
+
? await this.deps.stateIndex!.getRoot(tenant)
|
|
56
|
+
: await this.deps.stateIndex!.getProtocolRoot(tenant, protocol);
|
|
57
57
|
return {
|
|
58
58
|
status : { code: 200, detail: 'OK' },
|
|
59
59
|
root : hashToHex(rootHash),
|
|
@@ -62,9 +62,9 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
62
62
|
|
|
63
63
|
case 'subtree': {
|
|
64
64
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
65
|
-
const hash = protocol
|
|
66
|
-
? await this.deps.stateIndex!.
|
|
67
|
-
: await this.deps.stateIndex!.
|
|
65
|
+
const hash = protocol === undefined
|
|
66
|
+
? await this.deps.stateIndex!.getSubtreeHash(tenant, bitPath)
|
|
67
|
+
: await this.deps.stateIndex!.getProtocolSubtreeHash(tenant, protocol, bitPath);
|
|
68
68
|
return {
|
|
69
69
|
status : { code: 200, detail: 'OK' },
|
|
70
70
|
hash : hashToHex(hash),
|
|
@@ -73,9 +73,9 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
73
73
|
|
|
74
74
|
case 'leaves': {
|
|
75
75
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
76
|
-
const leaves = protocol
|
|
77
|
-
? await this.deps.stateIndex!.
|
|
78
|
-
: await this.deps.stateIndex!.
|
|
76
|
+
const leaves = protocol === undefined
|
|
77
|
+
? await this.deps.stateIndex!.getLeaves(tenant, bitPath)
|
|
78
|
+
: await this.deps.stateIndex!.getProtocolLeaves(tenant, protocol, bitPath);
|
|
79
79
|
return {
|
|
80
80
|
status : { code: 200, detail: 'OK' },
|
|
81
81
|
entries : leaves,
|
|
@@ -165,18 +165,18 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
165
165
|
if (clientHash === undefined) {
|
|
166
166
|
// Server has entries the client doesn't — enumerate server leaves.
|
|
167
167
|
const bitPath = MessagesSyncHandler.parseBitPrefix(pfx);
|
|
168
|
-
const leaves = protocol
|
|
169
|
-
? await stateIndex.
|
|
170
|
-
: await stateIndex.
|
|
168
|
+
const leaves = protocol === undefined
|
|
169
|
+
? await stateIndex.getLeaves(tenant, bitPath)
|
|
170
|
+
: await stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
|
|
171
171
|
onlyRemoteCids.push(...leaves);
|
|
172
172
|
continue;
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
// Both sides have entries but they differ — enumerate both and set-diff.
|
|
176
176
|
const bitPath = MessagesSyncHandler.parseBitPrefix(pfx);
|
|
177
|
-
const serverLeaves = protocol
|
|
178
|
-
? await stateIndex.
|
|
179
|
-
: await stateIndex.
|
|
177
|
+
const serverLeaves = protocol === undefined
|
|
178
|
+
? await stateIndex.getLeaves(tenant, bitPath)
|
|
179
|
+
: await stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
|
|
180
180
|
|
|
181
181
|
// We don't have the client's leaves, so we report all server leaves
|
|
182
182
|
// as onlyRemote (the client will de-duplicate locally). We also
|
|
@@ -210,9 +210,9 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
210
210
|
|
|
211
211
|
const walk = async (prefix: string, currentDepth: number): Promise<void> => {
|
|
212
212
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
|
|
213
|
-
const hash = protocol
|
|
214
|
-
? await stateIndex.
|
|
215
|
-
: await stateIndex.
|
|
213
|
+
const hash = protocol === undefined
|
|
214
|
+
? await stateIndex.getSubtreeHash(tenant, bitPath)
|
|
215
|
+
: await stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath);
|
|
216
216
|
const hexHash = hashToHex(hash);
|
|
217
217
|
|
|
218
218
|
if (hexHash === defaultHashHex) {
|
|
@@ -15,7 +15,7 @@ import { getRuleSetAtPath, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
|
15
15
|
|
|
16
16
|
export class ProtocolsConfigureHandler implements MethodHandler {
|
|
17
17
|
|
|
18
|
-
constructor(private deps: HandlerDependencies) { }
|
|
18
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
19
19
|
|
|
20
20
|
public async handle({
|
|
21
21
|
tenant,
|
|
@@ -298,7 +298,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
298
298
|
|
|
299
299
|
// Check that the role path exists and is marked $role: true in the referenced protocol
|
|
300
300
|
const roleRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
|
|
301
|
-
if (
|
|
301
|
+
if (!roleRuleSet?.$role) {
|
|
302
302
|
throw new DwnError(
|
|
303
303
|
DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
|
|
304
304
|
`cross-protocol role '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
|
|
@@ -5,13 +5,13 @@ import { authenticate } from '../core/auth.js';
|
|
|
5
5
|
import { DwnErrorCode } from '../core/dwn-error.js';
|
|
6
6
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
7
7
|
import { ProtocolsQuery } from '../interfaces/protocols-query.js';
|
|
8
|
-
import { removeUndefinedProperties } from '
|
|
8
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
9
9
|
|
|
10
10
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
11
11
|
|
|
12
12
|
export class ProtocolsQueryHandler implements MethodHandler {
|
|
13
13
|
|
|
14
|
-
constructor(private deps: HandlerDependencies) { }
|
|
14
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
15
15
|
|
|
16
16
|
public async handle({
|
|
17
17
|
tenant,
|
|
@@ -14,7 +14,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
14
14
|
|
|
15
15
|
export class RecordsCountHandler implements MethodHandler {
|
|
16
16
|
|
|
17
|
-
constructor(private deps: HandlerDependencies) { }
|
|
17
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
18
18
|
|
|
19
19
|
public async handle({
|
|
20
20
|
tenant,
|
|
@@ -18,7 +18,7 @@ import { ResumableTaskName } from '../core/resumable-task-manager.js';
|
|
|
18
18
|
|
|
19
19
|
export class RecordsDeleteHandler implements MethodHandler {
|
|
20
20
|
|
|
21
|
-
constructor(private deps: HandlerDependencies) { }
|
|
21
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
22
22
|
|
|
23
23
|
public async handle({
|
|
24
24
|
tenant,
|
|
@@ -18,7 +18,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
18
18
|
|
|
19
19
|
export class RecordsQueryHandler implements MethodHandler {
|
|
20
20
|
|
|
21
|
-
constructor(private deps: HandlerDependencies) { }
|
|
21
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
22
22
|
|
|
23
23
|
public async handle({
|
|
24
24
|
tenant,
|
|
@@ -20,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
20
20
|
|
|
21
21
|
export class RecordsReadHandler implements MethodHandler {
|
|
22
22
|
|
|
23
|
-
constructor(private deps: HandlerDependencies) { }
|
|
23
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
24
24
|
|
|
25
25
|
public async handle({
|
|
26
26
|
tenant,
|
|
@@ -115,11 +115,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
let data;
|
|
118
|
-
if (matchedRecordsWrite.encodedData
|
|
119
|
-
const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
|
|
120
|
-
data = DataStream.fromBytes(dataBytes);
|
|
121
|
-
delete matchedRecordsWrite.encodedData;
|
|
122
|
-
} else {
|
|
118
|
+
if (matchedRecordsWrite.encodedData === undefined) {
|
|
123
119
|
const result = await this.deps.dataStore!.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
124
120
|
if (result?.dataStream === undefined) {
|
|
125
121
|
// The message envelope exists but the record data is unavailable (e.g., evicted
|
|
@@ -131,6 +127,10 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
131
127
|
};
|
|
132
128
|
}
|
|
133
129
|
data = result.dataStream;
|
|
130
|
+
} else {
|
|
131
|
+
const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
|
|
132
|
+
data = DataStream.fromBytes(dataBytes);
|
|
133
|
+
delete matchedRecordsWrite.encodedData;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
const recordsReadReply: RecordsReadReply = {
|
|
@@ -20,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
20
20
|
|
|
21
21
|
export class RecordsSubscribeHandler implements MethodHandler {
|
|
22
22
|
|
|
23
|
-
constructor(private deps: HandlerDependencies) { }
|
|
23
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
24
24
|
|
|
25
25
|
public async handle({
|
|
26
26
|
tenant,
|
|
@@ -97,7 +97,7 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
97
97
|
const gapInfo = (error as any).gapInfo as ProgressGapInfo | undefined;
|
|
98
98
|
return {
|
|
99
99
|
status : { code: 410, detail: 'Progress token gap' },
|
|
100
|
-
error : gapInfo
|
|
100
|
+
error : gapInfo === undefined ? undefined : { code: 'ProgressGap' as const, ...gapInfo },
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
103
|
return messageReplyFromError(error, 500);
|
|
@@ -27,7 +27,7 @@ type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?:
|
|
|
27
27
|
|
|
28
28
|
export class RecordsWriteHandler implements MethodHandler {
|
|
29
29
|
|
|
30
|
-
constructor(private deps: HandlerDependencies) { }
|
|
30
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
31
31
|
|
|
32
32
|
public async handle({
|
|
33
33
|
tenant,
|
|
@@ -106,7 +106,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
106
106
|
if (isInitial) {
|
|
107
107
|
const hasInlineData = !!(newestExistingMessage as any).encodedData;
|
|
108
108
|
const hasStoredData = this.deps.dataStore
|
|
109
|
-
? !!(await this.deps.dataStore.get(tenant, recordsWrite.message.recordId, message.descriptor.dataCid
|
|
109
|
+
? !!(await this.deps.dataStore.get(tenant, recordsWrite.message.recordId, message.descriptor.dataCid))
|
|
110
110
|
: false;
|
|
111
111
|
existingLacksData = !hasInlineData && !hasStoredData;
|
|
112
112
|
}
|
|
@@ -121,9 +121,9 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
121
121
|
|
|
122
122
|
// Look up the core protocol (if any) for the incoming message so that lifecycle hooks
|
|
123
123
|
// can be dispatched generically rather than checking for specific protocol URIs.
|
|
124
|
-
const coreProtocol = message.descriptor.protocol
|
|
125
|
-
?
|
|
126
|
-
:
|
|
124
|
+
const coreProtocol = message.descriptor.protocol === undefined
|
|
125
|
+
? undefined
|
|
126
|
+
: this.deps.coreProtocols?.get(message.descriptor.protocol);
|
|
127
127
|
|
|
128
128
|
try {
|
|
129
129
|
if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
|
|
@@ -148,11 +148,8 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
148
148
|
let isLatestBaseState = false;
|
|
149
149
|
let messageWithOptionalEncodedData = message as RecordsQueryReplyEntry;
|
|
150
150
|
|
|
151
|
-
if (dataStream
|
|
152
|
-
|
|
153
|
-
isLatestBaseState = true;
|
|
154
|
-
} else {
|
|
155
|
-
// else data stream is NOT provided
|
|
151
|
+
if (dataStream === undefined) {
|
|
152
|
+
// data stream is NOT provided
|
|
156
153
|
|
|
157
154
|
// if the incoming message is not an initial write, and no dataStream is provided, we would allow it provided it passes validation
|
|
158
155
|
// processMessageWithoutDataStream() abstracts that logic
|
|
@@ -161,6 +158,9 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
161
158
|
messageWithOptionalEncodedData = await this.processMessageWithoutDataStream(tenant, message, newestExistingWrite );
|
|
162
159
|
isLatestBaseState = true;
|
|
163
160
|
}
|
|
161
|
+
} else {
|
|
162
|
+
messageWithOptionalEncodedData = await this.processMessageWithDataStream(tenant, message, dataStream);
|
|
163
|
+
isLatestBaseState = true;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
|
|
@@ -252,14 +252,14 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
252
252
|
// if data is below the threshold, we store it within MessageStore
|
|
253
253
|
if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
254
254
|
// validate data integrity before setting.
|
|
255
|
-
const dataBytes = await DataStream.toBytes(dataStream
|
|
255
|
+
const dataBytes = await DataStream.toBytes(dataStream);
|
|
256
256
|
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
257
257
|
RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
258
258
|
|
|
259
259
|
// Dispatch schema validation to the core protocol, if applicable.
|
|
260
|
-
const coreProtocol = message.descriptor.protocol
|
|
261
|
-
?
|
|
262
|
-
:
|
|
260
|
+
const coreProtocol = message.descriptor.protocol === undefined
|
|
261
|
+
? undefined
|
|
262
|
+
: this.deps.coreProtocols?.get(message.descriptor.protocol);
|
|
263
263
|
if (coreProtocol?.validateRecord !== undefined) {
|
|
264
264
|
coreProtocol.validateRecord(message, dataBytes);
|
|
265
265
|
}
|
|
@@ -304,13 +304,13 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
304
304
|
|
|
305
305
|
if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
306
306
|
// we encode the data from the original write if it is smaller than the data-store threshold
|
|
307
|
-
if (newestExistingWrite.encodedData
|
|
308
|
-
messageWithOptionalEncodedData.encodedData = newestExistingWrite.encodedData;
|
|
309
|
-
} else {
|
|
307
|
+
if (newestExistingWrite.encodedData === undefined) {
|
|
310
308
|
throw new DwnError(
|
|
311
309
|
DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious,
|
|
312
310
|
`No dataStream was provided and unable to get data from previous message`
|
|
313
311
|
);
|
|
312
|
+
} else {
|
|
313
|
+
messageWithOptionalEncodedData.encodedData = newestExistingWrite.encodedData;
|
|
314
314
|
}
|
|
315
315
|
} else {
|
|
316
316
|
// else just make sure the data is in the data store
|
|
@@ -396,7 +396,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
396
396
|
ruleSet = ruleSet[pathSegments[i]] as typeof ruleSet;
|
|
397
397
|
}
|
|
398
398
|
|
|
399
|
-
if (ruleSet
|
|
399
|
+
if (ruleSet?.$squash !== true) {
|
|
400
400
|
return;
|
|
401
401
|
}
|
|
402
402
|
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export type { DwnConfig } from './dwn.js';
|
|
3
3
|
export type { EventListener, EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, SubscriptionEose, SubscriptionEvent, SubscriptionListener, SubscriptionMessage, SubscriptionReply } from './types/subscriptions.js';
|
|
4
4
|
export type { AuthorizationModel, Descriptor, DelegatedGrantRecordsWriteMessage, GenericMessage, GenericMessageReply, GenericSignaturePayload, MessageSort, MessageSubscription, Pagination, QueryResultEntry, Status } from './types/message-types.js';
|
|
5
|
-
export type { MessagesFilter, MessagesReadMessage
|
|
5
|
+
export type { MessagesFilter, MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions, MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncDiffEntry, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
|
|
6
6
|
export type { GT, LT, Filter, FilterValue, KeyValues, EqualFilter, OneOfFilter, RangeFilter, RangeCriterion, PaginationCursor, QueryOptions, RangeValue, StartsWithFilter } from './types/query-types.js';
|
|
7
7
|
export type { ProtocolsConfigureDescriptor, ProtocolDefinition, ProtocolTypes, ProtocolRuleSet, ProtocolsQueryFilter, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply, ProtocolActionRule, ProtocolDeliveryStrategy, ProtocolPathEncryption, ProtocolsQueryDescriptor, ProtocolRecordLimitDefinition, ProtocolSizeDefinition, ProtocolTagsDefinition, ProtocolTagSchema, ProtocolType, ProtocolUses } from './types/protocols-types.js';
|
|
8
8
|
export { ProtocolRecordLimitStrategy } from './types/protocols-types.js';
|
|
@@ -30,8 +30,8 @@ export { DwnConstant } from './core/dwn-constant.js';
|
|
|
30
30
|
export { DwnError, DwnErrorCode } from './core/dwn-error.js';
|
|
31
31
|
export { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
|
|
32
32
|
export { Encoder } from './utils/encoder.js';
|
|
33
|
-
export { MessagesSubscribe
|
|
34
|
-
export type { MessagesSubscribeOptions
|
|
33
|
+
export { MessagesSubscribe } from './interfaces/messages-subscribe.js';
|
|
34
|
+
export type { MessagesSubscribeOptions } from './interfaces/messages-subscribe.js';
|
|
35
35
|
export { Encryption, ContentEncryptionAlgorithm, KeyAgreementAlgorithm } from './utils/encryption.js';
|
|
36
36
|
export type { JweEncryption, JweRecipient, JweRecipientHeader, JweProtectedHeader, JweKeyUnwrapPayload } from './utils/encryption.js';
|
|
37
37
|
export { RecordsWrite } from './interfaces/records-write.js';
|
|
@@ -40,8 +40,8 @@ export { executeUnlessAborted } from './utils/abort.js';
|
|
|
40
40
|
export { Jws } from './utils/jws.js';
|
|
41
41
|
export type { KeyMaterial, PrivateKeyJwk, PublicKeyJwk, Jwk } from './types/jose-types.js';
|
|
42
42
|
export { Message } from './core/message.js';
|
|
43
|
-
export { MessagesRead
|
|
44
|
-
export type { MessagesReadOptions
|
|
43
|
+
export { MessagesRead } from './interfaces/messages-read.js';
|
|
44
|
+
export type { MessagesReadOptions } from './interfaces/messages-read.js';
|
|
45
45
|
export { MessagesSync } from './interfaces/messages-sync.js';
|
|
46
46
|
export type { MessagesSyncOptions } from './interfaces/messages-sync.js';
|
|
47
47
|
export type { UnionMessageReply } from './core/message-reply.js';
|
|
@@ -5,7 +5,7 @@ import type { MessagesSubscribeDescriptor, MessagesSubscribeMessage } from '../t
|
|
|
5
5
|
|
|
6
6
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
7
7
|
import { Message } from '../core/message.js';
|
|
8
|
-
import { removeUndefinedProperties } from '
|
|
8
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
9
9
|
import { Time } from '../utils/time.js';
|
|
10
10
|
import { validateProtocolUrlNormalized } from '../utils/url.js';
|
|
11
11
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
@@ -3,7 +3,7 @@ import type { MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncMessage }
|
|
|
3
3
|
|
|
4
4
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
5
5
|
import { Message } from '../core/message.js';
|
|
6
|
-
import { removeUndefinedProperties } from '
|
|
6
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
7
7
|
import { Time } from '../utils/time.js';
|
|
8
8
|
import { validateProtocolUrlNormalized } from '../utils/url.js';
|
|
9
9
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
@@ -377,16 +377,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
377
377
|
for (let j = i + 1; j < actionRules.length; j++) {
|
|
378
378
|
const otherActionRule = actionRules[j];
|
|
379
379
|
|
|
380
|
-
if (actionRule.who
|
|
381
|
-
|
|
382
|
-
throw new DwnError(
|
|
383
|
-
DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
|
|
384
|
-
`More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
|
|
385
|
-
`not allowed within a rule set: ${JSON.stringify(actionRule)}`
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
} else {
|
|
389
|
-
// else implicitly a role-based action rule
|
|
380
|
+
if (actionRule.who === undefined) {
|
|
381
|
+
// implicitly a role-based action rule
|
|
390
382
|
|
|
391
383
|
if (actionRule.role === otherActionRule.role) {
|
|
392
384
|
throw new DwnError(
|
|
@@ -394,6 +386,14 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
394
386
|
`More than one action rule per role ${actionRule.role} not allowed within a rule set: ${JSON.stringify(actionRule)}`
|
|
395
387
|
);
|
|
396
388
|
}
|
|
389
|
+
} else {
|
|
390
|
+
if (actionRule.who === otherActionRule.who && actionRule.of === otherActionRule.of) {
|
|
391
|
+
throw new DwnError(
|
|
392
|
+
DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
|
|
393
|
+
`More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
|
|
394
|
+
`not allowed within a rule set: ${JSON.stringify(actionRule)}`
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
399
|
}
|
|
@@ -497,7 +497,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
497
497
|
}
|
|
498
498
|
|
|
499
499
|
// validate alias exists in `uses`
|
|
500
|
-
if (uses
|
|
500
|
+
if (uses?.[parsed.alias] === undefined) {
|
|
501
501
|
throw new DwnError(
|
|
502
502
|
DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
|
|
503
503
|
`'$ref' alias '${parsed.alias}' at protocol path '${ruleSetProtocolPath}' does not exist in the 'uses' map.`
|
|
@@ -543,7 +543,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
543
543
|
);
|
|
544
544
|
}
|
|
545
545
|
|
|
546
|
-
if (uses
|
|
546
|
+
if (uses?.[parsed.alias] === undefined) {
|
|
547
547
|
const errorCode = fieldName === 'role'
|
|
548
548
|
? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
|
|
549
549
|
: DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
|
|
@@ -7,7 +7,7 @@ import { AbstractMessage } from '../core/abstract-message.js';
|
|
|
7
7
|
import { Message } from '../core/message.js';
|
|
8
8
|
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
9
9
|
import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
|
|
10
|
-
import { removeUndefinedProperties } from '
|
|
10
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
11
11
|
import { Time } from '../utils/time.js';
|
|
12
12
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
13
13
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
@@ -7,7 +7,7 @@ import { Message } from '../core/message.js';
|
|
|
7
7
|
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
8
8
|
import { Records } from '../utils/records.js';
|
|
9
9
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
10
|
-
import { removeUndefinedProperties } from '
|
|
10
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
11
11
|
import { Time } from '../utils/time.js';
|
|
12
12
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
13
13
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|