@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,6 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { GenericMessageReply } from '../types/message-types.js';
|
|
3
|
-
import type { MessageStore } from '../types/message-store.js';
|
|
1
|
+
import type { ProgressToken } from '../types/subscriptions.js';
|
|
2
|
+
import type { GenericMessage, GenericMessageReply } from '../types/message-types.js';
|
|
4
3
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
4
|
import type { RecordsQueryReplyEntry, RecordsWriteMessage } from '../types/records-types.js';
|
|
6
5
|
|
|
@@ -9,21 +8,18 @@ import { Cid } from '../utils/cid.js';
|
|
|
9
8
|
import { DataStream } from '../utils/data-stream.js';
|
|
10
9
|
import { DwnConstant } from '../core/dwn-constant.js';
|
|
11
10
|
import { Encoder } from '../utils/encoder.js';
|
|
12
|
-
import { FilterUtility } from '../utils/filter.js';
|
|
13
11
|
import { Message } from '../core/message.js';
|
|
14
12
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
15
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
16
13
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
17
14
|
import { Records } from '../utils/records.js';
|
|
18
15
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
19
16
|
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
20
17
|
import { ResumableTaskName } from '../core/resumable-task-manager.js';
|
|
21
|
-
import { SortDirection } from '../types/query-types.js';
|
|
22
18
|
import { StorageController } from '../store/storage-controller.js';
|
|
23
19
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
24
20
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
25
21
|
|
|
26
|
-
type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?: ReadableStream<Uint8Array>};
|
|
22
|
+
type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?: ReadableStream<Uint8Array> };
|
|
27
23
|
|
|
28
24
|
export class RecordsWriteHandler implements MethodHandler {
|
|
29
25
|
|
|
@@ -32,7 +28,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
32
28
|
public async handle({
|
|
33
29
|
tenant,
|
|
34
30
|
message,
|
|
35
|
-
dataStream
|
|
31
|
+
dataStream,
|
|
36
32
|
}: HandlerArgs): Promise<GenericMessageReply> {
|
|
37
33
|
let recordsWrite: RecordsWrite;
|
|
38
34
|
try {
|
|
@@ -52,30 +48,26 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
52
48
|
// mutable validation. An already-stored message has already passed
|
|
53
49
|
// admission; replay should not be reinterpreted against current protocol,
|
|
54
50
|
// parent, role, grant, or record-limit state.
|
|
55
|
-
//
|
|
56
|
-
// Exception: an initial write may have been stored earlier without data
|
|
57
|
-
// (204). A later delivery of the same message with data must be allowed
|
|
58
|
-
// to complete the record.
|
|
59
51
|
const incomingCid = await Message.getCid(message);
|
|
60
52
|
for (const existingMessage of existingMessages) {
|
|
61
53
|
if (await Message.getCid(existingMessage) !== incomingCid) {
|
|
62
54
|
continue;
|
|
63
55
|
}
|
|
64
56
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
existingMessage as RecordsWriteMessage,
|
|
68
|
-
message,
|
|
69
|
-
dataStream !== undefined,
|
|
70
|
-
);
|
|
57
|
+
return { status: { code: 409, detail: 'Conflict' } };
|
|
58
|
+
}
|
|
71
59
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
|
|
61
|
+
|
|
62
|
+
let initialWrite: RecordsWriteMessage | undefined;
|
|
63
|
+
try {
|
|
64
|
+
initialWrite = await this.getInitialWrite(existingMessages, newMessageIsInitialWrite);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
return messageReplyFromError(e, 400);
|
|
75
67
|
}
|
|
76
68
|
|
|
77
69
|
try {
|
|
78
|
-
await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.
|
|
70
|
+
await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.validationStateReader);
|
|
79
71
|
} catch (e) {
|
|
80
72
|
return messageReplyFromError(e, 400);
|
|
81
73
|
}
|
|
@@ -83,18 +75,14 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
83
75
|
// authentication & authorization
|
|
84
76
|
try {
|
|
85
77
|
await authenticate(message.authorization, this.deps.didResolver, message.attestation);
|
|
86
|
-
await this.authorizeRecordsWrite(tenant, recordsWrite
|
|
78
|
+
await this.authorizeRecordsWrite(tenant, recordsWrite);
|
|
87
79
|
} catch (e) {
|
|
88
80
|
return messageReplyFromError(e, 401);
|
|
89
81
|
}
|
|
90
82
|
|
|
91
|
-
|
|
92
|
-
const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
|
|
93
|
-
let initialWrite: RecordsWriteMessage | undefined;
|
|
94
|
-
if (!newMessageIsInitialWrite) {
|
|
83
|
+
if (initialWrite !== undefined) {
|
|
95
84
|
try {
|
|
96
|
-
initialWrite
|
|
97
|
-
RecordsWrite.verifyEqualityOfImmutableProperties(initialWrite, message);
|
|
85
|
+
this.verifyImmutableProperties(initialWrite, message);
|
|
98
86
|
} catch (e) {
|
|
99
87
|
return messageReplyFromError(e, 400);
|
|
100
88
|
}
|
|
@@ -121,30 +109,9 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
121
109
|
}
|
|
122
110
|
|
|
123
111
|
if (!incomingMessageIsNewest) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// sync when a live pull initially stores the message without data
|
|
128
|
-
// and a subsequent poll or retry delivers the same message with data.
|
|
129
|
-
//
|
|
130
|
-
// We detect the incomplete state by checking whether the existing
|
|
131
|
-
// message is an initial write that lacks both inline encodedData and
|
|
132
|
-
// DataStore data — indicating it was stored without data.
|
|
133
|
-
let existingLacksData = false;
|
|
134
|
-
if (newestExistingMessage) {
|
|
135
|
-
existingLacksData = await this.existingInitialWriteLacksData(
|
|
136
|
-
tenant,
|
|
137
|
-
newestExistingMessage as RecordsWriteMessage,
|
|
138
|
-
message,
|
|
139
|
-
dataStream !== undefined,
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (!existingLacksData) {
|
|
144
|
-
return {
|
|
145
|
-
status: { code: 409, detail: 'Conflict' }
|
|
146
|
-
};
|
|
147
|
-
}
|
|
112
|
+
return {
|
|
113
|
+
status: { code: 409, detail: 'Conflict' }
|
|
114
|
+
};
|
|
148
115
|
}
|
|
149
116
|
|
|
150
117
|
// Look up the core protocol (if any) for the incoming message so that lifecycle hooks
|
|
@@ -152,6 +119,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
152
119
|
const coreProtocol = message.descriptor.protocol === undefined
|
|
153
120
|
? undefined
|
|
154
121
|
: this.deps.coreProtocols?.get(message.descriptor.protocol);
|
|
122
|
+
let position: ProgressToken | undefined;
|
|
155
123
|
|
|
156
124
|
try {
|
|
157
125
|
if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
|
|
@@ -165,7 +133,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
165
133
|
// This allows core protocols to perform cross-record validation before storage
|
|
166
134
|
// (e.g. ensuring revocation tag consistency with the parent grant's scoped protocol).
|
|
167
135
|
if (coreProtocol?.preProcessWrite !== undefined) {
|
|
168
|
-
await coreProtocol.preProcessWrite(tenant, message, this.deps.
|
|
136
|
+
await coreProtocol.preProcessWrite(tenant, message, this.deps.validationStateReader);
|
|
169
137
|
}
|
|
170
138
|
|
|
171
139
|
// NOTE: We allow isLatestBaseState to be true ONLY if the incoming message comes with data, or if the incoming message is NOT an initial write
|
|
@@ -192,21 +160,8 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
192
160
|
}
|
|
193
161
|
|
|
194
162
|
const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
|
|
195
|
-
await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
|
|
196
|
-
|
|
197
|
-
await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
|
|
198
|
-
|
|
199
|
-
// NOTE: We only emit a `RecordsWrite` when the message is the latest base state.
|
|
200
|
-
// Because we allow a `RecordsWrite` which is not the latest state to be written, but not queried, we shouldn't emit it either.
|
|
201
|
-
// It will be emitted as a part of a subsequent next write, if it is the latest base state.
|
|
202
|
-
//
|
|
203
|
-
// We emit `messageWithOptionalEncodedData` (not the raw `message`) so
|
|
204
|
-
// that WebSocket subscribers receive inline `encodedData` for small
|
|
205
|
-
// records (<= 30 KB). This allows live sync to store the record
|
|
206
|
-
// immediately without a separate MessagesRead round-trip.
|
|
207
|
-
if (this.deps.eventLog !== undefined && isLatestBaseState) {
|
|
208
|
-
await this.deps.eventLog.emit(tenant, { message: messageWithOptionalEncodedData, initialWrite }, indexes, messageCid);
|
|
209
|
-
}
|
|
163
|
+
const putResult = await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
|
|
164
|
+
position = putResult.position;
|
|
210
165
|
} catch (error) {
|
|
211
166
|
if (error instanceof DwnError) {
|
|
212
167
|
if (error.code === DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious ||
|
|
@@ -230,12 +185,13 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
230
185
|
// for more details.
|
|
231
186
|
status: (newMessageIsInitialWrite && dataStream === undefined) ?
|
|
232
187
|
{ code: 204, detail: 'No Content' } :
|
|
233
|
-
{ code: 202, detail: 'Accepted' }
|
|
188
|
+
{ code: 202, detail: 'Accepted' },
|
|
189
|
+
position,
|
|
234
190
|
};
|
|
235
191
|
|
|
236
|
-
//
|
|
237
|
-
await StorageController.
|
|
238
|
-
tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!,
|
|
192
|
+
// displace every other message for this record, retaining only the initial write as non-latest state
|
|
193
|
+
await StorageController.deleteDisplacedMessagesAndRetainWrites(
|
|
194
|
+
tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!, []
|
|
239
195
|
);
|
|
240
196
|
|
|
241
197
|
// Squash processing: if the incoming write is a squash, delete all older sibling records
|
|
@@ -254,7 +210,6 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
254
210
|
await coreProtocol.postProcessWrite(tenant, recordsWrite, {
|
|
255
211
|
messageStore : this.deps.messageStore,
|
|
256
212
|
dataStore : this.deps.dataStore!,
|
|
257
|
-
stateIndex : this.deps.stateIndex!,
|
|
258
213
|
});
|
|
259
214
|
}
|
|
260
215
|
|
|
@@ -282,7 +237,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
282
237
|
// validate data integrity before setting.
|
|
283
238
|
const dataBytes = await DataStream.toBytes(dataStream);
|
|
284
239
|
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
285
|
-
|
|
240
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
286
241
|
|
|
287
242
|
// Dispatch schema validation to the core protocol, if applicable.
|
|
288
243
|
const coreProtocol = message.descriptor.protocol === undefined
|
|
@@ -304,7 +259,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
304
259
|
this.deps.dataStore!.put(tenant, message.recordId, message.descriptor.dataCid, dataStreamCopy2)
|
|
305
260
|
]);
|
|
306
261
|
|
|
307
|
-
|
|
262
|
+
RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, DataStorePutResult.dataSize);
|
|
308
263
|
} catch (error) {
|
|
309
264
|
// unwind/delete data if we have issue with storage or the data failed integrity validation
|
|
310
265
|
await this.deps.dataStore!.delete(tenant, message.recordId, message.descriptor.dataCid);
|
|
@@ -316,31 +271,33 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
316
271
|
return messageWithOptionalEncodedData;
|
|
317
272
|
}
|
|
318
273
|
|
|
319
|
-
private async
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
if (!incomingHasData) {
|
|
326
|
-
return false;
|
|
274
|
+
private async getInitialWrite(
|
|
275
|
+
existingMessages: GenericMessage[],
|
|
276
|
+
newMessageIsInitialWrite: boolean,
|
|
277
|
+
): Promise<RecordsWriteMessage | undefined> {
|
|
278
|
+
if (newMessageIsInitialWrite) {
|
|
279
|
+
return undefined;
|
|
327
280
|
}
|
|
328
281
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
282
|
+
return RecordsWrite.getInitialWrite(existingMessages);
|
|
283
|
+
}
|
|
333
284
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
285
|
+
private verifyImmutableProperties(
|
|
286
|
+
initialWrite: RecordsWriteMessage,
|
|
287
|
+
message: RecordsWriteMessage,
|
|
288
|
+
): void {
|
|
289
|
+
try {
|
|
290
|
+
RecordsWrite.verifyEqualityOfImmutableProperties(initialWrite, message);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
if (error instanceof DwnError && error.code === DwnErrorCode.RecordsWriteImmutablePropertyChanged) {
|
|
293
|
+
throw new DwnError(
|
|
294
|
+
DwnErrorCode.RecordsWriteImmutablePropertyChanged,
|
|
295
|
+
'immutable RecordsWrite properties cannot be changed.'
|
|
296
|
+
);
|
|
297
|
+
}
|
|
342
298
|
|
|
343
|
-
|
|
299
|
+
throw error;
|
|
300
|
+
}
|
|
344
301
|
}
|
|
345
302
|
|
|
346
303
|
private async processMessageWithoutDataStream(
|
|
@@ -355,7 +312,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
355
312
|
// we preform the dataCid check in case a user attempts to gain access to data by referencing a different known dataCid,
|
|
356
313
|
// so we insure that the data is already associated with the existing newest message
|
|
357
314
|
// See: https://github.com/enboxorg/enbox/issues/359 for more info
|
|
358
|
-
|
|
315
|
+
RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
|
|
359
316
|
|
|
360
317
|
if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
|
|
361
318
|
// we encode the data from the original write if it is smaller than the data-store threshold
|
|
@@ -371,9 +328,9 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
371
328
|
// else just make sure the data is in the data store
|
|
372
329
|
|
|
373
330
|
// attempt to retrieve the data from the previous message
|
|
374
|
-
const
|
|
331
|
+
const priorDataExists = await this.deps.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
|
|
375
332
|
|
|
376
|
-
if (
|
|
333
|
+
if (!priorDataExists) {
|
|
377
334
|
throw new DwnError(
|
|
378
335
|
DwnErrorCode.RecordsWriteMissingDataInPrevious,
|
|
379
336
|
`No dataStream was provided and unable to get data from previous message`
|
|
@@ -384,35 +341,6 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
384
341
|
return messageWithOptionalEncodedData;
|
|
385
342
|
}
|
|
386
343
|
|
|
387
|
-
/**
|
|
388
|
-
* Validates the expected `dataCid` and `dataSize` in the descriptor vs the received data.
|
|
389
|
-
*
|
|
390
|
-
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataCidMismatch`
|
|
391
|
-
* if the data stream resulted in a data CID that mismatches with `dataCid` in the given message
|
|
392
|
-
* @throws {DwnError} with `DwnErrorCode.RecordsWriteDataSizeMismatch`
|
|
393
|
-
* if `dataSize` in `descriptor` given mismatches the actual data size
|
|
394
|
-
*/
|
|
395
|
-
private static validateDataIntegrity(
|
|
396
|
-
expectedDataCid: string,
|
|
397
|
-
expectedDataSize: number,
|
|
398
|
-
actualDataCid: string,
|
|
399
|
-
actualDataSize: number
|
|
400
|
-
): void {
|
|
401
|
-
if (expectedDataCid !== actualDataCid) {
|
|
402
|
-
throw new DwnError(
|
|
403
|
-
DwnErrorCode.RecordsWriteDataCidMismatch,
|
|
404
|
-
`actual data CID ${actualDataCid} does not match dataCid in descriptor: ${expectedDataCid}`
|
|
405
|
-
);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (expectedDataSize !== actualDataSize) {
|
|
409
|
-
throw new DwnError(
|
|
410
|
-
DwnErrorCode.RecordsWriteDataSizeMismatch,
|
|
411
|
-
`actual data size ${actualDataSize} bytes does not match dataSize in descriptor: ${expectedDataSize}`
|
|
412
|
-
);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
344
|
/**
|
|
417
345
|
* Enforces the squash backstop: if the incoming message is at a protocol path with `$squash: true`,
|
|
418
346
|
* and there exists a squash record at the same protocol path and parent context whose
|
|
@@ -426,16 +354,14 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
426
354
|
return;
|
|
427
355
|
}
|
|
428
356
|
|
|
429
|
-
// Fetch the protocol definition to check if $squash is enabled at this path.
|
|
430
|
-
//
|
|
357
|
+
// Fetch the protocol definition active at the incoming message timestamp to check if $squash is enabled at this path.
|
|
358
|
+
// The reader resolves core protocols (e.g. permissions) from the registry.
|
|
431
359
|
let protocolDefinition;
|
|
432
360
|
try {
|
|
433
|
-
protocolDefinition = await
|
|
361
|
+
protocolDefinition = await this.deps.validationStateReader.fetchProtocolDefinition(
|
|
434
362
|
tenant,
|
|
435
363
|
message.descriptor.protocol,
|
|
436
|
-
|
|
437
|
-
undefined,
|
|
438
|
-
this.deps.coreProtocols,
|
|
364
|
+
message.descriptor.messageTimestamp,
|
|
439
365
|
);
|
|
440
366
|
} catch (error) {
|
|
441
367
|
// If the protocol definition can't be found, skip the backstop check.
|
|
@@ -455,36 +381,19 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
455
381
|
return;
|
|
456
382
|
}
|
|
457
383
|
|
|
458
|
-
// Find the most recent squash record at the same protocol path and parent context
|
|
459
|
-
const filter: Filter = {
|
|
460
|
-
interface : DwnInterfaceName.Records,
|
|
461
|
-
method : DwnMethodName.Write,
|
|
462
|
-
isLatestBaseState : true,
|
|
463
|
-
protocol : message.descriptor.protocol,
|
|
464
|
-
protocolPath : message.descriptor.protocolPath,
|
|
465
|
-
squash : true,
|
|
466
|
-
};
|
|
467
|
-
|
|
468
|
-
// Scope by parent context for nested records
|
|
469
384
|
const parentContextId = Records.getParentContextFromOfContextId(message.contextId);
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
filter.contextId = prefixFilter;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
const { messages: squashMessages } = await this.deps.messageStore.query(
|
|
385
|
+
const contextIdPrefix = parentContextId !== undefined && parentContextId !== '' ? parentContextId : undefined;
|
|
386
|
+
const newestSquash = await this.deps.validationStateReader.fetchLatestSquashRecordAtScope({
|
|
476
387
|
tenant,
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
);
|
|
388
|
+
protocol : message.descriptor.protocol,
|
|
389
|
+
protocolPath : message.descriptor.protocolPath,
|
|
390
|
+
contextIdPrefix,
|
|
391
|
+
});
|
|
481
392
|
|
|
482
|
-
if (
|
|
393
|
+
if (newestSquash === undefined) {
|
|
483
394
|
return;
|
|
484
395
|
}
|
|
485
396
|
|
|
486
|
-
const newestSquash = squashMessages[0] as RecordsWriteMessage;
|
|
487
|
-
|
|
488
397
|
// Reject if the incoming message's timestamp is <= the squash record's timestamp
|
|
489
398
|
if (message.descriptor.messageTimestamp <= newestSquash.descriptor.messageTimestamp) {
|
|
490
399
|
throw new DwnError(
|
|
@@ -496,7 +405,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
496
405
|
}
|
|
497
406
|
}
|
|
498
407
|
|
|
499
|
-
private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite
|
|
408
|
+
private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite): Promise<void> {
|
|
500
409
|
// if owner signature is given (`owner` is not `undefined`), it must be the same as the tenant DID
|
|
501
410
|
if (recordsWrite.owner !== undefined && recordsWrite.owner !== tenant) {
|
|
502
411
|
throw new DwnError(
|
|
@@ -506,11 +415,11 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
506
415
|
}
|
|
507
416
|
|
|
508
417
|
if (recordsWrite.isSignedByAuthorDelegate) {
|
|
509
|
-
await recordsWrite.authorizeAuthorDelegate(
|
|
418
|
+
await recordsWrite.authorizeAuthorDelegate(this.deps.validationStateReader);
|
|
510
419
|
}
|
|
511
420
|
|
|
512
421
|
if (recordsWrite.isSignedByOwnerDelegate) {
|
|
513
|
-
await recordsWrite.authorizeOwnerDelegate(
|
|
422
|
+
await recordsWrite.authorizeOwnerDelegate(this.deps.validationStateReader);
|
|
514
423
|
}
|
|
515
424
|
|
|
516
425
|
if (recordsWrite.owner !== undefined) {
|
|
@@ -522,16 +431,16 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
522
431
|
return;
|
|
523
432
|
} else if (recordsWrite.author !== undefined && Message.getPermissionGrantId(recordsWrite.signaturePayload!) !== undefined) {
|
|
524
433
|
const permissionGrantId = Message.getPermissionGrantId(recordsWrite.signaturePayload!)!;
|
|
525
|
-
const permissionGrant = await
|
|
434
|
+
const permissionGrant = await this.deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
526
435
|
await RecordsGrantAuthorization.authorizeWrite({
|
|
527
|
-
recordsWriteMessage
|
|
528
|
-
expectedGrantor
|
|
529
|
-
expectedGrantee
|
|
436
|
+
recordsWriteMessage : recordsWrite.message,
|
|
437
|
+
expectedGrantor : tenant,
|
|
438
|
+
expectedGrantee : recordsWrite.author,
|
|
530
439
|
permissionGrant,
|
|
531
|
-
|
|
440
|
+
validationStateReader : this.deps.validationStateReader
|
|
532
441
|
});
|
|
533
442
|
} else {
|
|
534
|
-
await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite,
|
|
443
|
+
await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, this.deps.validationStateReader);
|
|
535
444
|
}
|
|
536
445
|
}
|
|
537
446
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
// export everything that we want to be consumable
|
|
2
2
|
export type { DwnConfig } from './dwn.js';
|
|
3
|
-
export type {
|
|
3
|
+
export type { EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, ReplicationFeedReader, SubscriptionEose, SubscriptionError, SubscriptionEvent, SubscriptionListener, SubscriptionMessage, SubscriptionReply, Wake, WakePublisher, WakeSubscriber } from './types/subscriptions.js';
|
|
4
4
|
export type { AuthorizationModel, Descriptor, DelegatedGrantRecordsWriteMessage, GenericMessage, GenericMessageReply, GenericSignaturePayload, MessageSort, MessageSubscription, Pagination, QueryResultEntry, Status } from './types/message-types.js';
|
|
5
5
|
export type { DependencyRef, ReplicationApplyOptions, ReplicationApplyResult, ReplicationApplyResultContext } from './core/replication-apply.js';
|
|
6
6
|
export { replicationApplyResultFromReply } from './core/replication-apply.js';
|
|
7
|
-
export type {
|
|
7
|
+
export type { ValidationStateReader } from './types/validation-state-reader.js';
|
|
8
|
+
export { StoreValidationStateReader } from './core/validation-state-reader.js';
|
|
9
|
+
export type { RecordedValidationRead } from './core/recording-validation-state-reader.js';
|
|
10
|
+
export { RecordingValidationStateReader } from './core/recording-validation-state-reader.js';
|
|
11
|
+
export type { MessagesFilter, MessagesQueryDescriptor, MessagesQueryMessage, MessagesQueryReply, MessagesQueryReplyEntry, MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions } from './types/messages-types.js';
|
|
8
12
|
export type { GT, LT, Filter, FilterValue, KeyValues, EqualFilter, OneOfFilter, RangeFilter, RangeCriterion, PaginationCursor, QueryOptions, RangeValue, StartsWithFilter } from './types/query-types.js';
|
|
9
13
|
export type { ProtocolsConfigureDescriptor, ProtocolDefinition, ProtocolTypes, ProtocolRuleSet, ProtocolsQueryFilter, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply, ProtocolActionRule, ProtocolDeliveryStrategy, ProtocolPathEncryption, ProtocolsQueryDescriptor, ProtocolRecordLimitDefinition, ProtocolSizeDefinition, ProtocolTagsDefinition, ProtocolTagSchema, ProtocolType, ProtocolUses } from './types/protocols-types.js';
|
|
10
14
|
export { ProtocolRecordLimitStrategy } from './types/protocols-types.js';
|
|
@@ -44,10 +48,11 @@ export type { KeyMaterial, PrivateKeyJwk, PublicKeyJwk, Jwk } from './types/jose
|
|
|
44
48
|
export { Message } from './core/message.js';
|
|
45
49
|
export { MessagesRead } from './interfaces/messages-read.js';
|
|
46
50
|
export type { MessagesReadOptions } from './interfaces/messages-read.js';
|
|
47
|
-
export {
|
|
48
|
-
export type {
|
|
51
|
+
export { MessagesQuery } from './interfaces/messages-query.js';
|
|
52
|
+
export type { MessagesQueryOptions } from './interfaces/messages-query.js';
|
|
49
53
|
export type { UnionMessageReply } from './core/message-reply.js';
|
|
50
|
-
export type { MessageStore, MessageStoreOptions } from './types/message-store.js';
|
|
54
|
+
export type { MessageStore, MessageStoreOptions, MessageStorePutResult } from './types/message-store.js';
|
|
55
|
+
export { Replication } from './utils/replication.js';
|
|
51
56
|
export type { MessageInterface } from './types/message-interface.js';
|
|
52
57
|
export { PermissionGrant } from './protocols/permission-grant.js';
|
|
53
58
|
export { PermissionRequest } from './protocols/permission-request.js';
|
|
@@ -93,19 +98,11 @@ export { MessageStoreLevel } from './store/message-store-level.js';
|
|
|
93
98
|
export type { MessageStoreLevelConfig } from './store/message-store-level.js';
|
|
94
99
|
export { ResumableTaskStoreLevel } from './store/resumable-task-store-level.js';
|
|
95
100
|
export type { ResumableTaskStoreLevelConfig } from './store/resumable-task-store-level.js';
|
|
96
|
-
export {
|
|
97
|
-
export
|
|
101
|
+
export { EventEmitterWakePublisher } from './event-stream/event-emitter-wake-publisher.js';
|
|
102
|
+
export { DurableEventLog } from './event-stream/durable-event-log.js';
|
|
103
|
+
export type { DurableEventLogConfig, DurableEventLogStore } from './event-stream/durable-event-log.js';
|
|
98
104
|
|
|
99
|
-
// Sparse Merkle Tree and StateIndex
|
|
100
|
-
export type { StateIndex } from './types/state-index.js';
|
|
101
|
-
export { StateIndexLevel } from './state-index/state-index-level.js';
|
|
102
|
-
export type { StateIndexLevelConfig } from './state-index/state-index-level.js';
|
|
103
|
-
export { SparseMerkleTree } from './smt/sparse-merkle-tree.js';
|
|
104
|
-
export { SMTStoreLevel } from './smt/smt-store-level.js';
|
|
105
|
-
export { SMTStoreMemory } from './smt/smt-store-memory.js';
|
|
106
|
-
export type { Hash, SMTNode, SMTInternalNode, SMTLeafNode, SMTProof, SMTDiffResult, SMTNodeStore } from './types/smt-types.js';
|
|
107
|
-
export { hashChildren, hashEquals, hashKey, hashLeaf, hashToHex, hexToHash, getBit, initDefaultHashes, getDefaultHashes, SMT_DEPTH, ZERO_HASH } from './smt/smt-utils.js';
|
|
108
105
|
// test library exports
|
|
109
|
-
export type { GenerateFromRecordsWriteInput, GenerateFromRecordsWriteOut, GenerateGrantCreateInput, GenerateGrantCreateOutput, GenerateMessagesReadInput, GenerateMessagesReadOutput, GenerateMessagesSubscribeInput, GenerateMessagesSubscribeOutput, GenerateProtocolsConfigureInput, GenerateProtocolsConfigureOutput, GenerateProtocolsQueryInput, GenerateProtocolsQueryOutput, GenerateRecordsCountInput, GenerateRecordsCountOutput, GenerateRecordsDeleteInput, GenerateRecordsDeleteOutput, GenerateRecordsQueryInput, GenerateRecordsQueryOutput, GenerateRecordsSubscribeInput, GenerateRecordsSubscribeOutput, GenerateRecordsWriteInput, GenerateRecordsWriteOutput, Persona } from '../tests/utils/test-data-generator.js';
|
|
106
|
+
export type { GenerateFromRecordsWriteInput, GenerateFromRecordsWriteOut, GenerateGrantCreateInput, GenerateGrantCreateOutput, GenerateMessagesQueryInput, GenerateMessagesQueryOutput, GenerateMessagesReadInput, GenerateMessagesReadOutput, GenerateMessagesSubscribeInput, GenerateMessagesSubscribeOutput, GenerateProtocolsConfigureInput, GenerateProtocolsConfigureOutput, GenerateProtocolsQueryInput, GenerateProtocolsQueryOutput, GenerateRecordsCountInput, GenerateRecordsCountOutput, GenerateRecordsDeleteInput, GenerateRecordsDeleteOutput, GenerateRecordsQueryInput, GenerateRecordsQueryOutput, GenerateRecordsSubscribeInput, GenerateRecordsSubscribeOutput, GenerateRecordsWriteInput, GenerateRecordsWriteOutput, Persona } from '../tests/utils/test-data-generator.js';
|
|
110
107
|
export { TestDataGenerator } from '../tests/utils/test-data-generator.js';
|
|
111
108
|
export { Poller } from '../tests/utils/poller.js';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
|
+
import type { ProgressToken } from '../types/subscriptions.js';
|
|
3
|
+
import type { MessagesFilter, MessagesQueryDescriptor, MessagesQueryMessage } from '../types/messages-types.js';
|
|
4
|
+
|
|
5
|
+
import { AbstractMessage } from '../core/abstract-message.js';
|
|
6
|
+
import { Message } from '../core/message.js';
|
|
7
|
+
import { removeUndefinedProperties } from '@enbox/common';
|
|
8
|
+
import { Time } from '../utils/time.js';
|
|
9
|
+
import { validateProtocolUrlNormalized } from '../utils/url.js';
|
|
10
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
11
|
+
|
|
12
|
+
export type MessagesQueryOptions = {
|
|
13
|
+
signer: MessageSigner;
|
|
14
|
+
messageTimestamp?: string;
|
|
15
|
+
filters?: MessagesFilter[];
|
|
16
|
+
permissionGrantIds?: string[];
|
|
17
|
+
cursor?: ProgressToken;
|
|
18
|
+
limit?: number;
|
|
19
|
+
cidsOnly?: boolean;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export class MessagesQuery extends AbstractMessage<MessagesQueryMessage> {
|
|
23
|
+
public static async parse(message: MessagesQueryMessage): Promise<MessagesQuery> {
|
|
24
|
+
Message.validateJsonSchema(message);
|
|
25
|
+
await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
|
|
26
|
+
|
|
27
|
+
for (const filter of message.descriptor.filters) {
|
|
28
|
+
if ('protocol' in filter && filter.protocol !== undefined) {
|
|
29
|
+
validateProtocolUrlNormalized(filter.protocol);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Time.validateTimestamp(message.descriptor.messageTimestamp);
|
|
34
|
+
return new MessagesQuery(message);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates a MessagesQuery message.
|
|
39
|
+
*
|
|
40
|
+
* @throws {DwnError} if json schema validation fails.
|
|
41
|
+
*/
|
|
42
|
+
public static async create(options: MessagesQueryOptions): Promise<MessagesQuery> {
|
|
43
|
+
const permissionGrantInvocation = Message.normalizePermissionGrantInvocation({
|
|
44
|
+
permissionGrantIds: options.permissionGrantIds
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const descriptor: MessagesQueryDescriptor = {
|
|
48
|
+
interface : DwnInterfaceName.Messages,
|
|
49
|
+
method : DwnMethodName.Query,
|
|
50
|
+
filters : options.filters ?? [],
|
|
51
|
+
messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
|
|
52
|
+
cursor : options.cursor,
|
|
53
|
+
limit : options.limit,
|
|
54
|
+
cidsOnly : options.cidsOnly,
|
|
55
|
+
...permissionGrantInvocation,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
removeUndefinedProperties(descriptor);
|
|
59
|
+
|
|
60
|
+
const authorization = await Message.createAuthorization({
|
|
61
|
+
descriptor,
|
|
62
|
+
signer: options.signer,
|
|
63
|
+
...permissionGrantInvocation,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const message: MessagesQueryMessage = { descriptor, authorization };
|
|
67
|
+
Message.validateJsonSchema(message);
|
|
68
|
+
return new MessagesQuery(message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DataEncodedRecordsWriteMessage } from '../types/records-types.js';
|
|
2
2
|
import type { MessageSigner } from '../types/signer.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
4
4
|
import type {
|
|
5
5
|
ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor,
|
|
6
6
|
ProtocolsConfigureMessage, ProtocolTypes, ProtocolUses
|
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
|
|
9
9
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
10
10
|
import Ajv from 'ajv/dist/2020.js';
|
|
11
|
+
import { DwnConstant } from '../core/dwn-constant.js';
|
|
11
12
|
import { Message } from '../core/message.js';
|
|
12
13
|
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
13
14
|
import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
|
|
@@ -69,16 +70,16 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
69
70
|
|
|
70
71
|
/**
|
|
71
72
|
* Authorizes the author-delegate who signed this message.
|
|
72
|
-
* @param
|
|
73
|
+
* @param validationStateReader Used to check if the grant has been revoked.
|
|
73
74
|
*/
|
|
74
|
-
public async authorizeAuthorDelegate(
|
|
75
|
+
public async authorizeAuthorDelegate(validationStateReader: ValidationStateReader): Promise<void> {
|
|
75
76
|
const delegatedGrant = PermissionGrant.parse(this.message.authorization.authorDelegatedGrant!);
|
|
76
77
|
await ProtocolsGrantAuthorization.authorizeConfigure({
|
|
77
78
|
protocolsConfigureMessage : this.message,
|
|
78
79
|
expectedGrantor : this.author!,
|
|
79
80
|
expectedGrantee : this.signer!,
|
|
80
81
|
permissionGrant : delegatedGrant,
|
|
81
|
-
|
|
82
|
+
validationStateReader
|
|
82
83
|
});
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -247,6 +248,13 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
247
248
|
);
|
|
248
249
|
}
|
|
249
250
|
|
|
251
|
+
if (max > DwnConstant.maxRecordLimit) {
|
|
252
|
+
throw new DwnError(
|
|
253
|
+
DwnErrorCode.ProtocolsConfigureInvalidRecordLimit,
|
|
254
|
+
`Invalid $recordLimit.max value ${max} at protocol path '${ruleSetProtocolPath}': must be <= ${DwnConstant.maxRecordLimit}.`
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
250
258
|
const validStrategies = Object.values(ProtocolRecordLimitStrategy) as string[];
|
|
251
259
|
if (!validStrategies.includes(strategy as string)) {
|
|
252
260
|
throw new DwnError(
|