@enbox/dwn-sdk-js 0.4.0 → 0.4.2
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 +3 -10
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +799 -885
- 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 +12 -4
- 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 -45
- 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 +34 -89
- 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 +123 -28
- package/dist/esm/src/core/replication-apply.js.map +1 -1
- 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 +165 -132
- 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 +6 -7
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
- package/dist/esm/src/interfaces/messages-query.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +12 -9
- 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/protocol-tags.js +262 -0
- package/dist/esm/src/utils/protocol-tags.js.map +1 -0
- 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 +55 -1
- package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
- 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 +504 -35
- 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 +82 -36
- 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 -2
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/protocol-tags.spec.js +96 -0
- package/dist/esm/tests/utils/protocol-tags.spec.js.map +1 -0
- 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 +12 -4
- 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 -14
- 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 +14 -17
- 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 +36 -0
- package/dist/types/src/core/replication-apply.d.ts.map +1 -1
- 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 +33 -20
- 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 +14 -16
- 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 -37
- 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/protocol-tags.d.ts +15 -0
- package/dist/types/src/utils/protocol-tags.d.ts.map +1 -0
- 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-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/protocol-tags.spec.d.ts +2 -0
- package/dist/types/tests/utils/protocol-tags.spec.d.ts.map +1 -0
- 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 +12 -4
- package/src/core/grant-authorization.ts +11 -20
- package/src/core/message-reply.ts +6 -5
- package/src/core/messages-grant-authorization.ts +37 -70
- package/src/core/protocol-authorization-action.ts +29 -38
- package/src/core/protocol-authorization-validation.ts +47 -121
- 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 +172 -32
- package/src/core/resumable-task-manager.ts +10 -8
- package/src/core/validation-state-reader.ts +350 -0
- package/src/dwn.ts +285 -192
- 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 +14 -17
- package/src/interfaces/messages-query.ts +70 -0
- package/src/interfaces/protocols-configure.ts +20 -10
- 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 -45
- 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/protocol-tags.ts +366 -0
- 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 -278
- package/dist/esm/src/handlers/messages-sync.js.map +0 -1
- 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/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 -1088
- 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/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 -39
- package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
- 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/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/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 -403
- package/src/interfaces/messages-sync.ts +0 -69
- 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/types/smt-types.ts +0 -95
- package/src/types/state-index.ts +0 -100
package/src/dwn.ts
CHANGED
|
@@ -1,32 +1,55 @@
|
|
|
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
|
-
import type { KeyValues } from './types/query-types.js';
|
|
4
4
|
import type { MessageStore } from './types/message-store.js';
|
|
5
5
|
import type { ResumableTaskStore } from './types/resumable-task-store.js';
|
|
6
|
-
import type { StateIndex } from './types/state-index.js';
|
|
7
6
|
import type { TenantGate } from './core/tenant-gate.js';
|
|
8
7
|
import type { UnionMessageReply } from './core/message-reply.js';
|
|
9
|
-
import type {
|
|
8
|
+
import type { ValidationStateReader } from './types/validation-state-reader.js';
|
|
9
|
+
import type { EventLog, SubscriptionListener } from './types/subscriptions.js';
|
|
10
10
|
import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
|
|
11
11
|
import type { HandlerDependencies, MethodHandler } from './types/method-handler.js';
|
|
12
|
-
import type {
|
|
12
|
+
import type {
|
|
13
|
+
MessagesQueryMessage,
|
|
14
|
+
MessagesQueryReply,
|
|
15
|
+
MessagesReadMessage,
|
|
16
|
+
MessagesReadReply,
|
|
17
|
+
MessagesSubscribeMessage,
|
|
18
|
+
MessagesSubscribeMessageOptions,
|
|
19
|
+
MessagesSubscribeReply,
|
|
20
|
+
} from './types/messages-types.js';
|
|
13
21
|
import type { ProtocolDefinition, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
|
|
14
|
-
import type {
|
|
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';
|
|
15
37
|
import type { ReplicationApplyOptions, ReplicationApplyResult } from './core/replication-apply.js';
|
|
16
38
|
|
|
17
39
|
import { AllowAllTenantGate } from './core/tenant-gate.js';
|
|
40
|
+
import { Cid } from './utils/cid.js';
|
|
18
41
|
import { CoreProtocolRegistry } from './core/core-protocol.js';
|
|
19
|
-
import {
|
|
42
|
+
import { DataStream } from './utils/data-stream.js';
|
|
43
|
+
import { DwnConstant } from './core/dwn-constant.js';
|
|
20
44
|
import { Message } from './core/message.js';
|
|
21
45
|
import { messageReplyFromError } from './core/message-reply.js';
|
|
46
|
+
import { MessagesQueryHandler } from './handlers/messages-query.js';
|
|
22
47
|
import { MessagesReadHandler } from './handlers/messages-read.js';
|
|
23
48
|
import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
|
|
24
|
-
import { MessagesSyncHandler } from './handlers/messages-sync.js';
|
|
25
49
|
import { PermissionsProtocol } from './protocols/permissions.js';
|
|
26
|
-
import { ProtocolAuthorization } from './core/protocol-authorization.js';
|
|
27
|
-
import { ProtocolsConfigure } from './interfaces/protocols-configure.js';
|
|
28
50
|
import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
|
|
29
51
|
import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
|
|
52
|
+
import { Records } from './utils/records.js';
|
|
30
53
|
import { RecordsCountHandler } from './handlers/records-count.js';
|
|
31
54
|
import { RecordsDelete } from './interfaces/records-delete.js';
|
|
32
55
|
import { RecordsDeleteHandler } from './handlers/records-delete.js';
|
|
@@ -35,11 +58,13 @@ import { RecordsReadHandler } from './handlers/records-read.js';
|
|
|
35
58
|
import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
|
|
36
59
|
import { RecordsWrite } from './interfaces/records-write.js';
|
|
37
60
|
import { RecordsWriteHandler } from './handlers/records-write.js';
|
|
38
|
-
import { replicationApplyResultFromReply } from './core/replication-apply.js';
|
|
39
61
|
import { ResumableTaskManager } from './core/resumable-task-manager.js';
|
|
40
62
|
import { StorageController } from './store/storage-controller.js';
|
|
63
|
+
import { StoreValidationStateReader } from './core/validation-state-reader.js';
|
|
41
64
|
import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
65
|
+
import { DwnError, DwnErrorCode } from './core/dwn-error.js';
|
|
42
66
|
import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
|
|
67
|
+
import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
|
|
43
68
|
|
|
44
69
|
/**
|
|
45
70
|
* Structural shape for `DidResolver` implementations that expose
|
|
@@ -53,18 +78,29 @@ type LifecycleResolver = {
|
|
|
53
78
|
close: () => Promise<void>;
|
|
54
79
|
};
|
|
55
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
|
+
|
|
56
92
|
export class Dwn {
|
|
57
93
|
private readonly methodHandlers: { [key:string]: MethodHandler };
|
|
58
94
|
private readonly didResolver: DidResolver;
|
|
59
95
|
private readonly messageStore: MessageStore;
|
|
60
96
|
private readonly dataStore: DataStore;
|
|
61
97
|
private readonly resumableTaskStore: ResumableTaskStore;
|
|
62
|
-
private readonly stateIndex: StateIndex;
|
|
63
98
|
private readonly tenantGate: TenantGate;
|
|
64
99
|
private readonly eventLog?: EventLog;
|
|
65
100
|
private readonly storageController: StorageController;
|
|
66
101
|
private readonly resumableTaskManager: ResumableTaskManager;
|
|
67
102
|
private readonly _coreProtocols: CoreProtocolRegistry;
|
|
103
|
+
private readonly validationStateReader: ValidationStateReader;
|
|
68
104
|
|
|
69
105
|
/** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
|
|
70
106
|
private readonly ownsResolver: boolean;
|
|
@@ -76,41 +112,46 @@ export class Dwn {
|
|
|
76
112
|
this.messageStore = config.messageStore;
|
|
77
113
|
this.dataStore = config.dataStore;
|
|
78
114
|
this.resumableTaskStore = config.resumableTaskStore;
|
|
79
|
-
|
|
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;
|
|
80
127
|
|
|
81
128
|
this.eventLog = config.eventLog;
|
|
82
129
|
|
|
83
130
|
this.storageController = new StorageController({
|
|
84
131
|
messageStore : this.messageStore,
|
|
85
132
|
dataStore : this.dataStore,
|
|
86
|
-
stateIndex : this.stateIndex,
|
|
87
|
-
eventLog : this.eventLog
|
|
88
133
|
});
|
|
89
134
|
this.resumableTaskManager = new ResumableTaskManager(
|
|
90
135
|
config.resumableTaskStore,
|
|
91
136
|
this.storageController
|
|
92
137
|
);
|
|
93
138
|
|
|
94
|
-
// Initialize the core protocol registry with built-in system protocols.
|
|
95
|
-
this._coreProtocols = new CoreProtocolRegistry();
|
|
96
|
-
this._coreProtocols.register(new PermissionsProtocol());
|
|
97
|
-
|
|
98
139
|
// Build the shared dependency bag once; every handler receives the same object
|
|
99
140
|
// and accesses only the dependencies it needs.
|
|
100
141
|
const deps: HandlerDependencies = {
|
|
101
|
-
didResolver
|
|
102
|
-
messageStore
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
resumableTaskManager
|
|
106
|
-
coreProtocols
|
|
107
|
-
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,
|
|
108
149
|
};
|
|
109
150
|
|
|
110
151
|
this.methodHandlers = {
|
|
111
152
|
[DwnInterfaceName.Messages + DwnMethodName.Read] : new MessagesReadHandler(deps),
|
|
153
|
+
[DwnInterfaceName.Messages + DwnMethodName.Query] : new MessagesQueryHandler(deps),
|
|
112
154
|
[DwnInterfaceName.Messages + DwnMethodName.Subscribe] : new MessagesSubscribeHandler(deps),
|
|
113
|
-
[DwnInterfaceName.Messages + DwnMethodName.Sync] : new MessagesSyncHandler(deps),
|
|
114
155
|
[DwnInterfaceName.Protocols + DwnMethodName.Configure] : new ProtocolsConfigureHandler(deps),
|
|
115
156
|
[DwnInterfaceName.Protocols + DwnMethodName.Query] : new ProtocolsQueryHandler(deps),
|
|
116
157
|
[DwnInterfaceName.Records + DwnMethodName.Count] : new RecordsCountHandler(deps),
|
|
@@ -156,7 +197,6 @@ export class Dwn {
|
|
|
156
197
|
await this.messageStore.open();
|
|
157
198
|
await this.dataStore.open();
|
|
158
199
|
await this.resumableTaskStore.open();
|
|
159
|
-
await this.stateIndex.open();
|
|
160
200
|
await this.eventLog?.open();
|
|
161
201
|
|
|
162
202
|
await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
|
|
@@ -167,7 +207,6 @@ export class Dwn {
|
|
|
167
207
|
await this.messageStore.close();
|
|
168
208
|
await this.dataStore.close();
|
|
169
209
|
await this.resumableTaskStore.close();
|
|
170
|
-
await this.stateIndex.close();
|
|
171
210
|
|
|
172
211
|
// Close the resolver's cache if the DWN owns it.
|
|
173
212
|
const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
|
|
@@ -187,15 +226,14 @@ export class Dwn {
|
|
|
187
226
|
|
|
188
227
|
/**
|
|
189
228
|
* Returns the internal storage components for advanced operations that
|
|
190
|
-
* cannot be expressed through the standard `processMessage()` pipeline
|
|
191
|
-
* (e.g., owner-upgrade of externally authored encrypted records).
|
|
229
|
+
* cannot be expressed through the standard `processMessage()` pipeline.
|
|
192
230
|
*
|
|
193
231
|
* Callers are responsible for maintaining consistency across stores.
|
|
194
232
|
*/
|
|
195
|
-
public get storage():
|
|
233
|
+
public get storage(): DwnStorage {
|
|
196
234
|
return {
|
|
235
|
+
dataStore : this.dataStore,
|
|
197
236
|
messageStore : this.messageStore,
|
|
198
|
-
stateIndex : this.stateIndex,
|
|
199
237
|
eventLog : this.eventLog,
|
|
200
238
|
};
|
|
201
239
|
}
|
|
@@ -207,7 +245,7 @@ export class Dwn {
|
|
|
207
245
|
public async processMessage(
|
|
208
246
|
tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
|
|
209
247
|
public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
|
|
210
|
-
public async processMessage(tenant: string, rawMessage:
|
|
248
|
+
public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
|
|
211
249
|
public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
|
|
212
250
|
public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
|
|
213
251
|
public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
|
|
@@ -231,7 +269,7 @@ export class Dwn {
|
|
|
231
269
|
tenant,
|
|
232
270
|
message: rawMessage,
|
|
233
271
|
dataStream,
|
|
234
|
-
subscriptionHandler
|
|
272
|
+
subscriptionHandler,
|
|
235
273
|
});
|
|
236
274
|
|
|
237
275
|
return methodHandlerReply;
|
|
@@ -259,13 +297,193 @@ export class Dwn {
|
|
|
259
297
|
return { kind: 'Invalid', reason: integrityError.status.detail };
|
|
260
298
|
}
|
|
261
299
|
|
|
262
|
-
if (await this.replicatedMessageAlreadyStored(tenant, rawMessage
|
|
300
|
+
if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
|
|
263
301
|
return { kind: 'Duplicate' };
|
|
264
302
|
}
|
|
265
303
|
|
|
266
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
|
+
|
|
267
310
|
const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
|
|
268
|
-
|
|
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;
|
|
269
487
|
}
|
|
270
488
|
|
|
271
489
|
private async getReplicationApplyProtocolDefinition(
|
|
@@ -278,24 +496,36 @@ export class Dwn {
|
|
|
278
496
|
return undefined;
|
|
279
497
|
}
|
|
280
498
|
|
|
281
|
-
const
|
|
282
|
-
if (
|
|
499
|
+
const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
|
|
500
|
+
if (lookup === undefined) {
|
|
283
501
|
return undefined;
|
|
284
502
|
}
|
|
285
503
|
|
|
286
504
|
try {
|
|
287
|
-
return await
|
|
505
|
+
return await this.validationStateReader.fetchProtocolDefinition(
|
|
288
506
|
tenant,
|
|
289
|
-
protocol,
|
|
290
|
-
|
|
291
|
-
message.descriptor.messageTimestamp,
|
|
292
|
-
this._coreProtocols,
|
|
507
|
+
lookup.protocol,
|
|
508
|
+
lookup.messageTimestamp,
|
|
293
509
|
);
|
|
294
510
|
} catch {
|
|
295
511
|
return undefined;
|
|
296
512
|
}
|
|
297
513
|
}
|
|
298
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
|
+
|
|
299
529
|
private static getMessageProtocolForReplicationApply(message: GenericMessage): string | undefined {
|
|
300
530
|
const descriptor = message.descriptor as { protocol?: unknown; filter?: { protocol?: unknown } };
|
|
301
531
|
if (typeof descriptor.protocol === 'string') {
|
|
@@ -306,10 +536,14 @@ export class Dwn {
|
|
|
306
536
|
}
|
|
307
537
|
}
|
|
308
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
|
+
|
|
309
544
|
private async replicatedMessageAlreadyStored(
|
|
310
545
|
tenant: string,
|
|
311
546
|
message: GenericMessage,
|
|
312
|
-
options: ReplicationApplyOptions,
|
|
313
547
|
): Promise<boolean> {
|
|
314
548
|
const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
|
|
315
549
|
if (existingMessages.length === 0) {
|
|
@@ -322,11 +556,6 @@ export class Dwn {
|
|
|
322
556
|
continue;
|
|
323
557
|
}
|
|
324
558
|
|
|
325
|
-
if (options.dataStream !== undefined && Dwn.existingReplicatedWriteMayNeedDataCompletion(existing, message)) {
|
|
326
|
-
return false;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
await this.repairReplicationIndexesForDuplicate(tenant, message, existingMessages, incomingCid);
|
|
330
559
|
return true;
|
|
331
560
|
}
|
|
332
561
|
|
|
@@ -381,148 +610,6 @@ export class Dwn {
|
|
|
381
610
|
return [];
|
|
382
611
|
}
|
|
383
612
|
|
|
384
|
-
private static existingReplicatedWriteMayNeedDataCompletion(existing: GenericMessage, incoming: GenericMessage): boolean {
|
|
385
|
-
if (
|
|
386
|
-
incoming.descriptor.interface !== DwnInterfaceName.Records ||
|
|
387
|
-
incoming.descriptor.method !== DwnMethodName.Write ||
|
|
388
|
-
existing.descriptor.interface !== DwnInterfaceName.Records ||
|
|
389
|
-
existing.descriptor.method !== DwnMethodName.Write
|
|
390
|
-
) {
|
|
391
|
-
return false;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const existingWrite = existing as { encodedData?: string; descriptor: { dateCreated?: string; messageTimestamp?: string } };
|
|
395
|
-
const isInitialWrite = existingWrite.descriptor.dateCreated === existingWrite.descriptor.messageTimestamp;
|
|
396
|
-
return isInitialWrite && existingWrite.encodedData === undefined;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
private async repairReplicationIndexesForDuplicate(
|
|
400
|
-
tenant: string,
|
|
401
|
-
message: GenericMessage,
|
|
402
|
-
existingMessages: GenericMessage[],
|
|
403
|
-
messageCid: string,
|
|
404
|
-
): Promise<void> {
|
|
405
|
-
const leaves = await this.stateIndex.getLeaves(tenant, []);
|
|
406
|
-
const stateIndexHasMessage = leaves.includes(messageCid);
|
|
407
|
-
if (stateIndexHasMessage && this.eventLog === undefined) {
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const repair = await this.constructReplicationIndexRepair(tenant, message, existingMessages);
|
|
412
|
-
if (repair === undefined) {
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
if (!stateIndexHasMessage) {
|
|
417
|
-
await this.stateIndex.insert(tenant, messageCid, repair.indexes);
|
|
418
|
-
}
|
|
419
|
-
if (repair.emitEvent && !await this.eventLogHasMessage(tenant, messageCid, repair.indexes)) {
|
|
420
|
-
await this.eventLog?.emit(tenant, repair.event, repair.indexes, messageCid);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
private async eventLogHasMessage(tenant: string, messageCid: string, indexes: KeyValues): Promise<boolean> {
|
|
425
|
-
if (this.eventLog === undefined) {
|
|
426
|
-
return true;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const { events } = await this.eventLog.read(tenant, { filters: [indexes] });
|
|
430
|
-
for (const event of events) {
|
|
431
|
-
if (event.messageCid === messageCid || await Message.getCid(event.event.message) === messageCid) {
|
|
432
|
-
return true;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
return false;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
private async constructReplicationIndexRepair(
|
|
439
|
-
tenant: string,
|
|
440
|
-
message: GenericMessage,
|
|
441
|
-
existingMessages: GenericMessage[],
|
|
442
|
-
): Promise<{ indexes: KeyValues; event: MessageEvent; emitEvent: boolean } | undefined> {
|
|
443
|
-
const { descriptor } = message;
|
|
444
|
-
|
|
445
|
-
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
|
|
446
|
-
const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
|
|
447
|
-
const eventMessage = await Dwn.getStoredMessageForCid(existingMessages, await Message.getCid(message)) ?? message;
|
|
448
|
-
const recordsWrite = await RecordsWrite.parse(eventMessage as RecordsWriteMessage);
|
|
449
|
-
const indexes = await recordsWrite.constructIndexes(isLatest);
|
|
450
|
-
const initialWrite = await this.getInitialWriteForReplicationEvent(tenant, eventMessage as RecordsWriteMessage);
|
|
451
|
-
return {
|
|
452
|
-
indexes,
|
|
453
|
-
event : { message: eventMessage, initialWrite },
|
|
454
|
-
emitEvent : isLatest && Dwn.replicatedWriteHasQueryableData(eventMessage),
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
|
|
459
|
-
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(
|
|
460
|
-
this.messageStore,
|
|
461
|
-
tenant,
|
|
462
|
-
(message as RecordsDeleteMessage).descriptor.recordId,
|
|
463
|
-
);
|
|
464
|
-
if (initialWrite === undefined) {
|
|
465
|
-
return undefined;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
const recordsDelete = await RecordsDelete.parse(message as RecordsDeleteMessage);
|
|
469
|
-
const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
|
|
470
|
-
return {
|
|
471
|
-
indexes : recordsDelete.constructIndexes(initialWrite),
|
|
472
|
-
event : { message, initialWrite },
|
|
473
|
-
emitEvent : isLatest,
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
|
|
478
|
-
const protocolsConfigure = await ProtocolsConfigure.parse(message as ProtocolsConfigureMessage);
|
|
479
|
-
const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
|
|
480
|
-
return {
|
|
481
|
-
indexes : ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, isLatest),
|
|
482
|
-
event : { message },
|
|
483
|
-
emitEvent : isLatest,
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
return undefined;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
private static async isNewestStoredMessage(
|
|
491
|
-
message: GenericMessage,
|
|
492
|
-
existingMessages: GenericMessage[],
|
|
493
|
-
): Promise<boolean> {
|
|
494
|
-
const newestMessage = await Message.getNewestMessage(existingMessages);
|
|
495
|
-
return newestMessage !== undefined && await Message.getCid(newestMessage) === await Message.getCid(message);
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
private static async getStoredMessageForCid(existingMessages: GenericMessage[], messageCid: string): Promise<GenericMessage | undefined> {
|
|
499
|
-
for (const existingMessage of existingMessages) {
|
|
500
|
-
if (await Message.getCid(existingMessage) === messageCid) {
|
|
501
|
-
return existingMessage;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
private async getInitialWriteForReplicationEvent(
|
|
507
|
-
tenant: string,
|
|
508
|
-
message: RecordsWriteMessage,
|
|
509
|
-
): Promise<RecordsWriteMessage | undefined> {
|
|
510
|
-
if (await RecordsWrite.isInitialWrite(message)) {
|
|
511
|
-
return message;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
return RecordsWrite.fetchInitialRecordsWriteMessage(this.messageStore, tenant, message.recordId);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
private static replicatedWriteHasQueryableData(message: GenericMessage): boolean {
|
|
518
|
-
if (message.descriptor.interface !== DwnInterfaceName.Records || message.descriptor.method !== DwnMethodName.Write) {
|
|
519
|
-
return false;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
return (message as { encodedData?: unknown }).encodedData !== undefined ||
|
|
523
|
-
(message as RecordsWriteMessage).descriptor.dateCreated !== (message as RecordsWriteMessage).descriptor.messageTimestamp;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
613
|
/**
|
|
527
614
|
* Checks tenant gate to see if tenant is allowed.
|
|
528
615
|
* @param tenant The tenant DID to route the given message to.
|
|
@@ -598,8 +685,14 @@ export type DwnConfig = {
|
|
|
598
685
|
*/
|
|
599
686
|
eventLog?: EventLog;
|
|
600
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
|
+
|
|
601
695
|
messageStore: MessageStore;
|
|
602
696
|
dataStore: DataStore;
|
|
603
|
-
stateIndex: StateIndex;
|
|
604
697
|
resumableTaskStore: ResumableTaskStore;
|
|
605
698
|
};
|