@enbox/dwn-sdk-js 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/browser.mjs +11 -11
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +783 -1206
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-constant.js +5 -0
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +13 -7
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +9 -18
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message-reply.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +28 -61
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +25 -27
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js +31 -69
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +44 -118
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
- package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +11 -11
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/replication-apply.js +295 -0
- package/dist/esm/src/core/replication-apply.js.map +1 -0
- package/dist/esm/src/core/resumable-task-manager.js +5 -4
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/validation-state-reader.js +237 -0
- package/dist/esm/src/core/validation-state-reader.js.map +1 -0
- package/dist/esm/src/dwn.js +261 -16
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/enums/dwn-interface-method.js +0 -1
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
- package/dist/esm/src/event-stream/durable-event-log.js +365 -0
- package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
- package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
- package/dist/esm/src/handlers/messages-query.js +159 -0
- package/dist/esm/src/handlers/messages-query.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +5 -5
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +8 -8
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +30 -49
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +1 -1
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +20 -11
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +20 -16
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +35 -11
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +52 -42
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +107 -11
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +62 -116
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +7 -8
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-query.js +49 -0
- package/dist/esm/src/interfaces/messages-query.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +7 -3
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +3 -4
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +4 -3
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +21 -4
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +4 -3
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +3 -3
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +4 -3
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +27 -13
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +27 -34
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/store/index-level.js +24 -9
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +7 -0
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +536 -42
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +58 -49
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/message-types.js.map +1 -1
- package/dist/esm/src/types/validation-state-reader.js +2 -0
- package/dist/esm/src/types/validation-state-reader.js.map +1 -0
- package/dist/esm/src/utils/messages.js +17 -0
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
- package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
- package/dist/esm/src/utils/records.js +50 -14
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/replication.js +85 -0
- package/dist/esm/src/utils/replication.js.map +1 -0
- package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
- package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
- package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
- package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
- package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
- package/dist/esm/tests/core/replication-apply.spec.js +274 -0
- package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
- package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
- package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
- package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
- package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
- package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
- package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
- package/dist/esm/tests/durable-event-log.spec.js +373 -0
- package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +620 -14
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +1 -4
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +165 -4
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-delivery.spec.js +1 -4
- package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
- package/dist/esm/tests/features/records-immutable.spec.js +1 -4
- package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
- package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
- package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
- package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +11 -22
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
- package/dist/esm/tests/features/records-squash.spec.js +6 -4
- package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +1 -4
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
- package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
- package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
- package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
- package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +1 -4
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +32 -9
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +4 -4
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +84 -38
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +55 -6
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +361 -5
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +60 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +7 -3
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-stores.js +19 -9
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +4 -4
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +25 -0
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
- package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
- package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
- package/dist/types/generated/precompiled-validators.d.ts +6 -6
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/core-protocol.d.ts +3 -3
- package/dist/types/src/core/core-protocol.d.ts.map +1 -1
- package/dist/types/src/core/dwn-constant.d.ts +5 -0
- package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +13 -7
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts +5 -5
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/message-reply.d.ts +5 -4
- package/dist/types/src/core/message-reply.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +12 -15
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +8 -33
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
- package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
- package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/replication-apply.d.ts +129 -0
- package/dist/types/src/core/replication-apply.d.ts.map +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/core/validation-state-reader.d.ts +79 -0
- package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +47 -13
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
- package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
- package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
- package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-query.d.ts +20 -0
- package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-read.d.ts +1 -1
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +2 -1
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +2 -2
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +1 -1
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts +2 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +3 -11
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +16 -18
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-query.d.ts +23 -0
- package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-count.d.ts +3 -3
- package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-delete.d.ts +11 -3
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-query.d.ts +3 -3
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-read.d.ts +3 -3
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +15 -7
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +9 -12
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +10 -1
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/level-wrapper.d.ts +5 -0
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +94 -14
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +17 -14
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +29 -1
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +2 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +21 -55
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +2 -2
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +1 -1
- package/dist/types/src/types/subscriptions.d.ts +50 -39
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/types/validation-state-reader.d.ts +116 -0
- package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
- package/dist/types/src/utils/messages.d.ts +10 -0
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
- package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
- package/dist/types/src/utils/records.d.ts +25 -3
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/replication.d.ts +22 -0
- package/dist/types/src/utils/replication.d.ts.map +1 -0
- package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
- package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
- package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
- package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
- package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
- package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
- package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
- package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
- package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
- package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
- package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
- package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
- package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
- package/dist/types/tests/test-event-stream.d.ts +1 -1
- package/dist/types/tests/test-event-stream.d.ts.map +1 -1
- package/dist/types/tests/test-stores.d.ts +5 -4
- package/dist/types/tests/test-stores.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +1 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
- package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/core/core-protocol.ts +3 -3
- package/src/core/dwn-constant.ts +7 -1
- package/src/core/dwn-error.ts +13 -7
- package/src/core/grant-authorization.ts +11 -20
- package/src/core/message-reply.ts +6 -5
- package/src/core/messages-grant-authorization.ts +37 -100
- package/src/core/protocol-authorization-action.ts +29 -38
- package/src/core/protocol-authorization-validation.ts +41 -98
- package/src/core/protocol-authorization.ts +56 -202
- package/src/core/protocols-grant-authorization.ts +9 -9
- package/src/core/recording-validation-state-reader.ts +130 -0
- package/src/core/records-grant-authorization.ts +16 -16
- package/src/core/replication-apply.ts +412 -0
- package/src/core/resumable-task-manager.ts +10 -8
- package/src/core/validation-state-reader.ts +350 -0
- package/src/dwn.ts +417 -30
- package/src/enums/dwn-interface-method.ts +0 -1
- package/src/event-stream/durable-event-log.ts +509 -0
- package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
- package/src/handlers/messages-query.ts +203 -0
- package/src/handlers/messages-read.ts +9 -10
- package/src/handlers/messages-subscribe.ts +12 -13
- package/src/handlers/protocols-configure.ts +37 -58
- package/src/handlers/protocols-query.ts +1 -1
- package/src/handlers/records-count.ts +24 -17
- package/src/handlers/records-delete.ts +29 -27
- package/src/handlers/records-query.ts +38 -17
- package/src/handlers/records-read.ts +63 -50
- package/src/handlers/records-subscribe.ts +132 -19
- package/src/handlers/records-write.ts +77 -168
- package/src/index.ts +16 -20
- package/src/interfaces/messages-query.ts +70 -0
- package/src/interfaces/protocols-configure.ts +12 -4
- package/src/interfaces/protocols-query.ts +4 -5
- package/src/interfaces/records-count.ts +9 -4
- package/src/interfaces/records-delete.ts +25 -5
- package/src/interfaces/records-query.ts +9 -4
- package/src/interfaces/records-read.ts +4 -4
- package/src/interfaces/records-subscribe.ts +9 -4
- package/src/interfaces/records-write.ts +41 -13
- package/src/protocols/permissions.ts +32 -52
- package/src/store/index-level.ts +30 -9
- package/src/store/level-wrapper.ts +9 -1
- package/src/store/message-store-level.ts +757 -47
- package/src/store/storage-controller.ts +74 -63
- package/src/types/message-store.ts +45 -2
- package/src/types/message-types.ts +3 -1
- package/src/types/messages-types.ts +26 -65
- package/src/types/method-handler.ts +3 -3
- package/src/types/permission-types.ts +1 -1
- package/src/types/subscriptions.ts +53 -42
- package/src/types/validation-state-reader.ts +127 -0
- package/src/utils/messages.ts +25 -1
- package/src/utils/record-limit-occupancy.ts +377 -0
- package/src/utils/records.ts +69 -13
- package/src/utils/replication.ts +122 -0
- package/dist/esm/src/core/record-chain.js +0 -64
- package/dist/esm/src/core/record-chain.js.map +0 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
- package/dist/esm/src/handlers/messages-sync.js +0 -581
- package/dist/esm/src/handlers/messages-sync.js.map +0 -1
- package/dist/esm/src/interfaces/messages-sync.js +0 -54
- package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
- package/dist/esm/src/smt/smt-store-level.js +0 -103
- package/dist/esm/src/smt/smt-store-level.js.map +0 -1
- package/dist/esm/src/smt/smt-store-memory.js +0 -41
- package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
- package/dist/esm/src/smt/smt-utils.js +0 -129
- package/dist/esm/src/smt/smt-utils.js.map +0 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
- package/dist/esm/src/state-index/state-index-level.js +0 -191
- package/dist/esm/src/state-index/state-index-level.js.map +0 -1
- package/dist/esm/src/sync/records-projection.js +0 -228
- package/dist/esm/src/sync/records-projection.js.map +0 -1
- package/dist/esm/src/types/smt-types.js +0 -5
- package/dist/esm/src/types/smt-types.js.map +0 -1
- package/dist/esm/src/types/state-index.js +0 -2
- package/dist/esm/src/types/state-index.js.map +0 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
- package/dist/esm/tests/sync/records-projection.spec.js +0 -245
- package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
- package/dist/types/src/core/record-chain.d.ts +0 -24
- package/dist/types/src/core/record-chain.d.ts.map +0 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
- package/dist/types/src/handlers/messages-sync.d.ts +0 -83
- package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
- package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
- package/dist/types/src/smt/smt-store-level.d.ts +0 -32
- package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
- package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
- package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
- package/dist/types/src/smt/smt-utils.d.ts +0 -58
- package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
- package/dist/types/src/state-index/state-index-level.d.ts +0 -83
- package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
- package/dist/types/src/sync/records-projection.d.ts +0 -98
- package/dist/types/src/sync/records-projection.d.ts.map +0 -1
- package/dist/types/src/types/smt-types.d.ts +0 -81
- package/dist/types/src/types/smt-types.d.ts.map +0 -1
- package/dist/types/src/types/state-index.d.ts +0 -90
- package/dist/types/src/types/state-index.d.ts.map +0 -1
- package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
- package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
- package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
- package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
- package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
- package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
- package/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
- package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
- package/src/core/record-chain.ts +0 -99
- package/src/event-stream/event-emitter-event-log.ts +0 -430
- package/src/handlers/messages-sync.ts +0 -896
- package/src/interfaces/messages-sync.ts +0 -86
- package/src/smt/smt-store-level.ts +0 -143
- package/src/smt/smt-store-memory.ts +0 -53
- package/src/smt/smt-utils.ts +0 -149
- package/src/smt/sparse-merkle-tree.ts +0 -698
- package/src/state-index/state-index-level.ts +0 -239
- package/src/sync/records-projection.ts +0 -328
- package/src/types/smt-types.ts +0 -95
- package/src/types/state-index.ts +0 -100
|
@@ -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,80 +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
|
-
const { projectionScopes, protocol } = syncMessage.descriptor;
|
|
103
|
-
|
|
104
|
-
if (projectionScopes === undefined) {
|
|
105
|
-
MessagesGrantAuthorization.authorizeProtocolSyncScope(scopes, protocol);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
MessagesGrantAuthorization.authorizeProjectionScopes(scopes, projectionScopes);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private static authorizeProtocolSyncScope(
|
|
113
|
-
scopes: MessagesPermissionScope[],
|
|
114
|
-
protocol: string | undefined
|
|
115
|
-
): void {
|
|
116
|
-
if (isRecordsPrimaryProjectionExcludedProtocol(protocol)) {
|
|
117
|
-
throw new DwnError(
|
|
118
|
-
DwnErrorCode.MessagesGrantAuthorizationProtocolSyncInfrastructureProtocol,
|
|
119
|
-
`Protocol-scoped MessagesSync cannot authorize infrastructure protocol ${protocol}`
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (!MessagesGrantAuthorization.someScopeMatches(scopes, { protocol })) {
|
|
124
|
-
throw new DwnError(
|
|
125
|
-
DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol,
|
|
126
|
-
`No permission grant scope matches protocol ${protocol}`
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
private static authorizeProjectionScopes(
|
|
132
|
-
scopes: MessagesPermissionScope[],
|
|
133
|
-
projectionScopes: ProtocolScope[],
|
|
134
|
-
): void {
|
|
135
|
-
for (const projectionScope of projectionScopes) {
|
|
136
|
-
if (isRecordsPrimaryProjectionExcludedProtocol(projectionScope.protocol)) {
|
|
137
|
-
throw new DwnError(
|
|
138
|
-
DwnErrorCode.MessagesGrantAuthorizationProjectionInfrastructureProtocol,
|
|
139
|
-
`Projected MessagesSync cannot authorize infrastructure protocol ${projectionScope.protocol}`
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (MessagesGrantAuthorization.someScopeMatches(scopes, projectionScope)) {
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
throw new DwnError(
|
|
148
|
-
DwnErrorCode.MessagesGrantAuthorizationProjectionScopeMismatch,
|
|
149
|
-
`No permission grant scope matches projection scope ${JSON.stringify(projectionScope)}`
|
|
150
|
-
);
|
|
151
|
-
}
|
|
88
|
+
MessagesGrantAuthorization.authorizeFilterScope(incomingMessage, scopes);
|
|
152
89
|
}
|
|
153
90
|
|
|
154
|
-
private static
|
|
155
|
-
|
|
91
|
+
private static authorizeFilterScope(
|
|
92
|
+
messagesMessage: MessagesQueryMessage | MessagesSubscribeMessage,
|
|
156
93
|
scopes: MessagesPermissionScope[]
|
|
157
94
|
): void {
|
|
158
|
-
const { filters } =
|
|
95
|
+
const { filters } = messagesMessage.descriptor;
|
|
159
96
|
|
|
160
97
|
if (filters.length === 0 && !MessagesGrantAuthorization.hasUnscopedGrant(scopes)) {
|
|
161
98
|
throw new DwnError(
|
|
@@ -195,7 +132,7 @@ export class MessagesGrantAuthorization {
|
|
|
195
132
|
expectedGrantor: string,
|
|
196
133
|
expectedGrantee: string,
|
|
197
134
|
permissionGrants: PermissionGrant[],
|
|
198
|
-
|
|
135
|
+
validationStateReader: ValidationStateReader,
|
|
199
136
|
deliveryTimestamp: string,
|
|
200
137
|
}): Promise<void> {
|
|
201
138
|
const {
|
|
@@ -203,7 +140,7 @@ export class MessagesGrantAuthorization {
|
|
|
203
140
|
expectedGrantor,
|
|
204
141
|
expectedGrantee,
|
|
205
142
|
permissionGrants,
|
|
206
|
-
|
|
143
|
+
validationStateReader,
|
|
207
144
|
deliveryTimestamp,
|
|
208
145
|
} = input;
|
|
209
146
|
|
|
@@ -215,12 +152,12 @@ export class MessagesGrantAuthorization {
|
|
|
215
152
|
},
|
|
216
153
|
};
|
|
217
154
|
|
|
218
|
-
await MessagesGrantAuthorization.
|
|
155
|
+
await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
|
|
219
156
|
incomingMessage: deliveryMessage,
|
|
220
157
|
expectedGrantor,
|
|
221
158
|
expectedGrantee,
|
|
222
159
|
permissionGrants,
|
|
223
|
-
|
|
160
|
+
validationStateReader,
|
|
224
161
|
});
|
|
225
162
|
}
|
|
226
163
|
|
|
@@ -229,14 +166,14 @@ export class MessagesGrantAuthorization {
|
|
|
229
166
|
* unresolved, revoked, expired, or interface/method-mismatched grants fail the request.
|
|
230
167
|
*/
|
|
231
168
|
private static async performBaseValidationForGrantSet(input: {
|
|
232
|
-
incomingMessage:
|
|
169
|
+
incomingMessage: MessagesQueryMessage | MessagesReadMessage | MessagesSubscribeMessage,
|
|
233
170
|
expectedGrantor: string,
|
|
234
171
|
expectedGrantee: string,
|
|
235
172
|
permissionGrants: PermissionGrant[],
|
|
236
|
-
|
|
173
|
+
validationStateReader: ValidationStateReader,
|
|
237
174
|
}): Promise<void> {
|
|
238
175
|
const {
|
|
239
|
-
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants,
|
|
176
|
+
incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
|
|
240
177
|
} = input;
|
|
241
178
|
|
|
242
179
|
for (const permissionGrant of permissionGrants) {
|
|
@@ -245,7 +182,7 @@ export class MessagesGrantAuthorization {
|
|
|
245
182
|
expectedGrantor,
|
|
246
183
|
expectedGrantee,
|
|
247
184
|
permissionGrant,
|
|
248
|
-
|
|
185
|
+
validationStateReader
|
|
249
186
|
});
|
|
250
187
|
}
|
|
251
188
|
}
|
|
@@ -257,7 +194,7 @@ export class MessagesGrantAuthorization {
|
|
|
257
194
|
tenant: string,
|
|
258
195
|
messageToGet: GenericMessage,
|
|
259
196
|
incomingScope: MessagesPermissionScope,
|
|
260
|
-
|
|
197
|
+
validationStateReader: ValidationStateReader,
|
|
261
198
|
): Promise<boolean> {
|
|
262
199
|
if (incomingScope.protocol === undefined) {
|
|
263
200
|
return true;
|
|
@@ -268,7 +205,7 @@ export class MessagesGrantAuthorization {
|
|
|
268
205
|
tenant,
|
|
269
206
|
messageToGet as RecordsWriteMessage | RecordsDeleteMessage,
|
|
270
207
|
incomingScope,
|
|
271
|
-
|
|
208
|
+
validationStateReader
|
|
272
209
|
);
|
|
273
210
|
}
|
|
274
211
|
|
|
@@ -286,12 +223,12 @@ export class MessagesGrantAuthorization {
|
|
|
286
223
|
tenant: string,
|
|
287
224
|
recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
|
|
288
225
|
incomingScope: MessagesPermissionScope,
|
|
289
|
-
|
|
226
|
+
validationStateReader: ValidationStateReader,
|
|
290
227
|
): Promise<boolean> {
|
|
291
228
|
const recordsWriteMessage = await MessagesGrantAuthorization.getAssociatedRecordsWrite(
|
|
292
229
|
tenant,
|
|
293
230
|
recordsMessage,
|
|
294
|
-
|
|
231
|
+
validationStateReader
|
|
295
232
|
);
|
|
296
233
|
|
|
297
234
|
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
@@ -299,7 +236,7 @@ export class MessagesGrantAuthorization {
|
|
|
299
236
|
tenant,
|
|
300
237
|
recordsWriteMessage,
|
|
301
238
|
incomingScope,
|
|
302
|
-
|
|
239
|
+
validationStateReader
|
|
303
240
|
);
|
|
304
241
|
}
|
|
305
242
|
|
|
@@ -310,7 +247,7 @@ export class MessagesGrantAuthorization {
|
|
|
310
247
|
tenant: string,
|
|
311
248
|
recordsWriteMessage: RecordsWriteMessage,
|
|
312
249
|
incomingScope: MessagesPermissionScope,
|
|
313
|
-
|
|
250
|
+
validationStateReader: ValidationStateReader,
|
|
314
251
|
): Promise<boolean> {
|
|
315
252
|
if (MessagesGrantAuthorization.isSubtreeScope(incomingScope)) {
|
|
316
253
|
return false;
|
|
@@ -318,7 +255,7 @@ export class MessagesGrantAuthorization {
|
|
|
318
255
|
|
|
319
256
|
const permissionScope = await PermissionsProtocol.getScopeFromPermissionRecord(
|
|
320
257
|
tenant,
|
|
321
|
-
|
|
258
|
+
validationStateReader,
|
|
322
259
|
recordsWriteMessage as DataEncodedRecordsWriteMessage
|
|
323
260
|
);
|
|
324
261
|
|
|
@@ -339,13 +276,13 @@ export class MessagesGrantAuthorization {
|
|
|
339
276
|
private static async getAssociatedRecordsWrite(
|
|
340
277
|
tenant: string,
|
|
341
278
|
recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
|
|
342
|
-
|
|
279
|
+
validationStateReader: ValidationStateReader,
|
|
343
280
|
): Promise<RecordsWriteMessage> {
|
|
344
281
|
if (Records.isRecordsWrite(recordsMessage)) {
|
|
345
282
|
return recordsMessage;
|
|
346
283
|
}
|
|
347
284
|
|
|
348
|
-
return
|
|
285
|
+
return validationStateReader.fetchNewestRecordsWrite(tenant, recordsMessage.descriptor.recordId);
|
|
349
286
|
}
|
|
350
287
|
|
|
351
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
|
|