@enbox/dwn-sdk-js 0.0.6 → 0.0.8
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 +762 -911
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/abstract-message.js +4 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -1
- package/dist/esm/src/core/auth.js +22 -33
- package/dist/esm/src/core/auth.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-constant.js +7 -7
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +10 -12
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +50 -52
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message.js +85 -116
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +63 -78
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +266 -0
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization-validation.js +321 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +144 -741
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/record-chain.js +64 -0
- package/dist/esm/src/core/record-chain.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +53 -72
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +50 -65
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/tenant-gate.js +2 -13
- package/dist/esm/src/core/tenant-gate.js.map +1 -1
- package/dist/esm/src/dwn.js +108 -101
- 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 +67 -81
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +51 -63
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +75 -89
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +153 -163
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +52 -55
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +97 -85
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +75 -93
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +116 -105
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +130 -132
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +164 -104
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +213 -280
- 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-read.js +24 -32
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +28 -41
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +26 -40
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +87 -65
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +55 -68
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +50 -66
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +45 -55
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +60 -76
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +51 -67
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +53 -68
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-query.js +102 -0
- package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-write-signing.js +81 -0
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +396 -610
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js +23 -35
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +56 -69
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +43 -14
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +28 -14
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +325 -227
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +42 -64
- package/dist/esm/src/smt/smt-store-level.js.map +1 -1
- package/dist/esm/src/smt/smt-store-memory.js +19 -45
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
- package/dist/esm/src/smt/smt-utils.js +28 -45
- package/dist/esm/src/smt/smt-utils.js.map +1 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js +113 -150
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-level.js +54 -156
- package/dist/esm/src/store/blockstore-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-mock.js +48 -153
- package/dist/esm/src/store/blockstore-mock.js.map +1 -1
- package/dist/esm/src/store/data-store-level.js +137 -100
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level-compound.js +246 -0
- package/dist/esm/src/store/index-level-compound.js.map +1 -0
- package/dist/esm/src/store/index-level.js +307 -715
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +143 -244
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +71 -94
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/resumable-task-store-level.js +62 -101
- package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +131 -146
- 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 +10 -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/abort.js +8 -19
- package/dist/esm/src/utils/abort.js.map +1 -1
- package/dist/esm/src/utils/array.js +15 -49
- package/dist/esm/src/utils/array.js.map +1 -1
- package/dist/esm/src/utils/cid.js +29 -77
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +37 -65
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +136 -162
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/filter.js +1 -12
- package/dist/esm/src/utils/filter.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +45 -71
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +9 -20
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js +12 -23
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/messages.js +21 -33
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +9 -17
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +62 -70
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +103 -166
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +60 -96
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +54 -71
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +5 -18
- package/dist/esm/src/utils/time.js.map +1 -1
- package/dist/esm/src/utils/url.js +3 -3
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +3 -12
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +50 -59
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +10 -18
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +65 -89
- 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 +337 -347
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +160 -172
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +78 -82
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +449 -184
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +981 -360
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +45 -54
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +99 -108
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +108 -117
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- 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 +178 -194
- 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-tags.spec.js +456 -463
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +88 -98
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +215 -210
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +309 -171
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +272 -199
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +247 -241
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +159 -172
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +101 -105
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +266 -279
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +984 -996
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +542 -671
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +433 -302
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1216 -1140
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +190 -219
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +36 -45
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +49 -55
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +127 -138
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +372 -36
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +55 -64
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +66 -76
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +451 -354
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +160 -108
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +404 -414
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +13 -22
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +229 -238
- package/dist/esm/tests/store/message-store.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-stores.js +16 -13
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +8 -15
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +24 -33
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +48 -57
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption.spec.js +229 -82
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +46 -55
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +10 -19
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +3 -12
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +18 -20
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +22 -33
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +14 -27
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +446 -467
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -17
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +3 -12
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +44 -24
- 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 +9 -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 +42 -0
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts +81 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +24 -106
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/record-chain.d.ts +24 -0
- package/dist/types/src/core/record-chain.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.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 +4 -24
- 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-query.d.ts +33 -0
- package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts +34 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +13 -53
- 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-compound.d.ts +70 -0
- package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +4 -58
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +4 -4
- 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 +41 -1
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +16 -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/protocols.d.ts +5 -0
- package/dist/types/src/utils/protocols.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/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/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-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 +18 -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 +15 -12
- package/src/core/grant-authorization.ts +20 -3
- package/src/core/protocol-authorization-action.ts +377 -0
- package/src/core/protocol-authorization-validation.ts +487 -0
- package/src/core/protocol-authorization.ts +111 -856
- package/src/core/record-chain.ts +99 -0
- package/src/core/records-grant-authorization.ts +6 -8
- 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 +47 -104
- package/src/index.ts +9 -5
- package/src/interfaces/messages-subscribe.ts +7 -1
- package/src/interfaces/protocols-configure.ts +73 -8
- 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-query.ts +139 -0
- package/src/interfaces/records-write-signing.ts +123 -0
- package/src/interfaces/records-write.ts +66 -261
- 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-compound.ts +324 -0
- package/src/store/index-level.ts +68 -341
- package/src/store/storage-controller.ts +11 -11
- 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 +46 -0
- package/src/types/records-types.ts +16 -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/protocols.ts +8 -0
- package/src/utils/records.ts +8 -59
- package/dist/esm/src/event-stream/event-emitter-stream.js +0 -60
- 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 -77
- 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 -123
- 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,30 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import freeForAll from '../vectors/protocol-definitions/free-for-all.json' with { type: 'json' };
|
|
3
|
+
import sinon from 'sinon';
|
|
10
4
|
import { Dwn } from '../../src/dwn.js';
|
|
11
5
|
import { DwnErrorCode } from '../../src/core/dwn-error.js';
|
|
12
|
-
import freeForAll from '../vectors/protocol-definitions/free-for-all.json' with { type: 'json' };
|
|
13
6
|
import { Jws } from '../../src/utils/jws.js';
|
|
14
7
|
import { Message } from '../../src/core/message.js';
|
|
15
8
|
import { MessagesSubscribe } from '../../src/interfaces/messages-subscribe.js';
|
|
16
9
|
import { MessagesSubscribeHandler } from '../../src/handlers/messages-subscribe.js';
|
|
17
10
|
import { Poller } from '../utils/poller.js';
|
|
18
|
-
import sinon from 'sinon';
|
|
19
11
|
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
20
|
-
import {
|
|
12
|
+
import { TestEventLog } from '../test-event-stream.js';
|
|
21
13
|
import { TestStores } from '../test-stores.js';
|
|
22
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
23
14
|
import { DidKey, UniversalResolver } from '@enbox/dids';
|
|
24
15
|
import { DwnInterfaceName, DwnMethodName } from '../../src/index.js';
|
|
25
16
|
export function testMessagesSubscribeHandler() {
|
|
26
17
|
describe('MessagesSubscribe.handle()', () => {
|
|
27
|
-
describe('
|
|
18
|
+
describe('EventLog disabled', () => {
|
|
28
19
|
let didResolver;
|
|
29
20
|
let messageStore;
|
|
30
21
|
let dataStore;
|
|
@@ -33,147 +24,229 @@ export function testMessagesSubscribeHandler() {
|
|
|
33
24
|
let dwn;
|
|
34
25
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
35
26
|
// so that different test suites can reuse the same backend store for testing
|
|
36
|
-
beforeAll(() =>
|
|
27
|
+
beforeAll(async () => {
|
|
37
28
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
38
29
|
const stores = TestStores.get();
|
|
39
30
|
messageStore = stores.messageStore;
|
|
40
31
|
dataStore = stores.dataStore;
|
|
41
32
|
resumableTaskStore = stores.resumableTaskStore;
|
|
42
33
|
stateIndex = stores.stateIndex;
|
|
43
|
-
dwn =
|
|
34
|
+
dwn = await Dwn.create({
|
|
44
35
|
didResolver,
|
|
45
36
|
messageStore,
|
|
46
37
|
dataStore,
|
|
47
38
|
resumableTaskStore,
|
|
48
39
|
stateIndex,
|
|
49
40
|
});
|
|
50
|
-
})
|
|
51
|
-
beforeEach(() =>
|
|
41
|
+
});
|
|
42
|
+
beforeEach(async () => {
|
|
52
43
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
53
44
|
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
})
|
|
59
|
-
afterAll(() =>
|
|
60
|
-
|
|
61
|
-
})
|
|
62
|
-
it('should respond with a 501 if subscriptions are not supported', () =>
|
|
63
|
-
|
|
64
|
-
dwn =
|
|
65
|
-
const alice =
|
|
45
|
+
await messageStore.clear();
|
|
46
|
+
await dataStore.clear();
|
|
47
|
+
await resumableTaskStore.clear();
|
|
48
|
+
await stateIndex.clear();
|
|
49
|
+
});
|
|
50
|
+
afterAll(async () => {
|
|
51
|
+
await dwn.close();
|
|
52
|
+
});
|
|
53
|
+
it('should respond with a 501 if subscriptions are not supported', async () => {
|
|
54
|
+
await dwn.close(); // close the original dwn instance
|
|
55
|
+
dwn = await Dwn.create({ didResolver, messageStore, dataStore, stateIndex, resumableTaskStore }); // leave out eventLog
|
|
56
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
66
57
|
// attempt to subscribe
|
|
67
|
-
const { message } =
|
|
68
|
-
const subscriptionMessageReply =
|
|
58
|
+
const { message } = await MessagesSubscribe.create({ signer: Jws.createSigner(alice) });
|
|
59
|
+
const subscriptionMessageReply = await dwn.processMessage(alice.did, message, { subscriptionHandler: (_) => { } });
|
|
69
60
|
expect(subscriptionMessageReply.status.code).toBe(501);
|
|
70
|
-
expect(subscriptionMessageReply.status.detail).toContain(DwnErrorCode.
|
|
71
|
-
})
|
|
61
|
+
expect(subscriptionMessageReply.status.detail).toContain(DwnErrorCode.MessagesSubscribeEventLogUnimplemented);
|
|
62
|
+
});
|
|
72
63
|
});
|
|
73
|
-
describe('
|
|
64
|
+
describe('EventLog enabled', () => {
|
|
74
65
|
let didResolver;
|
|
75
66
|
let messageStore;
|
|
76
67
|
let dataStore;
|
|
77
68
|
let resumableTaskStore;
|
|
78
69
|
let stateIndex;
|
|
79
|
-
let
|
|
70
|
+
let eventLog;
|
|
80
71
|
let dwn;
|
|
81
72
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
82
73
|
// so that different test suites can reuse the same backend store for testing
|
|
83
|
-
beforeAll(() =>
|
|
74
|
+
beforeAll(async () => {
|
|
84
75
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
85
76
|
const stores = TestStores.get();
|
|
86
77
|
messageStore = stores.messageStore;
|
|
87
78
|
dataStore = stores.dataStore;
|
|
88
79
|
resumableTaskStore = stores.resumableTaskStore;
|
|
89
80
|
stateIndex = stores.stateIndex;
|
|
90
|
-
|
|
91
|
-
|
|
81
|
+
eventLog = TestEventLog.get();
|
|
82
|
+
eventLog = TestEventLog.get();
|
|
83
|
+
dwn = await Dwn.create({
|
|
92
84
|
didResolver,
|
|
93
85
|
messageStore,
|
|
94
86
|
dataStore,
|
|
95
87
|
resumableTaskStore,
|
|
96
88
|
stateIndex,
|
|
97
|
-
|
|
89
|
+
eventLog,
|
|
98
90
|
});
|
|
99
|
-
})
|
|
100
|
-
beforeEach(() =>
|
|
91
|
+
});
|
|
92
|
+
beforeEach(async () => {
|
|
101
93
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
102
94
|
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
})
|
|
108
|
-
afterAll(() =>
|
|
109
|
-
|
|
110
|
-
})
|
|
111
|
-
it('returns a 400 if message is invalid', () =>
|
|
112
|
-
const alice =
|
|
113
|
-
const { message } =
|
|
95
|
+
await messageStore.clear();
|
|
96
|
+
await dataStore.clear();
|
|
97
|
+
await resumableTaskStore.clear();
|
|
98
|
+
await stateIndex.clear();
|
|
99
|
+
});
|
|
100
|
+
afterAll(async () => {
|
|
101
|
+
await dwn.close();
|
|
102
|
+
});
|
|
103
|
+
it('returns a 400 if message is invalid', async () => {
|
|
104
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
105
|
+
const { message } = await TestDataGenerator.generateMessagesSubscribe({ author: alice });
|
|
114
106
|
// add an invalid property to the descriptor
|
|
115
107
|
message['descriptor']['invalid'] = 'invalid';
|
|
116
|
-
const messagesSubscribeHandler = new MessagesSubscribeHandler(
|
|
117
|
-
|
|
108
|
+
const messagesSubscribeHandler = new MessagesSubscribeHandler({
|
|
109
|
+
didResolver, messageStore, eventLog,
|
|
110
|
+
});
|
|
111
|
+
const reply = await messagesSubscribeHandler.handle({ tenant: alice.did, message, subscriptionHandler: (_) => { } });
|
|
118
112
|
expect(reply.status.code).toBe(400);
|
|
119
|
-
})
|
|
120
|
-
it('should allow tenant to subscribe their own event stream', () =>
|
|
121
|
-
const alice =
|
|
113
|
+
});
|
|
114
|
+
it('should allow tenant to subscribe their own event stream', async () => {
|
|
115
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
116
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
122
117
|
// set up a promise to read later that captures the emitted messageCid
|
|
123
118
|
let handler;
|
|
124
119
|
const messageSubscriptionPromise = new Promise((resolve) => {
|
|
125
|
-
handler = (
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
handler = async (msg) => {
|
|
121
|
+
if (msg.type !== 'event') {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const { message } = msg.event;
|
|
125
|
+
const messageCid = await Message.getCid(message);
|
|
128
126
|
resolve(messageCid);
|
|
129
|
-
}
|
|
127
|
+
};
|
|
130
128
|
});
|
|
131
129
|
// testing MessagesSubscribe
|
|
132
|
-
const messagesSubscribe =
|
|
130
|
+
const messagesSubscribe = await MessagesSubscribe.create({
|
|
133
131
|
signer: Jws.createSigner(alice),
|
|
134
132
|
});
|
|
135
|
-
const subscriptionReply =
|
|
133
|
+
const subscriptionReply = await dwn.processMessage(alice.did, messagesSubscribe.message, { subscriptionHandler: handler });
|
|
136
134
|
expect(subscriptionReply.status.code).toBe(200);
|
|
137
135
|
expect(subscriptionReply.subscription).toBeDefined();
|
|
138
|
-
const messageWrite =
|
|
139
|
-
const writeReply =
|
|
136
|
+
const messageWrite = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
137
|
+
const writeReply = await dwn.processMessage(alice.did, messageWrite.message, { dataStream: messageWrite.dataStream });
|
|
140
138
|
expect(writeReply.status.code).toBe(202);
|
|
141
|
-
const messageCid =
|
|
139
|
+
const messageCid = await Message.getCid(messageWrite.message);
|
|
142
140
|
// control: ensure that the event exists
|
|
143
|
-
const events =
|
|
144
|
-
expect(events.length).toBe(
|
|
145
|
-
expect(events
|
|
141
|
+
const events = await stateIndex.getLeaves(alice.did, []);
|
|
142
|
+
expect(events.length).toBe(2);
|
|
143
|
+
expect(events).toContain(messageCid);
|
|
146
144
|
// await the event
|
|
147
|
-
const resolvedCid =
|
|
145
|
+
const resolvedCid = await messageSubscriptionPromise;
|
|
148
146
|
expect(resolvedCid).toBe(messageCid);
|
|
149
|
-
})
|
|
150
|
-
it('should not allow non-tenant to subscribe to an event stream they are not authorized for', () =>
|
|
151
|
-
const alice =
|
|
152
|
-
const bob =
|
|
147
|
+
});
|
|
148
|
+
it('should not allow non-tenant to subscribe to an event stream they are not authorized for', async () => {
|
|
149
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
150
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
153
151
|
// test anonymous request
|
|
154
|
-
const anonymousSubscription =
|
|
152
|
+
const anonymousSubscription = await TestDataGenerator.generateMessagesSubscribe();
|
|
155
153
|
delete anonymousSubscription.message.authorization;
|
|
156
|
-
const anonymousReply =
|
|
154
|
+
const anonymousReply = await dwn.processMessage(alice.did, anonymousSubscription.message);
|
|
157
155
|
expect(anonymousReply.status.code).toBe(400);
|
|
158
156
|
expect(anonymousReply.status.detail).toContain(`MessagesSubscribe: must have required property 'authorization'`);
|
|
159
157
|
expect(anonymousReply.subscription).toBeUndefined();
|
|
160
158
|
// testing MessagesSubscribe
|
|
161
|
-
const messagesSubscribe =
|
|
159
|
+
const messagesSubscribe = await MessagesSubscribe.create({
|
|
162
160
|
signer: Jws.createSigner(bob),
|
|
163
161
|
});
|
|
164
|
-
const subscriptionReply =
|
|
162
|
+
const subscriptionReply = await dwn.processMessage(alice.did, messagesSubscribe.message);
|
|
165
163
|
expect(subscriptionReply.status.code).toBe(401);
|
|
166
164
|
expect(subscriptionReply.subscription).toBeUndefined();
|
|
167
|
-
})
|
|
165
|
+
});
|
|
166
|
+
describe('cursor-based subscriptions', () => {
|
|
167
|
+
it('should deliver catch-up events through the handler when cursor is provided', async () => {
|
|
168
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
169
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
170
|
+
// Read the EventLog to get a cursor before writing.
|
|
171
|
+
const { cursor: cursorBefore } = await eventLog.read(alice.did);
|
|
172
|
+
// Write a record before subscribing.
|
|
173
|
+
const write1 = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
174
|
+
const write1Reply = await dwn.processMessage(alice.did, write1.message, { dataStream: write1.dataStream });
|
|
175
|
+
expect(write1Reply.status.code).toBe(202);
|
|
176
|
+
const write1Cid = await Message.getCid(write1.message);
|
|
177
|
+
// Subscribe with cursor from before the write to catch up.
|
|
178
|
+
const messageCids = [];
|
|
179
|
+
const handler = async (msg) => {
|
|
180
|
+
if (msg.type !== 'event') {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const { message } = msg.event;
|
|
184
|
+
const cid = await Message.getCid(message);
|
|
185
|
+
messageCids.push(cid);
|
|
186
|
+
};
|
|
187
|
+
const { message: subMessage } = await TestDataGenerator.generateMessagesSubscribe({
|
|
188
|
+
author: alice,
|
|
189
|
+
cursor: cursorBefore,
|
|
190
|
+
});
|
|
191
|
+
const subReply = await dwn.processMessage(alice.did, subMessage, { subscriptionHandler: handler });
|
|
192
|
+
expect(subReply.status.code).toBe(200);
|
|
193
|
+
expect(subReply.subscription).toBeDefined();
|
|
194
|
+
// Wait for the catch-up events.
|
|
195
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
196
|
+
expect(messageCids.length).toBeGreaterThanOrEqual(1);
|
|
197
|
+
expect(messageCids).toContain(write1Cid);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
it('should receive live events after cursor catch-up completes', async () => {
|
|
201
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
202
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
203
|
+
// Write before subscribing.
|
|
204
|
+
const write1 = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
205
|
+
await dwn.processMessage(alice.did, write1.message, { dataStream: write1.dataStream });
|
|
206
|
+
// Read to get cursor after write1.
|
|
207
|
+
const { cursor: cursorAfterWrite1 } = await eventLog.read(alice.did);
|
|
208
|
+
// Write another record that we'll catch up on.
|
|
209
|
+
const write2 = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
210
|
+
await dwn.processMessage(alice.did, write2.message, { dataStream: write2.dataStream });
|
|
211
|
+
const write2Cid = await Message.getCid(write2.message);
|
|
212
|
+
const messageCids = [];
|
|
213
|
+
const handler = async (msg) => {
|
|
214
|
+
if (msg.type !== 'event') {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const { message } = msg.event;
|
|
218
|
+
const cid = await Message.getCid(message);
|
|
219
|
+
messageCids.push(cid);
|
|
220
|
+
};
|
|
221
|
+
const { message: subMessage } = await TestDataGenerator.generateMessagesSubscribe({
|
|
222
|
+
author: alice,
|
|
223
|
+
cursor: cursorAfterWrite1,
|
|
224
|
+
});
|
|
225
|
+
const subReply = await dwn.processMessage(alice.did, subMessage, { subscriptionHandler: handler });
|
|
226
|
+
expect(subReply.status.code).toBe(200);
|
|
227
|
+
// Wait for catch-up (write2).
|
|
228
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
229
|
+
expect(messageCids).toContain(write2Cid);
|
|
230
|
+
});
|
|
231
|
+
// Write a live record.
|
|
232
|
+
const write3 = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
233
|
+
await dwn.processMessage(alice.did, write3.message, { dataStream: write3.dataStream });
|
|
234
|
+
const write3Cid = await Message.getCid(write3.message);
|
|
235
|
+
// Wait for the live event.
|
|
236
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
237
|
+
expect(messageCids).toContain(write3Cid);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|
|
168
241
|
describe('grant based subscribes', () => {
|
|
169
|
-
it('allows subscribe of messages with matching interface and method grant scope', () =>
|
|
242
|
+
it('allows subscribe of messages with matching interface and method grant scope', async () => {
|
|
170
243
|
// scenario: Alice gives Bob permission to subscribe for all of her messages
|
|
171
244
|
// Alice writes various messages
|
|
172
245
|
// When Bob subscribes for messages, he should receive updates to all of Alice's messages
|
|
173
|
-
const alice =
|
|
174
|
-
const bob =
|
|
246
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
247
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
175
248
|
// create grant that is scoped to `MessagesSubscribe` for bob
|
|
176
|
-
const { message: grantMessage, dataStream } =
|
|
249
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
177
250
|
author: alice,
|
|
178
251
|
grantedTo: bob,
|
|
179
252
|
scope: {
|
|
@@ -181,67 +254,126 @@ export function testMessagesSubscribeHandler() {
|
|
|
181
254
|
method: DwnMethodName.Subscribe
|
|
182
255
|
}
|
|
183
256
|
});
|
|
184
|
-
const grantReply =
|
|
257
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
185
258
|
expect(grantReply.status.code).toBe(202);
|
|
259
|
+
// install the default test protocol used by generateRecordsWrite
|
|
260
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
186
261
|
// create a handler to capture the emitted messageCids
|
|
187
262
|
const messageCids = [];
|
|
188
|
-
const handler = (
|
|
189
|
-
|
|
190
|
-
|
|
263
|
+
const handler = async (msg) => {
|
|
264
|
+
if (msg.type !== 'event') {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const { message } = msg.event;
|
|
268
|
+
const messageCid = await Message.getCid(message);
|
|
191
269
|
messageCids.push(messageCid);
|
|
192
|
-
}
|
|
270
|
+
};
|
|
193
271
|
// subscribe to messages
|
|
194
|
-
const { message: subscribeMessage } =
|
|
272
|
+
const { message: subscribeMessage } = await TestDataGenerator.generateMessagesSubscribe({
|
|
195
273
|
author: bob,
|
|
196
274
|
permissionGrantId: grantMessage.recordId,
|
|
197
275
|
});
|
|
198
|
-
const subscribeReply =
|
|
276
|
+
const subscribeReply = await dwn.processMessage(alice.did, subscribeMessage, { subscriptionHandler: handler });
|
|
199
277
|
expect(subscribeReply.status.code).toBe(200);
|
|
200
278
|
// configure the freeForAll protocol
|
|
201
|
-
const { message: freeForAllConfigure } =
|
|
279
|
+
const { message: freeForAllConfigure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
202
280
|
author: alice,
|
|
203
281
|
protocolDefinition: freeForAll,
|
|
204
282
|
});
|
|
205
|
-
const { status: freeForAllReplyStatus } =
|
|
283
|
+
const { status: freeForAllReplyStatus } = await dwn.processMessage(alice.did, freeForAllConfigure);
|
|
206
284
|
expect(freeForAllReplyStatus.code).toBe(202);
|
|
207
285
|
// configure a random protocol configuration
|
|
208
|
-
const { message: protocolMessage } =
|
|
286
|
+
const { message: protocolMessage } = await TestDataGenerator.generateProtocolsConfigure({
|
|
209
287
|
author: alice,
|
|
210
288
|
});
|
|
211
|
-
const { status: configureStatus } =
|
|
289
|
+
const { status: configureStatus } = await dwn.processMessage(alice.did, protocolMessage);
|
|
212
290
|
expect(configureStatus.code).toBe(202);
|
|
213
291
|
// write a message to the Records free for all interface
|
|
214
|
-
const { message: recordMessage, dataStream: recordDataStream } =
|
|
292
|
+
const { message: recordMessage, dataStream: recordDataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
215
293
|
protocol: freeForAll.protocol,
|
|
216
294
|
protocolPath: 'post',
|
|
217
295
|
schema: freeForAll.types.post.schema,
|
|
218
296
|
author: alice
|
|
219
297
|
});
|
|
220
|
-
const recordReply =
|
|
298
|
+
const recordReply = await dwn.processMessage(alice.did, recordMessage, { dataStream: recordDataStream });
|
|
221
299
|
expect(recordReply.status.code).toBe(202);
|
|
222
300
|
// write a random message
|
|
223
|
-
const { message: randomMessage, dataStream: randomDataStream } =
|
|
301
|
+
const { message: randomMessage, dataStream: randomDataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
224
302
|
author: alice
|
|
225
303
|
});
|
|
226
|
-
const randomReply =
|
|
304
|
+
const randomReply = await dwn.processMessage(alice.did, randomMessage, { dataStream: randomDataStream });
|
|
227
305
|
expect(randomReply.status.code).toBe(202);
|
|
228
306
|
// ensure that all messages have been received
|
|
229
|
-
|
|
307
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
230
308
|
expect(messageCids.length).toBe(4);
|
|
231
309
|
const expectedCids = [
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
310
|
+
await Message.getCid(freeForAllConfigure),
|
|
311
|
+
await Message.getCid(protocolMessage),
|
|
312
|
+
await Message.getCid(recordMessage),
|
|
313
|
+
await Message.getCid(randomMessage),
|
|
236
314
|
];
|
|
237
315
|
expect(messageCids.sort()).toEqual(expectedCids.sort());
|
|
238
|
-
})
|
|
239
|
-
})
|
|
240
|
-
it('
|
|
241
|
-
|
|
242
|
-
const
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
it('allows subscribe of messages with a unified MessagesRead grant scope', async () => {
|
|
319
|
+
// scenario: A Messages.Read grant should also authorize MessagesSubscribe operations
|
|
320
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
321
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
322
|
+
// create grant that is scoped to `MessagesRead` (unified) for bob
|
|
323
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
324
|
+
author: alice,
|
|
325
|
+
grantedTo: bob,
|
|
326
|
+
scope: {
|
|
327
|
+
interface: DwnInterfaceName.Messages,
|
|
328
|
+
method: DwnMethodName.Read,
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
332
|
+
expect(grantReply.status.code).toBe(202);
|
|
333
|
+
// install the default test protocol used by generateRecordsWrite
|
|
334
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
335
|
+
// create a handler to capture the emitted messageCids
|
|
336
|
+
const messageCids = [];
|
|
337
|
+
const handler = async (msg) => {
|
|
338
|
+
if (msg.type !== 'event') {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const { message } = msg.event;
|
|
342
|
+
const messageCid = await Message.getCid(message);
|
|
343
|
+
messageCids.push(messageCid);
|
|
344
|
+
};
|
|
345
|
+
// bob subscribes to messages using the Messages.Read grant
|
|
346
|
+
const { message: subscribeMessage } = await TestDataGenerator.generateMessagesSubscribe({
|
|
347
|
+
author: bob,
|
|
348
|
+
permissionGrantId: grantMessage.recordId,
|
|
349
|
+
});
|
|
350
|
+
const subscribeReply = await dwn.processMessage(alice.did, subscribeMessage, { subscriptionHandler: handler });
|
|
351
|
+
expect(subscribeReply.status.code).toBe(200);
|
|
352
|
+
// install the freeForAll protocol and write a record to trigger events
|
|
353
|
+
const { message: freeForAllConfigure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
354
|
+
author: alice,
|
|
355
|
+
protocolDefinition: freeForAll,
|
|
356
|
+
});
|
|
357
|
+
const { status: freeForAllReplyStatus } = await dwn.processMessage(alice.did, freeForAllConfigure);
|
|
358
|
+
expect(freeForAllReplyStatus.code).toBe(202);
|
|
359
|
+
const { message: recordMessage, dataStream: recordDataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
360
|
+
protocol: freeForAll.protocol,
|
|
361
|
+
protocolPath: 'post',
|
|
362
|
+
schema: freeForAll.types.post.schema,
|
|
363
|
+
author: alice
|
|
364
|
+
});
|
|
365
|
+
const recordReply = await dwn.processMessage(alice.did, recordMessage, { dataStream: recordDataStream });
|
|
366
|
+
expect(recordReply.status.code).toBe(202);
|
|
367
|
+
// ensure that at least one event was received
|
|
368
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
369
|
+
expect(messageCids.length).toBeGreaterThanOrEqual(1);
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
it('rejects subscribe of messages with mismatching interface grant scope', async () => {
|
|
373
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
374
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
243
375
|
// create grant that is scoped to `RecordsWrite` for bob scoped to the `freeForAll` protocol
|
|
244
|
-
const { message: grantMessage, dataStream } =
|
|
376
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
245
377
|
author: alice,
|
|
246
378
|
grantedTo: bob,
|
|
247
379
|
scope: {
|
|
@@ -250,22 +382,22 @@ export function testMessagesSubscribeHandler() {
|
|
|
250
382
|
protocol: freeForAll.protocol
|
|
251
383
|
}
|
|
252
384
|
});
|
|
253
|
-
const grantReply =
|
|
385
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
254
386
|
expect(grantReply.status.code).toBe(202);
|
|
255
387
|
// bob attempts to use the `RecordsWrite` grant on an `MessagesSubscribe` message
|
|
256
|
-
const { message: bobSubscribe } =
|
|
388
|
+
const { message: bobSubscribe } = await TestDataGenerator.generateMessagesSubscribe({
|
|
257
389
|
author: bob,
|
|
258
390
|
permissionGrantId: grantMessage.recordId
|
|
259
391
|
});
|
|
260
|
-
const bobReply =
|
|
392
|
+
const bobReply = await dwn.processMessage(alice.did, bobSubscribe);
|
|
261
393
|
expect(bobReply.status.code).toBe(401);
|
|
262
394
|
expect(bobReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationInterfaceMismatch);
|
|
263
|
-
})
|
|
264
|
-
it('rejects subscribe of messages with mismatching method grant scopes', () =>
|
|
265
|
-
const alice =
|
|
266
|
-
const bob =
|
|
395
|
+
});
|
|
396
|
+
it('rejects subscribe of messages with mismatching method grant scopes', async () => {
|
|
397
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
398
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
267
399
|
// create grant that is scoped to `MessagesSync` for bob
|
|
268
|
-
const { message: grantMessage, dataStream } =
|
|
400
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
269
401
|
author: alice,
|
|
270
402
|
grantedTo: bob,
|
|
271
403
|
scope: {
|
|
@@ -273,39 +405,39 @@ export function testMessagesSubscribeHandler() {
|
|
|
273
405
|
method: DwnMethodName.Sync,
|
|
274
406
|
}
|
|
275
407
|
});
|
|
276
|
-
const grantReply =
|
|
408
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
277
409
|
expect(grantReply.status.code).toBe(202);
|
|
278
410
|
// bob attempts to use the `MessagesSync` grant on an `MessagesSubscribe` message
|
|
279
|
-
const { message: bobSubscribe } =
|
|
411
|
+
const { message: bobSubscribe } = await TestDataGenerator.generateMessagesSubscribe({
|
|
280
412
|
author: bob,
|
|
281
413
|
permissionGrantId: grantMessage.recordId
|
|
282
414
|
});
|
|
283
|
-
const bobReply =
|
|
415
|
+
const bobReply = await dwn.processMessage(alice.did, bobSubscribe);
|
|
284
416
|
expect(bobReply.status.code).toBe(401);
|
|
285
417
|
expect(bobReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationMethodMismatch);
|
|
286
|
-
})
|
|
418
|
+
});
|
|
287
419
|
describe('protocol filtered messages', () => {
|
|
288
|
-
it('allows subscribe of protocol filtered messages with matching protocol grant scopes', () =>
|
|
289
|
-
const alice =
|
|
290
|
-
const bob =
|
|
420
|
+
it('allows subscribe of protocol filtered messages with matching protocol grant scopes', async () => {
|
|
421
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
422
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
291
423
|
// install protocol 1
|
|
292
|
-
const protocol1 =
|
|
293
|
-
const { message: protocol1Configure } =
|
|
424
|
+
const protocol1 = { ...freeForAll, published: true, protocol: 'http://protcol1' };
|
|
425
|
+
const { message: protocol1Configure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
294
426
|
author: alice,
|
|
295
427
|
protocolDefinition: protocol1,
|
|
296
428
|
});
|
|
297
|
-
const { status: protocol1ConfigureStatus } =
|
|
429
|
+
const { status: protocol1ConfigureStatus } = await dwn.processMessage(alice.did, protocol1Configure);
|
|
298
430
|
expect(protocol1ConfigureStatus.code).toBe(202);
|
|
299
431
|
// install protocol 2
|
|
300
|
-
const protocol2 =
|
|
301
|
-
const { message: protocol2Configure } =
|
|
432
|
+
const protocol2 = { ...freeForAll, published: true, protocol: 'http://protcol2' };
|
|
433
|
+
const { message: protocol2Configure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
302
434
|
author: alice,
|
|
303
435
|
protocolDefinition: protocol2,
|
|
304
436
|
});
|
|
305
|
-
const { status: protocol2ConfigureStatus } =
|
|
437
|
+
const { status: protocol2ConfigureStatus } = await dwn.processMessage(alice.did, protocol2Configure);
|
|
306
438
|
expect(protocol2ConfigureStatus.code).toBe(202);
|
|
307
439
|
// grant bob permission to subscribe for protocol 1
|
|
308
|
-
const { message: grant1Message, dataStream: grant1DataStream } =
|
|
440
|
+
const { message: grant1Message, dataStream: grant1DataStream } = await TestDataGenerator.generateGrantCreate({
|
|
309
441
|
author: alice,
|
|
310
442
|
grantedTo: bob,
|
|
311
443
|
scope: {
|
|
@@ -314,86 +446,92 @@ export function testMessagesSubscribeHandler() {
|
|
|
314
446
|
protocol: protocol1.protocol
|
|
315
447
|
}
|
|
316
448
|
});
|
|
317
|
-
const grant1Reply =
|
|
449
|
+
const grant1Reply = await dwn.processMessage(alice.did, grant1Message, { dataStream: grant1DataStream });
|
|
318
450
|
expect(grant1Reply.status.code).toBe(202);
|
|
319
451
|
// bob uses the grant to subscribe to protocol 1 messages
|
|
320
452
|
const proto1MessageCids = [];
|
|
321
|
-
const proto1Handler = (
|
|
322
|
-
|
|
323
|
-
|
|
453
|
+
const proto1Handler = async (msg) => {
|
|
454
|
+
if (msg.type !== 'event') {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
const { message } = msg.event;
|
|
458
|
+
const messageCid = await Message.getCid(message);
|
|
324
459
|
proto1MessageCids.push(messageCid);
|
|
325
|
-
}
|
|
326
|
-
const { message: bobSubscribe1 } =
|
|
460
|
+
};
|
|
461
|
+
const { message: bobSubscribe1 } = await TestDataGenerator.generateMessagesSubscribe({
|
|
327
462
|
author: bob,
|
|
328
463
|
filters: [{ protocol: protocol1.protocol }],
|
|
329
464
|
permissionGrantId: grant1Message.recordId
|
|
330
465
|
});
|
|
331
|
-
const bobReply1 =
|
|
466
|
+
const bobReply1 = await dwn.processMessage(alice.did, bobSubscribe1, { subscriptionHandler: proto1Handler });
|
|
332
467
|
expect(bobReply1.status.code).toBe(200);
|
|
333
468
|
const allMessages = [];
|
|
334
|
-
const allHandler = (
|
|
335
|
-
|
|
336
|
-
|
|
469
|
+
const allHandler = async (msg) => {
|
|
470
|
+
if (msg.type !== 'event') {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
const { message } = msg.event;
|
|
474
|
+
const messageCid = await Message.getCid(message);
|
|
337
475
|
allMessages.push(messageCid);
|
|
338
|
-
}
|
|
339
|
-
const { message: allSubscribe } =
|
|
476
|
+
};
|
|
477
|
+
const { message: allSubscribe } = await TestDataGenerator.generateMessagesSubscribe({
|
|
340
478
|
author: alice,
|
|
341
479
|
});
|
|
342
|
-
const allReply =
|
|
480
|
+
const allReply = await dwn.processMessage(alice.did, allSubscribe, { subscriptionHandler: allHandler });
|
|
343
481
|
expect(allReply.status.code).toBe(200);
|
|
344
482
|
// alice writes a message to protocol 1
|
|
345
|
-
const { message: proto1Message, dataStream: proto1DataStream } =
|
|
483
|
+
const { message: proto1Message, dataStream: proto1DataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
346
484
|
protocol: protocol1.protocol,
|
|
347
485
|
protocolPath: 'post',
|
|
348
486
|
schema: protocol1.types.post.schema,
|
|
349
487
|
author: alice
|
|
350
488
|
});
|
|
351
|
-
const proto1Reply =
|
|
489
|
+
const proto1Reply = await dwn.processMessage(alice.did, proto1Message, { dataStream: proto1DataStream });
|
|
352
490
|
expect(proto1Reply.status.code).toBe(202);
|
|
353
491
|
// alice writes a message to protocol 2
|
|
354
|
-
const { message: proto2Message, dataStream: proto2DataStream } =
|
|
492
|
+
const { message: proto2Message, dataStream: proto2DataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
355
493
|
protocol: protocol2.protocol,
|
|
356
494
|
protocolPath: 'post',
|
|
357
495
|
schema: protocol2.types.post.schema,
|
|
358
496
|
author: alice
|
|
359
497
|
});
|
|
360
|
-
const proto2Reply =
|
|
498
|
+
const proto2Reply = await dwn.processMessage(alice.did, proto2Message, { dataStream: proto2DataStream });
|
|
361
499
|
expect(proto2Reply.status.code).toBe(202);
|
|
362
500
|
// ensure that all messages have been received as a control
|
|
363
|
-
|
|
501
|
+
await Poller.pollUntilSuccessOrTimeout(async () => {
|
|
364
502
|
expect(allMessages.length).toBe(2);
|
|
365
503
|
const expectedAllCids = [
|
|
366
|
-
|
|
367
|
-
|
|
504
|
+
await Message.getCid(proto1Message),
|
|
505
|
+
await Message.getCid(proto2Message)
|
|
368
506
|
];
|
|
369
507
|
expect(allMessages.sort()).toEqual(expectedAllCids.sort());
|
|
370
508
|
// proto 1 messages should only have one message
|
|
371
509
|
expect(proto1MessageCids.length).toBe(1);
|
|
372
|
-
const expectedProto1Cids = [
|
|
510
|
+
const expectedProto1Cids = [await Message.getCid(proto1Message)];
|
|
373
511
|
expect(proto1MessageCids.sort()).toEqual(expectedProto1Cids.sort());
|
|
374
|
-
})
|
|
375
|
-
})
|
|
376
|
-
it('rejects subscribe of protocol filtered messages with mismatching protocol grant scopes', () =>
|
|
377
|
-
const alice =
|
|
378
|
-
const bob =
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
it('rejects subscribe of protocol filtered messages with mismatching protocol grant scopes', async () => {
|
|
515
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
516
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
379
517
|
// install protocol 1
|
|
380
|
-
const protocol1 =
|
|
381
|
-
const { message: protocol1Configure } =
|
|
518
|
+
const protocol1 = { ...freeForAll, published: true, protocol: 'http://protcol1' };
|
|
519
|
+
const { message: protocol1Configure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
382
520
|
author: alice,
|
|
383
521
|
protocolDefinition: protocol1,
|
|
384
522
|
});
|
|
385
|
-
const { status: protocol1ConfigureStatus } =
|
|
523
|
+
const { status: protocol1ConfigureStatus } = await dwn.processMessage(alice.did, protocol1Configure);
|
|
386
524
|
expect(protocol1ConfigureStatus.code).toBe(202);
|
|
387
525
|
// install protocol 2
|
|
388
|
-
const protocol2 =
|
|
389
|
-
const { message: protocol2Configure } =
|
|
526
|
+
const protocol2 = { ...freeForAll, published: true, protocol: 'http://protcol2' };
|
|
527
|
+
const { message: protocol2Configure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
390
528
|
author: alice,
|
|
391
529
|
protocolDefinition: protocol2,
|
|
392
530
|
});
|
|
393
|
-
const { status: protocol2ConfigureStatus } =
|
|
531
|
+
const { status: protocol2ConfigureStatus } = await dwn.processMessage(alice.did, protocol2Configure);
|
|
394
532
|
expect(protocol2ConfigureStatus.code).toBe(202);
|
|
395
533
|
// grant bob permission to subscribe for protocol 1
|
|
396
|
-
const { message: grant1Message, dataStream: grant1DataStream } =
|
|
534
|
+
const { message: grant1Message, dataStream: grant1DataStream } = await TestDataGenerator.generateGrantCreate({
|
|
397
535
|
author: alice,
|
|
398
536
|
grantedTo: bob,
|
|
399
537
|
scope: {
|
|
@@ -402,30 +540,30 @@ export function testMessagesSubscribeHandler() {
|
|
|
402
540
|
protocol: protocol1.protocol
|
|
403
541
|
}
|
|
404
542
|
});
|
|
405
|
-
const grant1Reply =
|
|
543
|
+
const grant1Reply = await dwn.processMessage(alice.did, grant1Message, { dataStream: grant1DataStream });
|
|
406
544
|
expect(grant1Reply.status.code).toBe(202);
|
|
407
545
|
// bob uses the grant for protocol 1 to subscribe for protocol 2 messages
|
|
408
|
-
const { message: bobSubscribe1 } =
|
|
546
|
+
const { message: bobSubscribe1 } = await TestDataGenerator.generateMessagesSubscribe({
|
|
409
547
|
author: bob,
|
|
410
548
|
filters: [{ protocol: protocol2.protocol }],
|
|
411
549
|
permissionGrantId: grant1Message.recordId
|
|
412
550
|
});
|
|
413
|
-
const bobReply1 =
|
|
551
|
+
const bobReply1 = await dwn.processMessage(alice.did, bobSubscribe1);
|
|
414
552
|
expect(bobReply1.status.code).toBe(401);
|
|
415
553
|
expect(bobReply1.status.detail).toContain(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol);
|
|
416
554
|
expect(bobReply1.subscription).toBeUndefined();
|
|
417
555
|
// bob attempts to use the grant for protocol 1 to subscribe to messages in protocol 1 OR protocol 2 given two filters
|
|
418
556
|
// this should fail because the grant is scoped to protocol 1 only
|
|
419
|
-
const { message: bobSubscribe2 } =
|
|
557
|
+
const { message: bobSubscribe2 } = await TestDataGenerator.generateMessagesSubscribe({
|
|
420
558
|
author: bob,
|
|
421
559
|
filters: [{ protocol: protocol1.protocol }, { protocol: protocol2.protocol }],
|
|
422
560
|
permissionGrantId: grant1Message.recordId
|
|
423
561
|
});
|
|
424
|
-
const bobReply2 =
|
|
562
|
+
const bobReply2 = await dwn.processMessage(alice.did, bobSubscribe2);
|
|
425
563
|
expect(bobReply2.status.code).toBe(401);
|
|
426
564
|
expect(bobReply2.status.detail).toContain(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol);
|
|
427
565
|
expect(bobReply2.subscription).toBeUndefined();
|
|
428
|
-
})
|
|
566
|
+
});
|
|
429
567
|
});
|
|
430
568
|
});
|
|
431
569
|
});
|