@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
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { FilterUtility } from '../utils/filter.js';
|
|
2
|
+
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
3
|
+
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
4
|
+
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
5
|
+
import { SortDirection } from '../types/query-types.js';
|
|
6
|
+
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
7
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
8
|
+
import { fetchInitialRecordsWrite, fetchInitialRecordsWriteMessage, getInitialWrite } from '../interfaces/records-write-query.js';
|
|
9
|
+
/**
|
|
10
|
+
* The store-backed `ValidationStateReader` — the single place where validation-time state reads
|
|
11
|
+
* touch the `MessageStore`/`DataStore`.
|
|
12
|
+
*/
|
|
13
|
+
export class StoreValidationStateReader {
|
|
14
|
+
messageStore;
|
|
15
|
+
dataStore;
|
|
16
|
+
coreProtocols;
|
|
17
|
+
constructor(input) {
|
|
18
|
+
this.messageStore = input.messageStore;
|
|
19
|
+
this.dataStore = input.dataStore;
|
|
20
|
+
this.coreProtocols = input.coreProtocols;
|
|
21
|
+
}
|
|
22
|
+
/** @inheritdoc */
|
|
23
|
+
async fetchInitialRecordsWrite(tenant, recordId) {
|
|
24
|
+
return fetchInitialRecordsWrite(this.messageStore, tenant, recordId);
|
|
25
|
+
}
|
|
26
|
+
/** @inheritdoc */
|
|
27
|
+
async fetchInitialWrite(tenant, recordId) {
|
|
28
|
+
const query = {
|
|
29
|
+
interface: DwnInterfaceName.Records,
|
|
30
|
+
method: DwnMethodName.Write,
|
|
31
|
+
recordId: recordId
|
|
32
|
+
};
|
|
33
|
+
const { messages } = await this.messageStore.query(tenant, [query]);
|
|
34
|
+
if (messages.length === 0) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const initialWrite = await getInitialWrite(messages);
|
|
38
|
+
return initialWrite;
|
|
39
|
+
}
|
|
40
|
+
/** @inheritdoc */
|
|
41
|
+
async constructRecordChain(tenant, descendantRecordId) {
|
|
42
|
+
if (descendantRecordId === undefined) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const recordChain = [];
|
|
46
|
+
// keep walking up the chain from the inbound message's parent, until there is no more parent
|
|
47
|
+
let currentRecordId = descendantRecordId;
|
|
48
|
+
while (currentRecordId !== undefined) {
|
|
49
|
+
const initialWrite = await this.fetchInitialWrite(tenant, currentRecordId);
|
|
50
|
+
// RecordsWrite needed should be available since we perform necessary checks at the time of writes,
|
|
51
|
+
// eg. check the immediate parent in `verifyProtocolPathAndContextId` at the time of writing,
|
|
52
|
+
// so if this condition is triggered, it means there is an unexpected bug that caused an incomplete chain.
|
|
53
|
+
// We add additional defensive check here because returning an unexpected/incorrect record chain could lead to security vulnerabilities.
|
|
54
|
+
if (initialWrite === undefined) {
|
|
55
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain, `Unexpected error that should never trigger: no parent found with ID ${currentRecordId} when constructing record chain.`);
|
|
56
|
+
}
|
|
57
|
+
recordChain.push(initialWrite);
|
|
58
|
+
currentRecordId = initialWrite.descriptor.parentId;
|
|
59
|
+
}
|
|
60
|
+
return recordChain.reverse(); // root record first
|
|
61
|
+
}
|
|
62
|
+
/** @inheritdoc */
|
|
63
|
+
async fetchParentRecord(input) {
|
|
64
|
+
const { tenant, parentProtocolUri, parentId } = input;
|
|
65
|
+
const latestStateQuery = {
|
|
66
|
+
isLatestBaseState: true, // NOTE: this filter is critical, to ensure are are not returning a deleted parent
|
|
67
|
+
interface: DwnInterfaceName.Records,
|
|
68
|
+
method: DwnMethodName.Write,
|
|
69
|
+
protocol: parentProtocolUri,
|
|
70
|
+
recordId: parentId
|
|
71
|
+
};
|
|
72
|
+
const { messages: parentMessages } = await this.messageStore.query(tenant, [latestStateQuery]);
|
|
73
|
+
const latestParent = parentMessages[0];
|
|
74
|
+
if (latestParent !== undefined) {
|
|
75
|
+
return latestParent;
|
|
76
|
+
}
|
|
77
|
+
const initialWrite = await fetchInitialRecordsWriteMessage(this.messageStore, tenant, parentId);
|
|
78
|
+
if (initialWrite?.descriptor.protocol !== parentProtocolUri) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
if (await this.recordHasLocalTombstone(tenant, parentId)) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return initialWrite;
|
|
85
|
+
}
|
|
86
|
+
/** @inheritdoc */
|
|
87
|
+
async hasMatchingRoleRecord(input) {
|
|
88
|
+
const latestStateFilter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: true });
|
|
89
|
+
const { messages: matchingMessages } = await this.messageStore.query(input.tenant, [latestStateFilter]);
|
|
90
|
+
if (matchingMessages.length > 0) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
const anyWriteFilter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: false });
|
|
94
|
+
const { messages: candidates } = await this.messageStore.query(input.tenant, [anyWriteFilter]);
|
|
95
|
+
for (const candidate of candidates) {
|
|
96
|
+
if (!await RecordsWrite.isInitialWrite(candidate)) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!await this.recordHasLocalTombstone(input.tenant, candidate.recordId)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/** @inheritdoc */
|
|
106
|
+
async queryLatestRoleRecords(input) {
|
|
107
|
+
const filter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: true });
|
|
108
|
+
const { messages: matchingMessages } = await this.messageStore.query(input.tenant, [filter]);
|
|
109
|
+
return matchingMessages;
|
|
110
|
+
}
|
|
111
|
+
/** @inheritdoc */
|
|
112
|
+
async fetchGrant(tenant, permissionGrantId) {
|
|
113
|
+
const grantQuery = {
|
|
114
|
+
recordId: permissionGrantId,
|
|
115
|
+
isLatestBaseState: true
|
|
116
|
+
};
|
|
117
|
+
const { messages } = await this.messageStore.query(tenant, [grantQuery]);
|
|
118
|
+
const possibleGrantMessage = messages[0];
|
|
119
|
+
const dwnInterface = possibleGrantMessage?.descriptor.interface;
|
|
120
|
+
const dwnMethod = possibleGrantMessage?.descriptor.method;
|
|
121
|
+
if (dwnInterface !== DwnInterfaceName.Records ||
|
|
122
|
+
dwnMethod !== DwnMethodName.Write ||
|
|
123
|
+
possibleGrantMessage.descriptor.protocolPath !== PermissionsProtocol.grantPath) {
|
|
124
|
+
throw new DwnError(DwnErrorCode.GrantAuthorizationGrantMissing, `Could not find permission grant with record ID ${permissionGrantId}.`);
|
|
125
|
+
}
|
|
126
|
+
const permissionGrantMessage = possibleGrantMessage;
|
|
127
|
+
const permissionGrant = PermissionGrant.parse(permissionGrantMessage);
|
|
128
|
+
return permissionGrant;
|
|
129
|
+
}
|
|
130
|
+
/** @inheritdoc */
|
|
131
|
+
async fetchOldestGrantRevocation(tenant, permissionGrantId) {
|
|
132
|
+
const query = PermissionsProtocol.grantRevocationFilter(permissionGrantId);
|
|
133
|
+
const { messages } = await this.messageStore.query(tenant, [query], { messageTimestamp: SortDirection.Ascending }, { limit: 1 });
|
|
134
|
+
return messages[0];
|
|
135
|
+
}
|
|
136
|
+
/** @inheritdoc */
|
|
137
|
+
async fetchNewestRecordsWrite(tenant, recordId) {
|
|
138
|
+
return RecordsWrite.fetchNewestRecordsWrite(this.messageStore, tenant, recordId);
|
|
139
|
+
}
|
|
140
|
+
/** @inheritdoc */
|
|
141
|
+
async fetchProtocolDefinition(tenant, protocolUri, messageTimestamp) {
|
|
142
|
+
// if the protocol is a registered core protocol, return the definition directly without a store query
|
|
143
|
+
if (this.coreProtocols !== undefined) {
|
|
144
|
+
const coreDefinition = this.coreProtocols.getDefinition(protocolUri);
|
|
145
|
+
if (coreDefinition !== undefined) {
|
|
146
|
+
return coreDefinition;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// fetch the corresponding protocol definition
|
|
150
|
+
const query = {
|
|
151
|
+
interface: DwnInterfaceName.Protocols,
|
|
152
|
+
method: DwnMethodName.Configure,
|
|
153
|
+
protocol: protocolUri,
|
|
154
|
+
};
|
|
155
|
+
if (messageTimestamp === undefined) {
|
|
156
|
+
// default: return only the latest protocol definition
|
|
157
|
+
query.isLatestBaseState = true;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// temporal lookup: find the protocol definition active at the given timestamp
|
|
161
|
+
query.messageTimestamp = { lte: messageTimestamp };
|
|
162
|
+
}
|
|
163
|
+
let { messages: protocols } = await this.messageStore.query(tenant, [query], { messageTimestamp: SortDirection.Descending }, { limit: 1 });
|
|
164
|
+
if (protocols.length === 0 && messageTimestamp !== undefined) {
|
|
165
|
+
// A record can be authored before the protocol's earliest retained config yet still have
|
|
166
|
+
// been admitted under that config: admission order, not timestamp order, governed the
|
|
167
|
+
// source. When no config predates the record, reconstruct the historical answer from the
|
|
168
|
+
// earliest retained config. A protocol that is genuinely not installed still has zero
|
|
169
|
+
// configs and fails below.
|
|
170
|
+
({ messages: protocols } = await this.messageStore.query(tenant, [{
|
|
171
|
+
interface: DwnInterfaceName.Protocols,
|
|
172
|
+
method: DwnMethodName.Configure,
|
|
173
|
+
protocol: protocolUri,
|
|
174
|
+
}], { messageTimestamp: SortDirection.Ascending }, { limit: 1 }));
|
|
175
|
+
}
|
|
176
|
+
if (protocols.length === 0) {
|
|
177
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationProtocolNotFound, `unable to find protocol definition for ${protocolUri}`);
|
|
178
|
+
}
|
|
179
|
+
const protocolMessage = protocols[0];
|
|
180
|
+
return protocolMessage.descriptor.definition;
|
|
181
|
+
}
|
|
182
|
+
/** @inheritdoc */
|
|
183
|
+
async fetchLatestSquashRecordAtScope(input) {
|
|
184
|
+
const filter = {
|
|
185
|
+
interface: DwnInterfaceName.Records,
|
|
186
|
+
method: DwnMethodName.Write,
|
|
187
|
+
isLatestBaseState: true,
|
|
188
|
+
protocol: input.protocol,
|
|
189
|
+
protocolPath: input.protocolPath,
|
|
190
|
+
squash: true,
|
|
191
|
+
};
|
|
192
|
+
if (input.contextIdPrefix !== undefined) {
|
|
193
|
+
filter.contextId = FilterUtility.constructPrefixFilterAsRangeFilter(input.contextIdPrefix);
|
|
194
|
+
}
|
|
195
|
+
const { messages } = await this.messageStore.query(input.tenant, [filter], { messageTimestamp: SortDirection.Descending }, { limit: 1 });
|
|
196
|
+
return messages[0];
|
|
197
|
+
}
|
|
198
|
+
/** @inheritdoc */
|
|
199
|
+
async hasStoredData(tenant, recordId, dataCid) {
|
|
200
|
+
const dataStoreGetResult = await this.dataStore.get(tenant, recordId, dataCid);
|
|
201
|
+
return dataStoreGetResult !== undefined;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Checks whether a `RecordsDelete` tombstone for the given record is locally present.
|
|
205
|
+
* Retained initial writes can prove immutable parent/role facts, but a tombstone still wins.
|
|
206
|
+
*/
|
|
207
|
+
async recordHasLocalTombstone(tenant, recordId) {
|
|
208
|
+
const tombstoneQuery = {
|
|
209
|
+
interface: DwnInterfaceName.Records,
|
|
210
|
+
method: DwnMethodName.Delete,
|
|
211
|
+
recordId: recordId
|
|
212
|
+
};
|
|
213
|
+
const { messages } = await this.messageStore.query(tenant, [tombstoneQuery]);
|
|
214
|
+
return messages.length > 0;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Constructs the role-record selector filter shared by the invoked-role lookup and the
|
|
218
|
+
* duplicate-role-recipient uniqueness check.
|
|
219
|
+
*/
|
|
220
|
+
static constructRoleRecordFilter(input) {
|
|
221
|
+
const filter = {
|
|
222
|
+
interface: DwnInterfaceName.Records,
|
|
223
|
+
method: DwnMethodName.Write,
|
|
224
|
+
protocol: input.protocol,
|
|
225
|
+
protocolPath: input.protocolPath,
|
|
226
|
+
recipient: input.recipient,
|
|
227
|
+
};
|
|
228
|
+
if (input.latestStateOnly) {
|
|
229
|
+
filter.isLatestBaseState = true;
|
|
230
|
+
}
|
|
231
|
+
if (input.contextIdPrefix !== undefined) {
|
|
232
|
+
filter.contextId = FilterUtility.constructPrefixFilterAsRangeFilter(input.contextIdPrefix);
|
|
233
|
+
}
|
|
234
|
+
return filter;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=validation-state-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-state-reader.js","sourceRoot":"","sources":["../../../../src/core/validation-state-reader.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/src/dwn.js
CHANGED
|
@@ -1,35 +1,44 @@
|
|
|
1
1
|
import { AllowAllTenantGate } from './core/tenant-gate.js';
|
|
2
|
+
import { Cid } from './utils/cid.js';
|
|
2
3
|
import { CoreProtocolRegistry } from './core/core-protocol.js';
|
|
4
|
+
import { DataStream } from './utils/data-stream.js';
|
|
5
|
+
import { DwnConstant } from './core/dwn-constant.js';
|
|
3
6
|
import { Message } from './core/message.js';
|
|
4
7
|
import { messageReplyFromError } from './core/message-reply.js';
|
|
8
|
+
import { MessagesQueryHandler } from './handlers/messages-query.js';
|
|
5
9
|
import { MessagesReadHandler } from './handlers/messages-read.js';
|
|
6
10
|
import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
|
|
7
|
-
import { MessagesSyncHandler } from './handlers/messages-sync.js';
|
|
8
11
|
import { PermissionsProtocol } from './protocols/permissions.js';
|
|
9
12
|
import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
|
|
10
13
|
import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
|
|
14
|
+
import { Records } from './utils/records.js';
|
|
11
15
|
import { RecordsCountHandler } from './handlers/records-count.js';
|
|
16
|
+
import { RecordsDelete } from './interfaces/records-delete.js';
|
|
12
17
|
import { RecordsDeleteHandler } from './handlers/records-delete.js';
|
|
13
18
|
import { RecordsQueryHandler } from './handlers/records-query.js';
|
|
14
19
|
import { RecordsReadHandler } from './handlers/records-read.js';
|
|
15
20
|
import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
|
|
21
|
+
import { RecordsWrite } from './interfaces/records-write.js';
|
|
16
22
|
import { RecordsWriteHandler } from './handlers/records-write.js';
|
|
17
23
|
import { ResumableTaskManager } from './core/resumable-task-manager.js';
|
|
18
24
|
import { StorageController } from './store/storage-controller.js';
|
|
25
|
+
import { StoreValidationStateReader } from './core/validation-state-reader.js';
|
|
19
26
|
import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
|
|
27
|
+
import { DwnError, DwnErrorCode } from './core/dwn-error.js';
|
|
20
28
|
import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
|
|
29
|
+
import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
|
|
21
30
|
export class Dwn {
|
|
22
31
|
methodHandlers;
|
|
23
32
|
didResolver;
|
|
24
33
|
messageStore;
|
|
25
34
|
dataStore;
|
|
26
35
|
resumableTaskStore;
|
|
27
|
-
stateIndex;
|
|
28
36
|
tenantGate;
|
|
29
37
|
eventLog;
|
|
30
38
|
storageController;
|
|
31
39
|
resumableTaskManager;
|
|
32
40
|
_coreProtocols;
|
|
41
|
+
validationStateReader;
|
|
33
42
|
/** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
|
|
34
43
|
ownsResolver;
|
|
35
44
|
constructor(config) {
|
|
@@ -39,33 +48,37 @@ export class Dwn {
|
|
|
39
48
|
this.messageStore = config.messageStore;
|
|
40
49
|
this.dataStore = config.dataStore;
|
|
41
50
|
this.resumableTaskStore = config.resumableTaskStore;
|
|
42
|
-
|
|
51
|
+
// Initialize the core protocol registry with built-in system protocols.
|
|
52
|
+
this._coreProtocols = new CoreProtocolRegistry();
|
|
53
|
+
this._coreProtocols.register(new PermissionsProtocol());
|
|
54
|
+
// The single narrow surface through which validation logic reads state (replay-basis closure).
|
|
55
|
+
const validationStateReader = new StoreValidationStateReader({
|
|
56
|
+
messageStore: this.messageStore,
|
|
57
|
+
dataStore: this.dataStore,
|
|
58
|
+
coreProtocols: this._coreProtocols,
|
|
59
|
+
});
|
|
60
|
+
this.validationStateReader = config.instrumentValidationStateReader?.(validationStateReader) ?? validationStateReader;
|
|
43
61
|
this.eventLog = config.eventLog;
|
|
44
62
|
this.storageController = new StorageController({
|
|
45
63
|
messageStore: this.messageStore,
|
|
46
64
|
dataStore: this.dataStore,
|
|
47
|
-
stateIndex: this.stateIndex,
|
|
48
|
-
eventLog: this.eventLog
|
|
49
65
|
});
|
|
50
66
|
this.resumableTaskManager = new ResumableTaskManager(config.resumableTaskStore, this.storageController);
|
|
51
|
-
// Initialize the core protocol registry with built-in system protocols.
|
|
52
|
-
this._coreProtocols = new CoreProtocolRegistry();
|
|
53
|
-
this._coreProtocols.register(new PermissionsProtocol());
|
|
54
67
|
// Build the shared dependency bag once; every handler receives the same object
|
|
55
68
|
// and accesses only the dependencies it needs.
|
|
56
69
|
const deps = {
|
|
57
70
|
didResolver: this.didResolver,
|
|
58
71
|
messageStore: this.messageStore,
|
|
72
|
+
validationStateReader: this.validationStateReader,
|
|
59
73
|
dataStore: this.dataStore,
|
|
60
|
-
stateIndex: this.stateIndex,
|
|
61
74
|
resumableTaskManager: this.resumableTaskManager,
|
|
62
75
|
coreProtocols: this._coreProtocols,
|
|
63
76
|
eventLog: this.eventLog,
|
|
64
77
|
};
|
|
65
78
|
this.methodHandlers = {
|
|
66
79
|
[DwnInterfaceName.Messages + DwnMethodName.Read]: new MessagesReadHandler(deps),
|
|
80
|
+
[DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler(deps),
|
|
67
81
|
[DwnInterfaceName.Messages + DwnMethodName.Subscribe]: new MessagesSubscribeHandler(deps),
|
|
68
|
-
[DwnInterfaceName.Messages + DwnMethodName.Sync]: new MessagesSyncHandler(deps),
|
|
69
82
|
[DwnInterfaceName.Protocols + DwnMethodName.Configure]: new ProtocolsConfigureHandler(deps),
|
|
70
83
|
[DwnInterfaceName.Protocols + DwnMethodName.Query]: new ProtocolsQueryHandler(deps),
|
|
71
84
|
[DwnInterfaceName.Records + DwnMethodName.Count]: new RecordsCountHandler(deps),
|
|
@@ -107,7 +120,6 @@ export class Dwn {
|
|
|
107
120
|
await this.messageStore.open();
|
|
108
121
|
await this.dataStore.open();
|
|
109
122
|
await this.resumableTaskStore.open();
|
|
110
|
-
await this.stateIndex.open();
|
|
111
123
|
await this.eventLog?.open();
|
|
112
124
|
await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
|
|
113
125
|
}
|
|
@@ -116,7 +128,6 @@ export class Dwn {
|
|
|
116
128
|
await this.messageStore.close();
|
|
117
129
|
await this.dataStore.close();
|
|
118
130
|
await this.resumableTaskStore.close();
|
|
119
|
-
await this.stateIndex.close();
|
|
120
131
|
// Close the resolver's cache if the DWN owns it.
|
|
121
132
|
const lifecycleResolver = this.didResolver;
|
|
122
133
|
if (this.ownsResolver && typeof lifecycleResolver.close === 'function') {
|
|
@@ -133,15 +144,14 @@ export class Dwn {
|
|
|
133
144
|
}
|
|
134
145
|
/**
|
|
135
146
|
* Returns the internal storage components for advanced operations that
|
|
136
|
-
* cannot be expressed through the standard `processMessage()` pipeline
|
|
137
|
-
* (e.g., owner-upgrade of externally authored encrypted records).
|
|
147
|
+
* cannot be expressed through the standard `processMessage()` pipeline.
|
|
138
148
|
*
|
|
139
149
|
* Callers are responsible for maintaining consistency across stores.
|
|
140
150
|
*/
|
|
141
151
|
get storage() {
|
|
142
152
|
return {
|
|
153
|
+
dataStore: this.dataStore,
|
|
143
154
|
messageStore: this.messageStore,
|
|
144
|
-
stateIndex: this.stateIndex,
|
|
145
155
|
eventLog: this.eventLog,
|
|
146
156
|
};
|
|
147
157
|
}
|
|
@@ -156,10 +166,245 @@ export class Dwn {
|
|
|
156
166
|
tenant,
|
|
157
167
|
message: rawMessage,
|
|
158
168
|
dataStream,
|
|
159
|
-
subscriptionHandler
|
|
169
|
+
subscriptionHandler,
|
|
160
170
|
});
|
|
161
171
|
return methodHandlerReply;
|
|
162
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Applies a message obtained through replication and returns a structured
|
|
175
|
+
* outcome instead of an HTTP-like handler status. Normal authoring still
|
|
176
|
+
* uses `processMessage`; sync uses this entry point so missing local
|
|
177
|
+
* dependencies can be fetched and retried without treating the replicated
|
|
178
|
+
* message as permanently invalid.
|
|
179
|
+
*/
|
|
180
|
+
async applyReplicatedMessage(tenant, rawMessage, options = {}) {
|
|
181
|
+
const tenantError = await this.validateTenant(tenant);
|
|
182
|
+
if (tenantError !== undefined) {
|
|
183
|
+
return { kind: 'Deferred', reason: 'tenant-inactive' };
|
|
184
|
+
}
|
|
185
|
+
const integrityError = await this.validateMessageIntegrity(rawMessage);
|
|
186
|
+
if (integrityError !== undefined) {
|
|
187
|
+
return { kind: 'Invalid', reason: integrityError.status.detail };
|
|
188
|
+
}
|
|
189
|
+
if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
|
|
190
|
+
return { kind: 'Duplicate' };
|
|
191
|
+
}
|
|
192
|
+
const reply = await this.processMessage(tenant, rawMessage, options);
|
|
193
|
+
const replicatedWriteBeatenByDeleteResult = await this.storeReplicatedWriteBeatenByDelete(tenant, rawMessage, reply, options);
|
|
194
|
+
if (replicatedWriteBeatenByDeleteResult !== undefined) {
|
|
195
|
+
return replicatedWriteBeatenByDeleteResult;
|
|
196
|
+
}
|
|
197
|
+
const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
|
|
198
|
+
const missingAncestorRecordIds = await this.getReplicationApplyMissingAncestors(tenant, rawMessage, reply);
|
|
199
|
+
return replicationApplyResultFromReply(rawMessage, reply, { protocolDefinition, missingAncestorRecordIds });
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Computes the layer-batched missing-ancestor set for a replicated message that failed on a
|
|
203
|
+
* missing ancestor (immediate parent or record-chain construction), so the resulting
|
|
204
|
+
* `Incomplete` names every locally-absent ancestor at once. Returns `undefined`
|
|
205
|
+
* (single-ancestor emission) when the set cannot be computed.
|
|
206
|
+
*/
|
|
207
|
+
async getReplicationApplyMissingAncestors(tenant, message, reply) {
|
|
208
|
+
try {
|
|
209
|
+
return await missingAncestorRecordIdsFromReply(tenant, message, reply, this.validationStateReader);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async storeReplicatedWriteBeatenByDelete(tenant, message, reply, options) {
|
|
216
|
+
const detail = reply.status.detail ?? '';
|
|
217
|
+
if (!detail.startsWith(`${DwnErrorCode.RecordsWriteNotAllowedAfterDelete}:`) || !Records.isRecordsWrite(message)) {
|
|
218
|
+
return undefined;
|
|
219
|
+
}
|
|
220
|
+
const query = {
|
|
221
|
+
interface: DwnInterfaceName.Records,
|
|
222
|
+
recordId: message.recordId,
|
|
223
|
+
};
|
|
224
|
+
const { messages: existingMessages } = await this.messageStore.query(tenant, [query]);
|
|
225
|
+
const initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
|
|
226
|
+
const existingDelete = await Records.getNewestRecordsDelete(existingMessages);
|
|
227
|
+
if (existingDelete === undefined) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
const validationReply = await this.validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options);
|
|
231
|
+
if (validationReply !== undefined) {
|
|
232
|
+
return replicationApplyResultFromReply(message, validationReply);
|
|
233
|
+
}
|
|
234
|
+
const recordsWrite = await RecordsWrite.parse(message);
|
|
235
|
+
const storedWriteMessage = { ...message };
|
|
236
|
+
delete storedWriteMessage.encodedData;
|
|
237
|
+
const recordsWriteIndexes = await recordsWrite.constructIndexes(false);
|
|
238
|
+
await this.messageStore.put(tenant, storedWriteMessage, recordsWriteIndexes);
|
|
239
|
+
const recordsDelete = await RecordsDelete.parse(existingDelete);
|
|
240
|
+
const visibilitySourceWrite = await Records.getNewestRecordsWrite([...existingMessages, storedWriteMessage]) ?? initialWrite;
|
|
241
|
+
const recordsDeleteIndexes = recordsDelete.constructIndexes(initialWrite, visibilitySourceWrite);
|
|
242
|
+
const recordsDeleteCid = await Message.getCid(existingDelete);
|
|
243
|
+
await this.messageStore.updateIndexes(tenant, recordsDeleteCid, recordsDeleteIndexes);
|
|
244
|
+
return { kind: 'Superseded' };
|
|
245
|
+
}
|
|
246
|
+
async validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options) {
|
|
247
|
+
try {
|
|
248
|
+
await this.validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options);
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
const statusCode = error instanceof DwnError
|
|
253
|
+
? this._coreProtocols.mapErrorToStatusCode(error.code) ?? 400
|
|
254
|
+
: 400;
|
|
255
|
+
return messageReplyFromError(error, statusCode);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options) {
|
|
259
|
+
const coreProtocol = message.descriptor.protocol === undefined
|
|
260
|
+
? undefined
|
|
261
|
+
: this._coreProtocols.get(message.descriptor.protocol);
|
|
262
|
+
if (coreProtocol?.preProcessWrite !== undefined) {
|
|
263
|
+
await coreProtocol.preProcessWrite(tenant, message, this.validationStateReader);
|
|
264
|
+
}
|
|
265
|
+
if (options.dataStream !== undefined) {
|
|
266
|
+
await Dwn.validateReplicatedWriteBeatenByDeleteDataStream(message, options.dataStream, coreProtocol);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (await RecordsWrite.isInitialWrite(message)) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
await this.validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages);
|
|
273
|
+
}
|
|
274
|
+
static async validateReplicatedWriteBeatenByDeleteDataStream(message, dataStream, coreProtocol) {
|
|
275
|
+
if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
276
|
+
const dataBytes = await DataStream.toBytes(dataStream);
|
|
277
|
+
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
278
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
279
|
+
if (coreProtocol?.validateRecord !== undefined) {
|
|
280
|
+
coreProtocol.validateRecord(message, dataBytes);
|
|
281
|
+
}
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const [dataCidStream, dataSizeStream] = DataStream.duplicateDataStream(dataStream, 2);
|
|
285
|
+
const [dataCid, dataSize] = await Promise.all([
|
|
286
|
+
Cid.computeDagPbCidFromStream(dataCidStream),
|
|
287
|
+
Dwn.getDataStreamByteLength(dataSizeStream),
|
|
288
|
+
]);
|
|
289
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataSize);
|
|
290
|
+
}
|
|
291
|
+
async validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages) {
|
|
292
|
+
const newestExistingWrite = await Records.getNewestRecordsWrite(existingMessages);
|
|
293
|
+
if (newestExistingWrite === undefined) {
|
|
294
|
+
throw new DwnError(DwnErrorCode.RecordsWriteGetInitialWriteNotFound, `initial write is missing for record ${message.recordId}`);
|
|
295
|
+
}
|
|
296
|
+
const { dataCid, dataSize } = message.descriptor;
|
|
297
|
+
RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
|
|
298
|
+
if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
299
|
+
const newestExistingWriteWithData = newestExistingWrite;
|
|
300
|
+
if (newestExistingWriteWithData.encodedData === undefined) {
|
|
301
|
+
throw new DwnError(DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious, `No dataStream was provided and unable to get data from previous message`);
|
|
302
|
+
}
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const priorDataExists = await this.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, dataCid);
|
|
306
|
+
if (!priorDataExists) {
|
|
307
|
+
throw new DwnError(DwnErrorCode.RecordsWriteMissingDataInPrevious, `No dataStream was provided and unable to get data from previous message`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
static async getDataStreamByteLength(dataStream) {
|
|
311
|
+
let byteLength = 0;
|
|
312
|
+
for await (const chunk of DataStream.asAsyncIterable(dataStream)) {
|
|
313
|
+
byteLength += chunk.length;
|
|
314
|
+
}
|
|
315
|
+
return byteLength;
|
|
316
|
+
}
|
|
317
|
+
async getReplicationApplyProtocolDefinition(tenant, message, reply) {
|
|
318
|
+
const detail = reply.status.detail ?? '';
|
|
319
|
+
if (!detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`)) {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
|
|
323
|
+
if (lookup === undefined) {
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
return await this.validationStateReader.fetchProtocolDefinition(tenant, lookup.protocol, lookup.messageTimestamp);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
static getReplicationApplyProtocolDefinitionLookup(message) {
|
|
334
|
+
if (Dwn.isRecordsWriteMessage(message)) {
|
|
335
|
+
return {
|
|
336
|
+
protocol: message.descriptor.protocol,
|
|
337
|
+
messageTimestamp: message.descriptor.messageTimestamp,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
const protocol = Dwn.getMessageProtocolForReplicationApply(message);
|
|
341
|
+
return protocol === undefined ? undefined : { protocol };
|
|
342
|
+
}
|
|
343
|
+
static getMessageProtocolForReplicationApply(message) {
|
|
344
|
+
const descriptor = message.descriptor;
|
|
345
|
+
if (typeof descriptor.protocol === 'string') {
|
|
346
|
+
return descriptor.protocol;
|
|
347
|
+
}
|
|
348
|
+
if (typeof descriptor.filter?.protocol === 'string') {
|
|
349
|
+
return descriptor.filter.protocol;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
static isRecordsWriteMessage(message) {
|
|
353
|
+
return message.descriptor.interface === DwnInterfaceName.Records &&
|
|
354
|
+
message.descriptor.method === DwnMethodName.Write;
|
|
355
|
+
}
|
|
356
|
+
async replicatedMessageAlreadyStored(tenant, message) {
|
|
357
|
+
const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
|
|
358
|
+
if (existingMessages.length === 0) {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
const incomingCid = await Message.getCid(message);
|
|
362
|
+
for (const existing of existingMessages) {
|
|
363
|
+
if (await Message.getCid(existing) !== incomingCid) {
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
async getExistingMessagesForReplicationDedup(tenant, message) {
|
|
371
|
+
const { descriptor } = message;
|
|
372
|
+
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
|
|
373
|
+
const recordId = message.recordId;
|
|
374
|
+
if (typeof recordId !== 'string') {
|
|
375
|
+
return [];
|
|
376
|
+
}
|
|
377
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
378
|
+
interface: DwnInterfaceName.Records,
|
|
379
|
+
recordId,
|
|
380
|
+
}]);
|
|
381
|
+
return messages;
|
|
382
|
+
}
|
|
383
|
+
if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
|
|
384
|
+
const recordId = descriptor.recordId;
|
|
385
|
+
if (typeof recordId !== 'string') {
|
|
386
|
+
return [];
|
|
387
|
+
}
|
|
388
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
389
|
+
interface: DwnInterfaceName.Records,
|
|
390
|
+
recordId,
|
|
391
|
+
}]);
|
|
392
|
+
return messages;
|
|
393
|
+
}
|
|
394
|
+
if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
|
|
395
|
+
const protocol = descriptor.definition?.protocol;
|
|
396
|
+
if (typeof protocol !== 'string') {
|
|
397
|
+
return [];
|
|
398
|
+
}
|
|
399
|
+
const { messages } = await this.messageStore.query(tenant, [{
|
|
400
|
+
interface: DwnInterfaceName.Protocols,
|
|
401
|
+
method: DwnMethodName.Configure,
|
|
402
|
+
protocol,
|
|
403
|
+
}]);
|
|
404
|
+
return messages;
|
|
405
|
+
}
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
163
408
|
/**
|
|
164
409
|
* Checks tenant gate to see if tenant is allowed.
|
|
165
410
|
* @param tenant The tenant DID to route the given message to.
|