@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,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
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
|
-
};
|
|
10
1
|
import freeForAll from '../vectors/protocol-definitions/free-for-all.json' with { type: 'json' };
|
|
11
2
|
import { Jws } from '../../src/utils/jws.js';
|
|
12
3
|
import { Message } from '../../src/core/message.js';
|
|
@@ -14,7 +5,7 @@ import { MessagesSync } from '../../src/interfaces/messages-sync.js';
|
|
|
14
5
|
import { MessagesSyncHandler } from '../../src/handlers/messages-sync.js';
|
|
15
6
|
import sinon from 'sinon';
|
|
16
7
|
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
17
|
-
import {
|
|
8
|
+
import { TestEventLog } from '../test-event-stream.js';
|
|
18
9
|
import { TestStores } from '../test-stores.js';
|
|
19
10
|
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
20
11
|
import { DidKey, UniversalResolver } from '@enbox/dids';
|
|
@@ -26,246 +17,254 @@ export function testMessagesSyncHandler() {
|
|
|
26
17
|
let dataStore;
|
|
27
18
|
let resumableTaskStore;
|
|
28
19
|
let stateIndex;
|
|
29
|
-
let
|
|
20
|
+
let eventLog;
|
|
30
21
|
let dwn;
|
|
31
|
-
beforeAll(() =>
|
|
22
|
+
beforeAll(async () => {
|
|
32
23
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
33
24
|
const stores = TestStores.get();
|
|
34
25
|
messageStore = stores.messageStore;
|
|
35
26
|
dataStore = stores.dataStore;
|
|
36
27
|
resumableTaskStore = stores.resumableTaskStore;
|
|
37
28
|
stateIndex = stores.stateIndex;
|
|
38
|
-
|
|
39
|
-
dwn =
|
|
40
|
-
})
|
|
41
|
-
beforeEach(() =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
})
|
|
47
|
-
afterAll(() =>
|
|
48
|
-
|
|
49
|
-
})
|
|
29
|
+
eventLog = TestEventLog.get();
|
|
30
|
+
dwn = await Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventLog, resumableTaskStore });
|
|
31
|
+
});
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
await messageStore.clear();
|
|
34
|
+
await dataStore.clear();
|
|
35
|
+
await resumableTaskStore.clear();
|
|
36
|
+
await stateIndex.clear();
|
|
37
|
+
});
|
|
38
|
+
afterAll(async () => {
|
|
39
|
+
await dwn.close();
|
|
40
|
+
});
|
|
50
41
|
describe('root action', () => {
|
|
51
|
-
it('returns the empty root hash for a tenant with no messages', () =>
|
|
52
|
-
const alice =
|
|
53
|
-
const { message } =
|
|
42
|
+
it('returns the empty root hash for a tenant with no messages', async () => {
|
|
43
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
44
|
+
const { message } = await MessagesSync.create({
|
|
54
45
|
signer: Jws.createSigner(alice),
|
|
55
46
|
action: 'root',
|
|
56
47
|
});
|
|
57
|
-
const reply =
|
|
48
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
58
49
|
expect(reply.status.code).toBe(200);
|
|
59
50
|
expect(typeof reply.root).toBe('string');
|
|
60
51
|
expect(reply.root.length).toBe(64); // hex-encoded 32-byte hash
|
|
61
|
-
})
|
|
62
|
-
it('returns a different root hash after writing a message', () =>
|
|
63
|
-
const alice =
|
|
52
|
+
});
|
|
53
|
+
it('returns a different root hash after writing a message', async () => {
|
|
54
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
55
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
64
56
|
// get the empty root
|
|
65
|
-
const { message: rootMsg1 } =
|
|
57
|
+
const { message: rootMsg1 } = await MessagesSync.create({
|
|
66
58
|
signer: Jws.createSigner(alice),
|
|
67
59
|
action: 'root',
|
|
68
60
|
});
|
|
69
|
-
const reply1 =
|
|
61
|
+
const reply1 = await dwn.processMessage(alice.did, rootMsg1);
|
|
70
62
|
expect(reply1.status.code).toBe(200);
|
|
71
63
|
const emptyRoot = reply1.root;
|
|
72
64
|
// write a record
|
|
73
|
-
const { message: recordMessage, dataStream } =
|
|
74
|
-
const writeReply =
|
|
65
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
66
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
75
67
|
expect(writeReply.status.code).toBe(202);
|
|
76
68
|
// get the root again
|
|
77
|
-
const { message: rootMsg2 } =
|
|
69
|
+
const { message: rootMsg2 } = await MessagesSync.create({
|
|
78
70
|
signer: Jws.createSigner(alice),
|
|
79
71
|
action: 'root',
|
|
80
72
|
});
|
|
81
|
-
const reply2 =
|
|
73
|
+
const reply2 = await dwn.processMessage(alice.did, rootMsg2);
|
|
82
74
|
expect(reply2.status.code).toBe(200);
|
|
83
75
|
expect(reply2.root).not.toBe(emptyRoot);
|
|
84
|
-
})
|
|
85
|
-
it('returns protocol-scoped root hash when protocol is specified', () =>
|
|
86
|
-
const alice =
|
|
87
|
-
|
|
76
|
+
});
|
|
77
|
+
it('returns protocol-scoped root hash when protocol is specified', async () => {
|
|
78
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
79
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
80
|
+
const protocolDefinition = { ...freeForAll, published: true };
|
|
88
81
|
// configure the protocol
|
|
89
|
-
const { message: protocolMessage } =
|
|
82
|
+
const { message: protocolMessage } = await TestDataGenerator.generateProtocolsConfigure({
|
|
90
83
|
author: alice,
|
|
91
84
|
protocolDefinition,
|
|
92
85
|
});
|
|
93
|
-
const configureReply =
|
|
86
|
+
const configureReply = await dwn.processMessage(alice.did, protocolMessage);
|
|
94
87
|
expect(configureReply.status.code).toBe(202);
|
|
95
88
|
// write a record for this protocol
|
|
96
|
-
const { message: recordMessage, dataStream } =
|
|
89
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
97
90
|
author: alice,
|
|
98
91
|
protocol: protocolDefinition.protocol,
|
|
99
92
|
protocolPath: 'post',
|
|
100
93
|
schema: protocolDefinition.types.post.schema,
|
|
101
94
|
});
|
|
102
|
-
const writeReply =
|
|
95
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
103
96
|
expect(writeReply.status.code).toBe(202);
|
|
104
|
-
// write a
|
|
105
|
-
const { message:
|
|
106
|
-
const
|
|
107
|
-
expect(
|
|
97
|
+
// write a record under a different protocol to diverge the global root
|
|
98
|
+
const { message: otherRecord, dataStream: otherDataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
99
|
+
const otherWriteReply = await dwn.processMessage(alice.did, otherRecord, { dataStream: otherDataStream });
|
|
100
|
+
expect(otherWriteReply.status.code).toBe(202);
|
|
108
101
|
// get the global root
|
|
109
|
-
const { message: globalRootMsg } =
|
|
102
|
+
const { message: globalRootMsg } = await MessagesSync.create({
|
|
110
103
|
signer: Jws.createSigner(alice),
|
|
111
104
|
action: 'root',
|
|
112
105
|
});
|
|
113
|
-
const globalReply =
|
|
106
|
+
const globalReply = await dwn.processMessage(alice.did, globalRootMsg);
|
|
114
107
|
expect(globalReply.status.code).toBe(200);
|
|
115
108
|
// get the protocol-scoped root
|
|
116
|
-
const { message: protoRootMsg } =
|
|
109
|
+
const { message: protoRootMsg } = await MessagesSync.create({
|
|
117
110
|
signer: Jws.createSigner(alice),
|
|
118
111
|
action: 'root',
|
|
119
112
|
protocol: protocolDefinition.protocol,
|
|
120
113
|
});
|
|
121
|
-
const protoReply =
|
|
114
|
+
const protoReply = await dwn.processMessage(alice.did, protoRootMsg);
|
|
122
115
|
expect(protoReply.status.code).toBe(200);
|
|
123
116
|
// global root and protocol root should be different
|
|
124
|
-
// (global includes the
|
|
117
|
+
// (global includes the record from the other protocol)
|
|
125
118
|
expect(protoReply.root).not.toBe(globalReply.root);
|
|
126
119
|
// both should be non-empty roots
|
|
127
120
|
expect(protoReply.root.length).toBe(64);
|
|
128
|
-
})
|
|
121
|
+
});
|
|
129
122
|
});
|
|
130
123
|
describe('subtree action', () => {
|
|
131
|
-
it('returns a subtree hash for a given bit prefix', () =>
|
|
132
|
-
const alice =
|
|
124
|
+
it('returns a subtree hash for a given bit prefix', async () => {
|
|
125
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
126
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
133
127
|
// write a record so the tree is non-empty
|
|
134
|
-
const { message: recordMessage, dataStream } =
|
|
135
|
-
const writeReply =
|
|
128
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
129
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
136
130
|
expect(writeReply.status.code).toBe(202);
|
|
137
|
-
const { message } =
|
|
131
|
+
const { message } = await MessagesSync.create({
|
|
138
132
|
signer: Jws.createSigner(alice),
|
|
139
133
|
action: 'subtree',
|
|
140
134
|
prefix: '0',
|
|
141
135
|
});
|
|
142
|
-
const reply =
|
|
136
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
143
137
|
expect(reply.status.code).toBe(200);
|
|
144
138
|
expect(typeof reply.hash).toBe('string');
|
|
145
139
|
expect(reply.hash.length).toBe(64);
|
|
146
|
-
})
|
|
147
|
-
it('returns different hashes for different prefixes', () =>
|
|
148
|
-
const alice =
|
|
140
|
+
});
|
|
141
|
+
it('returns different hashes for different prefixes', async () => {
|
|
142
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
143
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
149
144
|
// write several records to populate various subtrees
|
|
150
145
|
for (let i = 0; i < 10; i++) {
|
|
151
|
-
const { message: recordMessage, dataStream } =
|
|
152
|
-
const writeReply =
|
|
146
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
147
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
153
148
|
expect(writeReply.status.code).toBe(202);
|
|
154
149
|
}
|
|
155
|
-
const { message: msg0 } =
|
|
150
|
+
const { message: msg0 } = await MessagesSync.create({
|
|
156
151
|
signer: Jws.createSigner(alice),
|
|
157
152
|
action: 'subtree',
|
|
158
153
|
prefix: '0',
|
|
159
154
|
});
|
|
160
|
-
const reply0 =
|
|
161
|
-
const { message: msg1 } =
|
|
155
|
+
const reply0 = await dwn.processMessage(alice.did, msg0);
|
|
156
|
+
const { message: msg1 } = await MessagesSync.create({
|
|
162
157
|
signer: Jws.createSigner(alice),
|
|
163
158
|
action: 'subtree',
|
|
164
159
|
prefix: '1',
|
|
165
160
|
});
|
|
166
|
-
const reply1 =
|
|
161
|
+
const reply1 = await dwn.processMessage(alice.did, msg1);
|
|
167
162
|
expect(reply0.status.code).toBe(200);
|
|
168
163
|
expect(reply1.status.code).toBe(200);
|
|
169
164
|
// With 10 messages, it's very likely the two halves of the tree differ
|
|
170
165
|
// (not guaranteed but probabilistically near-certain)
|
|
171
|
-
})
|
|
166
|
+
});
|
|
172
167
|
});
|
|
173
168
|
describe('leaves action', () => {
|
|
174
|
-
it('returns all message CIDs for an empty prefix', () =>
|
|
175
|
-
const alice =
|
|
169
|
+
it('returns all message CIDs for an empty prefix', async () => {
|
|
170
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
171
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
176
172
|
// write some messages
|
|
177
173
|
const expectedCids = [];
|
|
178
174
|
for (let i = 0; i < 3; i++) {
|
|
179
|
-
const { message: recordMessage, dataStream } =
|
|
180
|
-
const writeReply =
|
|
175
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
176
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
181
177
|
expect(writeReply.status.code).toBe(202);
|
|
182
|
-
expectedCids.push(
|
|
178
|
+
expectedCids.push(await Message.getCid(recordMessage));
|
|
183
179
|
}
|
|
184
|
-
const { message } =
|
|
180
|
+
const { message } = await MessagesSync.create({
|
|
185
181
|
signer: Jws.createSigner(alice),
|
|
186
182
|
action: 'leaves',
|
|
187
183
|
prefix: '',
|
|
188
184
|
});
|
|
189
|
-
const reply =
|
|
185
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
190
186
|
expect(reply.status.code).toBe(200);
|
|
191
187
|
expect(Array.isArray(reply.entries)).toBe(true);
|
|
192
|
-
|
|
188
|
+
// 3 RecordsWrite messages + 1 ProtocolsConfigure for the default test protocol
|
|
189
|
+
expect(reply.entries.length).toBe(4);
|
|
193
190
|
for (const cid of expectedCids) {
|
|
194
191
|
expect(reply.entries).toContain(cid);
|
|
195
192
|
}
|
|
196
|
-
})
|
|
197
|
-
it('returns protocol-scoped leaves when protocol is specified', () =>
|
|
198
|
-
const alice =
|
|
199
|
-
|
|
193
|
+
});
|
|
194
|
+
it('returns protocol-scoped leaves when protocol is specified', async () => {
|
|
195
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
196
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
197
|
+
const protocolDefinition = { ...freeForAll, published: true };
|
|
200
198
|
// configure the protocol
|
|
201
|
-
const { message: protocolMessage } =
|
|
199
|
+
const { message: protocolMessage } = await TestDataGenerator.generateProtocolsConfigure({
|
|
202
200
|
author: alice,
|
|
203
201
|
protocolDefinition,
|
|
204
202
|
});
|
|
205
|
-
const configureReply =
|
|
203
|
+
const configureReply = await dwn.processMessage(alice.did, protocolMessage);
|
|
206
204
|
expect(configureReply.status.code).toBe(202);
|
|
207
205
|
// write a protocol-scoped record
|
|
208
|
-
const { message: protoRecord, dataStream: protoDataStream } =
|
|
206
|
+
const { message: protoRecord, dataStream: protoDataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
209
207
|
author: alice,
|
|
210
208
|
protocol: protocolDefinition.protocol,
|
|
211
209
|
protocolPath: 'post',
|
|
212
210
|
schema: protocolDefinition.types.post.schema,
|
|
213
211
|
});
|
|
214
|
-
const protoWriteReply =
|
|
212
|
+
const protoWriteReply = await dwn.processMessage(alice.did, protoRecord, { dataStream: protoDataStream });
|
|
215
213
|
expect(protoWriteReply.status.code).toBe(202);
|
|
216
|
-
// write a
|
|
217
|
-
const { message:
|
|
218
|
-
const
|
|
219
|
-
expect(
|
|
214
|
+
// write a record under a different protocol
|
|
215
|
+
const { message: otherRecord, dataStream: otherDataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
216
|
+
const otherWriteReply = await dwn.processMessage(alice.did, otherRecord, { dataStream: otherDataStream });
|
|
217
|
+
expect(otherWriteReply.status.code).toBe(202);
|
|
220
218
|
// query protocol-scoped leaves
|
|
221
|
-
const { message } =
|
|
219
|
+
const { message } = await MessagesSync.create({
|
|
222
220
|
signer: Jws.createSigner(alice),
|
|
223
221
|
action: 'leaves',
|
|
224
222
|
prefix: '',
|
|
225
223
|
protocol: protocolDefinition.protocol,
|
|
226
224
|
});
|
|
227
|
-
const reply =
|
|
225
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
228
226
|
expect(reply.status.code).toBe(200);
|
|
229
|
-
// should contain the ProtocolsConfigure and the protocol-scoped record, but not the
|
|
227
|
+
// should contain the ProtocolsConfigure and the protocol-scoped record, but not the other-protocol record
|
|
230
228
|
expect(reply.entries.length).toBe(2);
|
|
231
|
-
const protocolCid =
|
|
232
|
-
const recordCid =
|
|
229
|
+
const protocolCid = await Message.getCid(protocolMessage);
|
|
230
|
+
const recordCid = await Message.getCid(protoRecord);
|
|
233
231
|
expect(reply.entries).toContain(protocolCid);
|
|
234
232
|
expect(reply.entries).toContain(recordCid);
|
|
235
|
-
})
|
|
233
|
+
});
|
|
236
234
|
});
|
|
237
235
|
describe('authorization', () => {
|
|
238
|
-
it('returns 401 if tenant is not the author', () =>
|
|
239
|
-
const alice =
|
|
240
|
-
const bob =
|
|
241
|
-
const { message } =
|
|
236
|
+
it('returns 401 if tenant is not the author', async () => {
|
|
237
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
238
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
239
|
+
const { message } = await MessagesSync.create({
|
|
242
240
|
signer: Jws.createSigner(alice),
|
|
243
241
|
action: 'root',
|
|
244
242
|
});
|
|
245
|
-
const reply =
|
|
243
|
+
const reply = await dwn.processMessage(bob.did, message);
|
|
246
244
|
expect(reply.status.code).toBe(401);
|
|
247
|
-
})
|
|
248
|
-
it('returns 400 if message is invalid', () =>
|
|
249
|
-
const alice =
|
|
250
|
-
const { message } =
|
|
245
|
+
});
|
|
246
|
+
it('returns 400 if message is invalid', async () => {
|
|
247
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
248
|
+
const { message } = await MessagesSync.create({
|
|
251
249
|
signer: Jws.createSigner(alice),
|
|
252
250
|
action: 'root',
|
|
253
251
|
});
|
|
254
252
|
message['descriptor']['troll'] = 'hehe';
|
|
255
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, stateIndex);
|
|
256
|
-
const reply =
|
|
253
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex });
|
|
254
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
257
255
|
expect(reply.status.code).toBe(400);
|
|
258
|
-
})
|
|
256
|
+
});
|
|
259
257
|
describe('grant-based sync', () => {
|
|
260
|
-
it('allows sync with a matching MessagesSync grant scope', () =>
|
|
261
|
-
const alice =
|
|
262
|
-
const bob =
|
|
258
|
+
it('allows sync with a matching MessagesSync grant scope', async () => {
|
|
259
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
260
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
261
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
263
262
|
// write a record so the tree is non-empty
|
|
264
|
-
const { message: recordMessage, dataStream } =
|
|
265
|
-
const writeReply =
|
|
263
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
264
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
266
265
|
expect(writeReply.status.code).toBe(202);
|
|
267
266
|
// grant bob permission to sync Alice's messages
|
|
268
|
-
const { message: grantMessage, dataStream: grantDataStream } =
|
|
267
|
+
const { message: grantMessage, dataStream: grantDataStream } = await TestDataGenerator.generateGrantCreate({
|
|
269
268
|
author: alice,
|
|
270
269
|
grantedTo: bob,
|
|
271
270
|
scope: {
|
|
@@ -273,38 +272,112 @@ export function testMessagesSyncHandler() {
|
|
|
273
272
|
method: DwnMethodName.Sync,
|
|
274
273
|
},
|
|
275
274
|
});
|
|
276
|
-
const grantReply =
|
|
275
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream: grantDataStream });
|
|
277
276
|
expect(grantReply.status.code).toBe(202);
|
|
278
277
|
// bob syncs using the grant — root action
|
|
279
|
-
const { message: syncMsg } =
|
|
278
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
280
279
|
signer: Jws.createSigner(bob),
|
|
281
280
|
action: 'root',
|
|
282
281
|
permissionGrantId: grantMessage.recordId,
|
|
283
282
|
});
|
|
284
|
-
const reply =
|
|
283
|
+
const reply = await dwn.processMessage(alice.did, syncMsg);
|
|
285
284
|
expect(reply.status.code).toBe(200);
|
|
286
285
|
expect(typeof reply.root).toBe('string');
|
|
287
286
|
expect(reply.root.length).toBe(64);
|
|
288
|
-
})
|
|
289
|
-
it('allows sync with a
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
-
const
|
|
287
|
+
});
|
|
288
|
+
it('allows sync with a unified MessagesRead grant scope', async () => {
|
|
289
|
+
// scenario: A Messages.Read grant should also authorize MessagesSync operations
|
|
290
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
291
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
292
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
293
|
+
// write a record so the tree is non-empty
|
|
294
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
295
|
+
const writeReply = await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
296
|
+
expect(writeReply.status.code).toBe(202);
|
|
297
|
+
// grant bob permission with Messages.Read scope (unified)
|
|
298
|
+
const { message: grantMessage, dataStream: grantDataStream } = await TestDataGenerator.generateGrantCreate({
|
|
299
|
+
author: alice,
|
|
300
|
+
grantedTo: bob,
|
|
301
|
+
scope: {
|
|
302
|
+
interface: DwnInterfaceName.Messages,
|
|
303
|
+
method: DwnMethodName.Read,
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream: grantDataStream });
|
|
307
|
+
expect(grantReply.status.code).toBe(202);
|
|
308
|
+
// bob syncs using the Messages.Read grant — root action
|
|
309
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
310
|
+
signer: Jws.createSigner(bob),
|
|
311
|
+
action: 'root',
|
|
312
|
+
permissionGrantId: grantMessage.recordId,
|
|
313
|
+
});
|
|
314
|
+
const reply2 = await dwn.processMessage(alice.did, syncMsg);
|
|
315
|
+
expect(reply2.status.code).toBe(200);
|
|
316
|
+
expect(typeof reply2.root).toBe('string');
|
|
317
|
+
expect(reply2.root.length).toBe(64);
|
|
318
|
+
});
|
|
319
|
+
it('allows sync with a protocol-scoped MessagesRead grant', async () => {
|
|
320
|
+
// scenario: A Messages.Read grant scoped to a protocol should authorize protocol-scoped MessagesSync
|
|
321
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
322
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
323
|
+
const protocolDefinition = { ...freeForAll, published: true };
|
|
293
324
|
// configure and write a protocol record
|
|
294
|
-
const { message: protocolMessage } =
|
|
325
|
+
const { message: protocolMessage } = await TestDataGenerator.generateProtocolsConfigure({
|
|
295
326
|
author: alice,
|
|
296
327
|
protocolDefinition,
|
|
297
328
|
});
|
|
298
|
-
|
|
299
|
-
const { message: recordMessage, dataStream } =
|
|
329
|
+
await dwn.processMessage(alice.did, protocolMessage);
|
|
330
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
300
331
|
author: alice,
|
|
301
332
|
protocol: protocolDefinition.protocol,
|
|
302
333
|
protocolPath: 'post',
|
|
303
334
|
schema: protocolDefinition.types.post.schema,
|
|
304
335
|
});
|
|
305
|
-
|
|
336
|
+
await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
337
|
+
// grant bob permission with Messages.Read scope scoped to this protocol
|
|
338
|
+
const { message: grantMessage, dataStream: grantDataStream } = await TestDataGenerator.generateGrantCreate({
|
|
339
|
+
author: alice,
|
|
340
|
+
grantedTo: bob,
|
|
341
|
+
scope: {
|
|
342
|
+
interface: DwnInterfaceName.Messages,
|
|
343
|
+
method: DwnMethodName.Read,
|
|
344
|
+
protocol: protocolDefinition.protocol,
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream: grantDataStream });
|
|
348
|
+
expect(grantReply.status.code).toBe(202);
|
|
349
|
+
// bob syncs leaves with the protocol-scoped Messages.Read grant
|
|
350
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
351
|
+
signer: Jws.createSigner(bob),
|
|
352
|
+
action: 'leaves',
|
|
353
|
+
prefix: '',
|
|
354
|
+
protocol: protocolDefinition.protocol,
|
|
355
|
+
permissionGrantId: grantMessage.recordId,
|
|
356
|
+
});
|
|
357
|
+
const reply2 = await dwn.processMessage(alice.did, syncMsg);
|
|
358
|
+
expect(reply2.status.code).toBe(200);
|
|
359
|
+
expect(Array.isArray(reply2.entries)).toBe(true);
|
|
360
|
+
expect(reply2.entries.length).toBe(2);
|
|
361
|
+
});
|
|
362
|
+
it('allows sync with a protocol-scoped grant', async () => {
|
|
363
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
364
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
365
|
+
const protocolDefinition = { ...freeForAll, published: true };
|
|
366
|
+
// configure and write a protocol record
|
|
367
|
+
const { message: protocolMessage } = await TestDataGenerator.generateProtocolsConfigure({
|
|
368
|
+
author: alice,
|
|
369
|
+
protocolDefinition,
|
|
370
|
+
});
|
|
371
|
+
await dwn.processMessage(alice.did, protocolMessage);
|
|
372
|
+
const { message: recordMessage, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
373
|
+
author: alice,
|
|
374
|
+
protocol: protocolDefinition.protocol,
|
|
375
|
+
protocolPath: 'post',
|
|
376
|
+
schema: protocolDefinition.types.post.schema,
|
|
377
|
+
});
|
|
378
|
+
await dwn.processMessage(alice.did, recordMessage, { dataStream });
|
|
306
379
|
// grant bob permission to sync Alice's messages scoped to this protocol
|
|
307
|
-
const { message: grantMessage, dataStream: grantDataStream } =
|
|
380
|
+
const { message: grantMessage, dataStream: grantDataStream } = await TestDataGenerator.generateGrantCreate({
|
|
308
381
|
author: alice,
|
|
309
382
|
grantedTo: bob,
|
|
310
383
|
scope: {
|
|
@@ -313,31 +386,31 @@ export function testMessagesSyncHandler() {
|
|
|
313
386
|
protocol: protocolDefinition.protocol,
|
|
314
387
|
},
|
|
315
388
|
});
|
|
316
|
-
const grantReply =
|
|
389
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream: grantDataStream });
|
|
317
390
|
expect(grantReply.status.code).toBe(202);
|
|
318
391
|
// bob syncs leaves with the protocol-scoped grant
|
|
319
|
-
const { message: syncMsg } =
|
|
392
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
320
393
|
signer: Jws.createSigner(bob),
|
|
321
394
|
action: 'leaves',
|
|
322
395
|
prefix: '',
|
|
323
396
|
protocol: protocolDefinition.protocol,
|
|
324
397
|
permissionGrantId: grantMessage.recordId,
|
|
325
398
|
});
|
|
326
|
-
const reply =
|
|
399
|
+
const reply = await dwn.processMessage(alice.did, syncMsg);
|
|
327
400
|
expect(reply.status.code).toBe(200);
|
|
328
401
|
expect(Array.isArray(reply.entries)).toBe(true);
|
|
329
402
|
// includes both the ProtocolsConfigure and the RecordsWrite
|
|
330
403
|
expect(reply.entries.length).toBe(2);
|
|
331
|
-
const protocolCid =
|
|
332
|
-
const recordCid =
|
|
404
|
+
const protocolCid = await Message.getCid(protocolMessage);
|
|
405
|
+
const recordCid = await Message.getCid(recordMessage);
|
|
333
406
|
expect(reply.entries).toContain(protocolCid);
|
|
334
407
|
expect(reply.entries).toContain(recordCid);
|
|
335
|
-
})
|
|
336
|
-
it('rejects sync with mismatching interface grant scope', () =>
|
|
337
|
-
const alice =
|
|
338
|
-
const bob =
|
|
408
|
+
});
|
|
409
|
+
it('rejects sync with mismatching interface grant scope', async () => {
|
|
410
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
411
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
339
412
|
// create a RecordsWrite grant (wrong interface for MessagesSync)
|
|
340
|
-
const { message: grantMessage, dataStream } =
|
|
413
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
341
414
|
author: alice,
|
|
342
415
|
grantedTo: bob,
|
|
343
416
|
scope: {
|
|
@@ -346,22 +419,22 @@ export function testMessagesSyncHandler() {
|
|
|
346
419
|
protocol: freeForAll.protocol,
|
|
347
420
|
},
|
|
348
421
|
});
|
|
349
|
-
const grantReply =
|
|
422
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
350
423
|
expect(grantReply.status.code).toBe(202);
|
|
351
|
-
const { message: syncMsg } =
|
|
424
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
352
425
|
signer: Jws.createSigner(bob),
|
|
353
426
|
action: 'root',
|
|
354
427
|
permissionGrantId: grantMessage.recordId,
|
|
355
428
|
});
|
|
356
|
-
const reply =
|
|
429
|
+
const reply = await dwn.processMessage(alice.did, syncMsg);
|
|
357
430
|
expect(reply.status.code).toBe(401);
|
|
358
431
|
expect(reply.status.detail).toContain(DwnErrorCode.GrantAuthorizationInterfaceMismatch);
|
|
359
|
-
})
|
|
360
|
-
it('rejects sync with mismatching method grant scope', () =>
|
|
361
|
-
const alice =
|
|
362
|
-
const bob =
|
|
432
|
+
});
|
|
433
|
+
it('rejects sync with mismatching method grant scope', async () => {
|
|
434
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
435
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
363
436
|
// create a MessagesSubscribe grant (wrong method for MessagesSync)
|
|
364
|
-
const { message: grantMessage, dataStream } =
|
|
437
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
365
438
|
author: alice,
|
|
366
439
|
grantedTo: bob,
|
|
367
440
|
scope: {
|
|
@@ -369,22 +442,22 @@ export function testMessagesSyncHandler() {
|
|
|
369
442
|
method: DwnMethodName.Subscribe,
|
|
370
443
|
},
|
|
371
444
|
});
|
|
372
|
-
const grantReply =
|
|
445
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
373
446
|
expect(grantReply.status.code).toBe(202);
|
|
374
|
-
const { message: syncMsg } =
|
|
447
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
375
448
|
signer: Jws.createSigner(bob),
|
|
376
449
|
action: 'root',
|
|
377
450
|
permissionGrantId: grantMessage.recordId,
|
|
378
451
|
});
|
|
379
|
-
const reply =
|
|
452
|
+
const reply = await dwn.processMessage(alice.did, syncMsg);
|
|
380
453
|
expect(reply.status.code).toBe(401);
|
|
381
454
|
expect(reply.status.detail).toContain(DwnErrorCode.GrantAuthorizationMethodMismatch);
|
|
382
|
-
})
|
|
383
|
-
it('rejects sync with mismatching protocol grant scope', () =>
|
|
384
|
-
const alice =
|
|
385
|
-
const bob =
|
|
455
|
+
});
|
|
456
|
+
it('rejects sync with mismatching protocol grant scope', async () => {
|
|
457
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
458
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
386
459
|
// grant bob permission to sync protocol1
|
|
387
|
-
const { message: grantMessage, dataStream } =
|
|
460
|
+
const { message: grantMessage, dataStream } = await TestDataGenerator.generateGrantCreate({
|
|
388
461
|
author: alice,
|
|
389
462
|
grantedTo: bob,
|
|
390
463
|
scope: {
|
|
@@ -393,39 +466,39 @@ export function testMessagesSyncHandler() {
|
|
|
393
466
|
protocol: 'http://protocol1',
|
|
394
467
|
},
|
|
395
468
|
});
|
|
396
|
-
const grantReply =
|
|
469
|
+
const grantReply = await dwn.processMessage(alice.did, grantMessage, { dataStream });
|
|
397
470
|
expect(grantReply.status.code).toBe(202);
|
|
398
471
|
// bob attempts to sync protocol2 using the protocol1 grant
|
|
399
|
-
const { message: syncMsg } =
|
|
472
|
+
const { message: syncMsg } = await MessagesSync.create({
|
|
400
473
|
signer: Jws.createSigner(bob),
|
|
401
474
|
action: 'root',
|
|
402
475
|
protocol: 'http://protocol2',
|
|
403
476
|
permissionGrantId: grantMessage.recordId,
|
|
404
477
|
});
|
|
405
|
-
const reply =
|
|
478
|
+
const reply = await dwn.processMessage(alice.did, syncMsg);
|
|
406
479
|
expect(reply.status.code).toBe(401);
|
|
407
480
|
expect(reply.status.detail).toContain(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol);
|
|
408
|
-
})
|
|
481
|
+
});
|
|
409
482
|
});
|
|
410
483
|
});
|
|
411
484
|
describe('input validation', () => {
|
|
412
|
-
it('returns 400 for an unknown action', () =>
|
|
413
|
-
const alice =
|
|
414
|
-
const { message } =
|
|
485
|
+
it('returns 400 for an unknown action', async () => {
|
|
486
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
487
|
+
const { message } = await MessagesSync.create({
|
|
415
488
|
signer: Jws.createSigner(alice),
|
|
416
489
|
action: 'root',
|
|
417
490
|
});
|
|
418
491
|
// manually override to an invalid action
|
|
419
492
|
message.descriptor.action = 'invalid';
|
|
420
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, stateIndex);
|
|
421
|
-
const reply =
|
|
493
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex });
|
|
494
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
422
495
|
expect(reply.status.code).toBe(400);
|
|
423
496
|
// the JSON schema validator catches the invalid action before the handler switch/case
|
|
424
497
|
expect(reply.status.detail).toContain('SchemaValidatorFailure');
|
|
425
|
-
})
|
|
426
|
-
it('returns 400 for unknown action that bypasses schema validation (default case)', () =>
|
|
427
|
-
const alice =
|
|
428
|
-
const { message } =
|
|
498
|
+
});
|
|
499
|
+
it('returns 400 for unknown action that bypasses schema validation (default case)', async () => {
|
|
500
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
501
|
+
const { message } = await MessagesSync.create({
|
|
429
502
|
signer: Jws.createSigner(alice),
|
|
430
503
|
action: 'root',
|
|
431
504
|
});
|
|
@@ -438,18 +511,18 @@ export function testMessagesSyncHandler() {
|
|
|
438
511
|
try {
|
|
439
512
|
// Override action to something that passes the stub but hits the default case
|
|
440
513
|
message.descriptor.action = 'bogusAction';
|
|
441
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, stateIndex);
|
|
442
|
-
const reply =
|
|
514
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex });
|
|
515
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
443
516
|
expect(reply.status.code).toBe(400);
|
|
444
517
|
expect(reply.status.detail).toContain('Unknown action');
|
|
445
518
|
}
|
|
446
519
|
finally {
|
|
447
520
|
parseStub.restore();
|
|
448
521
|
}
|
|
449
|
-
})
|
|
450
|
-
it('returns 500 for invalid prefix with non-binary characters (via stubbed parse)', () =>
|
|
451
|
-
const alice =
|
|
452
|
-
const { message } =
|
|
522
|
+
});
|
|
523
|
+
it('returns 500 for invalid prefix with non-binary characters (via stubbed parse)', async () => {
|
|
524
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
525
|
+
const { message } = await MessagesSync.create({
|
|
453
526
|
signer: Jws.createSigner(alice),
|
|
454
527
|
action: 'subtree',
|
|
455
528
|
prefix: '0',
|
|
@@ -463,18 +536,18 @@ export function testMessagesSyncHandler() {
|
|
|
463
536
|
try {
|
|
464
537
|
// Override prefix to contain invalid characters
|
|
465
538
|
message.descriptor.prefix = 'abc';
|
|
466
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, stateIndex);
|
|
467
|
-
const reply =
|
|
539
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex });
|
|
540
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
468
541
|
expect(reply.status.code).toBe(500);
|
|
469
542
|
expect(reply.status.detail).toContain('MessagesSyncInvalidPrefix');
|
|
470
543
|
}
|
|
471
544
|
finally {
|
|
472
545
|
parseStub.restore();
|
|
473
546
|
}
|
|
474
|
-
})
|
|
475
|
-
it('returns 500 for prefix exceeding 256 characters (via stubbed parse)', () =>
|
|
476
|
-
const alice =
|
|
477
|
-
const { message } =
|
|
547
|
+
});
|
|
548
|
+
it('returns 500 for prefix exceeding 256 characters (via stubbed parse)', async () => {
|
|
549
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
550
|
+
const { message } = await MessagesSync.create({
|
|
478
551
|
signer: Jws.createSigner(alice),
|
|
479
552
|
action: 'subtree',
|
|
480
553
|
prefix: '0',
|
|
@@ -488,40 +561,40 @@ export function testMessagesSyncHandler() {
|
|
|
488
561
|
try {
|
|
489
562
|
// Override prefix to be too long
|
|
490
563
|
message.descriptor.prefix = '0'.repeat(257);
|
|
491
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, stateIndex);
|
|
492
|
-
const reply =
|
|
564
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex });
|
|
565
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
493
566
|
expect(reply.status.code).toBe(500);
|
|
494
567
|
expect(reply.status.detail).toContain('MessagesSyncInvalidPrefix');
|
|
495
568
|
}
|
|
496
569
|
finally {
|
|
497
570
|
parseStub.restore();
|
|
498
571
|
}
|
|
499
|
-
})
|
|
572
|
+
});
|
|
500
573
|
});
|
|
501
574
|
describe('error handling', () => {
|
|
502
|
-
it('returns 500 when stateIndex throws an unexpected error', () =>
|
|
503
|
-
const alice =
|
|
575
|
+
it('returns 500 when stateIndex throws an unexpected error', async () => {
|
|
576
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
504
577
|
const failingStateIndex = {
|
|
505
|
-
open: () =>
|
|
506
|
-
close: () =>
|
|
507
|
-
clear: () =>
|
|
508
|
-
insert: () =>
|
|
509
|
-
delete: () =>
|
|
510
|
-
getRoot: () =>
|
|
511
|
-
getProtocolRoot: () =>
|
|
512
|
-
getSubtreeHash: () =>
|
|
513
|
-
getProtocolSubtreeHash: () =>
|
|
514
|
-
getLeaves: () =>
|
|
515
|
-
getProtocolLeaves: () =>
|
|
578
|
+
open: async () => { },
|
|
579
|
+
close: async () => { },
|
|
580
|
+
clear: async () => { },
|
|
581
|
+
insert: async () => { },
|
|
582
|
+
delete: async () => { },
|
|
583
|
+
getRoot: async () => { throw new Error('Unexpected DB failure'); },
|
|
584
|
+
getProtocolRoot: async () => { throw new Error('Unexpected DB failure'); },
|
|
585
|
+
getSubtreeHash: async () => { throw new Error('Unexpected DB failure'); },
|
|
586
|
+
getProtocolSubtreeHash: async () => { throw new Error('Unexpected DB failure'); },
|
|
587
|
+
getLeaves: async () => { throw new Error('Unexpected DB failure'); },
|
|
588
|
+
getProtocolLeaves: async () => { throw new Error('Unexpected DB failure'); },
|
|
516
589
|
};
|
|
517
|
-
const handler = new MessagesSyncHandler(didResolver, messageStore, failingStateIndex);
|
|
518
|
-
const { message } =
|
|
590
|
+
const handler = new MessagesSyncHandler({ didResolver, messageStore, stateIndex: failingStateIndex });
|
|
591
|
+
const { message } = await MessagesSync.create({
|
|
519
592
|
signer: Jws.createSigner(alice),
|
|
520
593
|
action: 'root',
|
|
521
594
|
});
|
|
522
|
-
const reply =
|
|
595
|
+
const reply = await handler.handle({ tenant: alice.did, message });
|
|
523
596
|
expect(reply.status.code).toBe(500);
|
|
524
|
-
})
|
|
597
|
+
});
|
|
525
598
|
});
|
|
526
599
|
});
|
|
527
600
|
}
|