@enbox/dwn-sdk-js 0.0.7 → 0.1.0
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/dist/browser.mjs +8 -8
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +817 -911
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/constants.js +11 -0
- package/dist/esm/src/core/constants.js.map +1 -0
- package/dist/esm/src/core/core-protocol.js +44 -0
- package/dist/esm/src/core/core-protocol.js.map +1 -0
- package/dist/esm/src/core/dwn-error.js +12 -12
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +16 -3
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +5 -0
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-validation.js +91 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +53 -30
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/records-grant-authorization.js +6 -8
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +2 -0
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/dwn.js +42 -18
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +7 -11
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +22 -24
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +11 -15
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +37 -27
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +7 -11
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +10 -12
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +10 -18
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +11 -15
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +31 -26
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +39 -26
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +128 -105
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +5 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +33 -3
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +1 -1
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +1 -1
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +1 -1
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +1 -1
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +2 -1
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-signing.js +1 -12
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +25 -41
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +1 -1
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +1 -1
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +113 -5
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js +5 -7
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/data-store-level.js +110 -33
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level.js +42 -32
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +70 -6
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/permission-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +11 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +0 -8
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/messages.js +16 -34
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/records.js +5 -43
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +2 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +32 -43
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +14 -7
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +9 -5
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +14 -7
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +12 -12
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +636 -5
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +4 -4
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +7 -7
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +4 -4
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-delivery.spec.js +236 -0
- package/dist/esm/tests/features/records-delivery.spec.js.map +1 -0
- package/dist/esm/tests/features/records-immutable.spec.js +315 -0
- package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune.spec.js +4 -4
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
- package/dist/esm/tests/features/records-squash.spec.js +1055 -0
- package/dist/esm/tests/features/records-squash.spec.js.map +1 -0
- package/dist/esm/tests/features/records-tags.spec.js +16 -4
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +7 -8
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +11 -5
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +169 -22
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +103 -21
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +5 -5
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +5 -5
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +9 -4
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +24 -25
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +68 -9
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +24 -138
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +175 -35
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +176 -72
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +52 -68
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +6 -6
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-request.spec.js +4 -4
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +4 -4
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +4 -4
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +350 -5
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +4 -4
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +4 -4
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +93 -40
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +102 -41
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +12 -13
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-suite.js +10 -4
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +12 -5
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +8 -12
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +36 -2
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +37 -8
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts +49 -40
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/constants.d.ts +11 -0
- package/dist/types/src/core/constants.d.ts.map +1 -0
- package/dist/types/src/core/core-protocol.d.ts +89 -0
- package/dist/types/src/core/core-protocol.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +12 -12
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts +6 -2
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-validation.d.ts +30 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +19 -11
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts +2 -1
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +19 -7
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-read.d.ts +3 -8
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts +3 -8
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts +3 -8
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +3 -6
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +3 -8
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +3 -8
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts +3 -8
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +12 -25
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +8 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write-signing.d.ts +3 -4
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +11 -11
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +1 -1
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +40 -3
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
- package/dist/types/src/store/data-store-level.d.ts +20 -4
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +4 -0
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +20 -6
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +3 -3
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +12 -3
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +24 -3
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +7 -0
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +69 -2
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +23 -6
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/subscriptions.d.ts +151 -13
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +1 -9
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/messages.d.ts +7 -5
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +1 -11
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
- package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
- 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/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-delivery.spec.d.ts +2 -0
- package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
- package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-squash.spec.d.ts +2 -0
- package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -0
- 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-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/messages-sync.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/subscriptions.spec.d.ts.map +1 -1
- package/dist/types/tests/test-event-stream.d.ts +11 -12
- package/dist/types/tests/test-event-stream.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +2 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +19 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/core/constants.ts +11 -0
- package/src/core/core-protocol.ts +129 -0
- package/src/core/dwn-error.ts +18 -12
- package/src/core/grant-authorization.ts +20 -3
- package/src/core/protocol-authorization-action.ts +5 -0
- package/src/core/protocol-authorization-validation.ts +133 -0
- package/src/core/protocol-authorization.ts +71 -23
- package/src/core/records-grant-authorization.ts +6 -8
- package/src/core/resumable-task-manager.ts +3 -1
- package/src/dwn.ts +58 -73
- package/src/event-stream/event-emitter-event-log.ts +283 -0
- package/src/handlers/messages-read.ts +8 -9
- package/src/handlers/messages-subscribe.ts +24 -28
- package/src/handlers/messages-sync.ts +10 -16
- package/src/handlers/protocols-configure.ts +47 -32
- package/src/handlers/protocols-query.ts +6 -9
- package/src/handlers/records-count.ts +11 -10
- package/src/handlers/records-delete.ts +12 -21
- package/src/handlers/records-query.ts +12 -12
- package/src/handlers/records-read.ts +34 -22
- package/src/handlers/records-subscribe.ts +47 -26
- package/src/handlers/records-write.ts +152 -119
- package/src/index.ts +9 -5
- package/src/interfaces/messages-subscribe.ts +7 -1
- package/src/interfaces/protocols-configure.ts +51 -3
- package/src/interfaces/records-count.ts +1 -1
- package/src/interfaces/records-delete.ts +1 -1
- package/src/interfaces/records-query.ts +1 -1
- package/src/interfaces/records-read.ts +1 -1
- package/src/interfaces/records-subscribe.ts +8 -1
- package/src/interfaces/records-write-signing.ts +2 -22
- package/src/interfaces/records-write.ts +35 -48
- package/src/protocols/permission-grant.ts +1 -1
- package/src/protocols/permission-request.ts +1 -1
- package/src/protocols/permissions.ts +148 -6
- package/src/state-index/state-index-level.ts +5 -7
- package/src/store/data-store-level.ts +124 -34
- package/src/store/index-level.ts +44 -35
- package/src/store/storage-controller.ts +89 -12
- package/src/types/message-types.ts +3 -3
- package/src/types/messages-types.ts +12 -3
- package/src/types/method-handler.ts +26 -4
- package/src/types/mitt.d.ts +28 -0
- package/src/types/permission-types.ts +7 -0
- package/src/types/protocols-types.ts +78 -1
- package/src/types/records-types.ts +24 -6
- package/src/types/subscriptions.ts +178 -14
- package/src/utils/hd-key.ts +0 -9
- package/src/utils/messages.ts +17 -37
- package/src/utils/records.ts +7 -58
- package/dist/esm/src/event-stream/event-emitter-stream.js +0 -46
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -68
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-stream/event-stream.spec.js +0 -114
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
- package/src/event-stream/event-emitter-stream.ts +0 -69
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import type { DidResolver } from '@enbox/dids';
|
|
2
1
|
import type { MessageStore } from '../types/message-store.js';
|
|
3
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
4
|
-
import type { StateIndex } from '../types/state-index.js';
|
|
2
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
3
|
import type { MessagesSyncMessage, MessagesSyncReply } from '../types/messages-types.js';
|
|
6
4
|
|
|
7
5
|
import { authenticate } from '../core/auth.js';
|
|
@@ -15,11 +13,7 @@ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
|
15
13
|
|
|
16
14
|
export class MessagesSyncHandler implements MethodHandler {
|
|
17
15
|
|
|
18
|
-
constructor(
|
|
19
|
-
private didResolver: DidResolver,
|
|
20
|
-
private messageStore: MessageStore,
|
|
21
|
-
private stateIndex: StateIndex,
|
|
22
|
-
) { }
|
|
16
|
+
constructor(private deps: HandlerDependencies) { }
|
|
23
17
|
|
|
24
18
|
public async handle({
|
|
25
19
|
tenant,
|
|
@@ -34,8 +28,8 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
34
28
|
}
|
|
35
29
|
|
|
36
30
|
try {
|
|
37
|
-
await authenticate(message.authorization, this.didResolver);
|
|
38
|
-
await MessagesSyncHandler.authorizeMessagesSync(tenant, messagesSync, this.messageStore);
|
|
31
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
32
|
+
await MessagesSyncHandler.authorizeMessagesSync(tenant, messagesSync, this.deps.messageStore);
|
|
39
33
|
} catch (e) {
|
|
40
34
|
return messageReplyFromError(e, 401);
|
|
41
35
|
}
|
|
@@ -46,8 +40,8 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
46
40
|
switch (action) {
|
|
47
41
|
case 'root': {
|
|
48
42
|
const rootHash = protocol !== undefined
|
|
49
|
-
? await this.stateIndex
|
|
50
|
-
: await this.stateIndex
|
|
43
|
+
? await this.deps.stateIndex!.getProtocolRoot(tenant, protocol)
|
|
44
|
+
: await this.deps.stateIndex!.getRoot(tenant);
|
|
51
45
|
return {
|
|
52
46
|
status : { code: 200, detail: 'OK' },
|
|
53
47
|
root : hashToHex(rootHash),
|
|
@@ -57,8 +51,8 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
57
51
|
case 'subtree': {
|
|
58
52
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
59
53
|
const hash = protocol !== undefined
|
|
60
|
-
? await this.stateIndex
|
|
61
|
-
: await this.stateIndex
|
|
54
|
+
? await this.deps.stateIndex!.getProtocolSubtreeHash(tenant, protocol, bitPath)
|
|
55
|
+
: await this.deps.stateIndex!.getSubtreeHash(tenant, bitPath);
|
|
62
56
|
return {
|
|
63
57
|
status : { code: 200, detail: 'OK' },
|
|
64
58
|
hash : hashToHex(hash),
|
|
@@ -68,8 +62,8 @@ export class MessagesSyncHandler implements MethodHandler {
|
|
|
68
62
|
case 'leaves': {
|
|
69
63
|
const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
|
|
70
64
|
const leaves = protocol !== undefined
|
|
71
|
-
? await this.stateIndex
|
|
72
|
-
: await this.stateIndex
|
|
65
|
+
? await this.deps.stateIndex!.getProtocolLeaves(tenant, protocol, bitPath)
|
|
66
|
+
: await this.deps.stateIndex!.getLeaves(tenant, bitPath);
|
|
73
67
|
return {
|
|
74
68
|
status : { code: 200, detail: 'OK' },
|
|
75
69
|
entries : leaves,
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import type { DidResolver } from '@enbox/dids';
|
|
2
|
-
import type { EventStream } from '../types/subscriptions.js';
|
|
3
1
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
4
2
|
import type { MessageStore } from '../types//message-store.js';
|
|
5
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
6
|
-
import type { StateIndex } from '../types/state-index.js';
|
|
3
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
7
4
|
import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureMessage } from '../types/protocols-types.js';
|
|
8
5
|
|
|
9
6
|
import { authenticate } from '../core/auth.js';
|
|
@@ -18,12 +15,7 @@ import { getRuleSetAtPath, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
|
18
15
|
|
|
19
16
|
export class ProtocolsConfigureHandler implements MethodHandler {
|
|
20
17
|
|
|
21
|
-
constructor(
|
|
22
|
-
private didResolver: DidResolver,
|
|
23
|
-
private messageStore: MessageStore,
|
|
24
|
-
private stateIndex: StateIndex,
|
|
25
|
-
private eventStream?: EventStream
|
|
26
|
-
) { }
|
|
18
|
+
constructor(private deps: HandlerDependencies) { }
|
|
27
19
|
|
|
28
20
|
public async handle({
|
|
29
21
|
tenant,
|
|
@@ -38,8 +30,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
38
30
|
|
|
39
31
|
// authentication & authorization
|
|
40
32
|
try {
|
|
41
|
-
await authenticate(message.authorization, this.didResolver);
|
|
42
|
-
await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.messageStore);
|
|
33
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
34
|
+
await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.deps.messageStore);
|
|
43
35
|
} catch (e) {
|
|
44
36
|
return messageReplyFromError(e, 401);
|
|
45
37
|
}
|
|
@@ -48,7 +40,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
48
40
|
// `$ref` paths must exist in the referenced protocols, and cross-protocol roles must exist.
|
|
49
41
|
try {
|
|
50
42
|
await ProtocolsConfigureHandler.validateCompositionDependencies(
|
|
51
|
-
tenant, message.descriptor.definition, this.messageStore
|
|
43
|
+
tenant, message.descriptor.definition, this.deps.messageStore
|
|
52
44
|
);
|
|
53
45
|
} catch (e) {
|
|
54
46
|
return messageReplyFromError(e, 400);
|
|
@@ -60,7 +52,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
60
52
|
method : DwnMethodName.Configure,
|
|
61
53
|
protocol : message.descriptor.definition.protocol
|
|
62
54
|
};
|
|
63
|
-
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
|
|
55
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
|
|
64
56
|
|
|
65
57
|
// find newest message, and if the incoming message is the newest
|
|
66
58
|
let newestMessage = await Message.getNewestMessage(existingMessages);
|
|
@@ -75,13 +67,13 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
75
67
|
if (incomingMessageIsNewest) {
|
|
76
68
|
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, true);
|
|
77
69
|
|
|
78
|
-
await this.messageStore.put(tenant, message, indexes);
|
|
70
|
+
await this.deps.messageStore.put(tenant, message, indexes);
|
|
79
71
|
const messageCid = await Message.getCid(message);
|
|
80
|
-
await this.stateIndex
|
|
72
|
+
await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
|
|
81
73
|
|
|
82
|
-
// only emit if the event
|
|
83
|
-
if (this.
|
|
84
|
-
this.
|
|
74
|
+
// only emit if the event log is set
|
|
75
|
+
if (this.deps.eventLog !== undefined) {
|
|
76
|
+
await this.deps.eventLog.emit(tenant, { message }, indexes);
|
|
85
77
|
}
|
|
86
78
|
|
|
87
79
|
messageReply = {
|
|
@@ -91,9 +83,9 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
91
83
|
// incoming message is older — still store it as a historical version (not the latest)
|
|
92
84
|
const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, false);
|
|
93
85
|
|
|
94
|
-
await this.messageStore.put(tenant, message, indexes);
|
|
86
|
+
await this.deps.messageStore.put(tenant, message, indexes);
|
|
95
87
|
const messageCid = await Message.getCid(message);
|
|
96
|
-
await this.stateIndex
|
|
88
|
+
await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
|
|
97
89
|
|
|
98
90
|
messageReply = {
|
|
99
91
|
status: { code: 202, detail: 'Accepted' }
|
|
@@ -108,8 +100,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
108
100
|
const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
|
|
109
101
|
const existingCid = await Message.getCid(existingMessage);
|
|
110
102
|
|
|
111
|
-
await this.messageStore.delete(tenant, existingCid);
|
|
112
|
-
await this.messageStore.put(tenant, existingMessage, updatedIndexes);
|
|
103
|
+
await this.deps.messageStore.delete(tenant, existingCid);
|
|
104
|
+
await this.deps.messageStore.put(tenant, existingMessage, updatedIndexes);
|
|
113
105
|
}
|
|
114
106
|
}
|
|
115
107
|
|
|
@@ -230,7 +222,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
230
222
|
const childRuleSet = ruleSet[key] as ProtocolRuleSet;
|
|
231
223
|
const childProtocolPath = protocolPath === '' ? key : `${protocolPath}/${key}`;
|
|
232
224
|
|
|
233
|
-
// Validate $ref path exists in the referenced protocol
|
|
225
|
+
// Validate $ref path exists in the referenced protocol and does not traverse through another $ref
|
|
234
226
|
if (childRuleSet.$ref !== undefined) {
|
|
235
227
|
const parsed = parseCrossProtocolRef(childRuleSet.$ref);
|
|
236
228
|
if (parsed !== undefined) {
|
|
@@ -244,13 +236,36 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
244
236
|
);
|
|
245
237
|
}
|
|
246
238
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
239
|
+
// Walk the target path segment-by-segment and reject if any intermediate node has a $ref
|
|
240
|
+
const segments = parsed.protocolPath.split('/');
|
|
241
|
+
let currentLevel: { [key: string]: ProtocolRuleSet } = refDefinition.structure;
|
|
242
|
+
|
|
243
|
+
for (let i = 0; i < segments.length; i++) {
|
|
244
|
+
const segment = segments[i];
|
|
245
|
+
const node = currentLevel[segment] as ProtocolRuleSet | undefined;
|
|
246
|
+
|
|
247
|
+
if (node === undefined) {
|
|
248
|
+
throw new DwnError(
|
|
249
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefProtocolPath,
|
|
250
|
+
`'$ref' at protocol path '${childProtocolPath}' references type path '${parsed.protocolPath}' ` +
|
|
251
|
+
`which does not exist in protocol '${refDefinition.protocol}'.`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// If any node along the target path (including the final target) has a $ref,
|
|
256
|
+
// it means the composition chain passes through another protocol boundary.
|
|
257
|
+
// Multi-level composition is not supported — reject at install time.
|
|
258
|
+
if (node.$ref !== undefined) {
|
|
259
|
+
const traversedPath = segments.slice(0, i + 1).join('/');
|
|
260
|
+
throw new DwnError(
|
|
261
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefTargetThroughRef,
|
|
262
|
+
`'$ref' at protocol path '${childProtocolPath}' references type path '${parsed.protocolPath}' ` +
|
|
263
|
+
`in protocol '${refDefinition.protocol}', but the node '${traversedPath}' is itself ` +
|
|
264
|
+
`a '$ref' composition point. multi-level composition (chaining through '$ref' nodes) is not supported.`
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
currentLevel = node as { [key: string]: ProtocolRuleSet };
|
|
254
269
|
}
|
|
255
270
|
}
|
|
256
271
|
}
|
|
@@ -312,4 +327,4 @@ export class ProtocolsConfigureHandler implements MethodHandler {
|
|
|
312
327
|
ProtocolsConfigureHandler.validateRefsAndRolesRecursively(childRuleSet, childProtocolPath, referencedDefinitions);
|
|
313
328
|
}
|
|
314
329
|
}
|
|
315
|
-
}
|
|
330
|
+
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
3
|
-
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
1
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
2
|
import type { ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from '../types/protocols-types.js';
|
|
6
3
|
|
|
7
4
|
import { authenticate } from '../core/auth.js';
|
|
@@ -14,7 +11,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
14
11
|
|
|
15
12
|
export class ProtocolsQueryHandler implements MethodHandler {
|
|
16
13
|
|
|
17
|
-
constructor(private
|
|
14
|
+
constructor(private deps: HandlerDependencies) { }
|
|
18
15
|
|
|
19
16
|
public async handle({
|
|
20
17
|
tenant,
|
|
@@ -30,8 +27,8 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
30
27
|
|
|
31
28
|
// authentication & authorization
|
|
32
29
|
try {
|
|
33
|
-
await authenticate(message.authorization, this.didResolver);
|
|
34
|
-
await protocolsQuery.authorize(tenant, this.messageStore);
|
|
30
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
31
|
+
await protocolsQuery.authorize(tenant, this.deps.messageStore);
|
|
35
32
|
} catch (error: any) {
|
|
36
33
|
|
|
37
34
|
// return public ProtocolsConfigures if query fails with a certain authentication or authorization code
|
|
@@ -58,7 +55,7 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
58
55
|
};
|
|
59
56
|
removeUndefinedProperties(query);
|
|
60
57
|
|
|
61
|
-
const { messages } = await this.messageStore.query(tenant, [ query ]);
|
|
58
|
+
const { messages } = await this.deps.messageStore.query(tenant, [ query ]);
|
|
62
59
|
|
|
63
60
|
return {
|
|
64
61
|
status : { code: 200, detail: 'OK' },
|
|
@@ -78,7 +75,7 @@ export class ProtocolsQueryHandler implements MethodHandler {
|
|
|
78
75
|
published : true,
|
|
79
76
|
isLatestBaseState : true,
|
|
80
77
|
};
|
|
81
|
-
const { messages: publishedProtocolsConfigure } = await this.messageStore.query(tenant, [ filter ]);
|
|
78
|
+
const { messages: publishedProtocolsConfigure } = await this.deps.messageStore.query(tenant, [ filter ]);
|
|
82
79
|
return publishedProtocolsConfigure as ProtocolsConfigureMessage[];
|
|
83
80
|
}
|
|
84
81
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
2
|
import type { Filter } from '../types/query-types.js';
|
|
3
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
4
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
5
5
|
import type { RecordsCountMessage, RecordsCountReply } from '../types/records-types.js';
|
|
6
6
|
|
|
7
7
|
import { authenticate } from '../core/auth.js';
|
|
@@ -14,7 +14,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
14
14
|
|
|
15
15
|
export class RecordsCountHandler implements MethodHandler {
|
|
16
16
|
|
|
17
|
-
constructor(private
|
|
17
|
+
constructor(private deps: HandlerDependencies) { }
|
|
18
18
|
|
|
19
19
|
public async handle({
|
|
20
20
|
tenant,
|
|
@@ -35,9 +35,9 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
35
35
|
} else {
|
|
36
36
|
// authentication and authorization
|
|
37
37
|
try {
|
|
38
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
38
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
39
39
|
|
|
40
|
-
await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.messageStore);
|
|
40
|
+
await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps.messageStore, this.deps.coreProtocols);
|
|
41
41
|
} catch (e) {
|
|
42
42
|
return messageReplyFromError(e, 401);
|
|
43
43
|
}
|
|
@@ -67,7 +67,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
67
67
|
isLatestBaseState : true
|
|
68
68
|
};
|
|
69
69
|
|
|
70
|
-
return this.messageStore.count(tenant, [countFilter]);
|
|
70
|
+
return this.deps.messageStore.count(tenant, [countFilter]);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
@@ -95,7 +95,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
return this.messageStore.count(tenant, filters);
|
|
98
|
+
return this.deps.messageStore.count(tenant, filters);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/**
|
|
@@ -103,7 +103,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
103
103
|
*/
|
|
104
104
|
private async countPublishedRecords(tenant: string, recordsCount: RecordsCount): Promise<number> {
|
|
105
105
|
const filter = RecordsCountHandler.buildPublishedRecordsFilter(recordsCount);
|
|
106
|
-
return this.messageStore.count(tenant, [filter]);
|
|
106
|
+
return this.deps.messageStore.count(tenant, [filter]);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
private static buildPublishedRecordsFilter(recordsCount: RecordsCount): Filter {
|
|
@@ -167,7 +167,8 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
167
167
|
private static async authorizeRecordsCount(
|
|
168
168
|
tenant: string,
|
|
169
169
|
recordsCount: RecordsCount,
|
|
170
|
-
messageStore: MessageStore
|
|
170
|
+
messageStore: MessageStore,
|
|
171
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
171
172
|
): Promise<void> {
|
|
172
173
|
|
|
173
174
|
if (Message.isSignedByAuthorDelegate(recordsCount.message)) {
|
|
@@ -178,7 +179,7 @@ export class RecordsCountHandler implements MethodHandler {
|
|
|
178
179
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
179
180
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
180
181
|
if (Records.shouldProtocolAuthorize(recordsCount.signaturePayload!)) {
|
|
181
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, messageStore);
|
|
182
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, messageStore, coreProtocols);
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
2
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
3
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
5
4
|
import type { RecordsDeleteMessage } from '../types/records-types.js';
|
|
6
|
-
import type {
|
|
5
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
7
6
|
|
|
8
7
|
import { authenticate } from '../core/auth.js';
|
|
9
8
|
import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
@@ -16,15 +15,10 @@ import { RecordsDelete } from '../interfaces/records-delete.js';
|
|
|
16
15
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
17
16
|
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
18
17
|
import { ResumableTaskName } from '../core/resumable-task-manager.js';
|
|
19
|
-
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
20
18
|
|
|
21
19
|
export class RecordsDeleteHandler implements MethodHandler {
|
|
22
20
|
|
|
23
|
-
constructor(
|
|
24
|
-
private didResolver: DidResolver,
|
|
25
|
-
private messageStore: MessageStore,
|
|
26
|
-
private resumableTaskManager: ResumableTaskManager,
|
|
27
|
-
) { }
|
|
21
|
+
constructor(private deps: HandlerDependencies) { }
|
|
28
22
|
|
|
29
23
|
public async handle({
|
|
30
24
|
tenant,
|
|
@@ -39,7 +33,7 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
39
33
|
|
|
40
34
|
// authentication
|
|
41
35
|
try {
|
|
42
|
-
await authenticate(message.authorization, this.didResolver);
|
|
36
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
43
37
|
} catch (e) {
|
|
44
38
|
return messageReplyFromError(e, 401);
|
|
45
39
|
}
|
|
@@ -49,7 +43,7 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
49
43
|
interface : DwnInterfaceName.Records,
|
|
50
44
|
recordId : message.descriptor.recordId
|
|
51
45
|
};
|
|
52
|
-
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
|
|
46
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
|
|
53
47
|
|
|
54
48
|
// find which message is the newest, and if the incoming message is the newest
|
|
55
49
|
const newestExistingMessage = await Message.getNewestMessage(existingMessages);
|
|
@@ -73,19 +67,20 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
73
67
|
// NOTE: We need a RecordsWrite (doesn't have to be initial) to access the immutable properties for delete processing,
|
|
74
68
|
// but if the latest record state is a RecordsDelete (ie. when we are pruning a non-prune delete),
|
|
75
69
|
// we'd need to use the initial write because RecordsDelete does not contain the immutable properties needed for processing.
|
|
76
|
-
const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(this.messageStore, tenant, message.descriptor.recordId);
|
|
70
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(this.deps.messageStore, tenant, message.descriptor.recordId);
|
|
77
71
|
|
|
78
72
|
await RecordsDeleteHandler.authorizeRecordsDelete(
|
|
79
73
|
tenant,
|
|
80
74
|
recordsDelete,
|
|
81
75
|
initialWrite!,
|
|
82
|
-
this.messageStore
|
|
76
|
+
this.deps.messageStore,
|
|
77
|
+
this.deps.coreProtocols,
|
|
83
78
|
);
|
|
84
79
|
} catch (e) {
|
|
85
80
|
return messageReplyFromError(e, 401);
|
|
86
81
|
}
|
|
87
82
|
|
|
88
|
-
await this.resumableTaskManager
|
|
83
|
+
await this.deps.resumableTaskManager!.run({
|
|
89
84
|
name : ResumableTaskName.RecordsDelete,
|
|
90
85
|
data : { tenant, message }
|
|
91
86
|
});
|
|
@@ -105,7 +100,8 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
105
100
|
tenant: string,
|
|
106
101
|
recordsDelete: RecordsDelete,
|
|
107
102
|
recordsWrite: RecordsWrite,
|
|
108
|
-
messageStore: MessageStore
|
|
103
|
+
messageStore: MessageStore,
|
|
104
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
109
105
|
): Promise<void> {
|
|
110
106
|
|
|
111
107
|
if (Message.isSignedByAuthorDelegate(recordsDelete.message)) {
|
|
@@ -124,13 +120,8 @@ export class RecordsDeleteHandler implements MethodHandler {
|
|
|
124
120
|
permissionGrant,
|
|
125
121
|
messageStore,
|
|
126
122
|
});
|
|
127
|
-
} else if (recordsWrite.message.descriptor.protocol !== undefined) {
|
|
128
|
-
await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite, messageStore);
|
|
129
123
|
} else {
|
|
130
|
-
|
|
131
|
-
DwnErrorCode.RecordsDeleteAuthorizationFailed,
|
|
132
|
-
'RecordsDelete message failed authorization'
|
|
133
|
-
);
|
|
124
|
+
await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite, messageStore, coreProtocols);
|
|
134
125
|
}
|
|
135
126
|
}
|
|
136
127
|
};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
3
2
|
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
5
3
|
import type { Filter, PaginationCursor } from '../types/query-types.js';
|
|
6
4
|
import type { GenericMessage, MessageSort } from '../types/message-types.js';
|
|
5
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
7
6
|
import type { RecordsQueryMessage, RecordsQueryReply, RecordsQueryReplyEntry } from '../types/records-types.js';
|
|
8
7
|
|
|
9
8
|
import { authenticate } from '../core/auth.js';
|
|
@@ -19,7 +18,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
19
18
|
|
|
20
19
|
export class RecordsQueryHandler implements MethodHandler {
|
|
21
20
|
|
|
22
|
-
constructor(private
|
|
21
|
+
constructor(private deps: HandlerDependencies) { }
|
|
23
22
|
|
|
24
23
|
public async handle({
|
|
25
24
|
tenant,
|
|
@@ -42,9 +41,9 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
42
41
|
} else {
|
|
43
42
|
// authentication and authorization
|
|
44
43
|
try {
|
|
45
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
44
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
46
45
|
|
|
47
|
-
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.messageStore);
|
|
46
|
+
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps.messageStore, this.deps.coreProtocols);
|
|
48
47
|
} catch (e) {
|
|
49
48
|
return messageReplyFromError(e, 401);
|
|
50
49
|
}
|
|
@@ -63,7 +62,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
63
62
|
// attach initial write if returned RecordsWrite is not initial write
|
|
64
63
|
for (const recordsWrite of recordsWrites) {
|
|
65
64
|
if (!await RecordsWrite.isInitialWrite(recordsWrite)) {
|
|
66
|
-
const initialWriteQueryResult = await this.messageStore.query(
|
|
65
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(
|
|
67
66
|
tenant,
|
|
68
67
|
[{ recordId: recordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
|
|
69
68
|
);
|
|
@@ -123,7 +122,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
123
122
|
};
|
|
124
123
|
|
|
125
124
|
const messageSort = this.convertDateSort(dateSort);
|
|
126
|
-
return this.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
|
|
125
|
+
return this.deps.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
/**
|
|
@@ -169,7 +168,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
169
168
|
}
|
|
170
169
|
|
|
171
170
|
const messageSort = this.convertDateSort(dateSort);
|
|
172
|
-
return this.messageStore.query(tenant, filters, messageSort, pagination );
|
|
171
|
+
return this.deps.messageStore.query(tenant, filters, messageSort, pagination );
|
|
173
172
|
}
|
|
174
173
|
|
|
175
174
|
/**
|
|
@@ -181,7 +180,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
181
180
|
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
182
181
|
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
183
182
|
const messageSort = this.convertDateSort(dateSort);
|
|
184
|
-
return this.messageStore.query(tenant, [ filter ], messageSort, pagination);
|
|
183
|
+
return this.deps.messageStore.query(tenant, [ filter ], messageSort, pagination);
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
|
|
@@ -249,7 +248,8 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
249
248
|
private static async authorizeRecordsQuery(
|
|
250
249
|
tenant: string,
|
|
251
250
|
recordsQuery: RecordsQuery,
|
|
252
|
-
messageStore: MessageStore
|
|
251
|
+
messageStore: MessageStore,
|
|
252
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
253
253
|
): Promise<void> {
|
|
254
254
|
|
|
255
255
|
if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
|
|
@@ -260,7 +260,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
260
260
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
261
261
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
262
262
|
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload!)) {
|
|
263
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore);
|
|
263
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore, coreProtocols);
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
266
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
3
2
|
import type { Filter } from '../types/query-types.js';
|
|
4
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
5
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
4
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
6
5
|
import type { RecordsDeleteMessage, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply } from '../types/records-types.js';
|
|
7
6
|
|
|
8
7
|
import { authenticate } from '../core/auth.js';
|
|
@@ -21,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
21
20
|
|
|
22
21
|
export class RecordsReadHandler implements MethodHandler {
|
|
23
22
|
|
|
24
|
-
constructor(private
|
|
23
|
+
constructor(private deps: HandlerDependencies) { }
|
|
25
24
|
|
|
26
25
|
public async handle({
|
|
27
26
|
tenant,
|
|
@@ -38,7 +37,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
38
37
|
// authentication
|
|
39
38
|
try {
|
|
40
39
|
if (recordsRead.author !== undefined) {
|
|
41
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
40
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
42
41
|
}
|
|
43
42
|
} catch (e) {
|
|
44
43
|
return messageReplyFromError(e, 401);
|
|
@@ -52,7 +51,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
52
51
|
...Records.convertFilter(message.descriptor.filter)
|
|
53
52
|
};
|
|
54
53
|
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
55
|
-
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
|
|
54
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
|
|
56
55
|
if (existingMessages.length === 0) {
|
|
57
56
|
return {
|
|
58
57
|
status: { code: 404, detail: 'Not Found' }
|
|
@@ -61,24 +60,35 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
61
60
|
|
|
62
61
|
const matchedMessage = existingMessages[0];
|
|
63
62
|
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
63
|
+
// If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
|
|
64
|
+
// (for parity with the live-record path which authorizes against the latest write),
|
|
65
|
+
// then return 404 with both the RecordsDelete and the initial RecordsWrite.
|
|
67
66
|
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
68
67
|
const recordsDeleteMessage = matchedMessage as RecordsDeleteMessage;
|
|
69
|
-
const
|
|
68
|
+
const recordId = recordsDeleteMessage.descriptor.recordId;
|
|
70
69
|
|
|
70
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
|
|
71
71
|
if (initialWrite === undefined) {
|
|
72
72
|
return messageReplyFromError(new DwnError(
|
|
73
73
|
DwnErrorCode.RecordsReadInitialWriteNotFound,
|
|
74
|
-
'
|
|
74
|
+
'initial write for deleted record not found'
|
|
75
75
|
), 400);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
//
|
|
79
|
-
|
|
78
|
+
// Authorize against the newest RecordsWrite so that mutable properties like `published`
|
|
79
|
+
// reflect the record's state at the time of deletion, not just the initial write.
|
|
80
|
+
let newestWrite;
|
|
80
81
|
try {
|
|
81
|
-
await
|
|
82
|
+
newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
|
|
83
|
+
} catch {
|
|
84
|
+
// If newest write is not found (should not happen since initial write exists),
|
|
85
|
+
// fall back to the initial write for authorization.
|
|
86
|
+
newestWrite = initialWrite;
|
|
87
|
+
}
|
|
88
|
+
const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps.messageStore, this.deps.coreProtocols);
|
|
82
92
|
} catch (error) {
|
|
83
93
|
return messageReplyFromError(error, 401);
|
|
84
94
|
}
|
|
@@ -87,7 +97,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
87
97
|
status : { code: 404, detail: 'Not Found' },
|
|
88
98
|
entry : {
|
|
89
99
|
recordsDelete: recordsDeleteMessage,
|
|
90
|
-
initialWrite
|
|
100
|
+
initialWrite,
|
|
91
101
|
}
|
|
92
102
|
};
|
|
93
103
|
}
|
|
@@ -96,7 +106,10 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
96
106
|
const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
|
|
97
107
|
|
|
98
108
|
try {
|
|
99
|
-
|
|
109
|
+
const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
|
|
110
|
+
await RecordsReadHandler.authorizeRecordsRead(
|
|
111
|
+
tenant, recordsRead, parsedWrite, this.deps.messageStore, this.deps.coreProtocols,
|
|
112
|
+
);
|
|
100
113
|
} catch (error) {
|
|
101
114
|
return messageReplyFromError(error, 401);
|
|
102
115
|
}
|
|
@@ -107,7 +120,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
107
120
|
data = DataStream.fromBytes(dataBytes);
|
|
108
121
|
delete matchedRecordsWrite.encodedData;
|
|
109
122
|
} else {
|
|
110
|
-
const result = await this.dataStore
|
|
123
|
+
const result = await this.deps.dataStore!.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
111
124
|
if (result?.dataStream === undefined) {
|
|
112
125
|
return {
|
|
113
126
|
status: { code: 404, detail: 'Not Found' }
|
|
@@ -126,7 +139,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
126
139
|
|
|
127
140
|
// attach initial write if latest RecordsWrite is not initial write
|
|
128
141
|
if (!await RecordsWrite.isInitialWrite(matchedRecordsWrite)) {
|
|
129
|
-
const initialWriteQueryResult = await this.messageStore.query(
|
|
142
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(
|
|
130
143
|
tenant,
|
|
131
144
|
[{ recordId: matchedRecordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
|
|
132
145
|
);
|
|
@@ -145,7 +158,8 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
145
158
|
tenant: string,
|
|
146
159
|
recordsRead: RecordsRead,
|
|
147
160
|
matchedRecordsWrite: RecordsWrite,
|
|
148
|
-
messageStore: MessageStore
|
|
161
|
+
messageStore: MessageStore,
|
|
162
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
149
163
|
): Promise<void> {
|
|
150
164
|
if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
|
|
151
165
|
await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
|
|
@@ -174,10 +188,8 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
174
188
|
permissionGrant,
|
|
175
189
|
messageStore
|
|
176
190
|
});
|
|
177
|
-
} else if (descriptor.protocol !== undefined) {
|
|
178
|
-
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore);
|
|
179
191
|
} else {
|
|
180
|
-
|
|
192
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols);
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
}
|