@enbox/dwn-sdk-js 0.4.0 → 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 +8 -8
- 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 +30 -68
- 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 +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 +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/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 +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 +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/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/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 +39 -96
- 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 +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 -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/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
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
1
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
3
|
-
import type {
|
|
2
|
+
import type { ProgressToken } from '../types/subscriptions.js';
|
|
4
3
|
import type { RecordsDeleteMessage } from '../types/records-types.js';
|
|
4
|
+
import type { RecordsWrite } from '../interfaces/records-write.js';
|
|
5
5
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
6
6
|
|
|
7
7
|
import { authenticate } from '../core/auth.js';
|
|
8
8
|
import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
9
9
|
import { Message } from '../core/message.js';
|
|
10
10
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
11
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
12
11
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
13
12
|
import { Records } from '../utils/records.js';
|
|
14
13
|
import { RecordsDelete } from '../interfaces/records-delete.js';
|
|
15
14
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
16
|
-
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
17
15
|
import { ResumableTaskName } from '../core/resumable-task-manager.js';
|
|
18
16
|
|
|
19
17
|
export class RecordsDeleteHandler implements MethodHandler {
|
|
@@ -22,8 +20,8 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
22
20
|
|
|
23
21
|
public async handle({
|
|
24
22
|
tenant,
|
|
25
|
-
message
|
|
26
|
-
}: { tenant: string, message: RecordsDeleteMessage}): Promise<GenericMessageReply> {
|
|
23
|
+
message,
|
|
24
|
+
}: { tenant: string, message: RecordsDeleteMessage }): Promise<GenericMessageReply> {
|
|
27
25
|
let recordsDelete: RecordsDelete;
|
|
28
26
|
try {
|
|
29
27
|
recordsDelete = await RecordsDelete.parse(message);
|
|
@@ -48,15 +46,20 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
48
46
|
// find which message is the newest, and if the incoming message is the newest
|
|
49
47
|
const newestExistingMessage = await Message.getNewestMessage(existingMessages);
|
|
50
48
|
|
|
51
|
-
if (
|
|
49
|
+
if (newestExistingMessage === undefined) {
|
|
52
50
|
return {
|
|
53
51
|
status: { code: 404, detail: 'Not Found' }
|
|
54
52
|
};
|
|
55
53
|
}
|
|
56
54
|
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
// Tombstone lattice: an incoming tombstone displaces ANY RecordsWrite, even a newer one — the
|
|
56
|
+
// write handler already rejects writes-after-delete regardless of timestamp, so this is the
|
|
57
|
+
// only rule that makes both arrival orders reach the same terminal state. Among competing
|
|
58
|
+
// tombstones one canonical winner stands on every replica: a prune beats a plain delete
|
|
59
|
+
// regardless of timestamp (the cascade is a side effect that must run everywhere), and within
|
|
60
|
+
// the same class the newest (messageTimestamp, then CID) wins. A beaten delete is a Conflict
|
|
61
|
+
// no-op; replication classifies the 409 as Superseded.
|
|
62
|
+
if (await Records.isDeleteBeatenByExistingTombstone(message, newestExistingMessage)) {
|
|
60
63
|
return {
|
|
61
64
|
status: { code: 409, detail: 'Conflict' }
|
|
62
65
|
};
|
|
@@ -67,26 +70,26 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
67
70
|
// NOTE: We need a RecordsWrite (doesn't have to be initial) to access the immutable properties for delete processing,
|
|
68
71
|
// but if the latest record state is a RecordsDelete (ie. when we are pruning a non-prune delete),
|
|
69
72
|
// we'd need to use the initial write because RecordsDelete does not contain the immutable properties needed for processing.
|
|
70
|
-
const initialWrite = await
|
|
73
|
+
const initialWrite = await this.deps.validationStateReader.fetchInitialRecordsWrite(tenant, message.descriptor.recordId);
|
|
71
74
|
|
|
72
|
-
await
|
|
75
|
+
await this.authorizeRecordsDelete(
|
|
73
76
|
tenant,
|
|
74
77
|
recordsDelete,
|
|
75
78
|
initialWrite!,
|
|
76
|
-
this.deps.messageStore,
|
|
77
|
-
this.deps.coreProtocols,
|
|
78
79
|
);
|
|
80
|
+
|
|
79
81
|
} catch (e) {
|
|
80
82
|
return messageReplyFromError(e, 401);
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
await this.deps.resumableTaskManager!.run({
|
|
85
|
+
const taskResult = await this.deps.resumableTaskManager!.run<{ position?: ProgressToken }>({
|
|
84
86
|
name : ResumableTaskName.RecordsDelete,
|
|
85
87
|
data : { tenant, message }
|
|
86
88
|
});
|
|
87
89
|
|
|
88
90
|
const messageReply = {
|
|
89
|
-
status: { code: 202, detail: 'Accepted' }
|
|
91
|
+
status : { code: 202, detail: 'Accepted' },
|
|
92
|
+
position : taskResult.position,
|
|
90
93
|
};
|
|
91
94
|
return messageReply;
|
|
92
95
|
};
|
|
@@ -96,33 +99,32 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
96
99
|
*
|
|
97
100
|
* @param recordsWrite A RecordsWrite of the record to be deleted.
|
|
98
101
|
*/
|
|
99
|
-
private
|
|
102
|
+
private async authorizeRecordsDelete(
|
|
100
103
|
tenant: string,
|
|
101
104
|
recordsDelete: RecordsDelete,
|
|
102
105
|
recordsWrite: RecordsWrite,
|
|
103
|
-
messageStore: MessageStore,
|
|
104
|
-
coreProtocols?: CoreProtocolRegistry,
|
|
105
106
|
): Promise<void> {
|
|
106
107
|
|
|
107
108
|
if (Message.isSignedByAuthorDelegate(recordsDelete.message)) {
|
|
108
|
-
await recordsDelete.authorizeDelegate(recordsWrite.message,
|
|
109
|
+
await recordsDelete.authorizeDelegate(recordsWrite.message, this.deps.validationStateReader);
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
if (recordsDelete.author === tenant) {
|
|
112
113
|
return;
|
|
113
114
|
} else if (recordsDelete.author !== undefined && Message.getPermissionGrantId(recordsDelete.signaturePayload!) !== undefined) {
|
|
114
115
|
const permissionGrantId = Message.getPermissionGrantId(recordsDelete.signaturePayload!)!;
|
|
115
|
-
const permissionGrant = await
|
|
116
|
+
const permissionGrant = await this.deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
116
117
|
await RecordsGrantAuthorization.authorizeDelete({
|
|
117
|
-
recordsDeleteMessage
|
|
118
|
-
recordsWriteToDelete
|
|
119
|
-
expectedGrantor
|
|
120
|
-
expectedGrantee
|
|
118
|
+
recordsDeleteMessage : recordsDelete.message,
|
|
119
|
+
recordsWriteToDelete : recordsWrite.message,
|
|
120
|
+
expectedGrantor : tenant,
|
|
121
|
+
expectedGrantee : recordsDelete.author,
|
|
121
122
|
permissionGrant,
|
|
122
|
-
|
|
123
|
+
validationStateReader : this.deps.validationStateReader,
|
|
123
124
|
});
|
|
124
125
|
} else {
|
|
125
|
-
await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite,
|
|
126
|
+
await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite, this.deps.validationStateReader);
|
|
126
127
|
}
|
|
127
128
|
}
|
|
129
|
+
|
|
128
130
|
};
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
|
-
import type { MessageStore } from '../types//message-store.js';
|
|
3
1
|
import type { Filter, PaginationCursor } from '../types/query-types.js';
|
|
4
2
|
import type { GenericMessage, MessageSort } from '../types/message-types.js';
|
|
5
3
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
@@ -9,8 +7,8 @@ import { authenticate } from '../core/auth.js';
|
|
|
9
7
|
import { DateSort } from '../types/records-types.js';
|
|
10
8
|
import { Message } from '../core/message.js';
|
|
11
9
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
12
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
13
10
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
11
|
+
import { queryRecordsWithRecordLimitOccupancy } from '../utils/record-limit-occupancy.js';
|
|
14
12
|
import { Records } from '../utils/records.js';
|
|
15
13
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
16
14
|
import { RecordsQuery } from '../interfaces/records-query.js';
|
|
@@ -24,7 +22,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
24
22
|
|
|
25
23
|
public async handle({
|
|
26
24
|
tenant,
|
|
27
|
-
message
|
|
25
|
+
message,
|
|
28
26
|
}: {tenant: string, message: RecordsQueryMessage}): Promise<RecordsQueryReply> {
|
|
29
27
|
let recordsQuery: RecordsQuery;
|
|
30
28
|
try {
|
|
@@ -45,7 +43,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
45
43
|
try {
|
|
46
44
|
await authenticate(message.authorization!, this.deps.didResolver);
|
|
47
45
|
|
|
48
|
-
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps
|
|
46
|
+
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps);
|
|
49
47
|
} catch (e) {
|
|
50
48
|
return messageReplyFromError(e, 401);
|
|
51
49
|
}
|
|
@@ -124,7 +122,15 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
124
122
|
};
|
|
125
123
|
|
|
126
124
|
const messageSort = this.convertDateSort(dateSort);
|
|
127
|
-
return
|
|
125
|
+
return queryRecordsWithRecordLimitOccupancy({
|
|
126
|
+
messageStore : this.deps.messageStore,
|
|
127
|
+
validationStateReader : this.deps.validationStateReader,
|
|
128
|
+
tenant,
|
|
129
|
+
filters : [queryFilter],
|
|
130
|
+
messageSort,
|
|
131
|
+
pagination,
|
|
132
|
+
messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
|
|
133
|
+
});
|
|
128
134
|
}
|
|
129
135
|
|
|
130
136
|
/**
|
|
@@ -174,7 +180,15 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
174
180
|
}
|
|
175
181
|
|
|
176
182
|
const messageSort = this.convertDateSort(dateSort);
|
|
177
|
-
return
|
|
183
|
+
return queryRecordsWithRecordLimitOccupancy({
|
|
184
|
+
messageStore : this.deps.messageStore,
|
|
185
|
+
validationStateReader : this.deps.validationStateReader,
|
|
186
|
+
tenant,
|
|
187
|
+
filters,
|
|
188
|
+
messageSort,
|
|
189
|
+
pagination,
|
|
190
|
+
messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
|
|
191
|
+
});
|
|
178
192
|
}
|
|
179
193
|
|
|
180
194
|
/**
|
|
@@ -186,7 +200,15 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
186
200
|
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
187
201
|
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
188
202
|
const messageSort = this.convertDateSort(dateSort);
|
|
189
|
-
return
|
|
203
|
+
return queryRecordsWithRecordLimitOccupancy({
|
|
204
|
+
messageStore : this.deps.messageStore,
|
|
205
|
+
validationStateReader : this.deps.validationStateReader,
|
|
206
|
+
tenant,
|
|
207
|
+
filters : [filter],
|
|
208
|
+
messageSort,
|
|
209
|
+
pagination,
|
|
210
|
+
messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
|
|
211
|
+
});
|
|
190
212
|
}
|
|
191
213
|
|
|
192
214
|
private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
|
|
@@ -268,23 +290,22 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
268
290
|
private static async authorizeRecordsQuery(
|
|
269
291
|
tenant: string,
|
|
270
292
|
recordsQuery: RecordsQuery,
|
|
271
|
-
|
|
272
|
-
coreProtocols?: CoreProtocolRegistry,
|
|
293
|
+
deps: HandlerDependencies,
|
|
273
294
|
): Promise<void> {
|
|
274
295
|
|
|
275
296
|
if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
|
|
276
|
-
await recordsQuery.authorizeDelegate(
|
|
297
|
+
await recordsQuery.authorizeDelegate(deps.validationStateReader);
|
|
277
298
|
}
|
|
278
299
|
|
|
279
300
|
const permissionGrantId = Message.getPermissionGrantId(recordsQuery.signaturePayload!);
|
|
280
301
|
if (permissionGrantId !== undefined) {
|
|
281
|
-
const permissionGrant = await
|
|
302
|
+
const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
282
303
|
await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
|
|
283
|
-
incomingMessage
|
|
284
|
-
expectedGrantor
|
|
285
|
-
expectedGrantee
|
|
304
|
+
incomingMessage : recordsQuery.message,
|
|
305
|
+
expectedGrantor : tenant,
|
|
306
|
+
expectedGrantee : recordsQuery.author!,
|
|
286
307
|
permissionGrant,
|
|
287
|
-
|
|
308
|
+
validationStateReader : deps.validationStateReader,
|
|
288
309
|
});
|
|
289
310
|
return;
|
|
290
311
|
}
|
|
@@ -293,7 +314,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
293
314
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
294
315
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
295
316
|
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload!)) {
|
|
296
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery,
|
|
317
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, deps.validationStateReader);
|
|
297
318
|
}
|
|
298
319
|
}
|
|
299
320
|
}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
1
|
import type { Filter } from '../types/query-types.js';
|
|
3
|
-
import type { MessageStore } from '../types//message-store.js';
|
|
4
2
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
3
|
import type { RecordsDeleteMessage, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply } from '../types/records-types.js';
|
|
6
4
|
|
|
7
5
|
import { authenticate } from '../core/auth.js';
|
|
8
6
|
import { DataStream } from '../utils/data-stream.js';
|
|
9
7
|
import { Encoder } from '../utils/encoder.js';
|
|
8
|
+
import { isRecordLimitOccupant } from '../utils/record-limit-occupancy.js';
|
|
10
9
|
import { Message } from '../core/message.js';
|
|
11
10
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
12
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
13
11
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
14
12
|
import { Records } from '../utils/records.js';
|
|
15
13
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
@@ -24,7 +22,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
24
22
|
|
|
25
23
|
public async handle({
|
|
26
24
|
tenant,
|
|
27
|
-
message
|
|
25
|
+
message,
|
|
28
26
|
}: { tenant: string, message: RecordsReadMessage }): Promise<RecordsReadReply> {
|
|
29
27
|
|
|
30
28
|
let recordsRead: RecordsRead;
|
|
@@ -51,7 +49,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
51
49
|
...Records.convertFilter(message.descriptor.filter)
|
|
52
50
|
};
|
|
53
51
|
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
54
|
-
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [
|
|
52
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [query], messageSort, { limit: 1 });
|
|
55
53
|
if (existingMessages.length === 0) {
|
|
56
54
|
return {
|
|
57
55
|
status: { code: 404, detail: 'Not Found' }
|
|
@@ -60,55 +58,29 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
60
58
|
|
|
61
59
|
const matchedMessage = existingMessages[0];
|
|
62
60
|
|
|
63
|
-
// If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
|
|
64
|
-
// (for parity with the live-record path which authorizes against the latest write),
|
|
65
|
-
// then return 404 with both the RecordsDelete and the initial RecordsWrite.
|
|
66
61
|
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
|
|
71
|
-
if (initialWrite === undefined) {
|
|
72
|
-
return messageReplyFromError(new DwnError(
|
|
73
|
-
DwnErrorCode.RecordsReadInitialWriteNotFound,
|
|
74
|
-
'initial write for deleted record not found'
|
|
75
|
-
), 400);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Authorize against the newest RecordsWrite so that mutable properties like `published`
|
|
79
|
-
// reflect the record's state at the time of deletion, not just the initial write.
|
|
80
|
-
let newestWrite;
|
|
81
|
-
try {
|
|
82
|
-
newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
|
|
83
|
-
} catch {
|
|
84
|
-
// If newest write is not found (should not happen since initial write exists),
|
|
85
|
-
// fall back to the initial write for authorization.
|
|
86
|
-
newestWrite = initialWrite;
|
|
87
|
-
}
|
|
88
|
-
const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
|
|
62
|
+
return this.replyForDeletedRecord(tenant, recordsRead, matchedMessage as RecordsDeleteMessage);
|
|
63
|
+
}
|
|
89
64
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
} catch (error) {
|
|
93
|
-
return messageReplyFromError(error, 401);
|
|
94
|
-
}
|
|
65
|
+
// else the matched message is a RecordsWrite
|
|
66
|
+
const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
|
|
95
67
|
|
|
68
|
+
if (!await isRecordLimitOccupant({
|
|
69
|
+
messageStore : this.deps.messageStore,
|
|
70
|
+
validationStateReader : this.deps.validationStateReader,
|
|
71
|
+
tenant,
|
|
72
|
+
message : matchedRecordsWrite,
|
|
73
|
+
messageTimestamp : recordsRead.message.descriptor.messageTimestamp,
|
|
74
|
+
})) {
|
|
96
75
|
return {
|
|
97
|
-
status
|
|
98
|
-
entry : {
|
|
99
|
-
recordsDelete: recordsDeleteMessage,
|
|
100
|
-
initialWrite,
|
|
101
|
-
}
|
|
76
|
+
status: { code: 404, detail: 'Not Found' }
|
|
102
77
|
};
|
|
103
78
|
}
|
|
104
79
|
|
|
105
|
-
// else the matched message is a RecordsWrite
|
|
106
|
-
const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
|
|
107
|
-
|
|
108
80
|
try {
|
|
109
81
|
const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
|
|
110
82
|
await RecordsReadHandler.authorizeRecordsRead(
|
|
111
|
-
tenant, recordsRead, parsedWrite, this.deps
|
|
83
|
+
tenant, recordsRead, parsedWrite, this.deps,
|
|
112
84
|
);
|
|
113
85
|
} catch (error) {
|
|
114
86
|
return messageReplyFromError(error, 401);
|
|
@@ -155,6 +127,48 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
155
127
|
return recordsReadReply;
|
|
156
128
|
};
|
|
157
129
|
|
|
130
|
+
private async replyForDeletedRecord(
|
|
131
|
+
tenant: string,
|
|
132
|
+
recordsRead: RecordsRead,
|
|
133
|
+
recordsDeleteMessage: RecordsDeleteMessage,
|
|
134
|
+
): Promise<RecordsReadReply> {
|
|
135
|
+
const recordId = recordsDeleteMessage.descriptor.recordId;
|
|
136
|
+
|
|
137
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
|
|
138
|
+
if (initialWrite === undefined) {
|
|
139
|
+
return messageReplyFromError(new DwnError(
|
|
140
|
+
DwnErrorCode.RecordsReadInitialWriteNotFound,
|
|
141
|
+
'initial write for deleted record not found'
|
|
142
|
+
), 400);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Authorize against the newest RecordsWrite so that mutable properties like `published`
|
|
146
|
+
// reflect the record's state at the time of deletion, not just the initial write.
|
|
147
|
+
let newestWrite;
|
|
148
|
+
try {
|
|
149
|
+
newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
|
|
150
|
+
} catch {
|
|
151
|
+
// If newest write is not found (should not happen since initial write exists),
|
|
152
|
+
// fall back to the initial write for authorization.
|
|
153
|
+
newestWrite = initialWrite;
|
|
154
|
+
}
|
|
155
|
+
const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
return messageReplyFromError(error, 401);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
status : { code: 404, detail: 'Not Found' },
|
|
165
|
+
entry : {
|
|
166
|
+
recordsDelete: recordsDeleteMessage,
|
|
167
|
+
initialWrite,
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
158
172
|
/**
|
|
159
173
|
* @param messageStore Used to check if the grant has been revoked.
|
|
160
174
|
*/
|
|
@@ -162,11 +176,10 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
162
176
|
tenant: string,
|
|
163
177
|
recordsRead: RecordsRead,
|
|
164
178
|
matchedRecordsWrite: RecordsWrite,
|
|
165
|
-
|
|
166
|
-
coreProtocols?: CoreProtocolRegistry,
|
|
179
|
+
deps: HandlerDependencies,
|
|
167
180
|
): Promise<void> {
|
|
168
181
|
if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
|
|
169
|
-
await recordsRead.authorizeDelegate(matchedRecordsWrite.message,
|
|
182
|
+
await recordsRead.authorizeDelegate(matchedRecordsWrite.message, deps.validationStateReader);
|
|
170
183
|
}
|
|
171
184
|
|
|
172
185
|
const { descriptor } = matchedRecordsWrite.message;
|
|
@@ -184,17 +197,17 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
184
197
|
return;
|
|
185
198
|
} else if (recordsRead.author !== undefined && Message.getPermissionGrantId(recordsRead.signaturePayload!) !== undefined) {
|
|
186
199
|
const permissionGrantId = Message.getPermissionGrantId(recordsRead.signaturePayload!)!;
|
|
187
|
-
const permissionGrant = await
|
|
200
|
+
const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
188
201
|
await RecordsGrantAuthorization.authorizeRead({
|
|
189
202
|
recordsReadMessage : recordsRead.message,
|
|
190
203
|
recordsWriteMessageToBeRead : matchedRecordsWrite.message,
|
|
191
204
|
expectedGrantor : tenant,
|
|
192
205
|
expectedGrantee : recordsRead.author,
|
|
193
206
|
permissionGrant,
|
|
194
|
-
|
|
207
|
+
validationStateReader : deps.validationStateReader
|
|
195
208
|
});
|
|
196
209
|
} else {
|
|
197
|
-
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite,
|
|
210
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, deps.validationStateReader);
|
|
198
211
|
}
|
|
199
212
|
}
|
|
200
213
|
}
|