@enbox/dwn-sdk-js 0.3.9 → 0.4.1
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/README.md +4 -4
- package/dist/browser.mjs +11 -11
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +783 -1206
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-constant.js +5 -0
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +13 -7
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +9 -18
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message-reply.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +28 -61
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +25 -27
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js +31 -69
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +44 -118
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
- package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +11 -11
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/replication-apply.js +295 -0
- package/dist/esm/src/core/replication-apply.js.map +1 -0
- package/dist/esm/src/core/resumable-task-manager.js +5 -4
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/validation-state-reader.js +237 -0
- package/dist/esm/src/core/validation-state-reader.js.map +1 -0
- package/dist/esm/src/dwn.js +261 -16
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/enums/dwn-interface-method.js +0 -1
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
- package/dist/esm/src/event-stream/durable-event-log.js +365 -0
- package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
- package/dist/esm/src/handlers/messages-query.js +159 -0
- package/dist/esm/src/handlers/messages-query.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +5 -5
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +8 -8
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +30 -49
- 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 +20 -11
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +20 -16
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +35 -11
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +52 -42
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +107 -11
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +62 -116
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +7 -8
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-query.js +49 -0
- package/dist/esm/src/interfaces/messages-query.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +7 -3
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +3 -4
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +4 -3
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +21 -4
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +4 -3
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +3 -3
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +4 -3
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +27 -13
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +27 -34
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/store/index-level.js +24 -9
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +7 -0
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +536 -42
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +58 -49
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/message-types.js.map +1 -1
- package/dist/esm/src/types/validation-state-reader.js +2 -0
- package/dist/esm/src/types/validation-state-reader.js.map +1 -0
- package/dist/esm/src/utils/messages.js +17 -0
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
- package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
- package/dist/esm/src/utils/records.js +50 -14
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/replication.js +85 -0
- package/dist/esm/src/utils/replication.js.map +1 -0
- package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
- package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
- package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
- package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
- package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/replication-apply.spec.js +274 -0
- package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
- package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
- package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
- package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
- package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
- package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
- package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
- package/dist/esm/tests/durable-event-log.spec.js +373 -0
- package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +620 -14
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +1 -4
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +165 -4
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-delivery.spec.js +1 -4
- package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
- package/dist/esm/tests/features/records-immutable.spec.js +1 -4
- package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
- package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
- package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +11 -22
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
- package/dist/esm/tests/features/records-squash.spec.js +6 -4
- package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +1 -4
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
- package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
- package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
- package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +1 -4
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +32 -9
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +4 -4
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +84 -38
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +55 -6
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +361 -5
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +60 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +7 -3
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-stores.js +19 -9
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +4 -4
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +25 -0
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
- package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
- package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
- package/dist/types/generated/precompiled-validators.d.ts +6 -6
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/core-protocol.d.ts +3 -3
- package/dist/types/src/core/core-protocol.d.ts.map +1 -1
- package/dist/types/src/core/dwn-constant.d.ts +5 -0
- package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +13 -7
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts +5 -5
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/message-reply.d.ts +5 -4
- package/dist/types/src/core/message-reply.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +12 -15
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +8 -33
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
- package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
- package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/replication-apply.d.ts +129 -0
- package/dist/types/src/core/replication-apply.d.ts.map +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/core/validation-state-reader.d.ts +79 -0
- package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +47 -13
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
- package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
- package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-query.d.ts +20 -0
- package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
- 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.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +2 -1
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +2 -2
- 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 +2 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +3 -11
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +16 -18
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-query.d.ts +23 -0
- package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-count.d.ts +3 -3
- package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-delete.d.ts +11 -3
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-query.d.ts +3 -3
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-read.d.ts +3 -3
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +15 -7
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +9 -12
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +10 -1
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/level-wrapper.d.ts +5 -0
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +94 -14
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +17 -14
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +29 -1
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +2 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +21 -55
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +2 -2
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +1 -1
- package/dist/types/src/types/subscriptions.d.ts +50 -39
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/types/validation-state-reader.d.ts +116 -0
- package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/utils/messages.d.ts +10 -0
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
- package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
- package/dist/types/src/utils/records.d.ts +25 -3
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/replication.d.ts +22 -0
- package/dist/types/src/utils/replication.d.ts.map +1 -0
- package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
- package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
- package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
- package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
- package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
- package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
- package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
- package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
- package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
- package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
- package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
- package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
- package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-configure.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-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
- package/dist/types/tests/test-event-stream.d.ts +1 -1
- package/dist/types/tests/test-event-stream.d.ts.map +1 -1
- package/dist/types/tests/test-stores.d.ts +5 -4
- package/dist/types/tests/test-stores.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +1 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
- package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/core/core-protocol.ts +3 -3
- package/src/core/dwn-constant.ts +7 -1
- package/src/core/dwn-error.ts +13 -7
- package/src/core/grant-authorization.ts +11 -20
- package/src/core/message-reply.ts +6 -5
- package/src/core/messages-grant-authorization.ts +37 -100
- package/src/core/protocol-authorization-action.ts +29 -38
- package/src/core/protocol-authorization-validation.ts +41 -98
- package/src/core/protocol-authorization.ts +56 -202
- package/src/core/protocols-grant-authorization.ts +9 -9
- package/src/core/recording-validation-state-reader.ts +130 -0
- package/src/core/records-grant-authorization.ts +16 -16
- package/src/core/replication-apply.ts +412 -0
- package/src/core/resumable-task-manager.ts +10 -8
- package/src/core/validation-state-reader.ts +350 -0
- package/src/dwn.ts +417 -30
- package/src/enums/dwn-interface-method.ts +0 -1
- package/src/event-stream/durable-event-log.ts +509 -0
- package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
- package/src/handlers/messages-query.ts +203 -0
- package/src/handlers/messages-read.ts +9 -10
- package/src/handlers/messages-subscribe.ts +12 -13
- package/src/handlers/protocols-configure.ts +37 -58
- package/src/handlers/protocols-query.ts +1 -1
- package/src/handlers/records-count.ts +24 -17
- package/src/handlers/records-delete.ts +29 -27
- package/src/handlers/records-query.ts +38 -17
- package/src/handlers/records-read.ts +63 -50
- package/src/handlers/records-subscribe.ts +132 -19
- package/src/handlers/records-write.ts +77 -168
- package/src/index.ts +16 -20
- package/src/interfaces/messages-query.ts +70 -0
- package/src/interfaces/protocols-configure.ts +12 -4
- package/src/interfaces/protocols-query.ts +4 -5
- package/src/interfaces/records-count.ts +9 -4
- package/src/interfaces/records-delete.ts +25 -5
- package/src/interfaces/records-query.ts +9 -4
- package/src/interfaces/records-read.ts +4 -4
- package/src/interfaces/records-subscribe.ts +9 -4
- package/src/interfaces/records-write.ts +41 -13
- package/src/protocols/permissions.ts +32 -52
- package/src/store/index-level.ts +30 -9
- package/src/store/level-wrapper.ts +9 -1
- package/src/store/message-store-level.ts +757 -47
- package/src/store/storage-controller.ts +74 -63
- package/src/types/message-store.ts +45 -2
- package/src/types/message-types.ts +3 -1
- package/src/types/messages-types.ts +26 -65
- package/src/types/method-handler.ts +3 -3
- package/src/types/permission-types.ts +1 -1
- package/src/types/subscriptions.ts +53 -42
- package/src/types/validation-state-reader.ts +127 -0
- package/src/utils/messages.ts +25 -1
- package/src/utils/record-limit-occupancy.ts +377 -0
- package/src/utils/records.ts +69 -13
- package/src/utils/replication.ts +122 -0
- package/dist/esm/src/core/record-chain.js +0 -64
- package/dist/esm/src/core/record-chain.js.map +0 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
- package/dist/esm/src/handlers/messages-sync.js +0 -581
- package/dist/esm/src/handlers/messages-sync.js.map +0 -1
- package/dist/esm/src/interfaces/messages-sync.js +0 -54
- package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
- package/dist/esm/src/smt/smt-store-level.js +0 -103
- package/dist/esm/src/smt/smt-store-level.js.map +0 -1
- package/dist/esm/src/smt/smt-store-memory.js +0 -41
- package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
- package/dist/esm/src/smt/smt-utils.js +0 -129
- package/dist/esm/src/smt/smt-utils.js.map +0 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
- package/dist/esm/src/state-index/state-index-level.js +0 -191
- package/dist/esm/src/state-index/state-index-level.js.map +0 -1
- package/dist/esm/src/sync/records-projection.js +0 -228
- package/dist/esm/src/sync/records-projection.js.map +0 -1
- package/dist/esm/src/types/smt-types.js +0 -5
- package/dist/esm/src/types/smt-types.js.map +0 -1
- package/dist/esm/src/types/state-index.js +0 -2
- package/dist/esm/src/types/state-index.js.map +0 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
- package/dist/esm/tests/sync/records-projection.spec.js +0 -245
- package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
- package/dist/types/src/core/record-chain.d.ts +0 -24
- package/dist/types/src/core/record-chain.d.ts.map +0 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
- package/dist/types/src/handlers/messages-sync.d.ts +0 -83
- package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
- package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
- package/dist/types/src/smt/smt-store-level.d.ts +0 -32
- package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
- package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
- package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
- package/dist/types/src/smt/smt-utils.d.ts +0 -58
- package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
- package/dist/types/src/state-index/state-index-level.d.ts +0 -83
- package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
- package/dist/types/src/sync/records-projection.d.ts +0 -98
- package/dist/types/src/sync/records-projection.d.ts.map +0 -1
- package/dist/types/src/types/smt-types.d.ts +0 -81
- package/dist/types/src/types/smt-types.d.ts.map +0 -1
- package/dist/types/src/types/state-index.d.ts +0 -90
- package/dist/types/src/types/state-index.d.ts.map +0 -1
- package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
- package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
- package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
- package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
- package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
- package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
- package/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
- package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
- package/src/core/record-chain.ts +0 -99
- package/src/event-stream/event-emitter-event-log.ts +0 -430
- package/src/handlers/messages-sync.ts +0 -896
- package/src/interfaces/messages-sync.ts +0 -86
- package/src/smt/smt-store-level.ts +0 -143
- package/src/smt/smt-store-memory.ts +0 -53
- package/src/smt/smt-utils.ts +0 -149
- package/src/smt/sparse-merkle-tree.ts +0 -698
- package/src/state-index/state-index-level.ts +0 -239
- package/src/sync/records-projection.ts +0 -328
- package/src/types/smt-types.ts +0 -95
- package/src/types/state-index.ts +0 -100
package/src/dwn.ts
CHANGED
|
@@ -1,37 +1,70 @@
|
|
|
1
|
+
import type { CoreProtocol } from './core/core-protocol.js';
|
|
1
2
|
import type { DataStore } from './types/data-store.js';
|
|
2
3
|
import type { DidResolver } from '@enbox/dids';
|
|
3
4
|
import type { MessageStore } from './types/message-store.js';
|
|
4
5
|
import type { ResumableTaskStore } from './types/resumable-task-store.js';
|
|
5
|
-
import type { StateIndex } from './types/state-index.js';
|
|
6
6
|
import type { TenantGate } from './core/tenant-gate.js';
|
|
7
7
|
import type { UnionMessageReply } from './core/message-reply.js';
|
|
8
|
+
import type { ValidationStateReader } from './types/validation-state-reader.js';
|
|
8
9
|
import type { EventLog, SubscriptionListener } from './types/subscriptions.js';
|
|
9
10
|
import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
|
|
10
11
|
import type { HandlerDependencies, MethodHandler } from './types/method-handler.js';
|
|
11
|
-
import type {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
import type {
|
|
13
|
+
MessagesQueryMessage,
|
|
14
|
+
MessagesQueryReply,
|
|
15
|
+
MessagesReadMessage,
|
|
16
|
+
MessagesReadReply,
|
|
17
|
+
MessagesSubscribeMessage,
|
|
18
|
+
MessagesSubscribeMessageOptions,
|
|
19
|
+
MessagesSubscribeReply,
|
|
20
|
+
} from './types/messages-types.js';
|
|
21
|
+
import type { ProtocolDefinition, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
|
|
22
|
+
import type {
|
|
23
|
+
RecordsCountMessage,
|
|
24
|
+
RecordsCountReply,
|
|
25
|
+
RecordsDeleteMessage,
|
|
26
|
+
RecordsQueryMessage,
|
|
27
|
+
RecordsQueryReply,
|
|
28
|
+
RecordsQueryReplyEntry,
|
|
29
|
+
RecordsReadMessage,
|
|
30
|
+
RecordsReadReply,
|
|
31
|
+
RecordsSubscribeMessage,
|
|
32
|
+
RecordsSubscribeMessageOptions,
|
|
33
|
+
RecordsSubscribeReply,
|
|
34
|
+
RecordsWriteMessage,
|
|
35
|
+
RecordsWriteMessageOptions
|
|
36
|
+
} from './types/records-types.js';
|
|
37
|
+
import type { ReplicationApplyOptions, ReplicationApplyResult } from './core/replication-apply.js';
|
|
14
38
|
|
|
15
39
|
import { AllowAllTenantGate } from './core/tenant-gate.js';
|
|
40
|
+
import { Cid } from './utils/cid.js';
|
|
16
41
|
import { CoreProtocolRegistry } from './core/core-protocol.js';
|
|
42
|
+
import { DataStream } from './utils/data-stream.js';
|
|
43
|
+
import { DwnConstant } from './core/dwn-constant.js';
|
|
17
44
|
import { Message } from './core/message.js';
|
|
18
45
|
import { messageReplyFromError } from './core/message-reply.js';
|
|
46
|
+
import { MessagesQueryHandler } from './handlers/messages-query.js';
|
|
19
47
|
import { MessagesReadHandler } from './handlers/messages-read.js';
|
|
20
48
|
import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
|
|
21
|
-
import { MessagesSyncHandler } from './handlers/messages-sync.js';
|
|
22
49
|
import { PermissionsProtocol } from './protocols/permissions.js';
|
|
23
50
|
import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
|
|
24
51
|
import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
|
|
52
|
+
import { Records } from './utils/records.js';
|
|
25
53
|
import { RecordsCountHandler } from './handlers/records-count.js';
|
|
54
|
+
import { RecordsDelete } from './interfaces/records-delete.js';
|
|
26
55
|
import { RecordsDeleteHandler } from './handlers/records-delete.js';
|
|
27
56
|
import { RecordsQueryHandler } from './handlers/records-query.js';
|
|
28
57
|
import { RecordsReadHandler } from './handlers/records-read.js';
|
|
29
58
|
import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
|
|
59
|
+
import { RecordsWrite } from './interfaces/records-write.js';
|
|
30
60
|
import { RecordsWriteHandler } from './handlers/records-write.js';
|
|
31
61
|
import { ResumableTaskManager } from './core/resumable-task-manager.js';
|
|
32
62
|
import { StorageController } from './store/storage-controller.js';
|
|
63
|
+
import { StoreValidationStateReader } from './core/validation-state-reader.js';
|
|
33
64
|
import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
65
|
+
import { DwnError, DwnErrorCode } from './core/dwn-error.js';
|
|
34
66
|
import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
|
|
67
|
+
import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
|
|
35
68
|
|
|
36
69
|
/**
|
|
37
70
|
* Structural shape for `DidResolver` implementations that expose
|
|
@@ -45,18 +78,29 @@ type LifecycleResolver = {
|
|
|
45
78
|
close: () => Promise<void>;
|
|
46
79
|
};
|
|
47
80
|
|
|
81
|
+
type ReplicationApplyProtocolDefinitionLookup = {
|
|
82
|
+
protocol: string;
|
|
83
|
+
messageTimestamp?: string;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
type DwnStorage = {
|
|
87
|
+
dataStore: DataStore;
|
|
88
|
+
messageStore: MessageStore;
|
|
89
|
+
eventLog: EventLog | undefined;
|
|
90
|
+
};
|
|
91
|
+
|
|
48
92
|
export class Dwn {
|
|
49
93
|
private readonly methodHandlers: { [key:string]: MethodHandler };
|
|
50
94
|
private readonly didResolver: DidResolver;
|
|
51
95
|
private readonly messageStore: MessageStore;
|
|
52
96
|
private readonly dataStore: DataStore;
|
|
53
97
|
private readonly resumableTaskStore: ResumableTaskStore;
|
|
54
|
-
private readonly stateIndex: StateIndex;
|
|
55
98
|
private readonly tenantGate: TenantGate;
|
|
56
99
|
private readonly eventLog?: EventLog;
|
|
57
100
|
private readonly storageController: StorageController;
|
|
58
101
|
private readonly resumableTaskManager: ResumableTaskManager;
|
|
59
102
|
private readonly _coreProtocols: CoreProtocolRegistry;
|
|
103
|
+
private readonly validationStateReader: ValidationStateReader;
|
|
60
104
|
|
|
61
105
|
/** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
|
|
62
106
|
private readonly ownsResolver: boolean;
|
|
@@ -68,41 +112,46 @@ export class Dwn {
|
|
|
68
112
|
this.messageStore = config.messageStore;
|
|
69
113
|
this.dataStore = config.dataStore;
|
|
70
114
|
this.resumableTaskStore = config.resumableTaskStore;
|
|
71
|
-
|
|
115
|
+
|
|
116
|
+
// Initialize the core protocol registry with built-in system protocols.
|
|
117
|
+
this._coreProtocols = new CoreProtocolRegistry();
|
|
118
|
+
this._coreProtocols.register(new PermissionsProtocol());
|
|
119
|
+
|
|
120
|
+
// The single narrow surface through which validation logic reads state (replay-basis closure).
|
|
121
|
+
const validationStateReader = new StoreValidationStateReader({
|
|
122
|
+
messageStore : this.messageStore,
|
|
123
|
+
dataStore : this.dataStore,
|
|
124
|
+
coreProtocols : this._coreProtocols,
|
|
125
|
+
});
|
|
126
|
+
this.validationStateReader = config.instrumentValidationStateReader?.(validationStateReader) ?? validationStateReader;
|
|
72
127
|
|
|
73
128
|
this.eventLog = config.eventLog;
|
|
74
129
|
|
|
75
130
|
this.storageController = new StorageController({
|
|
76
131
|
messageStore : this.messageStore,
|
|
77
132
|
dataStore : this.dataStore,
|
|
78
|
-
stateIndex : this.stateIndex,
|
|
79
|
-
eventLog : this.eventLog
|
|
80
133
|
});
|
|
81
134
|
this.resumableTaskManager = new ResumableTaskManager(
|
|
82
135
|
config.resumableTaskStore,
|
|
83
136
|
this.storageController
|
|
84
137
|
);
|
|
85
138
|
|
|
86
|
-
// Initialize the core protocol registry with built-in system protocols.
|
|
87
|
-
this._coreProtocols = new CoreProtocolRegistry();
|
|
88
|
-
this._coreProtocols.register(new PermissionsProtocol());
|
|
89
|
-
|
|
90
139
|
// Build the shared dependency bag once; every handler receives the same object
|
|
91
140
|
// and accesses only the dependencies it needs.
|
|
92
141
|
const deps: HandlerDependencies = {
|
|
93
|
-
didResolver
|
|
94
|
-
messageStore
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
resumableTaskManager
|
|
98
|
-
coreProtocols
|
|
99
|
-
eventLog
|
|
142
|
+
didResolver : this.didResolver,
|
|
143
|
+
messageStore : this.messageStore,
|
|
144
|
+
validationStateReader : this.validationStateReader,
|
|
145
|
+
dataStore : this.dataStore,
|
|
146
|
+
resumableTaskManager : this.resumableTaskManager,
|
|
147
|
+
coreProtocols : this._coreProtocols,
|
|
148
|
+
eventLog : this.eventLog,
|
|
100
149
|
};
|
|
101
150
|
|
|
102
151
|
this.methodHandlers = {
|
|
103
152
|
[DwnInterfaceName.Messages + DwnMethodName.Read] : new MessagesReadHandler(deps),
|
|
153
|
+
[DwnInterfaceName.Messages + DwnMethodName.Query] : new MessagesQueryHandler(deps),
|
|
104
154
|
[DwnInterfaceName.Messages + DwnMethodName.Subscribe] : new MessagesSubscribeHandler(deps),
|
|
105
|
-
[DwnInterfaceName.Messages + DwnMethodName.Sync] : new MessagesSyncHandler(deps),
|
|
106
155
|
[DwnInterfaceName.Protocols + DwnMethodName.Configure] : new ProtocolsConfigureHandler(deps),
|
|
107
156
|
[DwnInterfaceName.Protocols + DwnMethodName.Query] : new ProtocolsQueryHandler(deps),
|
|
108
157
|
[DwnInterfaceName.Records + DwnMethodName.Count] : new RecordsCountHandler(deps),
|
|
@@ -148,7 +197,6 @@ export class Dwn {
|
|
|
148
197
|
await this.messageStore.open();
|
|
149
198
|
await this.dataStore.open();
|
|
150
199
|
await this.resumableTaskStore.open();
|
|
151
|
-
await this.stateIndex.open();
|
|
152
200
|
await this.eventLog?.open();
|
|
153
201
|
|
|
154
202
|
await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
|
|
@@ -159,7 +207,6 @@ export class Dwn {
|
|
|
159
207
|
await this.messageStore.close();
|
|
160
208
|
await this.dataStore.close();
|
|
161
209
|
await this.resumableTaskStore.close();
|
|
162
|
-
await this.stateIndex.close();
|
|
163
210
|
|
|
164
211
|
// Close the resolver's cache if the DWN owns it.
|
|
165
212
|
const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
|
|
@@ -179,15 +226,14 @@ export class Dwn {
|
|
|
179
226
|
|
|
180
227
|
/**
|
|
181
228
|
* Returns the internal storage components for advanced operations that
|
|
182
|
-
* cannot be expressed through the standard `processMessage()` pipeline
|
|
183
|
-
* (e.g., owner-upgrade of externally authored encrypted records).
|
|
229
|
+
* cannot be expressed through the standard `processMessage()` pipeline.
|
|
184
230
|
*
|
|
185
231
|
* Callers are responsible for maintaining consistency across stores.
|
|
186
232
|
*/
|
|
187
|
-
public get storage():
|
|
233
|
+
public get storage(): DwnStorage {
|
|
188
234
|
return {
|
|
235
|
+
dataStore : this.dataStore,
|
|
189
236
|
messageStore : this.messageStore,
|
|
190
|
-
stateIndex : this.stateIndex,
|
|
191
237
|
eventLog : this.eventLog,
|
|
192
238
|
};
|
|
193
239
|
}
|
|
@@ -199,7 +245,7 @@ export class Dwn {
|
|
|
199
245
|
public async processMessage(
|
|
200
246
|
tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
|
|
201
247
|
public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
|
|
202
|
-
public async processMessage(tenant: string, rawMessage:
|
|
248
|
+
public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
|
|
203
249
|
public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
|
|
204
250
|
public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
|
|
205
251
|
public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
|
|
@@ -223,12 +269,347 @@ export class Dwn {
|
|
|
223
269
|
tenant,
|
|
224
270
|
message: rawMessage,
|
|
225
271
|
dataStream,
|
|
226
|
-
subscriptionHandler
|
|
272
|
+
subscriptionHandler,
|
|
227
273
|
});
|
|
228
274
|
|
|
229
275
|
return methodHandlerReply;
|
|
230
276
|
}
|
|
231
277
|
|
|
278
|
+
/**
|
|
279
|
+
* Applies a message obtained through replication and returns a structured
|
|
280
|
+
* outcome instead of an HTTP-like handler status. Normal authoring still
|
|
281
|
+
* uses `processMessage`; sync uses this entry point so missing local
|
|
282
|
+
* dependencies can be fetched and retried without treating the replicated
|
|
283
|
+
* message as permanently invalid.
|
|
284
|
+
*/
|
|
285
|
+
public async applyReplicatedMessage(
|
|
286
|
+
tenant: string,
|
|
287
|
+
rawMessage: GenericMessage,
|
|
288
|
+
options: ReplicationApplyOptions = {},
|
|
289
|
+
): Promise<ReplicationApplyResult> {
|
|
290
|
+
const tenantError = await this.validateTenant(tenant);
|
|
291
|
+
if (tenantError !== undefined) {
|
|
292
|
+
return { kind: 'Deferred', reason: 'tenant-inactive' };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const integrityError = await this.validateMessageIntegrity(rawMessage);
|
|
296
|
+
if (integrityError !== undefined) {
|
|
297
|
+
return { kind: 'Invalid', reason: integrityError.status.detail };
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
|
|
301
|
+
return { kind: 'Duplicate' };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const reply = await this.processMessage(tenant, rawMessage, options);
|
|
305
|
+
const replicatedWriteBeatenByDeleteResult = await this.storeReplicatedWriteBeatenByDelete(tenant, rawMessage, reply, options);
|
|
306
|
+
if (replicatedWriteBeatenByDeleteResult !== undefined) {
|
|
307
|
+
return replicatedWriteBeatenByDeleteResult;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
|
|
311
|
+
const missingAncestorRecordIds = await this.getReplicationApplyMissingAncestors(tenant, rawMessage, reply);
|
|
312
|
+
return replicationApplyResultFromReply(rawMessage, reply, { protocolDefinition, missingAncestorRecordIds });
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Computes the layer-batched missing-ancestor set for a replicated message that failed on a
|
|
317
|
+
* missing ancestor (immediate parent or record-chain construction), so the resulting
|
|
318
|
+
* `Incomplete` names every locally-absent ancestor at once. Returns `undefined`
|
|
319
|
+
* (single-ancestor emission) when the set cannot be computed.
|
|
320
|
+
*/
|
|
321
|
+
private async getReplicationApplyMissingAncestors(
|
|
322
|
+
tenant: string,
|
|
323
|
+
message: GenericMessage,
|
|
324
|
+
reply: { status: { detail?: string } },
|
|
325
|
+
): Promise<string[] | undefined> {
|
|
326
|
+
try {
|
|
327
|
+
return await missingAncestorRecordIdsFromReply(tenant, message, reply, this.validationStateReader);
|
|
328
|
+
} catch {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private async storeReplicatedWriteBeatenByDelete(
|
|
334
|
+
tenant: string,
|
|
335
|
+
message: GenericMessage,
|
|
336
|
+
reply: { status: { detail?: string } },
|
|
337
|
+
options: ReplicationApplyOptions,
|
|
338
|
+
): Promise<ReplicationApplyResult | undefined> {
|
|
339
|
+
const detail = reply.status.detail ?? '';
|
|
340
|
+
if (!detail.startsWith(`${DwnErrorCode.RecordsWriteNotAllowedAfterDelete}:`) || !Records.isRecordsWrite(message)) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const query = {
|
|
345
|
+
interface : DwnInterfaceName.Records,
|
|
346
|
+
recordId : message.recordId,
|
|
347
|
+
};
|
|
348
|
+
const { messages: existingMessages } = await this.messageStore.query(tenant, [query]);
|
|
349
|
+
const initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
|
|
350
|
+
const existingDelete = await Records.getNewestRecordsDelete(existingMessages);
|
|
351
|
+
if (existingDelete === undefined) {
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const validationReply = await this.validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options);
|
|
356
|
+
if (validationReply !== undefined) {
|
|
357
|
+
return replicationApplyResultFromReply(message, validationReply);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const recordsWrite = await RecordsWrite.parse(message);
|
|
361
|
+
const storedWriteMessage: RecordsWriteMessage & { encodedData?: string } = { ...message };
|
|
362
|
+
delete storedWriteMessage.encodedData;
|
|
363
|
+
const recordsWriteIndexes = await recordsWrite.constructIndexes(false);
|
|
364
|
+
await this.messageStore.put(tenant, storedWriteMessage, recordsWriteIndexes);
|
|
365
|
+
|
|
366
|
+
const recordsDelete = await RecordsDelete.parse(existingDelete);
|
|
367
|
+
const visibilitySourceWrite = await Records.getNewestRecordsWrite([...existingMessages, storedWriteMessage]) ?? initialWrite;
|
|
368
|
+
const recordsDeleteIndexes = recordsDelete.constructIndexes(initialWrite, visibilitySourceWrite);
|
|
369
|
+
const recordsDeleteCid = await Message.getCid(existingDelete);
|
|
370
|
+
await this.messageStore.updateIndexes(tenant, recordsDeleteCid, recordsDeleteIndexes);
|
|
371
|
+
|
|
372
|
+
return { kind: 'Superseded' };
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
private async validateReplicatedWriteBeatenByDelete(
|
|
376
|
+
tenant: string,
|
|
377
|
+
message: RecordsWriteMessage,
|
|
378
|
+
existingMessages: GenericMessage[],
|
|
379
|
+
options: ReplicationApplyOptions,
|
|
380
|
+
): Promise<GenericMessageReply | undefined> {
|
|
381
|
+
try {
|
|
382
|
+
await this.validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options);
|
|
383
|
+
return undefined;
|
|
384
|
+
} catch (error) {
|
|
385
|
+
const statusCode = error instanceof DwnError
|
|
386
|
+
? this._coreProtocols.mapErrorToStatusCode(error.code) ?? 400
|
|
387
|
+
: 400;
|
|
388
|
+
return messageReplyFromError(error, statusCode);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
private async validateReplicatedWriteBeatenByDeleteOrThrow(
|
|
393
|
+
tenant: string,
|
|
394
|
+
message: RecordsWriteMessage,
|
|
395
|
+
existingMessages: GenericMessage[],
|
|
396
|
+
options: ReplicationApplyOptions,
|
|
397
|
+
): Promise<void> {
|
|
398
|
+
const coreProtocol = message.descriptor.protocol === undefined
|
|
399
|
+
? undefined
|
|
400
|
+
: this._coreProtocols.get(message.descriptor.protocol);
|
|
401
|
+
|
|
402
|
+
if (coreProtocol?.preProcessWrite !== undefined) {
|
|
403
|
+
await coreProtocol.preProcessWrite(tenant, message, this.validationStateReader);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if (options.dataStream !== undefined) {
|
|
407
|
+
await Dwn.validateReplicatedWriteBeatenByDeleteDataStream(message, options.dataStream, coreProtocol);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (await RecordsWrite.isInitialWrite(message)) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
await this.validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
private static async validateReplicatedWriteBeatenByDeleteDataStream(
|
|
419
|
+
message: RecordsWriteMessage,
|
|
420
|
+
dataStream: ReadableStream<Uint8Array>,
|
|
421
|
+
coreProtocol: CoreProtocol | undefined,
|
|
422
|
+
): Promise<void> {
|
|
423
|
+
if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
424
|
+
const dataBytes = await DataStream.toBytes(dataStream);
|
|
425
|
+
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
426
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
427
|
+
|
|
428
|
+
if (coreProtocol?.validateRecord !== undefined) {
|
|
429
|
+
coreProtocol.validateRecord(message, dataBytes);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const [dataCidStream, dataSizeStream] = DataStream.duplicateDataStream(dataStream, 2);
|
|
436
|
+
const [dataCid, dataSize] = await Promise.all([
|
|
437
|
+
Cid.computeDagPbCidFromStream(dataCidStream),
|
|
438
|
+
Dwn.getDataStreamByteLength(dataSizeStream),
|
|
439
|
+
]);
|
|
440
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataSize);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
private async validateReplicatedWriteBeatenByDeleteExistingData(
|
|
444
|
+
tenant: string,
|
|
445
|
+
message: RecordsWriteMessage,
|
|
446
|
+
existingMessages: GenericMessage[],
|
|
447
|
+
): Promise<void> {
|
|
448
|
+
const newestExistingWrite = await Records.getNewestRecordsWrite(existingMessages);
|
|
449
|
+
if (newestExistingWrite === undefined) {
|
|
450
|
+
throw new DwnError(
|
|
451
|
+
DwnErrorCode.RecordsWriteGetInitialWriteNotFound,
|
|
452
|
+
`initial write is missing for record ${message.recordId}`
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const { dataCid, dataSize } = message.descriptor;
|
|
457
|
+
RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
|
|
458
|
+
|
|
459
|
+
if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
460
|
+
const newestExistingWriteWithData = newestExistingWrite as RecordsQueryReplyEntry;
|
|
461
|
+
if (newestExistingWriteWithData.encodedData === undefined) {
|
|
462
|
+
throw new DwnError(
|
|
463
|
+
DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious,
|
|
464
|
+
`No dataStream was provided and unable to get data from previous message`
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const priorDataExists = await this.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, dataCid);
|
|
472
|
+
if (!priorDataExists) {
|
|
473
|
+
throw new DwnError(
|
|
474
|
+
DwnErrorCode.RecordsWriteMissingDataInPrevious,
|
|
475
|
+
`No dataStream was provided and unable to get data from previous message`
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
private static async getDataStreamByteLength(dataStream: ReadableStream<Uint8Array>): Promise<number> {
|
|
481
|
+
let byteLength = 0;
|
|
482
|
+
for await (const chunk of DataStream.asAsyncIterable(dataStream)) {
|
|
483
|
+
byteLength += chunk.length;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
return byteLength;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
private async getReplicationApplyProtocolDefinition(
|
|
490
|
+
tenant: string,
|
|
491
|
+
message: GenericMessage,
|
|
492
|
+
reply: { status: { detail?: string } },
|
|
493
|
+
): Promise<ProtocolDefinition | undefined> {
|
|
494
|
+
const detail = reply.status.detail ?? '';
|
|
495
|
+
if (!detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`)) {
|
|
496
|
+
return undefined;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
|
|
500
|
+
if (lookup === undefined) {
|
|
501
|
+
return undefined;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
try {
|
|
505
|
+
return await this.validationStateReader.fetchProtocolDefinition(
|
|
506
|
+
tenant,
|
|
507
|
+
lookup.protocol,
|
|
508
|
+
lookup.messageTimestamp,
|
|
509
|
+
);
|
|
510
|
+
} catch {
|
|
511
|
+
return undefined;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
private static getReplicationApplyProtocolDefinitionLookup(
|
|
516
|
+
message: GenericMessage,
|
|
517
|
+
): ReplicationApplyProtocolDefinitionLookup | undefined {
|
|
518
|
+
if (Dwn.isRecordsWriteMessage(message)) {
|
|
519
|
+
return {
|
|
520
|
+
protocol : message.descriptor.protocol,
|
|
521
|
+
messageTimestamp : message.descriptor.messageTimestamp,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
const protocol = Dwn.getMessageProtocolForReplicationApply(message);
|
|
526
|
+
return protocol === undefined ? undefined : { protocol };
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
private static getMessageProtocolForReplicationApply(message: GenericMessage): string | undefined {
|
|
530
|
+
const descriptor = message.descriptor as { protocol?: unknown; filter?: { protocol?: unknown } };
|
|
531
|
+
if (typeof descriptor.protocol === 'string') {
|
|
532
|
+
return descriptor.protocol;
|
|
533
|
+
}
|
|
534
|
+
if (typeof descriptor.filter?.protocol === 'string') {
|
|
535
|
+
return descriptor.filter.protocol;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
private static isRecordsWriteMessage(message: GenericMessage): message is RecordsWriteMessage {
|
|
540
|
+
return message.descriptor.interface === DwnInterfaceName.Records &&
|
|
541
|
+
message.descriptor.method === DwnMethodName.Write;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
private async replicatedMessageAlreadyStored(
|
|
545
|
+
tenant: string,
|
|
546
|
+
message: GenericMessage,
|
|
547
|
+
): Promise<boolean> {
|
|
548
|
+
const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
|
|
549
|
+
if (existingMessages.length === 0) {
|
|
550
|
+
return false;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
const incomingCid = await Message.getCid(message);
|
|
554
|
+
for (const existing of existingMessages) {
|
|
555
|
+
if (await Message.getCid(existing) !== incomingCid) {
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
return true;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
private async getExistingMessagesForReplicationDedup(
|
|
566
|
+
tenant: string,
|
|
567
|
+
message: GenericMessage,
|
|
568
|
+
): Promise<GenericMessage[]> {
|
|
569
|
+
const { descriptor } = message;
|
|
570
|
+
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
|
|
571
|
+
const recordId = (message as { recordId?: unknown }).recordId;
|
|
572
|
+
if (typeof recordId !== 'string') {
|
|
573
|
+
return [];
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
577
|
+
interface: DwnInterfaceName.Records,
|
|
578
|
+
recordId,
|
|
579
|
+
}]);
|
|
580
|
+
return messages;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
|
|
584
|
+
const recordId = (descriptor as { recordId?: unknown }).recordId;
|
|
585
|
+
if (typeof recordId !== 'string') {
|
|
586
|
+
return [];
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
590
|
+
interface: DwnInterfaceName.Records,
|
|
591
|
+
recordId,
|
|
592
|
+
}]);
|
|
593
|
+
return messages;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
|
|
597
|
+
const protocol = (descriptor as { definition?: { protocol?: unknown } }).definition?.protocol;
|
|
598
|
+
if (typeof protocol !== 'string') {
|
|
599
|
+
return [];
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
603
|
+
interface : DwnInterfaceName.Protocols,
|
|
604
|
+
method : DwnMethodName.Configure,
|
|
605
|
+
protocol,
|
|
606
|
+
}]);
|
|
607
|
+
return messages;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
return [];
|
|
611
|
+
}
|
|
612
|
+
|
|
232
613
|
/**
|
|
233
614
|
* Checks tenant gate to see if tenant is allowed.
|
|
234
615
|
* @param tenant The tenant DID to route the given message to.
|
|
@@ -304,8 +685,14 @@ export type DwnConfig = {
|
|
|
304
685
|
*/
|
|
305
686
|
eventLog?: EventLog;
|
|
306
687
|
|
|
688
|
+
/**
|
|
689
|
+
* Instrumentation seam: wraps the internally constructed `ValidationStateReader` before it is
|
|
690
|
+
* handed to the handlers (e.g. with a `RecordingValidationStateReader`). Used by the
|
|
691
|
+
* replay-basis closure tests and harnesses to record every validation-time state read.
|
|
692
|
+
*/
|
|
693
|
+
instrumentValidationStateReader?: (validationStateReader: ValidationStateReader) => ValidationStateReader;
|
|
694
|
+
|
|
307
695
|
messageStore: MessageStore;
|
|
308
696
|
dataStore: DataStore;
|
|
309
|
-
stateIndex: StateIndex;
|
|
310
697
|
resumableTaskStore: ResumableTaskStore;
|
|
311
698
|
};
|