@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,36 +1,34 @@
|
|
|
1
1
|
import type { GenericMessage } from '../types/message-types.js';
|
|
2
2
|
import type { MessagesPermissionScope } from '../types/permission-types.js';
|
|
3
|
-
import type { MessageStore } from '../types/message-store.js';
|
|
4
3
|
import type { PermissionGrant } from '../protocols/permission-grant.js';
|
|
5
4
|
import type { ProtocolsConfigureMessage } from '../types/protocols-types.js';
|
|
6
5
|
import type { ProtocolScope } from '../utils/permission-scope.js';
|
|
6
|
+
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
7
7
|
import type { DataEncodedRecordsWriteMessage, RecordsDeleteMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
8
|
-
import type { MessagesReadMessage, MessagesSubscribeMessage
|
|
8
|
+
import type { MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessage } from '../types/messages-types.js';
|
|
9
9
|
|
|
10
10
|
import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
11
11
|
import { GrantAuthorization } from './grant-authorization.js';
|
|
12
|
-
import { isRecordsPrimaryProjectionExcludedProtocol } from './constants.js';
|
|
13
12
|
import { PermissionScopeMatcher } from '../utils/permission-scope.js';
|
|
14
13
|
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
15
14
|
import { Records } from '../utils/records.js';
|
|
16
|
-
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
17
15
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
18
16
|
|
|
19
17
|
export class MessagesGrantAuthorization {
|
|
20
18
|
|
|
21
19
|
public static async fetchPermissionGrants(
|
|
22
20
|
tenant: string,
|
|
23
|
-
|
|
21
|
+
validationStateReader: ValidationStateReader,
|
|
24
22
|
permissionGrantIds: string[]
|
|
25
23
|
): Promise<PermissionGrant[]> {
|
|
26
24
|
return Promise.all(
|
|
27
|
-
permissionGrantIds.map(permissionGrantId =>
|
|
25
|
+
permissionGrantIds.map(permissionGrantId => validationStateReader.fetchGrant(tenant, permissionGrantId))
|
|
28
26
|
);
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
/**
|
|
32
30
|
* Authorizes a MessagesReadMessage using the given permission grant.
|
|
33
|
-
* @param
|
|
31
|
+
* @param validationStateReader Used to check grant revocation and fetch related RecordsWrites if needed.
|
|
34
32
|
*/
|
|
35
33
|
public static async authorizeMessagesRead(input: {
|
|
36
34
|
messagesReadMessage: MessagesReadMessage,
|
|
@@ -38,10 +36,10 @@ export class MessagesGrantAuthorization {
|
|
|
38
36
|
expectedGrantor: string,
|
|
39
37
|
expectedGrantee: string,
|
|
40
38
|
permissionGrants: PermissionGrant[],
|
|
41
|
-
|
|
39
|
+
validationStateReader: ValidationStateReader,
|
|
42
40
|
}): Promise<void> {
|
|
43
41
|
const {
|
|
44
|
-
messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrants,
|
|
42
|
+
messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
|
|
45
43
|
} = input;
|
|
46
44
|
|
|
47
45
|
await MessagesGrantAuthorization.performBaseValidationForGrantSet({
|
|
@@ -49,12 +47,12 @@ export class MessagesGrantAuthorization {
|
|
|
49
47
|
expectedGrantor,
|
|
50
48
|
expectedGrantee,
|
|
51
49
|
permissionGrants,
|
|
52
|
-
|
|
50
|
+
validationStateReader
|
|
53
51
|
});
|
|
54
52
|
|
|
55
53
|
for (const permissionGrant of permissionGrants) {
|
|
56
54
|
const scope = permissionGrant.scope as MessagesPermissionScope;
|
|
57
|
-
if (await MessagesGrantAuthorization.isScopeAuthorized(expectedGrantor, messageToRead, scope,
|
|
55
|
+
if (await MessagesGrantAuthorization.isScopeAuthorized(expectedGrantor, messageToRead, scope, validationStateReader)) {
|
|
58
56
|
return;
|
|
59
57
|
}
|
|
60
58
|
}
|
|
@@ -63,18 +61,18 @@ export class MessagesGrantAuthorization {
|
|
|
63
61
|
}
|
|
64
62
|
|
|
65
63
|
/**
|
|
66
|
-
* Authorizes the scope of a permission grant for
|
|
67
|
-
* @param
|
|
64
|
+
* Authorizes the scope of a permission grant for MessagesQuery or MessagesSubscribe.
|
|
65
|
+
* @param validationStateReader Used to check if the grant has been revoked.
|
|
68
66
|
*/
|
|
69
|
-
public static async
|
|
70
|
-
incomingMessage:
|
|
67
|
+
public static async authorizeQueryOrSubscribe(input: {
|
|
68
|
+
incomingMessage: MessagesQueryMessage | MessagesSubscribeMessage,
|
|
71
69
|
expectedGrantor: string,
|
|
72
70
|
expectedGrantee: string,
|
|
73
71
|
permissionGrants: PermissionGrant[],
|
|
74
|
-
|
|
72
|
+
validationStateReader: ValidationStateReader,
|
|
75
73
|
}): Promise<void> {
|
|
76
74
|
const {
|
|
77
|
-
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants,
|
|
75
|
+
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
|
|
78
76
|
} = input;
|
|
79
77
|
|
|
80
78
|
await MessagesGrantAuthorization.performBaseValidationForGrantSet({
|
|
@@ -82,50 +80,19 @@ export class MessagesGrantAuthorization {
|
|
|
82
80
|
expectedGrantor,
|
|
83
81
|
expectedGrantee,
|
|
84
82
|
permissionGrants,
|
|
85
|
-
|
|
83
|
+
validationStateReader
|
|
86
84
|
});
|
|
87
85
|
|
|
88
86
|
const scopes = permissionGrants.map(permissionGrant => permissionGrant.scope as MessagesPermissionScope);
|
|
89
87
|
|
|
90
|
-
|
|
91
|
-
MessagesGrantAuthorization.authorizeSyncScope(incomingMessage as MessagesSyncMessage, scopes);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
MessagesGrantAuthorization.authorizeSubscribeScope(incomingMessage as MessagesSubscribeMessage, scopes);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
private static authorizeSyncScope(
|
|
99
|
-
syncMessage: MessagesSyncMessage,
|
|
100
|
-
scopes: MessagesPermissionScope[]
|
|
101
|
-
): void {
|
|
102
|
-
MessagesGrantAuthorization.authorizeProtocolSyncScope(scopes, syncMessage.descriptor.protocol);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private static authorizeProtocolSyncScope(
|
|
106
|
-
scopes: MessagesPermissionScope[],
|
|
107
|
-
protocol: string | undefined
|
|
108
|
-
): void {
|
|
109
|
-
if (isRecordsPrimaryProjectionExcludedProtocol(protocol)) {
|
|
110
|
-
throw new DwnError(
|
|
111
|
-
DwnErrorCode.MessagesGrantAuthorizationProtocolSyncInfrastructureProtocol,
|
|
112
|
-
`Protocol-scoped MessagesSync cannot authorize infrastructure protocol ${protocol}`
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (!MessagesGrantAuthorization.someScopeMatches(scopes, { protocol })) {
|
|
117
|
-
throw new DwnError(
|
|
118
|
-
DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol,
|
|
119
|
-
`No permission grant scope matches protocol ${protocol}`
|
|
120
|
-
);
|
|
121
|
-
}
|
|
88
|
+
MessagesGrantAuthorization.authorizeFilterScope(incomingMessage, scopes);
|
|
122
89
|
}
|
|
123
90
|
|
|
124
|
-
private static
|
|
125
|
-
|
|
91
|
+
private static authorizeFilterScope(
|
|
92
|
+
messagesMessage: MessagesQueryMessage | MessagesSubscribeMessage,
|
|
126
93
|
scopes: MessagesPermissionScope[]
|
|
127
94
|
): void {
|
|
128
|
-
const { filters } =
|
|
95
|
+
const { filters } = messagesMessage.descriptor;
|
|
129
96
|
|
|
130
97
|
if (filters.length === 0 && !MessagesGrantAuthorization.hasUnscopedGrant(scopes)) {
|
|
131
98
|
throw new DwnError(
|
|
@@ -165,7 +132,7 @@ export class MessagesGrantAuthorization {
|
|
|
165
132
|
expectedGrantor: string,
|
|
166
133
|
expectedGrantee: string,
|
|
167
134
|
permissionGrants: PermissionGrant[],
|
|
168
|
-
|
|
135
|
+
validationStateReader: ValidationStateReader,
|
|
169
136
|
deliveryTimestamp: string,
|
|
170
137
|
}): Promise<void> {
|
|
171
138
|
const {
|
|
@@ -173,7 +140,7 @@ export class MessagesGrantAuthorization {
|
|
|
173
140
|
expectedGrantor,
|
|
174
141
|
expectedGrantee,
|
|
175
142
|
permissionGrants,
|
|
176
|
-
|
|
143
|
+
validationStateReader,
|
|
177
144
|
deliveryTimestamp,
|
|
178
145
|
} = input;
|
|
179
146
|
|
|
@@ -185,12 +152,12 @@ export class MessagesGrantAuthorization {
|
|
|
185
152
|
},
|
|
186
153
|
};
|
|
187
154
|
|
|
188
|
-
await MessagesGrantAuthorization.
|
|
155
|
+
await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
|
|
189
156
|
incomingMessage: deliveryMessage,
|
|
190
157
|
expectedGrantor,
|
|
191
158
|
expectedGrantee,
|
|
192
159
|
permissionGrants,
|
|
193
|
-
|
|
160
|
+
validationStateReader,
|
|
194
161
|
});
|
|
195
162
|
}
|
|
196
163
|
|
|
@@ -199,14 +166,14 @@ export class MessagesGrantAuthorization {
|
|
|
199
166
|
* unresolved, revoked, expired, or interface/method-mismatched grants fail the request.
|
|
200
167
|
*/
|
|
201
168
|
private static async performBaseValidationForGrantSet(input: {
|
|
202
|
-
incomingMessage:
|
|
169
|
+
incomingMessage: MessagesQueryMessage | MessagesReadMessage | MessagesSubscribeMessage,
|
|
203
170
|
expectedGrantor: string,
|
|
204
171
|
expectedGrantee: string,
|
|
205
172
|
permissionGrants: PermissionGrant[],
|
|
206
|
-
|
|
173
|
+
validationStateReader: ValidationStateReader,
|
|
207
174
|
}): Promise<void> {
|
|
208
175
|
const {
|
|
209
|
-
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants,
|
|
176
|
+
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
|
|
210
177
|
} = input;
|
|
211
178
|
|
|
212
179
|
for (const permissionGrant of permissionGrants) {
|
|
@@ -215,7 +182,7 @@ export class MessagesGrantAuthorization {
|
|
|
215
182
|
expectedGrantor,
|
|
216
183
|
expectedGrantee,
|
|
217
184
|
permissionGrant,
|
|
218
|
-
|
|
185
|
+
validationStateReader
|
|
219
186
|
});
|
|
220
187
|
}
|
|
221
188
|
}
|
|
@@ -227,7 +194,7 @@ export class MessagesGrantAuthorization {
|
|
|
227
194
|
tenant: string,
|
|
228
195
|
messageToGet: GenericMessage,
|
|
229
196
|
incomingScope: MessagesPermissionScope,
|
|
230
|
-
|
|
197
|
+
validationStateReader: ValidationStateReader,
|
|
231
198
|
): Promise<boolean> {
|
|
232
199
|
if (incomingScope.protocol === undefined) {
|
|
233
200
|
return true;
|
|
@@ -238,7 +205,7 @@ export class MessagesGrantAuthorization {
|
|
|
238
205
|
tenant,
|
|
239
206
|
messageToGet as RecordsWriteMessage | RecordsDeleteMessage,
|
|
240
207
|
incomingScope,
|
|
241
|
-
|
|
208
|
+
validationStateReader
|
|
242
209
|
);
|
|
243
210
|
}
|
|
244
211
|
|
|
@@ -256,12 +223,12 @@ export class MessagesGrantAuthorization {
|
|
|
256
223
|
tenant: string,
|
|
257
224
|
recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
|
|
258
225
|
incomingScope: MessagesPermissionScope,
|
|
259
|
-
|
|
226
|
+
validationStateReader: ValidationStateReader,
|
|
260
227
|
): Promise<boolean> {
|
|
261
228
|
const recordsWriteMessage = await MessagesGrantAuthorization.getAssociatedRecordsWrite(
|
|
262
229
|
tenant,
|
|
263
230
|
recordsMessage,
|
|
264
|
-
|
|
231
|
+
validationStateReader
|
|
265
232
|
);
|
|
266
233
|
|
|
267
234
|
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
@@ -269,7 +236,7 @@ export class MessagesGrantAuthorization {
|
|
|
269
236
|
tenant,
|
|
270
237
|
recordsWriteMessage,
|
|
271
238
|
incomingScope,
|
|
272
|
-
|
|
239
|
+
validationStateReader
|
|
273
240
|
);
|
|
274
241
|
}
|
|
275
242
|
|
|
@@ -280,7 +247,7 @@ export class MessagesGrantAuthorization {
|
|
|
280
247
|
tenant: string,
|
|
281
248
|
recordsWriteMessage: RecordsWriteMessage,
|
|
282
249
|
incomingScope: MessagesPermissionScope,
|
|
283
|
-
|
|
250
|
+
validationStateReader: ValidationStateReader,
|
|
284
251
|
): Promise<boolean> {
|
|
285
252
|
if (MessagesGrantAuthorization.isSubtreeScope(incomingScope)) {
|
|
286
253
|
return false;
|
|
@@ -288,7 +255,7 @@ export class MessagesGrantAuthorization {
|
|
|
288
255
|
|
|
289
256
|
const permissionScope = await PermissionsProtocol.getScopeFromPermissionRecord(
|
|
290
257
|
tenant,
|
|
291
|
-
|
|
258
|
+
validationStateReader,
|
|
292
259
|
recordsWriteMessage as DataEncodedRecordsWriteMessage
|
|
293
260
|
);
|
|
294
261
|
|
|
@@ -309,13 +276,13 @@ export class MessagesGrantAuthorization {
|
|
|
309
276
|
private static async getAssociatedRecordsWrite(
|
|
310
277
|
tenant: string,
|
|
311
278
|
recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
|
|
312
|
-
|
|
279
|
+
validationStateReader: ValidationStateReader,
|
|
313
280
|
): Promise<RecordsWriteMessage> {
|
|
314
281
|
if (Records.isRecordsWrite(recordsMessage)) {
|
|
315
282
|
return recordsMessage;
|
|
316
283
|
}
|
|
317
284
|
|
|
318
|
-
return
|
|
285
|
+
return validationStateReader.fetchNewestRecordsWrite(tenant, recordsMessage.descriptor.recordId);
|
|
319
286
|
}
|
|
320
287
|
|
|
321
288
|
private static getRecordsScopeTarget(recordsWriteMessage: RecordsWriteMessage): ProtocolScope {
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import type { Filter } from '../types/query-types.js';
|
|
2
|
-
import type { MessageStore } from '../types/message-store.js';
|
|
3
1
|
import type { RecordsCount } from '../interfaces/records-count.js';
|
|
4
2
|
import type { RecordsDelete } from '../interfaces/records-delete.js';
|
|
5
3
|
import type { RecordsQuery } from '../interfaces/records-query.js';
|
|
6
4
|
import type { RecordsRead } from '../interfaces/records-read.js';
|
|
7
5
|
import type { RecordsSubscribe } from '../interfaces/records-subscribe.js';
|
|
8
6
|
import type { RecordsWriteMessage } from '../types/records-types.js';
|
|
7
|
+
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
9
8
|
import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet } from '../types/protocols-types.js';
|
|
10
9
|
|
|
11
|
-
import {
|
|
10
|
+
import { DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
12
11
|
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
13
12
|
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
14
|
-
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
15
13
|
import { getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
16
14
|
import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
|
|
17
15
|
|
|
18
|
-
import type { FetchProtocolDefinitionFn } from './protocol-authorization.js';
|
|
19
|
-
|
|
20
16
|
/**
|
|
21
17
|
* Check if the incoming message is invoking a role. If so, validate the invoked role.
|
|
22
18
|
* For cross-protocol role invocation, the role record may live in a different protocol
|
|
@@ -28,9 +24,8 @@ export async function verifyInvokedRole(
|
|
|
28
24
|
protocolUri: string,
|
|
29
25
|
contextId: string | undefined,
|
|
30
26
|
protocolDefinition: ProtocolDefinition,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
governingTimestamp?: string,
|
|
27
|
+
validationStateReader: ValidationStateReader,
|
|
28
|
+
protocolDefinitionTimestamp?: string,
|
|
34
29
|
): Promise<void> {
|
|
35
30
|
const protocolRole = incomingMessage.signaturePayload?.protocolRole;
|
|
36
31
|
|
|
@@ -64,8 +59,8 @@ export async function verifyInvokedRole(
|
|
|
64
59
|
roleProtocolPath = parsed.protocolPath;
|
|
65
60
|
|
|
66
61
|
// Fetch the referenced protocol's definition to validate the role exists
|
|
67
|
-
const refDefinition = await fetchProtocolDefinition(
|
|
68
|
-
tenant, roleProtocolUri,
|
|
62
|
+
const refDefinition = await validationStateReader.fetchProtocolDefinition(
|
|
63
|
+
tenant, roleProtocolUri, protocolDefinitionTimestamp
|
|
69
64
|
);
|
|
70
65
|
const roleRuleSet = getRuleSetAtPath(roleProtocolPath, refDefinition.structure);
|
|
71
66
|
if (!roleRuleSet?.$role) {
|
|
@@ -85,16 +80,6 @@ export async function verifyInvokedRole(
|
|
|
85
80
|
}
|
|
86
81
|
}
|
|
87
82
|
|
|
88
|
-
// Construct a filter to fetch the invoked role record
|
|
89
|
-
const roleRecordFilter: Filter = {
|
|
90
|
-
interface : DwnInterfaceName.Records,
|
|
91
|
-
method : DwnMethodName.Write,
|
|
92
|
-
protocol : roleProtocolUri,
|
|
93
|
-
protocolPath : roleProtocolPath,
|
|
94
|
-
recipient : incomingMessage.author!,
|
|
95
|
-
isLatestBaseState : true,
|
|
96
|
-
};
|
|
97
|
-
|
|
98
83
|
const ancestorSegmentCountOfRolePath = roleProtocolPath.split('/').length - 1;
|
|
99
84
|
if (contextId === undefined && ancestorSegmentCountOfRolePath > 0) {
|
|
100
85
|
throw new DwnError(
|
|
@@ -103,22 +88,26 @@ export async function verifyInvokedRole(
|
|
|
103
88
|
);
|
|
104
89
|
}
|
|
105
90
|
|
|
106
|
-
// Compute `contextId` prefix
|
|
91
|
+
// Compute `contextId` prefix for fetching the invoked role record if the role path is not at the root level.
|
|
107
92
|
// e.g. if invoked role path is `Thread/Participant`, and the `contextId` of the message is `threadX/messageY/attachmentZ`,
|
|
108
|
-
// then we need to
|
|
93
|
+
// then we need to use the prefix `threadX` for the `contextId`
|
|
109
94
|
// because the `contextId` of the Participant record would be in the form of be `threadX/participantA`
|
|
95
|
+
let contextIdPrefix: string | undefined;
|
|
110
96
|
if (ancestorSegmentCountOfRolePath > 0) {
|
|
111
97
|
const contextIdSegments = contextId!.split('/'); // NOTE: currently contextId segment count is never shorter than the role path count.
|
|
112
|
-
|
|
113
|
-
const contextIdPrefixFilter = FilterUtility.constructPrefixFilterAsRangeFilter(contextIdPrefix);
|
|
114
|
-
|
|
115
|
-
roleRecordFilter.contextId = contextIdPrefixFilter;
|
|
98
|
+
contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
|
|
116
99
|
}
|
|
117
100
|
|
|
101
|
+
// fetch the invoked role record
|
|
102
|
+
const matchingRoleRecordExists = await validationStateReader.hasMatchingRoleRecord({
|
|
103
|
+
tenant,
|
|
104
|
+
protocol : roleProtocolUri,
|
|
105
|
+
protocolPath : roleProtocolPath,
|
|
106
|
+
recipient : incomingMessage.author!,
|
|
107
|
+
contextIdPrefix,
|
|
108
|
+
});
|
|
118
109
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (matchingMessages.length === 0) {
|
|
110
|
+
if (!matchingRoleRecordExists) {
|
|
122
111
|
throw new DwnError(
|
|
123
112
|
DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound,
|
|
124
113
|
`No matching role record found for protocol path ${roleProtocolPath}`
|
|
@@ -139,14 +128,14 @@ export async function verifyInvokedRole(
|
|
|
139
128
|
export async function getActionsSeekingARuleMatch(
|
|
140
129
|
tenant: string,
|
|
141
130
|
incomingMessage: RecordsCount | RecordsDelete | RecordsQuery | RecordsRead | RecordsSubscribe | RecordsWrite,
|
|
142
|
-
|
|
131
|
+
validationStateReader: ValidationStateReader,
|
|
143
132
|
): Promise<ProtocolAction[]> {
|
|
144
133
|
|
|
145
134
|
switch (incomingMessage.message.descriptor.method) {
|
|
146
|
-
case DwnMethodName.Delete:
|
|
135
|
+
case DwnMethodName.Delete: {
|
|
147
136
|
const recordsDelete = incomingMessage as RecordsDelete;
|
|
148
137
|
const recordId = recordsDelete.message.descriptor.recordId;
|
|
149
|
-
const initialWrite = await
|
|
138
|
+
const initialWrite = await validationStateReader.fetchInitialRecordsWrite(tenant, recordId);
|
|
150
139
|
|
|
151
140
|
// if there is no initial write, then no action rule can authorize the incoming message, because we won't know who the original author is
|
|
152
141
|
// NOTE: purely defensive programming: currently not reachable
|
|
@@ -155,7 +144,7 @@ export async function getActionsSeekingARuleMatch(
|
|
|
155
144
|
return [];
|
|
156
145
|
}
|
|
157
146
|
|
|
158
|
-
const actionsThatWouldAuthorizeDelete = [];
|
|
147
|
+
const actionsThatWouldAuthorizeDelete: ProtocolAction[] = [];
|
|
159
148
|
const prune = recordsDelete.message.descriptor.prune;
|
|
160
149
|
if (prune) {
|
|
161
150
|
actionsThatWouldAuthorizeDelete.push(ProtocolAction.CoPrune);
|
|
@@ -174,6 +163,7 @@ export async function getActionsSeekingARuleMatch(
|
|
|
174
163
|
}
|
|
175
164
|
|
|
176
165
|
return actionsThatWouldAuthorizeDelete;
|
|
166
|
+
}
|
|
177
167
|
|
|
178
168
|
case DwnMethodName.Count:
|
|
179
169
|
return [ProtocolAction.Read];
|
|
@@ -187,7 +177,7 @@ export async function getActionsSeekingARuleMatch(
|
|
|
187
177
|
case DwnMethodName.Subscribe:
|
|
188
178
|
return [ProtocolAction.Read];
|
|
189
179
|
|
|
190
|
-
case DwnMethodName.Write:
|
|
180
|
+
case DwnMethodName.Write: {
|
|
191
181
|
const incomingRecordsWrite = incomingMessage as RecordsWrite;
|
|
192
182
|
|
|
193
183
|
if (await incomingRecordsWrite.isInitialWrite()) {
|
|
@@ -201,7 +191,7 @@ export async function getActionsSeekingARuleMatch(
|
|
|
201
191
|
// else incoming RecordsWrite not an initial write
|
|
202
192
|
|
|
203
193
|
const recordId = (incomingMessage as RecordsWrite).message.recordId;
|
|
204
|
-
const initialWrite = await
|
|
194
|
+
const initialWrite = await validationStateReader.fetchInitialRecordsWrite(tenant, recordId);
|
|
205
195
|
|
|
206
196
|
// if there is no initial write to update from, then no action rule can authorize the incoming message
|
|
207
197
|
if (initialWrite === undefined) {
|
|
@@ -217,6 +207,7 @@ export async function getActionsSeekingARuleMatch(
|
|
|
217
207
|
}
|
|
218
208
|
}
|
|
219
209
|
}
|
|
210
|
+
}
|
|
220
211
|
|
|
221
212
|
// purely defensive programming: should not be reachable
|
|
222
213
|
// setting to empty array will prevent any message from being authorized
|
|
@@ -233,11 +224,11 @@ export async function authorizeAgainstAllowedActions(
|
|
|
233
224
|
incomingMessage: RecordsCount | RecordsDelete | RecordsQuery | RecordsRead | RecordsSubscribe | RecordsWrite,
|
|
234
225
|
ruleSet: ProtocolRuleSet,
|
|
235
226
|
recordChain: RecordsWriteMessage[],
|
|
236
|
-
|
|
227
|
+
validationStateReader: ValidationStateReader,
|
|
237
228
|
protocolDefinition?: ProtocolDefinition,
|
|
238
229
|
): Promise<void> {
|
|
239
230
|
const incomingMessageMethod = incomingMessage.message.descriptor.method;
|
|
240
|
-
const actionsSeekingARuleMatch = await getActionsSeekingARuleMatch(tenant, incomingMessage,
|
|
231
|
+
const actionsSeekingARuleMatch = await getActionsSeekingARuleMatch(tenant, incomingMessage, validationStateReader);
|
|
241
232
|
const author = incomingMessage.author;
|
|
242
233
|
const actionRules = ruleSet.$actions;
|
|
243
234
|
|