@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
package/src/utils/hd-key.ts
CHANGED
|
@@ -6,17 +6,8 @@ import { X25519 } from '@enbox/crypto';
|
|
|
6
6
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
7
7
|
|
|
8
8
|
export enum KeyDerivationScheme {
|
|
9
|
-
/**
|
|
10
|
-
* Key derivation using the `dataFormat` value for Flat-space records.
|
|
11
|
-
*/
|
|
12
|
-
DataFormats = 'dataFormats',
|
|
13
9
|
ProtocolContext = 'protocolContext',
|
|
14
10
|
ProtocolPath = 'protocolPath',
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Key derivation using the `schema` value for Flat-space records.
|
|
18
|
-
*/
|
|
19
|
-
Schemas = 'schemas'
|
|
20
11
|
}
|
|
21
12
|
|
|
22
13
|
export type DerivedPrivateJwk = {
|
package/src/utils/messages.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
1
2
|
import type { Filter } from '../types/query-types.js';
|
|
2
3
|
import type { MessagesFilter } from '../types/messages-types.js';
|
|
3
4
|
|
|
4
5
|
import { FilterUtility } from './filter.js';
|
|
5
6
|
import { normalizeProtocolUrl } from './url.js';
|
|
6
|
-
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
7
|
-
import { Records } from './records.js';
|
|
8
7
|
import { isEmptyObject, removeUndefinedProperties } from './object.js';
|
|
9
8
|
|
|
10
9
|
|
|
@@ -42,25 +41,29 @@ export class Messages {
|
|
|
42
41
|
/**
|
|
43
42
|
* Converts an incoming array of MessagesFilter into an array of Filter usable by MessageLog.
|
|
44
43
|
*
|
|
44
|
+
* When a `CoreProtocolRegistry` is provided, each registered core protocol's
|
|
45
|
+
* `constructAdditionalMessageFilter` hook is invoked per filter. This replaces the previous
|
|
46
|
+
* hardcoded permission-records shadow filter with a generic loop over all core protocols.
|
|
47
|
+
*
|
|
45
48
|
* @param filters An array of MessagesFilter
|
|
49
|
+
* @param coreProtocols Optional registry of core protocols whose additional filters are injected.
|
|
46
50
|
* @returns {Filter[]} an array of generic Filter able to be used when querying.
|
|
47
51
|
*/
|
|
48
|
-
public static convertFilters(filters: MessagesFilter[]): Filter[] {
|
|
52
|
+
public static convertFilters(filters: MessagesFilter[], coreProtocols?: CoreProtocolRegistry): Filter[] {
|
|
49
53
|
|
|
50
54
|
const messagesQueryFilters: Filter[] = [];
|
|
51
55
|
|
|
52
|
-
// convert each filter individually by the specific type of filter it is
|
|
53
|
-
// we must check for the type of filter in a specific order to make a reductive decision as to which filters need converting
|
|
54
|
-
// first we check for `MessagesRecordsFilter` fields for conversion
|
|
55
|
-
// otherwise it is `MessagesMessageFilter` fields for conversion
|
|
56
56
|
for (const filter of filters) {
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
// Ask each core protocol whether it needs an additional shadow filter for this query.
|
|
58
|
+
// For example, the Permissions protocol injects a filter for grants/requests/revocations
|
|
59
|
+
// tagged with the target protocol so they appear alongside that protocol's own records.
|
|
60
|
+
if (coreProtocols !== undefined) {
|
|
61
|
+
for (const coreProtocol of coreProtocols.all()) {
|
|
62
|
+
const additionalFilter = coreProtocol.constructAdditionalMessageFilter?.(filter);
|
|
63
|
+
if (additionalFilter !== undefined) {
|
|
64
|
+
messagesQueryFilters.push(additionalFilter);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
messagesQueryFilters.push(this.convertFilter(filter));
|
|
@@ -69,29 +72,6 @@ export class Messages {
|
|
|
69
72
|
return messagesQueryFilters;
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
/**
|
|
73
|
-
* Constructs a filter that gets associated permission records if protocol is in the given filter.
|
|
74
|
-
*/
|
|
75
|
-
private static constructPermissionRecordsFilter(filter: MessagesFilter): Filter | undefined {
|
|
76
|
-
const { protocol, messageTimestamp } = filter;
|
|
77
|
-
if (protocol !== undefined) {
|
|
78
|
-
const taggedFilter = {
|
|
79
|
-
protocol: PermissionsProtocol.uri,
|
|
80
|
-
...Records.convertTagsFilter({ protocol })
|
|
81
|
-
} as Filter;
|
|
82
|
-
|
|
83
|
-
if (messageTimestamp != undefined) {
|
|
84
|
-
// if we filter by message timestamp, we also want to filter the permission messages by the same timestamp range
|
|
85
|
-
const messageTimestampFilter = FilterUtility.convertRangeCriterion(messageTimestamp);
|
|
86
|
-
if (messageTimestampFilter) {
|
|
87
|
-
taggedFilter.messageTimestamp = messageTimestampFilter;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return taggedFilter;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
75
|
/**
|
|
96
76
|
* Converts an external-facing filter model into an internal-facing filer model used by data store.
|
|
97
77
|
*/
|
package/src/utils/records.ts
CHANGED
|
@@ -139,32 +139,16 @@ export class Records {
|
|
|
139
139
|
const contextId = recordsWriteMessage.contextId;
|
|
140
140
|
|
|
141
141
|
let fullDerivationPath;
|
|
142
|
-
if (keyDerivationScheme === KeyDerivationScheme.
|
|
143
|
-
fullDerivationPath = Records.constructKeyDerivationPathUsingDataFormatsScheme(descriptor.dataFormat);
|
|
144
|
-
} else if (keyDerivationScheme === KeyDerivationScheme.ProtocolPath) {
|
|
142
|
+
if (keyDerivationScheme === KeyDerivationScheme.ProtocolPath) {
|
|
145
143
|
fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolPathScheme(descriptor);
|
|
146
|
-
} else if (keyDerivationScheme === KeyDerivationScheme.ProtocolContext) {
|
|
147
|
-
fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolContextScheme(contextId);
|
|
148
144
|
} else {
|
|
149
|
-
// `
|
|
150
|
-
fullDerivationPath = Records.
|
|
145
|
+
// `protocolContext` scheme
|
|
146
|
+
fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolContextScheme(contextId);
|
|
151
147
|
}
|
|
152
148
|
|
|
153
149
|
return fullDerivationPath;
|
|
154
150
|
}
|
|
155
151
|
|
|
156
|
-
/**
|
|
157
|
-
* Constructs the full key derivation path using `dataFormats` scheme.
|
|
158
|
-
* The derivation path is always `["dataFormats", "<mime-type>"]` regardless of whether
|
|
159
|
-
* a schema is present. This matches the spec: keys are derived purely from the MIME type.
|
|
160
|
-
*/
|
|
161
|
-
public static constructKeyDerivationPathUsingDataFormatsScheme(dataFormat: string): string[] {
|
|
162
|
-
return [
|
|
163
|
-
KeyDerivationScheme.DataFormats,
|
|
164
|
-
dataFormat
|
|
165
|
-
];
|
|
166
|
-
}
|
|
167
|
-
|
|
168
152
|
/**
|
|
169
153
|
* Constructs the full key derivation path using `protocolPath` scheme.
|
|
170
154
|
*
|
|
@@ -174,16 +158,7 @@ export class Records {
|
|
|
174
158
|
* its children (composing protocol) use different protocol URIs and thus different key trees.
|
|
175
159
|
*/
|
|
176
160
|
public static constructKeyDerivationPathUsingProtocolPathScheme(descriptor: RecordsWriteDescriptor): string[] {
|
|
177
|
-
|
|
178
|
-
// NOTE: no need to check `protocolPath` and `contextId` because earlier code ensures that if `protocol` is defined, those are defined also
|
|
179
|
-
if (descriptor.protocol === undefined) {
|
|
180
|
-
throw new DwnError(
|
|
181
|
-
DwnErrorCode.RecordsProtocolPathDerivationSchemeMissingProtocol,
|
|
182
|
-
'Unable to construct key derivation path using `protocols` scheme because `protocol` is missing.'
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const protocolPathSegments = descriptor.protocolPath!.split('/');
|
|
161
|
+
const protocolPathSegments = descriptor.protocolPath.split('/');
|
|
187
162
|
const fullDerivationPath = [
|
|
188
163
|
KeyDerivationScheme.ProtocolPath,
|
|
189
164
|
descriptor.protocol,
|
|
@@ -203,14 +178,7 @@ export class Records {
|
|
|
203
178
|
* a shared context (e.g., thread participants can decrypt messages from both the threads protocol
|
|
204
179
|
* and composing protocols that attach to those threads).
|
|
205
180
|
*/
|
|
206
|
-
public static constructKeyDerivationPathUsingProtocolContextScheme(contextId: string
|
|
207
|
-
if (contextId === undefined) {
|
|
208
|
-
throw new DwnError(
|
|
209
|
-
DwnErrorCode.RecordsProtocolContextDerivationSchemeMissingContextId,
|
|
210
|
-
'Unable to construct key derivation path using `protocolContext` scheme because `contextId` is missing.'
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
|
|
181
|
+
public static constructKeyDerivationPathUsingProtocolContextScheme(contextId: string): string[] {
|
|
214
182
|
// TODO: Extend key derivation support to include the full contextId (https://github.com/enboxorg/enbox/issues/99)
|
|
215
183
|
const firstContextSegment = contextId.split('/')[0];
|
|
216
184
|
|
|
@@ -222,25 +190,6 @@ export class Records {
|
|
|
222
190
|
return fullDerivationPath;
|
|
223
191
|
}
|
|
224
192
|
|
|
225
|
-
/**
|
|
226
|
-
* Constructs the full key derivation path using `schemas` scheme.
|
|
227
|
-
*/
|
|
228
|
-
public static constructKeyDerivationPathUsingSchemasScheme( schema: string | undefined ): string[] {
|
|
229
|
-
if (schema === undefined) {
|
|
230
|
-
throw new DwnError(
|
|
231
|
-
DwnErrorCode.RecordsSchemasDerivationSchemeMissingSchema,
|
|
232
|
-
'Unable to construct key derivation path using `schemas` scheme because `schema` is missing.'
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const fullDerivationPath = [
|
|
237
|
-
KeyDerivationScheme.Schemas,
|
|
238
|
-
schema
|
|
239
|
-
];
|
|
240
|
-
|
|
241
|
-
return fullDerivationPath;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
193
|
/**
|
|
245
194
|
* Derives a descendant private key given an ancestor private key and the full absolute derivation path.
|
|
246
195
|
* Uses X25519 keys for encryption key derivation.
|
|
@@ -456,7 +405,7 @@ export class Records {
|
|
|
456
405
|
if (authorDelegatedGrantDefined) {
|
|
457
406
|
const delegatedGrant = message.authorization!.authorDelegatedGrant!;
|
|
458
407
|
|
|
459
|
-
const permissionGrant =
|
|
408
|
+
const permissionGrant = PermissionGrant.parse(delegatedGrant);
|
|
460
409
|
if (permissionGrant.delegated !== true) {
|
|
461
410
|
throw new DwnError(
|
|
462
411
|
DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant,
|
|
@@ -499,7 +448,7 @@ export class Records {
|
|
|
499
448
|
|
|
500
449
|
if (ownerDelegatedGrantDefined) {
|
|
501
450
|
const delegatedGrant = message.authorization!.ownerDelegatedGrant!;
|
|
502
|
-
const permissionGrant =
|
|
451
|
+
const permissionGrant = PermissionGrant.parse(delegatedGrant);
|
|
503
452
|
|
|
504
453
|
if (permissionGrant.delegated !== true) {
|
|
505
454
|
throw new DwnError(
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
3
|
-
const EVENTS_LISTENER_CHANNEL = 'events';
|
|
4
|
-
;
|
|
5
|
-
export class EventEmitterStream {
|
|
6
|
-
eventEmitter;
|
|
7
|
-
isOpen = false;
|
|
8
|
-
constructor(config = {}) {
|
|
9
|
-
// we capture the rejections and currently just log the errors that are produced
|
|
10
|
-
this.eventEmitter = new EventEmitter({ captureRejections: true });
|
|
11
|
-
// number of listeners per particular eventName before a warning is emitted
|
|
12
|
-
// we set to 0 which represents infinity.
|
|
13
|
-
// https://nodejs.org/api/events.html#emittersetmaxlistenersn
|
|
14
|
-
this.eventEmitter.setMaxListeners(0);
|
|
15
|
-
if (config.errorHandler) {
|
|
16
|
-
this.errorHandler = config.errorHandler;
|
|
17
|
-
}
|
|
18
|
-
this.eventEmitter.on('error', this.errorHandler);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
|
|
22
|
-
*/
|
|
23
|
-
errorHandler = (error) => { console.error('event emitter error', error); };
|
|
24
|
-
async subscribe(tenant, id, listener) {
|
|
25
|
-
this.eventEmitter.on(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener);
|
|
26
|
-
return {
|
|
27
|
-
id,
|
|
28
|
-
close: async () => { this.eventEmitter.off(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener); }
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
async open() {
|
|
32
|
-
this.isOpen = true;
|
|
33
|
-
}
|
|
34
|
-
async close() {
|
|
35
|
-
this.isOpen = false;
|
|
36
|
-
this.eventEmitter.removeAllListeners();
|
|
37
|
-
}
|
|
38
|
-
emit(tenant, event, indexes) {
|
|
39
|
-
if (!this.isOpen) {
|
|
40
|
-
this.errorHandler(new DwnError(DwnErrorCode.EventEmitterStreamNotOpenError, 'a message emitted when EventEmitterStream is closed'));
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
this.eventEmitter.emit(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, tenant, event, indexes);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=event-emitter-stream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-stream.js","sourceRoot":"","sources":["../../../../src/event-stream/event-emitter-stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAQxC,CAAC;AAEF,MAAM,OAAO,kBAAkB;IACrB,YAAY,CAAe;IAC3B,MAAM,GAAY,KAAK,CAAC;IAEhC,YAAY,SAAmC,EAAE;QAC/C,gFAAgF;QAChF,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,2EAA2E;QAC3E,yCAAyC;QACzC,6DAA6D;QAC7D,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,YAAY,GAAwB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAExG,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,EAAU,EAAE,QAAuB;QACjE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvE,OAAO;YACL,EAAE;YACF,KAAK,EAAE,KAAK,IAAmB,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC/G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,KAAmB,EAAE,OAAkB;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,IAAI,QAAQ,CAC5B,YAAY,CAAC,8BAA8B,EAC3C,qDAAqD,CACtD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;CACF"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { EventEmitterStream } from '../../src/event-stream/event-emitter-stream.js';
|
|
2
|
-
import { TestDataGenerator } from '../../src/index.js';
|
|
3
|
-
import { TestStores } from '../test-stores.js';
|
|
4
|
-
import sinon from 'sinon';
|
|
5
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
6
|
-
describe('EventEmitterStream', () => {
|
|
7
|
-
let messageStore;
|
|
8
|
-
beforeAll(async () => {
|
|
9
|
-
({ messageStore } = TestStores.get());
|
|
10
|
-
await messageStore.open();
|
|
11
|
-
});
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
await messageStore.clear();
|
|
14
|
-
});
|
|
15
|
-
afterAll(async () => {
|
|
16
|
-
// Clean up after each test by closing and clearing the event stream
|
|
17
|
-
await messageStore.close();
|
|
18
|
-
sinon.restore();
|
|
19
|
-
});
|
|
20
|
-
it('should remove listeners when `close` method is used', async () => {
|
|
21
|
-
const eventStream = new EventEmitterStream();
|
|
22
|
-
const emitter = eventStream['eventEmitter'];
|
|
23
|
-
// count the `events` listeners, which represents all listeners
|
|
24
|
-
expect(emitter.listenerCount('did:alice_events')).toBe(0);
|
|
25
|
-
const sub = await eventStream.subscribe('did:alice', 'id', () => { });
|
|
26
|
-
expect(emitter.listenerCount('did:alice_events')).toBe(1);
|
|
27
|
-
// close the subscription, which should remove the listener
|
|
28
|
-
await sub.close();
|
|
29
|
-
expect(emitter.listenerCount('did:alice_events')).toBe(0);
|
|
30
|
-
});
|
|
31
|
-
it('logs message when the emitter experiences an error', async () => {
|
|
32
|
-
const testHandler = {
|
|
33
|
-
errorHandler: (_) => { },
|
|
34
|
-
};
|
|
35
|
-
const eventErrorSpy = sinon.spy(testHandler, 'errorHandler');
|
|
36
|
-
const eventStream = new EventEmitterStream({ errorHandler: testHandler.errorHandler });
|
|
37
|
-
const emitter = eventStream['eventEmitter'];
|
|
38
|
-
emitter.emit('error', new Error('random error'));
|
|
39
|
-
expect(eventErrorSpy.callCount).toBe(1);
|
|
40
|
-
});
|
|
41
|
-
it('does not emit messages if event stream is closed', async () => {
|
|
42
|
-
const testHandler = {
|
|
43
|
-
errorHandler: (_) => { },
|
|
44
|
-
};
|
|
45
|
-
const eventErrorSpy = sinon.spy(testHandler, 'errorHandler');
|
|
46
|
-
const eventStream = new EventEmitterStream({ errorHandler: testHandler.errorHandler });
|
|
47
|
-
const handler = async (_tenant, _event, _indexes) => { };
|
|
48
|
-
await eventStream.subscribe('did:alice', 'sub-1', handler);
|
|
49
|
-
// close eventStream
|
|
50
|
-
await eventStream.close();
|
|
51
|
-
const message1 = await TestDataGenerator.generateRecordsWrite({});
|
|
52
|
-
eventStream.emit('did:alice', { message: message1.message }, {});
|
|
53
|
-
const message2 = await TestDataGenerator.generateRecordsWrite({});
|
|
54
|
-
eventStream.emit('did:alice', { message: message2.message }, {});
|
|
55
|
-
expect(eventErrorSpy.callCount).toBe(2);
|
|
56
|
-
// check that all listeners have been removed
|
|
57
|
-
const eventEmitter = eventStream['eventEmitter'];
|
|
58
|
-
for (const event of eventEmitter.eventNames()) {
|
|
59
|
-
expect(eventEmitter.listenerCount(event)).toBe(0);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
it('sets max listeners to 0 which represents infinity', async () => {
|
|
63
|
-
const eventStreamOne = new EventEmitterStream();
|
|
64
|
-
const emitterOne = eventStreamOne['eventEmitter'];
|
|
65
|
-
expect(emitterOne.getMaxListeners()).toBe(0);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
//# sourceMappingURL=event-emitter-stream.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-stream.spec.js","sourceRoot":"","sources":["../../../../tests/event-stream/event-emitter-stream.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { Poller } from '../utils/poller.js';
|
|
2
|
-
import { TestEventStream } from '../test-event-stream.js';
|
|
3
|
-
import { Message, TestDataGenerator } from '../../src/index.js';
|
|
4
|
-
import sinon from 'sinon';
|
|
5
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
6
|
-
// NOTE: We use `Poller.pollUntilSuccessOrTimeout` to poll for the expected results.
|
|
7
|
-
// In some cases, the EventStream is a coordinated pub/sub system and the messages/events are emitted over the network
|
|
8
|
-
// this means that the messages are not processed immediately and we need to wait for the messages to be processed
|
|
9
|
-
// before we can assert the results. The `pollUntilSuccessOrTimeout` function is a utility function that will poll until the expected results are met.
|
|
10
|
-
// It is also important to note that in some cases where we are testing a negative case (the message not arriving at the subscriber)
|
|
11
|
-
// we add an alternate subscription to await results within to give the EventStream ample time to process the message.
|
|
12
|
-
// Additionally in some of these cases the order in which messages are sent to be processed or checked may matter, and they are noted as such.
|
|
13
|
-
export function testEventStream() {
|
|
14
|
-
describe('EventStream', () => {
|
|
15
|
-
// saving the original `console.error` function to re-assign after tests complete
|
|
16
|
-
const originalConsoleErrorFunction = console.error;
|
|
17
|
-
let eventStream;
|
|
18
|
-
beforeAll(async () => {
|
|
19
|
-
eventStream = TestEventStream.get();
|
|
20
|
-
await eventStream.open();
|
|
21
|
-
// do not print the console error statements from the emitter error
|
|
22
|
-
console.error = (_) => { };
|
|
23
|
-
});
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
sinon.restore();
|
|
26
|
-
});
|
|
27
|
-
afterAll(async () => {
|
|
28
|
-
sinon.restore();
|
|
29
|
-
console.error = originalConsoleErrorFunction;
|
|
30
|
-
// Clean up after each test by closing and clearing the event stream
|
|
31
|
-
await eventStream.close();
|
|
32
|
-
});
|
|
33
|
-
it('emits all messages to each subscriptions', async () => {
|
|
34
|
-
// Scenario: We create 2 separate subscriptions that listen to all messages
|
|
35
|
-
// and we emit 3 messages. We expect both subscriptions to receive all 3 messages.
|
|
36
|
-
const messageCids1 = [];
|
|
37
|
-
const handler1 = async (_tenant, event, _indexes) => {
|
|
38
|
-
const { message } = event;
|
|
39
|
-
const messageCid = await Message.getCid(message);
|
|
40
|
-
messageCids1.push(messageCid);
|
|
41
|
-
};
|
|
42
|
-
const messageCids2 = [];
|
|
43
|
-
const handler2 = async (_tenant, event, _indexes) => {
|
|
44
|
-
const { message } = event;
|
|
45
|
-
const messageCid = await Message.getCid(message);
|
|
46
|
-
messageCids2.push(messageCid);
|
|
47
|
-
};
|
|
48
|
-
const subscription1 = await eventStream.subscribe('did:alice', 'sub-1', handler1);
|
|
49
|
-
const subscription2 = await eventStream.subscribe('did:alice', 'sub-2', handler2);
|
|
50
|
-
const message1 = await TestDataGenerator.generateRecordsWrite({});
|
|
51
|
-
const message1Cid = await Message.getCid(message1.message);
|
|
52
|
-
eventStream.emit('did:alice', { message: message1.message }, {});
|
|
53
|
-
const message2 = await TestDataGenerator.generateRecordsWrite({});
|
|
54
|
-
const message2Cid = await Message.getCid(message2.message);
|
|
55
|
-
eventStream.emit('did:alice', { message: message2.message }, {});
|
|
56
|
-
const message3 = await TestDataGenerator.generateRecordsWrite({});
|
|
57
|
-
const message3Cid = await Message.getCid(message3.message);
|
|
58
|
-
eventStream.emit('did:alice', { message: message3.message }, {});
|
|
59
|
-
// Use the Poller to poll until the expected results are met
|
|
60
|
-
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
61
|
-
expect(messageCids1).toEqual(expect.arrayContaining([message1Cid, message2Cid, message3Cid]));
|
|
62
|
-
expect(messageCids2).toEqual(expect.arrayContaining([message1Cid, message2Cid, message3Cid]));
|
|
63
|
-
});
|
|
64
|
-
await subscription1.close();
|
|
65
|
-
await subscription2.close();
|
|
66
|
-
});
|
|
67
|
-
it('does not receive messages if subscription is closed', async () => {
|
|
68
|
-
// Scenario: We create two subscriptions that listen to all messages.
|
|
69
|
-
// The reason we create two is in order to allow for a negative test case.
|
|
70
|
-
// We send a message, validate that both handlers processed the message
|
|
71
|
-
// We then close one of the subscriptions, and send another message.
|
|
72
|
-
// Now we validate that only the handler of the subscription that is still open received the message.
|
|
73
|
-
const sub1MessageCids = [];
|
|
74
|
-
const handler1 = async (_tenant, event, _indexes) => {
|
|
75
|
-
const { message } = event;
|
|
76
|
-
const messageCid = await Message.getCid(message);
|
|
77
|
-
sub1MessageCids.push(messageCid);
|
|
78
|
-
};
|
|
79
|
-
const sub2MessageCids = [];
|
|
80
|
-
const handler2 = async (_tenant, event, _indexes) => {
|
|
81
|
-
const { message } = event;
|
|
82
|
-
const messageCid = await Message.getCid(message);
|
|
83
|
-
sub2MessageCids.push(messageCid);
|
|
84
|
-
};
|
|
85
|
-
const subscription1 = await eventStream.subscribe('did:alice', 'sub-1', handler1);
|
|
86
|
-
const subscription2 = await eventStream.subscribe('did:alice', 'sub-2', handler2);
|
|
87
|
-
const message1 = await TestDataGenerator.generateRecordsWrite({});
|
|
88
|
-
const message1Cid = await Message.getCid(message1.message);
|
|
89
|
-
eventStream.emit('did:alice', { message: message1.message }, {});
|
|
90
|
-
// Use the Poller to poll until the expected results are met
|
|
91
|
-
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
92
|
-
expect(sub1MessageCids).toHaveLength(1);
|
|
93
|
-
expect(sub1MessageCids).toEqual(expect.arrayContaining([message1Cid]));
|
|
94
|
-
expect(sub2MessageCids).toHaveLength(1);
|
|
95
|
-
expect(sub2MessageCids).toEqual(expect.arrayContaining([message1Cid]));
|
|
96
|
-
});
|
|
97
|
-
await subscription1.close(); // close subscription 1
|
|
98
|
-
const message2 = await TestDataGenerator.generateRecordsWrite({});
|
|
99
|
-
const message2Cid = await Message.getCid(message2.message);
|
|
100
|
-
eventStream.emit('did:alice', { message: message2.message }, {});
|
|
101
|
-
// Use the Poller to poll until the expected results are met
|
|
102
|
-
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
103
|
-
// subscription 2 should have received the message
|
|
104
|
-
expect(sub2MessageCids.length).toBe(2);
|
|
105
|
-
expect(sub2MessageCids).toEqual(expect.arrayContaining([message1Cid, message2Cid]));
|
|
106
|
-
// subscription 1 should not have received the message
|
|
107
|
-
expect(sub1MessageCids).toHaveLength(1);
|
|
108
|
-
expect(sub1MessageCids).toEqual(expect.arrayContaining([message1Cid]));
|
|
109
|
-
});
|
|
110
|
-
await subscription2.close();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=event-stream.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-stream.spec.js","sourceRoot":"","sources":["../../../../tests/event-stream/event-stream.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { KeyValues } from '../types/query-types.js';
|
|
2
|
-
import type { EventListener, EventStream, EventSubscription, MessageEvent } from '../types/subscriptions.js';
|
|
3
|
-
export interface EventEmitterStreamConfig {
|
|
4
|
-
/**
|
|
5
|
-
* An optional error handler in order to be able to react to any errors or warnings triggers by `EventEmitter`.
|
|
6
|
-
* By default we log errors with `console.error`.
|
|
7
|
-
*/
|
|
8
|
-
errorHandler?: (error: any) => void;
|
|
9
|
-
}
|
|
10
|
-
export declare class EventEmitterStream implements EventStream {
|
|
11
|
-
private eventEmitter;
|
|
12
|
-
private isOpen;
|
|
13
|
-
constructor(config?: EventEmitterStreamConfig);
|
|
14
|
-
/**
|
|
15
|
-
* we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
|
|
16
|
-
*/
|
|
17
|
-
private errorHandler;
|
|
18
|
-
subscribe(tenant: string, id: string, listener: EventListener): Promise<EventSubscription>;
|
|
19
|
-
open(): Promise<void>;
|
|
20
|
-
close(): Promise<void>;
|
|
21
|
-
emit(tenant: string, event: MessageEvent, indexes: KeyValues): void;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=event-emitter-stream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-stream.d.ts","sourceRoot":"","sources":["../../../../src/event-stream/event-emitter-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAO7G,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACrC;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,GAAE,wBAA6B;IAgBjD;;OAEG;IACH,OAAO,CAAC,YAAY,CAAoF;IAElG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;CAUpE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter-stream.spec.d.ts","sourceRoot":"","sources":["../../../../tests/event-stream/event-emitter-stream.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-stream.spec.d.ts","sourceRoot":"","sources":["../../../../tests/event-stream/event-stream.spec.ts"],"names":[],"mappings":"AAoBA,wBAAgB,eAAe,IAAI,IAAI,CA2HtC"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { KeyValues } from '../types/query-types.js';
|
|
2
|
-
import type { EventListener, EventStream, EventSubscription, MessageEvent } from '../types/subscriptions.js';
|
|
3
|
-
|
|
4
|
-
import { EventEmitter } from 'events';
|
|
5
|
-
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
6
|
-
|
|
7
|
-
const EVENTS_LISTENER_CHANNEL = 'events';
|
|
8
|
-
|
|
9
|
-
export interface EventEmitterStreamConfig {
|
|
10
|
-
/**
|
|
11
|
-
* An optional error handler in order to be able to react to any errors or warnings triggers by `EventEmitter`.
|
|
12
|
-
* By default we log errors with `console.error`.
|
|
13
|
-
*/
|
|
14
|
-
errorHandler?: (error: any) => void;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export class EventEmitterStream implements EventStream {
|
|
18
|
-
private eventEmitter: EventEmitter;
|
|
19
|
-
private isOpen: boolean = false;
|
|
20
|
-
|
|
21
|
-
constructor(config: EventEmitterStreamConfig = {}) {
|
|
22
|
-
// we capture the rejections and currently just log the errors that are produced
|
|
23
|
-
this.eventEmitter = new EventEmitter({ captureRejections: true });
|
|
24
|
-
|
|
25
|
-
// number of listeners per particular eventName before a warning is emitted
|
|
26
|
-
// we set to 0 which represents infinity.
|
|
27
|
-
// https://nodejs.org/api/events.html#emittersetmaxlistenersn
|
|
28
|
-
this.eventEmitter.setMaxListeners(0);
|
|
29
|
-
|
|
30
|
-
if (config.errorHandler) {
|
|
31
|
-
this.errorHandler = config.errorHandler;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
this.eventEmitter.on('error', this.errorHandler);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
|
|
39
|
-
*/
|
|
40
|
-
private errorHandler: (error:any) => void = (error) => { console.error('event emitter error', error); };
|
|
41
|
-
|
|
42
|
-
async subscribe(tenant: string, id: string, listener: EventListener): Promise<EventSubscription> {
|
|
43
|
-
this.eventEmitter.on(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener);
|
|
44
|
-
return {
|
|
45
|
-
id,
|
|
46
|
-
close: async (): Promise<void> => { this.eventEmitter.off(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener); }
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async open(): Promise<void> {
|
|
51
|
-
this.isOpen = true;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async close(): Promise<void> {
|
|
55
|
-
this.isOpen = false;
|
|
56
|
-
this.eventEmitter.removeAllListeners();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
emit(tenant: string, event: MessageEvent, indexes: KeyValues): void {
|
|
60
|
-
if (!this.isOpen) {
|
|
61
|
-
this.errorHandler(new DwnError(
|
|
62
|
-
DwnErrorCode.EventEmitterStreamNotOpenError,
|
|
63
|
-
'a message emitted when EventEmitterStream is closed'
|
|
64
|
-
));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
this.eventEmitter.emit(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, tenant, event, indexes);
|
|
68
|
-
}
|
|
69
|
-
}
|