@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
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { EventLogEntry, ProgressGapInfo, ReplicationFeedReader } from '../types/subscriptions.js';
|
|
2
|
+
import type { Filter, KeyValues } from '../types/query-types.js';
|
|
3
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
4
|
+
import type { MessagesFilter, MessagesQueryMessage, MessagesQueryReply, MessagesQueryReplyEntry } from '../types/messages-types.js';
|
|
5
|
+
|
|
6
|
+
import { authenticate } from '../core/auth.js';
|
|
7
|
+
import { Message } from '../core/message.js';
|
|
8
|
+
import { messageReplyFromError } from '../core/message-reply.js';
|
|
9
|
+
import { Messages } from '../utils/messages.js';
|
|
10
|
+
import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
|
|
11
|
+
import { MessagesQuery } from '../interfaces/messages-query.js';
|
|
12
|
+
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
13
|
+
import { Replication } from '../utils/replication.js';
|
|
14
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
15
|
+
|
|
16
|
+
export class MessagesQueryHandler implements MethodHandler {
|
|
17
|
+
|
|
18
|
+
constructor(private readonly deps: HandlerDependencies) { }
|
|
19
|
+
|
|
20
|
+
public async handle({ tenant, message }: { tenant: string, message: MessagesQueryMessage }): Promise<MessagesQueryReply> {
|
|
21
|
+
let messagesQuery: MessagesQuery;
|
|
22
|
+
try {
|
|
23
|
+
messagesQuery = await MessagesQuery.parse(message);
|
|
24
|
+
} catch (e) {
|
|
25
|
+
return messageReplyFromError(e, 400);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
30
|
+
await this.authorizeMessagesQuery(tenant, messagesQuery);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
return messageReplyFromError(e, 401);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const replicationFeedReader = MessagesQueryHandler.asReplicationFeedReader(this.deps.messageStore);
|
|
36
|
+
if (replicationFeedReader === undefined) {
|
|
37
|
+
return {
|
|
38
|
+
status: {
|
|
39
|
+
code : 501,
|
|
40
|
+
detail : `${DwnErrorCode.MessagesQueryReplicationFeedUnimplemented}: MessagesQuery requires a replication feed reader`,
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const filters = MessagesQueryHandler.convertFilters(message.descriptor.filters, this.deps);
|
|
47
|
+
const result = await replicationFeedReader.logRead(tenant, {
|
|
48
|
+
cursor : message.descriptor.cursor,
|
|
49
|
+
filters,
|
|
50
|
+
limit : message.descriptor.limit,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const reply: MessagesQueryReply = {
|
|
54
|
+
status : { code: 200, detail: 'OK' },
|
|
55
|
+
entries : await MessagesQueryHandler.buildEntries(result.events, message.descriptor.cidsOnly ?? false),
|
|
56
|
+
cursor : result.cursor,
|
|
57
|
+
drained : result.drained,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const fingerprintScopes = MessagesQueryHandler.computeFingerprintScopes(message.descriptor.filters);
|
|
61
|
+
if (fingerprintScopes !== undefined) {
|
|
62
|
+
reply.fingerprint = await replicationFeedReader.fingerprint(tenant, fingerprintScopes);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return reply;
|
|
66
|
+
} catch (e) {
|
|
67
|
+
if (e instanceof DwnError && e.code === DwnErrorCode.EventLogProgressGap) {
|
|
68
|
+
const gapInfo = MessagesQueryHandler.getProgressGapInfo(e);
|
|
69
|
+
return {
|
|
70
|
+
status : { code: 410, detail: 'Progress token gap' },
|
|
71
|
+
error : gapInfo === undefined ? undefined : { code: 'ProgressGap', ...gapInfo },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return messageReplyFromError(e, 500);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private async authorizeMessagesQuery(
|
|
80
|
+
tenant: string,
|
|
81
|
+
messagesQuery: MessagesQuery,
|
|
82
|
+
): Promise<void> {
|
|
83
|
+
if (messagesQuery.author === tenant) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const permissionGrantIds = Message.getPermissionGrantIds(messagesQuery.signaturePayload!);
|
|
88
|
+
if (messagesQuery.author !== undefined && permissionGrantIds.length > 0) {
|
|
89
|
+
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(
|
|
90
|
+
tenant,
|
|
91
|
+
this.deps.validationStateReader,
|
|
92
|
+
permissionGrantIds
|
|
93
|
+
);
|
|
94
|
+
await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
|
|
95
|
+
incomingMessage : messagesQuery.message,
|
|
96
|
+
expectedGrantor : tenant,
|
|
97
|
+
expectedGrantee : messagesQuery.author,
|
|
98
|
+
permissionGrants,
|
|
99
|
+
validationStateReader : this.deps.validationStateReader
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
throw new DwnError(DwnErrorCode.MessagesQueryAuthorizationFailed, 'message failed authorization');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private static asReplicationFeedReader(candidate: unknown): ReplicationFeedReader | undefined {
|
|
108
|
+
const partial = candidate as Partial<ReplicationFeedReader>;
|
|
109
|
+
if (
|
|
110
|
+
typeof partial.logRead === 'function' &&
|
|
111
|
+
typeof partial.logBounds === 'function' &&
|
|
112
|
+
typeof partial.fingerprint === 'function' &&
|
|
113
|
+
typeof partial.epoch === 'function'
|
|
114
|
+
) {
|
|
115
|
+
return partial as ReplicationFeedReader;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private static convertFilters(filters: MessagesFilter[], deps: HandlerDependencies): Filter[] | undefined {
|
|
120
|
+
if (filters.length === 0) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return Messages.convertFilters(filters, deps.coreProtocols);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private static async buildEntries(
|
|
128
|
+
events: EventLogEntry[],
|
|
129
|
+
cidsOnly: boolean,
|
|
130
|
+
): Promise<MessagesQueryReplyEntry[]> {
|
|
131
|
+
const entries: MessagesQueryReplyEntry[] = [];
|
|
132
|
+
|
|
133
|
+
for (const event of events) {
|
|
134
|
+
entries.push(await MessagesQueryHandler.buildEntry(event, cidsOnly));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return entries;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private static async buildEntry(
|
|
141
|
+
event: EventLogEntry,
|
|
142
|
+
cidsOnly: boolean,
|
|
143
|
+
): Promise<MessagesQueryReplyEntry> {
|
|
144
|
+
const messageCid = event.messageCid ?? await Message.getCid(event.event.message);
|
|
145
|
+
const protocol = MessagesQueryHandler.getStringIndex(event.indexes, 'protocol');
|
|
146
|
+
const entry: MessagesQueryReplyEntry = {
|
|
147
|
+
seq : event.seq,
|
|
148
|
+
messageCid,
|
|
149
|
+
isLatestBaseState : MessagesQueryHandler.isLatestBaseState(event.indexes),
|
|
150
|
+
protocol,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
if (cidsOnly) {
|
|
154
|
+
return entry;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const { message, encodedData } = Messages.detachEncodedData(event.event.message);
|
|
158
|
+
entry.message = message;
|
|
159
|
+
if (encodedData !== undefined) {
|
|
160
|
+
entry.encodedData = encodedData;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return entry;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private static getStringIndex(indexes: KeyValues, key: string): string | undefined {
|
|
167
|
+
const value = indexes[key];
|
|
168
|
+
return typeof value === 'string' ? value : undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private static isLatestBaseState(indexes: KeyValues): boolean {
|
|
172
|
+
return indexes.isLatestBaseState === true || indexes.isLatestBaseState === 'true';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private static computeFingerprintScopes(filters: MessagesFilter[]): string[] | undefined {
|
|
176
|
+
if (filters.length === 0) {
|
|
177
|
+
return [Replication.globalDomain];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const protocols = new Set<string>();
|
|
181
|
+
for (const filter of filters) {
|
|
182
|
+
const keys = Object.keys(filter);
|
|
183
|
+
if (keys.length !== 1 || typeof filter.protocol !== 'string') {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
protocols.add(filter.protocol);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const protocolList = [...protocols];
|
|
191
|
+
const scopes = protocolList.map(protocol => Replication.protocolDomain(protocol));
|
|
192
|
+
if (!protocols.has(PermissionsProtocol.uri)) {
|
|
193
|
+
scopes.push(...protocolList.map(protocol => Replication.permissionDomain(protocol)));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return scopes;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private static getProgressGapInfo(error: DwnError): ProgressGapInfo | undefined {
|
|
200
|
+
const gapInfo = (error as DwnError & { gapInfo?: ProgressGapInfo }).gapInfo;
|
|
201
|
+
return gapInfo;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { GenericMessage } from '../types/message-types.js';
|
|
2
|
-
import type { MessageStore } from '../types/message-store.js';
|
|
3
2
|
import type { RecordsQueryReplyEntry } from '../types/records-types.js';
|
|
4
3
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
4
|
import type { MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry } from '../types/messages-types.js';
|
|
@@ -41,7 +40,7 @@ export class MessagesReadHandler implements MethodHandler {
|
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
try {
|
|
44
|
-
await MessagesReadHandler.authorizeMessagesRead(tenant, messagesRead, messageResult, this.deps
|
|
43
|
+
await MessagesReadHandler.authorizeMessagesRead(tenant, messagesRead, messageResult, this.deps);
|
|
45
44
|
} catch (error) {
|
|
46
45
|
return messageReplyFromError(error, 401);
|
|
47
46
|
}
|
|
@@ -72,13 +71,13 @@ export class MessagesReadHandler implements MethodHandler {
|
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
/**
|
|
75
|
-
* @param
|
|
74
|
+
* @param deps Used to fetch related permission grant, permission revocation, and/or RecordsWrites for permission scope validation.
|
|
76
75
|
*/
|
|
77
76
|
private static async authorizeMessagesRead(
|
|
78
77
|
tenant: string,
|
|
79
78
|
messagesRead: MessagesRead,
|
|
80
79
|
matchedMessage: GenericMessage,
|
|
81
|
-
|
|
80
|
+
deps: HandlerDependencies
|
|
82
81
|
): Promise<void> {
|
|
83
82
|
|
|
84
83
|
if (messagesRead.author === tenant) {
|
|
@@ -88,14 +87,14 @@ export class MessagesReadHandler implements MethodHandler {
|
|
|
88
87
|
|
|
89
88
|
const permissionGrantIds = Message.getPermissionGrantIds(messagesRead.signaturePayload!);
|
|
90
89
|
if (messagesRead.author !== undefined && permissionGrantIds.length > 0) {
|
|
91
|
-
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant,
|
|
90
|
+
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
|
|
92
91
|
await MessagesGrantAuthorization.authorizeMessagesRead({
|
|
93
|
-
messagesReadMessage
|
|
94
|
-
messageToRead
|
|
95
|
-
expectedGrantor
|
|
96
|
-
expectedGrantee
|
|
92
|
+
messagesReadMessage : messagesRead.message,
|
|
93
|
+
messageToRead : matchedMessage,
|
|
94
|
+
expectedGrantor : tenant,
|
|
95
|
+
expectedGrantee : messagesRead.author,
|
|
97
96
|
permissionGrants,
|
|
98
|
-
|
|
97
|
+
validationStateReader : deps.validationStateReader
|
|
99
98
|
});
|
|
100
99
|
} else {
|
|
101
100
|
throw new DwnError(DwnErrorCode.MessagesReadAuthorizationFailed, 'protocol message failed authorization');
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { MessageStore } from '../types/message-store.js';
|
|
2
1
|
import type { PermissionGrant } from '../protocols/permission-grant.js';
|
|
3
2
|
import type { EventSubscription, ProgressGapInfo, SubscriptionEvent, SubscriptionListener, SubscriptionMessage } from '../types/subscriptions.js';
|
|
4
3
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
@@ -57,7 +56,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
57
56
|
let authorization: MessagesSubscribeAuthorization;
|
|
58
57
|
try {
|
|
59
58
|
await authenticate(message.authorization, this.deps.didResolver);
|
|
60
|
-
authorization = await MessagesSubscribeHandler.authorizeMessagesSubscribe(tenant, messagesSubscribe, this.deps
|
|
59
|
+
authorization = await MessagesSubscribeHandler.authorizeMessagesSubscribe(tenant, messagesSubscribe, this.deps);
|
|
61
60
|
} catch (error) {
|
|
62
61
|
return messageReplyFromError(error, 401);
|
|
63
62
|
}
|
|
@@ -65,7 +64,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
65
64
|
const guardedHandler = MessagesSubscribeHandler.createAuthorizationGuard({
|
|
66
65
|
authorization,
|
|
67
66
|
messagesSubscribe,
|
|
68
|
-
|
|
67
|
+
validationStateReader: this.deps.validationStateReader,
|
|
69
68
|
subscriptionHandler,
|
|
70
69
|
});
|
|
71
70
|
|
|
@@ -99,7 +98,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
99
98
|
private static async authorizeMessagesSubscribe(
|
|
100
99
|
tenant: string,
|
|
101
100
|
messagesSubscribe: MessagesSubscribe,
|
|
102
|
-
|
|
101
|
+
deps: HandlerDependencies
|
|
103
102
|
): Promise<MessagesSubscribeAuthorization> {
|
|
104
103
|
// if `MessagesSubscribe` author is the same as the target tenant, we can directly grant access
|
|
105
104
|
if (messagesSubscribe.author === tenant) {
|
|
@@ -108,13 +107,13 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
108
107
|
|
|
109
108
|
const permissionGrantIds = Message.getPermissionGrantIds(messagesSubscribe.signaturePayload!);
|
|
110
109
|
if (messagesSubscribe.author !== undefined && permissionGrantIds.length > 0) {
|
|
111
|
-
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant,
|
|
112
|
-
await MessagesGrantAuthorization.
|
|
113
|
-
incomingMessage
|
|
114
|
-
expectedGrantor
|
|
115
|
-
expectedGrantee
|
|
110
|
+
const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
|
|
111
|
+
await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
|
|
112
|
+
incomingMessage : messagesSubscribe.message,
|
|
113
|
+
expectedGrantor : tenant,
|
|
114
|
+
expectedGrantee : messagesSubscribe.author,
|
|
116
115
|
permissionGrants,
|
|
117
|
-
|
|
116
|
+
validationStateReader : deps.validationStateReader
|
|
118
117
|
});
|
|
119
118
|
return {
|
|
120
119
|
kind : 'delegate',
|
|
@@ -130,10 +129,10 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
130
129
|
private static createAuthorizationGuard(input: {
|
|
131
130
|
authorization: MessagesSubscribeAuthorization;
|
|
132
131
|
messagesSubscribe: MessagesSubscribe;
|
|
133
|
-
|
|
132
|
+
validationStateReader: HandlerDependencies['validationStateReader'];
|
|
134
133
|
subscriptionHandler: SubscriptionListener;
|
|
135
134
|
}): GuardedSubscriptionHandler {
|
|
136
|
-
const { authorization, messagesSubscribe,
|
|
135
|
+
const { authorization, messagesSubscribe, validationStateReader, subscriptionHandler } = input;
|
|
137
136
|
if (authorization.kind === 'owner') {
|
|
138
137
|
return {
|
|
139
138
|
listener : subscriptionHandler,
|
|
@@ -182,7 +181,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
|
|
|
182
181
|
expectedGrantor : authorization.expectedGrantor,
|
|
183
182
|
expectedGrantee : authorization.expectedGrantee,
|
|
184
183
|
permissionGrants : authorization.permissionGrants,
|
|
185
|
-
|
|
184
|
+
validationStateReader,
|
|
186
185
|
deliveryTimestamp : Time.getCurrentTimestamp(),
|
|
187
186
|
});
|
|
188
187
|
} catch {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ProgressToken } from '../types/subscriptions.js';
|
|
3
3
|
import type { RecordsWriteMessage } from '../types/records-types.js';
|
|
4
|
+
import type { ValidationStateReader } from '../types/validation-state-reader.js';
|
|
4
5
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
6
|
import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureMessage } from '../types/protocols-types.js';
|
|
6
7
|
|
|
7
8
|
import { authenticate } from '../core/auth.js';
|
|
8
9
|
import { Message } from '../core/message.js';
|
|
9
10
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
10
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
11
11
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
12
12
|
import { ProtocolsConfigure } from '../interfaces/protocols-configure.js';
|
|
13
13
|
import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
|
|
@@ -43,7 +43,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
43
43
|
public async handle({
|
|
44
44
|
tenant,
|
|
45
45
|
message,
|
|
46
|
-
}: {tenant: string, message: ProtocolsConfigureMessage }): Promise<GenericMessageReply> {
|
|
46
|
+
}: { tenant: string, message: ProtocolsConfigureMessage }): Promise<GenericMessageReply> {
|
|
47
47
|
let protocolsConfigure: ProtocolsConfigure;
|
|
48
48
|
try {
|
|
49
49
|
protocolsConfigure = await ProtocolsConfigure.parse(message);
|
|
@@ -54,7 +54,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
54
54
|
// authentication & authorization
|
|
55
55
|
try {
|
|
56
56
|
await authenticate(message.authorization, this.deps.didResolver);
|
|
57
|
-
await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.deps
|
|
57
|
+
await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.deps);
|
|
58
58
|
} catch (e) {
|
|
59
59
|
return messageReplyFromError(e, 401);
|
|
60
60
|
}
|
|
@@ -63,7 +63,9 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
63
63
|
// `$ref` paths must exist in the referenced protocols, and cross-protocol roles must exist.
|
|
64
64
|
try {
|
|
65
65
|
await ProtocolsConfigureHandler.validateCompositionDependencies(
|
|
66
|
-
tenant,
|
|
66
|
+
tenant,
|
|
67
|
+
message.descriptor.definition,
|
|
68
|
+
this.deps.validationStateReader,
|
|
67
69
|
);
|
|
68
70
|
} catch (e) {
|
|
69
71
|
return messageReplyFromError(e, 400);
|
|
@@ -78,8 +80,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
78
80
|
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
|
|
79
81
|
|
|
80
82
|
// If the exact same message already exists, return 409 immediately.
|
|
81
|
-
// This prevents duplicate key violations in the MessageStore
|
|
82
|
-
//
|
|
83
|
+
// This prevents duplicate key violations in the MessageStore when sync pushes
|
|
84
|
+
// a message that the remote already has.
|
|
83
85
|
const incomingCid = await Message.getCid(message);
|
|
84
86
|
for (const existing of existingMessages) {
|
|
85
87
|
if (await Message.getCid(existing) === incomingCid) {
|
|
@@ -97,44 +99,38 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
97
99
|
|
|
98
100
|
// write the incoming message to DB if incoming message is newest
|
|
99
101
|
let messageReply: GenericMessageReply;
|
|
102
|
+
let position: ProgressToken | undefined;
|
|
100
103
|
if (incomingMessageIsNewest) {
|
|
101
104
|
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, true);
|
|
102
105
|
|
|
103
|
-
await this.deps.messageStore.put(tenant, message, indexes);
|
|
104
|
-
|
|
105
|
-
await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
|
|
106
|
-
|
|
107
|
-
// only emit if the event log is set
|
|
108
|
-
if (this.deps.eventLog !== undefined) {
|
|
109
|
-
await this.deps.eventLog.emit(tenant, { message }, indexes, messageCid);
|
|
110
|
-
}
|
|
106
|
+
const putResult = await this.deps.messageStore.put(tenant, message, indexes);
|
|
107
|
+
position = putResult.position;
|
|
111
108
|
|
|
112
109
|
messageReply = {
|
|
113
|
-
status: { code: 202, detail: 'Accepted' }
|
|
110
|
+
status: { code: 202, detail: 'Accepted' },
|
|
111
|
+
position,
|
|
114
112
|
};
|
|
115
113
|
} else {
|
|
116
114
|
// incoming message is older — still store it as a historical version (not the latest)
|
|
117
115
|
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, false);
|
|
118
116
|
|
|
119
|
-
await this.deps.messageStore.put(tenant, message, indexes);
|
|
120
|
-
|
|
121
|
-
await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
|
|
117
|
+
const putResult = await this.deps.messageStore.put(tenant, message, indexes);
|
|
118
|
+
position = putResult.position;
|
|
122
119
|
|
|
123
120
|
messageReply = {
|
|
124
|
-
status: { code: 202, detail: 'Accepted' }
|
|
121
|
+
status: { code: 202, detail: 'Accepted' },
|
|
122
|
+
position,
|
|
125
123
|
};
|
|
126
124
|
}
|
|
127
125
|
|
|
128
126
|
// re-index previously-latest messages as no longer the latest base state.
|
|
129
|
-
// We must delete and re-put (not just put) to properly replace old index entries.
|
|
130
127
|
for (const existingMessage of existingMessages) {
|
|
131
128
|
if (existingMessage !== newestMessage) {
|
|
132
129
|
const existingProtocolsConfigure = await ProtocolsConfigure.parse(existingMessage as ProtocolsConfigureMessage);
|
|
133
130
|
const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
|
|
134
131
|
const existingCid = await Message.getCid(existingMessage);
|
|
135
132
|
|
|
136
|
-
await this.deps.messageStore.
|
|
137
|
-
await this.deps.messageStore.put(tenant, existingMessage, updatedIndexes);
|
|
133
|
+
await this.deps.messageStore.updateIndexes(tenant, existingCid, updatedIndexes);
|
|
138
134
|
}
|
|
139
135
|
}
|
|
140
136
|
|
|
@@ -159,23 +155,23 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
159
155
|
return indexes;
|
|
160
156
|
}
|
|
161
157
|
|
|
162
|
-
private static async authorizeProtocolsConfigure(tenant: string, protocolConfigure: ProtocolsConfigure,
|
|
158
|
+
private static async authorizeProtocolsConfigure(tenant: string, protocolConfigure: ProtocolsConfigure, deps: HandlerDependencies): Promise<void> {
|
|
163
159
|
|
|
164
160
|
if (protocolConfigure.isSignedByAuthorDelegate) {
|
|
165
|
-
await protocolConfigure.authorizeAuthorDelegate(
|
|
161
|
+
await protocolConfigure.authorizeAuthorDelegate(deps.validationStateReader);
|
|
166
162
|
}
|
|
167
163
|
|
|
168
164
|
if (protocolConfigure.author === tenant) {
|
|
169
165
|
return;
|
|
170
166
|
} else if (protocolConfigure.author !== undefined && Message.getPermissionGrantId(protocolConfigure.signaturePayload!) !== undefined) {
|
|
171
167
|
const permissionGrantId = Message.getPermissionGrantId(protocolConfigure.signaturePayload!)!;
|
|
172
|
-
const permissionGrant = await
|
|
168
|
+
const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
173
169
|
await ProtocolsGrantAuthorization.authorizeConfigure({
|
|
174
170
|
protocolsConfigureMessage : protocolConfigure.message,
|
|
175
171
|
expectedGrantor : tenant,
|
|
176
172
|
expectedGrantee : protocolConfigure.author,
|
|
177
173
|
permissionGrant,
|
|
178
|
-
|
|
174
|
+
validationStateReader : deps.validationStateReader
|
|
179
175
|
});
|
|
180
176
|
} else {
|
|
181
177
|
throw new DwnError(DwnErrorCode.ProtocolsConfigureAuthorizationFailed, 'message failed authorization');
|
|
@@ -184,8 +180,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
184
180
|
|
|
185
181
|
private async purgeRecordsInvalidatedByProtocolConfig(tenant: string, protocol: string): Promise<void> {
|
|
186
182
|
const dataStore = this.deps.dataStore;
|
|
187
|
-
|
|
188
|
-
if (dataStore === undefined || stateIndex === undefined) {
|
|
183
|
+
if (dataStore === undefined) {
|
|
189
184
|
return;
|
|
190
185
|
}
|
|
191
186
|
|
|
@@ -227,7 +222,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
227
222
|
// record. Descendants are evaluated independently so valid child records are not
|
|
228
223
|
// destroyed as collateral.
|
|
229
224
|
await StorageController.purgeRecordMessages(
|
|
230
|
-
tenant, recordMessages, this.deps.messageStore, dataStore
|
|
225
|
+
tenant, recordMessages, this.deps.messageStore, dataStore
|
|
231
226
|
);
|
|
232
227
|
}
|
|
233
228
|
}
|
|
@@ -241,7 +236,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
241
236
|
// Stored records were authenticated when admitted. Reconciliation should not make
|
|
242
237
|
// record retention depend on fresh DID resolution availability or mutable dependency state.
|
|
243
238
|
await ProtocolAuthorization.validateStoredInitialWrite(
|
|
244
|
-
tenant, recordsWrite, this.deps.
|
|
239
|
+
tenant, recordsWrite, this.deps.validationStateReader
|
|
245
240
|
);
|
|
246
241
|
return 'valid';
|
|
247
242
|
} catch (error) {
|
|
@@ -266,7 +261,10 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
266
261
|
* This is a no-op if the protocol definition has no `uses` map.
|
|
267
262
|
*/
|
|
268
263
|
private static async validateCompositionDependencies(
|
|
269
|
-
tenant: string,
|
|
264
|
+
tenant: string,
|
|
265
|
+
definition: ProtocolDefinition,
|
|
266
|
+
validationStateReader: ValidationStateReader,
|
|
267
|
+
messageTimestamp?: string,
|
|
270
268
|
): Promise<void> {
|
|
271
269
|
const { uses } = definition;
|
|
272
270
|
if (uses === undefined) {
|
|
@@ -277,44 +275,25 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
277
275
|
const referencedDefinitions = new Map<string, ProtocolDefinition>();
|
|
278
276
|
for (const alias in uses) {
|
|
279
277
|
const protocolUri = uses[alias];
|
|
280
|
-
|
|
278
|
+
try {
|
|
279
|
+
const refDefinition = await validationStateReader.fetchProtocolDefinition(tenant, protocolUri, messageTimestamp);
|
|
280
|
+
referencedDefinitions.set(alias, refDefinition);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
if (!(error instanceof DwnError) || error.code !== DwnErrorCode.ProtocolAuthorizationProtocolNotFound) {
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
281
285
|
|
|
282
|
-
if (refDefinition === undefined) {
|
|
283
286
|
throw new DwnError(
|
|
284
287
|
DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled,
|
|
285
288
|
`composed protocol '${protocolUri}' (alias '${alias}') is not installed for tenant '${tenant}'.`
|
|
286
289
|
);
|
|
287
290
|
}
|
|
288
|
-
|
|
289
|
-
referencedDefinitions.set(alias, refDefinition);
|
|
290
291
|
}
|
|
291
292
|
|
|
292
293
|
// Walk the structure and validate all $ref paths and cross-protocol role references
|
|
293
294
|
ProtocolsConfigureHandler.validateRefsAndRolesRecursively(definition.structure as ProtocolRuleSet, '', referencedDefinitions);
|
|
294
295
|
}
|
|
295
296
|
|
|
296
|
-
/**
|
|
297
|
-
* Fetches the latest installed protocol definition for the given protocol URI.
|
|
298
|
-
* @returns The protocol definition, or `undefined` if not installed.
|
|
299
|
-
*/
|
|
300
|
-
private static async fetchInstalledProtocolDefinition(
|
|
301
|
-
tenant: string, protocolUri: string, messageStore: MessageStore
|
|
302
|
-
): Promise<ProtocolDefinition | undefined> {
|
|
303
|
-
const query = {
|
|
304
|
-
interface : DwnInterfaceName.Protocols,
|
|
305
|
-
method : DwnMethodName.Configure,
|
|
306
|
-
protocol : protocolUri,
|
|
307
|
-
isLatestBaseState : true
|
|
308
|
-
};
|
|
309
|
-
const { messages } = await messageStore.query(tenant, [query]);
|
|
310
|
-
|
|
311
|
-
if (messages.length === 0) {
|
|
312
|
-
return undefined;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return (messages[0] as ProtocolsConfigureMessage).descriptor.definition;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
297
|
/**
|
|
319
298
|
* Recursively walks the structure tree to validate:
|
|
320
299
|
* - `$ref` type paths exist in the referenced protocol's structure
|
|
@@ -28,7 +28,7 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
28
28
|
// authentication & authorization
|
|
29
29
|
try {
|
|
30
30
|
await authenticate(message.authorization, this.deps.didResolver);
|
|
31
|
-
await protocolsQuery.authorize(tenant, this.deps.
|
|
31
|
+
await protocolsQuery.authorize(tenant, this.deps.validationStateReader);
|
|
32
32
|
} catch (error: any) {
|
|
33
33
|
|
|
34
34
|
// return public ProtocolsConfigures if query fails with a certain authentication or authorization code
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
1
|
import type { Filter } from '../types/query-types.js';
|
|
3
|
-
import type { MessageStore } from '../types//message-store.js';
|
|
4
2
|
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
3
|
import type { RecordsCountMessage, RecordsCountReply } from '../types/records-types.js';
|
|
6
4
|
|
|
7
5
|
import { authenticate } from '../core/auth.js';
|
|
6
|
+
import { countRecordsWithRecordLimitOccupancy } from '../utils/record-limit-occupancy.js';
|
|
8
7
|
import { Message } from '../core/message.js';
|
|
9
8
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
10
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
11
9
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
12
10
|
import { Records } from '../utils/records.js';
|
|
13
11
|
import { RecordsCount } from '../interfaces/records-count.js';
|
|
@@ -20,7 +18,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
20
18
|
|
|
21
19
|
public async handle({
|
|
22
20
|
tenant,
|
|
23
|
-
message
|
|
21
|
+
message,
|
|
24
22
|
}: {tenant: string, message: RecordsCountMessage}): Promise<RecordsCountReply> {
|
|
25
23
|
let recordsCount: RecordsCount;
|
|
26
24
|
try {
|
|
@@ -39,7 +37,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
39
37
|
try {
|
|
40
38
|
await authenticate(message.authorization!, this.deps.didResolver);
|
|
41
39
|
|
|
42
|
-
await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps
|
|
40
|
+
await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps);
|
|
43
41
|
} catch (e) {
|
|
44
42
|
return messageReplyFromError(e, 401);
|
|
45
43
|
}
|
|
@@ -69,7 +67,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
69
67
|
isLatestBaseState : true
|
|
70
68
|
};
|
|
71
69
|
|
|
72
|
-
return this.
|
|
70
|
+
return this.countProjectedRecords(tenant, recordsCount, [countFilter]);
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
/**
|
|
@@ -101,7 +99,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
101
99
|
}
|
|
102
100
|
}
|
|
103
101
|
|
|
104
|
-
return this.
|
|
102
|
+
return this.countProjectedRecords(tenant, recordsCount, filters);
|
|
105
103
|
}
|
|
106
104
|
|
|
107
105
|
/**
|
|
@@ -109,7 +107,17 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
109
107
|
*/
|
|
110
108
|
private async countPublishedRecords(tenant: string, recordsCount: RecordsCount): Promise<number> {
|
|
111
109
|
const filter = RecordsCountHandler.buildPublishedRecordsFilter(recordsCount);
|
|
112
|
-
return this.
|
|
110
|
+
return this.countProjectedRecords(tenant, recordsCount, [filter]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private async countProjectedRecords(tenant: string, recordsCount: RecordsCount, filters: Filter[]): Promise<number> {
|
|
114
|
+
return countRecordsWithRecordLimitOccupancy({
|
|
115
|
+
messageStore : this.deps.messageStore,
|
|
116
|
+
validationStateReader : this.deps.validationStateReader,
|
|
117
|
+
tenant,
|
|
118
|
+
filters,
|
|
119
|
+
messageTimestamp : recordsCount.message.descriptor.messageTimestamp,
|
|
120
|
+
});
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
private static buildPublishedRecordsFilter(recordsCount: RecordsCount): Filter {
|
|
@@ -187,23 +195,22 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
187
195
|
private static async authorizeRecordsCount(
|
|
188
196
|
tenant: string,
|
|
189
197
|
recordsCount: RecordsCount,
|
|
190
|
-
|
|
191
|
-
coreProtocols?: CoreProtocolRegistry,
|
|
198
|
+
deps: HandlerDependencies,
|
|
192
199
|
): Promise<void> {
|
|
193
200
|
|
|
194
201
|
if (Message.isSignedByAuthorDelegate(recordsCount.message)) {
|
|
195
|
-
await recordsCount.authorizeDelegate(
|
|
202
|
+
await recordsCount.authorizeDelegate(deps.validationStateReader);
|
|
196
203
|
}
|
|
197
204
|
|
|
198
205
|
const permissionGrantId = Message.getPermissionGrantId(recordsCount.signaturePayload!);
|
|
199
206
|
if (permissionGrantId !== undefined) {
|
|
200
|
-
const permissionGrant = await
|
|
207
|
+
const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
|
|
201
208
|
await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
|
|
202
|
-
incomingMessage
|
|
203
|
-
expectedGrantor
|
|
204
|
-
expectedGrantee
|
|
209
|
+
incomingMessage : recordsCount.message,
|
|
210
|
+
expectedGrantor : tenant,
|
|
211
|
+
expectedGrantee : recordsCount.author!,
|
|
205
212
|
permissionGrant,
|
|
206
|
-
|
|
213
|
+
validationStateReader : deps.validationStateReader,
|
|
207
214
|
});
|
|
208
215
|
return;
|
|
209
216
|
}
|
|
@@ -212,7 +219,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
212
219
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
213
220
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
214
221
|
if (Records.shouldProtocolAuthorize(recordsCount.signaturePayload!)) {
|
|
215
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount,
|
|
222
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, deps.validationStateReader);
|
|
216
223
|
}
|
|
217
224
|
}
|
|
218
225
|
}
|