@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,18 +1,9 @@
|
|
|
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 { GeneralJwsVerifier } from '../../src/jose/jws/general/verifier.js';
|
|
11
2
|
import { Message } from '../../src/core/message.js';
|
|
12
3
|
import minimalProtocolDefinition from '../vectors/protocol-definitions/minimal.json' with { type: 'json' };
|
|
13
4
|
import sinon from 'sinon';
|
|
14
5
|
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
15
|
-
import {
|
|
6
|
+
import { TestEventLog } from '../test-event-stream.js';
|
|
16
7
|
import { TestStores } from '../test-stores.js';
|
|
17
8
|
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
18
9
|
import { DataStream, Dwn, DwnConstant, DwnErrorCode, DwnInterfaceName, DwnMethodName, Jws, PermissionGrant, PermissionsProtocol, Time } from '../../src/index.js';
|
|
@@ -25,114 +16,116 @@ export function testMessagesReadHandler() {
|
|
|
25
16
|
let dataStore;
|
|
26
17
|
let resumableTaskStore;
|
|
27
18
|
let stateIndex;
|
|
28
|
-
let
|
|
19
|
+
let eventLog;
|
|
29
20
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
30
21
|
// so that different test suites can reuse the same backend store for testing
|
|
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(() =>
|
|
29
|
+
eventLog = TestEventLog.get();
|
|
30
|
+
dwn = await Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventLog, resumableTaskStore });
|
|
31
|
+
});
|
|
32
|
+
beforeEach(async () => {
|
|
42
33
|
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
await messageStore.clear();
|
|
35
|
+
await dataStore.clear();
|
|
36
|
+
await resumableTaskStore.clear();
|
|
37
|
+
await stateIndex.clear();
|
|
47
38
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
48
|
-
})
|
|
49
|
-
afterAll(() =>
|
|
39
|
+
});
|
|
40
|
+
afterAll(async () => {
|
|
50
41
|
sinon.restore();
|
|
51
|
-
|
|
52
|
-
})
|
|
53
|
-
it('returns a 401 if authentication fails', () =>
|
|
54
|
-
const alice =
|
|
42
|
+
await dwn.close();
|
|
43
|
+
});
|
|
44
|
+
it('returns a 401 if authentication fails', async () => {
|
|
45
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
55
46
|
sinon.stub(GeneralJwsVerifier, 'verifySignatures').throws(new Error('Invalid signature'));
|
|
56
47
|
// alice creates a record
|
|
57
|
-
const { message } =
|
|
48
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
58
49
|
author: alice,
|
|
59
|
-
messageCid:
|
|
50
|
+
messageCid: await TestDataGenerator.randomCborSha256Cid()
|
|
60
51
|
});
|
|
61
52
|
// alice is not the author of the message
|
|
62
|
-
const reply =
|
|
53
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
63
54
|
expect(reply.status.code).toBe(401);
|
|
64
55
|
expect(reply.status.detail).toContain('Invalid signature');
|
|
65
|
-
})
|
|
66
|
-
it('returns a 400 if message is invalid', () =>
|
|
67
|
-
const alice =
|
|
68
|
-
const { recordsWrite } =
|
|
69
|
-
const { message } =
|
|
56
|
+
});
|
|
57
|
+
it('returns a 400 if message is invalid', async () => {
|
|
58
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
59
|
+
const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
60
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
70
61
|
author: alice,
|
|
71
|
-
messageCid:
|
|
62
|
+
messageCid: await Message.getCid(recordsWrite.message)
|
|
72
63
|
});
|
|
73
64
|
message['descriptor']['troll'] = 'hehe';
|
|
74
|
-
const reply =
|
|
65
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
75
66
|
expect(reply.status.code).toBe(400);
|
|
76
|
-
})
|
|
77
|
-
it('returns a 400 if message contains an invalid message cid', () =>
|
|
78
|
-
const alice =
|
|
79
|
-
const { recordsWrite } =
|
|
80
|
-
const { message } =
|
|
67
|
+
});
|
|
68
|
+
it('returns a 400 if message contains an invalid message cid', async () => {
|
|
69
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
70
|
+
const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
71
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
81
72
|
author: alice,
|
|
82
|
-
messageCid:
|
|
73
|
+
messageCid: await Message.getCid(recordsWrite.message)
|
|
83
74
|
});
|
|
84
75
|
message.descriptor.messageCid = 'hehetroll';
|
|
85
|
-
const reply =
|
|
76
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
86
77
|
expect(reply.status.code).toBe(400);
|
|
87
78
|
expect(reply.status.detail).toContain('is not a valid CID');
|
|
88
79
|
expect(reply.entry).toBeUndefined();
|
|
89
|
-
})
|
|
90
|
-
it('returns a 404 and the entry as undefined in reply entry when a messageCid is not found', () =>
|
|
91
|
-
const alice =
|
|
92
|
-
const { recordsWrite } =
|
|
93
|
-
const recordsWriteMessageCid =
|
|
94
|
-
const { message } =
|
|
80
|
+
});
|
|
81
|
+
it('returns a 404 and the entry as undefined in reply entry when a messageCid is not found', async () => {
|
|
82
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
83
|
+
const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
84
|
+
const recordsWriteMessageCid = await Message.getCid(recordsWrite.message);
|
|
85
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
95
86
|
author: alice,
|
|
96
87
|
messageCid: recordsWriteMessageCid
|
|
97
88
|
});
|
|
98
89
|
// returns a 404 because the RecordsWrite created above was never stored
|
|
99
|
-
const reply =
|
|
90
|
+
const reply = await dwn.processMessage(alice.did, message);
|
|
100
91
|
expect(reply.status.code).toBe(404);
|
|
101
92
|
expect(reply.entry).toBeUndefined();
|
|
102
|
-
})
|
|
93
|
+
});
|
|
103
94
|
describe('without a grant', () => {
|
|
104
95
|
describe('records interface messages', () => {
|
|
105
|
-
it('returns a 401 if the tenant is not the author', () =>
|
|
106
|
-
const alice =
|
|
107
|
-
const bob =
|
|
96
|
+
it('returns a 401 if the tenant is not the author', async () => {
|
|
97
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
98
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
99
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, bob);
|
|
108
100
|
// bob creates a record that alice will try and get
|
|
109
|
-
const { message: recordsWrite, dataStream } =
|
|
110
|
-
const { status } =
|
|
101
|
+
const { message: recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: bob });
|
|
102
|
+
const { status } = await dwn.processMessage(bob.did, recordsWrite, { dataStream });
|
|
111
103
|
expect(status.code).toBe(202);
|
|
112
104
|
// alice tries to read the message
|
|
113
|
-
const { message } =
|
|
105
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
114
106
|
author: alice,
|
|
115
|
-
messageCid:
|
|
107
|
+
messageCid: await Message.getCid(recordsWrite)
|
|
116
108
|
});
|
|
117
|
-
const reply =
|
|
109
|
+
const reply = await dwn.processMessage(bob.did, message);
|
|
118
110
|
expect(reply.status.code).toBe(401);
|
|
119
111
|
expect(reply.status.detail).toContain(DwnErrorCode.MessagesReadAuthorizationFailed);
|
|
120
|
-
})
|
|
112
|
+
});
|
|
121
113
|
describe('gets record data in the reply entry', () => {
|
|
122
|
-
it('data is less than threshold', () =>
|
|
123
|
-
const alice =
|
|
124
|
-
|
|
114
|
+
it('data is less than threshold', async () => {
|
|
115
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
116
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
117
|
+
const { message: recordsWrite, dataStream, dataBytes } = await TestDataGenerator.generateRecordsWrite({
|
|
125
118
|
author: alice,
|
|
126
119
|
data: TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded),
|
|
127
120
|
});
|
|
128
|
-
const reply =
|
|
121
|
+
const reply = await dwn.processMessage(alice.did, recordsWrite, { dataStream });
|
|
129
122
|
expect(reply.status.code).toBe(202);
|
|
130
|
-
const recordsWriteMessageCid =
|
|
131
|
-
const { message } =
|
|
123
|
+
const recordsWriteMessageCid = await Message.getCid(recordsWrite);
|
|
124
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
132
125
|
author: alice,
|
|
133
126
|
messageCid: recordsWriteMessageCid
|
|
134
127
|
});
|
|
135
|
-
const messagesReadReply =
|
|
128
|
+
const messagesReadReply = await dwn.processMessage(alice.did, message);
|
|
136
129
|
expect(messagesReadReply.status.code).toBe(200);
|
|
137
130
|
expect(messagesReadReply.entry).toBeDefined();
|
|
138
131
|
const messageReply = messagesReadReply.entry;
|
|
@@ -140,23 +133,24 @@ export function testMessagesReadHandler() {
|
|
|
140
133
|
expect(messageReply.messageCid).toBe(recordsWriteMessageCid);
|
|
141
134
|
expect(messageReply.message).toBeDefined();
|
|
142
135
|
expect(messageReply.data).toBeDefined();
|
|
143
|
-
const messageData =
|
|
136
|
+
const messageData = await DataStream.toBytes(messageReply.data);
|
|
144
137
|
expect(messageData).toEqual(dataBytes);
|
|
145
|
-
})
|
|
146
|
-
it('data is greater than threshold', () =>
|
|
147
|
-
const alice =
|
|
148
|
-
|
|
138
|
+
});
|
|
139
|
+
it('data is greater than threshold', async () => {
|
|
140
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
141
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
142
|
+
const { message: recordsWrite, dataStream, dataBytes } = await TestDataGenerator.generateRecordsWrite({
|
|
149
143
|
author: alice,
|
|
150
144
|
data: TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded + 10),
|
|
151
145
|
});
|
|
152
|
-
const reply =
|
|
146
|
+
const reply = await dwn.processMessage(alice.did, recordsWrite, { dataStream });
|
|
153
147
|
expect(reply.status.code).toBe(202);
|
|
154
|
-
const recordsWriteMessageCid =
|
|
155
|
-
const { message } =
|
|
148
|
+
const recordsWriteMessageCid = await Message.getCid(recordsWrite);
|
|
149
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
156
150
|
author: alice,
|
|
157
151
|
messageCid: recordsWriteMessageCid
|
|
158
152
|
});
|
|
159
|
-
const messagesReadReply =
|
|
153
|
+
const messagesReadReply = await dwn.processMessage(alice.did, message);
|
|
160
154
|
expect(messagesReadReply.status.code).toBe(200);
|
|
161
155
|
expect(messagesReadReply.entry).toBeDefined();
|
|
162
156
|
const messageReply = messagesReadReply.entry;
|
|
@@ -164,31 +158,32 @@ export function testMessagesReadHandler() {
|
|
|
164
158
|
expect(messageReply.messageCid).toBe(recordsWriteMessageCid);
|
|
165
159
|
expect(messageReply.message).toBeDefined();
|
|
166
160
|
expect(messageReply.data).toBeDefined();
|
|
167
|
-
const messageData =
|
|
161
|
+
const messageData = await DataStream.toBytes(messageReply.data);
|
|
168
162
|
expect(messageData).toEqual(dataBytes);
|
|
169
|
-
})
|
|
170
|
-
it('data is not available', () =>
|
|
171
|
-
const alice =
|
|
163
|
+
});
|
|
164
|
+
it('data is not available', async () => {
|
|
165
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
166
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
172
167
|
// initial write
|
|
173
|
-
const { message: recordsWriteMessage, recordsWrite, dataStream } =
|
|
168
|
+
const { message: recordsWriteMessage, recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
174
169
|
author: alice,
|
|
175
170
|
data: TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded + 10),
|
|
176
171
|
});
|
|
177
|
-
const initialMessageCid =
|
|
178
|
-
let reply =
|
|
172
|
+
const initialMessageCid = await Message.getCid(recordsWriteMessage);
|
|
173
|
+
let reply = await dwn.processMessage(alice.did, recordsWriteMessage, { dataStream });
|
|
179
174
|
expect(reply.status.code).toBe(202);
|
|
180
|
-
const { recordsWrite: updateMessage, dataStream: updateDataStream } =
|
|
175
|
+
const { recordsWrite: updateMessage, dataStream: updateDataStream } = await TestDataGenerator.generateFromRecordsWrite({
|
|
181
176
|
author: alice,
|
|
182
177
|
existingWrite: recordsWrite,
|
|
183
178
|
data: TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded + 10),
|
|
184
179
|
});
|
|
185
|
-
reply =
|
|
180
|
+
reply = await dwn.processMessage(alice.did, updateMessage.toJSON(), { dataStream: updateDataStream });
|
|
186
181
|
expect(reply.status.code).toBe(202);
|
|
187
|
-
const { message } =
|
|
182
|
+
const { message } = await TestDataGenerator.generateMessagesRead({
|
|
188
183
|
author: alice,
|
|
189
184
|
messageCid: initialMessageCid
|
|
190
185
|
});
|
|
191
|
-
const messagesReadReply =
|
|
186
|
+
const messagesReadReply = await dwn.processMessage(alice.did, message);
|
|
192
187
|
expect(messagesReadReply.status.code).toBe(200);
|
|
193
188
|
expect(messagesReadReply.entry).toBeDefined();
|
|
194
189
|
const messageReply = messagesReadReply.entry;
|
|
@@ -196,96 +191,104 @@ export function testMessagesReadHandler() {
|
|
|
196
191
|
expect(messageReply.messageCid).toBe(initialMessageCid);
|
|
197
192
|
expect(messageReply.message).toBeDefined();
|
|
198
193
|
expect(messageReply.data).toBeUndefined();
|
|
199
|
-
})
|
|
194
|
+
});
|
|
200
195
|
});
|
|
201
196
|
});
|
|
202
197
|
describe('Protocol interface messages', () => {
|
|
203
|
-
it('returns a 401 if the tenant is not the author', () =>
|
|
198
|
+
it('returns a 401 if the tenant is not the author', async () => {
|
|
204
199
|
// scenario: Alice configures both a published and non-published protocol and writes it to her DWN.
|
|
205
200
|
// Bob is unable to read either of the ProtocolConfigure messages because he is not the author.
|
|
206
|
-
const alice =
|
|
207
|
-
const bob =
|
|
201
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
202
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
208
203
|
// unpublished protocol configuration
|
|
209
|
-
const unpublishedProtocolDefinition =
|
|
210
|
-
|
|
204
|
+
const unpublishedProtocolDefinition = {
|
|
205
|
+
...minimalProtocolDefinition,
|
|
206
|
+
protocol: 'http://example.com/protocol/unpublished',
|
|
207
|
+
published: false
|
|
208
|
+
};
|
|
209
|
+
const { message: unpublishedProtocolsConfigure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
211
210
|
author: alice,
|
|
212
211
|
protocolDefinition: unpublishedProtocolDefinition
|
|
213
212
|
});
|
|
214
|
-
const unpublishedProtocolsConfigureReply =
|
|
213
|
+
const unpublishedProtocolsConfigureReply = await dwn.processMessage(alice.did, unpublishedProtocolsConfigure);
|
|
215
214
|
expect(unpublishedProtocolsConfigureReply.status.code).toBe(202);
|
|
216
215
|
// published protocol configuration
|
|
217
|
-
const publishedProtocolDefinition =
|
|
218
|
-
|
|
216
|
+
const publishedProtocolDefinition = {
|
|
217
|
+
...minimalProtocolDefinition,
|
|
218
|
+
protocol: 'http://example.com/protocol/published',
|
|
219
|
+
published: true
|
|
220
|
+
};
|
|
221
|
+
const { message: publishedProtocolsConfigure } = await TestDataGenerator.generateProtocolsConfigure({
|
|
219
222
|
author: alice,
|
|
220
223
|
protocolDefinition: publishedProtocolDefinition
|
|
221
224
|
});
|
|
222
|
-
const publishedProtocolsConfigureReply =
|
|
225
|
+
const publishedProtocolsConfigureReply = await dwn.processMessage(alice.did, publishedProtocolsConfigure);
|
|
223
226
|
expect(publishedProtocolsConfigureReply.status.code).toBe(202);
|
|
224
227
|
// get the message CIDs
|
|
225
|
-
const unpublishedProtocolMessageCid =
|
|
226
|
-
const publishedProtocolMessageCid =
|
|
228
|
+
const unpublishedProtocolMessageCid = await Message.getCid(unpublishedProtocolsConfigure);
|
|
229
|
+
const publishedProtocolMessageCid = await Message.getCid(publishedProtocolsConfigure);
|
|
227
230
|
// bob attempts to read the unpublished protocol configuration
|
|
228
|
-
const { message: getUnpublishedProtocolConfigure } =
|
|
231
|
+
const { message: getUnpublishedProtocolConfigure } = await TestDataGenerator.generateMessagesRead({
|
|
229
232
|
author: bob,
|
|
230
233
|
messageCid: unpublishedProtocolMessageCid,
|
|
231
234
|
});
|
|
232
|
-
const getUnpublishedProtocolConfigureReply =
|
|
235
|
+
const getUnpublishedProtocolConfigureReply = await dwn.processMessage(alice.did, getUnpublishedProtocolConfigure);
|
|
233
236
|
expect(getUnpublishedProtocolConfigureReply.status.code).toBe(401);
|
|
234
237
|
expect(getUnpublishedProtocolConfigureReply.status.detail).toContain(DwnErrorCode.MessagesReadAuthorizationFailed);
|
|
235
238
|
expect(getUnpublishedProtocolConfigureReply.entry).toBeUndefined();
|
|
236
239
|
// bob attempts to read the published protocol configuration
|
|
237
|
-
const { message: getPublishedProtocolConfigure } =
|
|
240
|
+
const { message: getPublishedProtocolConfigure } = await TestDataGenerator.generateMessagesRead({
|
|
238
241
|
author: bob,
|
|
239
242
|
messageCid: publishedProtocolMessageCid,
|
|
240
243
|
});
|
|
241
|
-
const getPublishedProtocolConfigureReply =
|
|
244
|
+
const getPublishedProtocolConfigureReply = await dwn.processMessage(alice.did, getPublishedProtocolConfigure);
|
|
242
245
|
expect(getPublishedProtocolConfigureReply.status.code).toBe(401);
|
|
243
246
|
expect(getPublishedProtocolConfigureReply.status.detail).toContain(DwnErrorCode.MessagesReadAuthorizationFailed);
|
|
244
247
|
expect(getPublishedProtocolConfigureReply.entry).toBeUndefined();
|
|
245
248
|
// control: alice is able to read both the published and unpublished protocol configurations
|
|
246
|
-
const { message: getUnpublishedProtocolConfigureAlice } =
|
|
249
|
+
const { message: getUnpublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesRead({
|
|
247
250
|
author: alice,
|
|
248
251
|
messageCid: unpublishedProtocolMessageCid,
|
|
249
252
|
});
|
|
250
|
-
const getUnpublishedProtocolConfigureAliceReply =
|
|
253
|
+
const getUnpublishedProtocolConfigureAliceReply = await dwn.processMessage(alice.did, getUnpublishedProtocolConfigureAlice);
|
|
251
254
|
expect(getUnpublishedProtocolConfigureAliceReply.status.code).toBe(200);
|
|
252
255
|
expect(getUnpublishedProtocolConfigureAliceReply.entry).toBeDefined();
|
|
253
256
|
expect(getUnpublishedProtocolConfigureAliceReply.entry.messageCid).toBe(unpublishedProtocolMessageCid);
|
|
254
257
|
expect(getUnpublishedProtocolConfigureAliceReply.entry.message).toEqual(unpublishedProtocolsConfigure);
|
|
255
|
-
const { message: getPublishedProtocolConfigureAlice } =
|
|
258
|
+
const { message: getPublishedProtocolConfigureAlice } = await TestDataGenerator.generateMessagesRead({
|
|
256
259
|
author: alice,
|
|
257
260
|
messageCid: publishedProtocolMessageCid,
|
|
258
261
|
});
|
|
259
|
-
const getPublishedProtocolConfigureAliceReply =
|
|
262
|
+
const getPublishedProtocolConfigureAliceReply = await dwn.processMessage(alice.did, getPublishedProtocolConfigureAlice);
|
|
260
263
|
expect(getPublishedProtocolConfigureAliceReply.status.code).toBe(200);
|
|
261
264
|
expect(getPublishedProtocolConfigureAliceReply.entry).toBeDefined();
|
|
262
265
|
expect(getPublishedProtocolConfigureAliceReply.entry.messageCid).toBe(publishedProtocolMessageCid);
|
|
263
266
|
expect(getPublishedProtocolConfigureAliceReply.entry.message).toEqual(publishedProtocolsConfigure);
|
|
264
|
-
})
|
|
267
|
+
});
|
|
265
268
|
});
|
|
266
269
|
});
|
|
267
270
|
describe('with a grant', () => {
|
|
268
|
-
it('returns a 401 if grant has different DWN interface scope', () =>
|
|
271
|
+
it('returns a 401 if grant has different DWN interface scope', async () => {
|
|
269
272
|
// scenario: Alice grants Bob access to RecordsWrite, then Bob tries to invoke the grant with MessagesRead
|
|
270
|
-
const alice =
|
|
271
|
-
const bob =
|
|
273
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
274
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
272
275
|
// alice installs a protocol
|
|
273
|
-
const protocolsConfig =
|
|
276
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
274
277
|
author: alice,
|
|
275
278
|
protocolDefinition: minimalProtocolDefinition
|
|
276
279
|
});
|
|
277
|
-
const protocolsConfigureReply =
|
|
280
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
278
281
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
279
282
|
// Alice writes a record which Bob will later try to read
|
|
280
|
-
const { recordsWrite, dataStream } =
|
|
283
|
+
const { recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
281
284
|
author: alice,
|
|
282
285
|
protocol: minimalProtocolDefinition.protocol,
|
|
283
286
|
protocolPath: 'foo',
|
|
284
287
|
});
|
|
285
|
-
const recordsWriteReply =
|
|
288
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream });
|
|
286
289
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
287
290
|
// Alice gives Bob a permission grant scoped to a RecordsWrite and the protocol
|
|
288
|
-
const permissionGrant =
|
|
291
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
289
292
|
signer: Jws.createSigner(alice),
|
|
290
293
|
grantedTo: bob.did,
|
|
291
294
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -296,32 +299,33 @@ export function testMessagesReadHandler() {
|
|
|
296
299
|
}
|
|
297
300
|
});
|
|
298
301
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
299
|
-
const permissionGrantWriteReply =
|
|
302
|
+
const permissionGrantWriteReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
300
303
|
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
301
304
|
// Bob tries to MessagesRead using the RecordsWrite grant
|
|
302
|
-
const messagesRead =
|
|
305
|
+
const messagesRead = await TestDataGenerator.generateMessagesRead({
|
|
303
306
|
author: bob,
|
|
304
|
-
messageCid:
|
|
307
|
+
messageCid: await Message.getCid(recordsWrite.message),
|
|
305
308
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
306
309
|
});
|
|
307
|
-
const messagesReadReply =
|
|
310
|
+
const messagesReadReply = await dwn.processMessage(alice.did, messagesRead.message);
|
|
308
311
|
expect(messagesReadReply.status.code).toBe(401);
|
|
309
312
|
expect(messagesReadReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationInterfaceMismatch);
|
|
310
|
-
})
|
|
311
|
-
it('allows external parties to read a message using a grant with unrestricted scope', () =>
|
|
313
|
+
});
|
|
314
|
+
it('allows external parties to read a message using a grant with unrestricted scope', async () => {
|
|
312
315
|
// scenario: Alice gives Bob a grant allowing him to read any message in her DWN.
|
|
313
316
|
// Bob invokes that grant to read a message.
|
|
314
|
-
const alice =
|
|
315
|
-
const bob =
|
|
317
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
318
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
319
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
316
320
|
// Alice writes a record to her DWN
|
|
317
|
-
const { message, dataStream } =
|
|
321
|
+
const { message, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
318
322
|
author: alice,
|
|
319
323
|
});
|
|
320
|
-
const writeReply =
|
|
324
|
+
const writeReply = await dwn.processMessage(alice.did, message, { dataStream });
|
|
321
325
|
expect(writeReply.status.code).toBe(202);
|
|
322
|
-
const messageCid =
|
|
326
|
+
const messageCid = await Message.getCid(message);
|
|
323
327
|
// Alice issues a permission grant allowing Bob to read any record in her DWN
|
|
324
|
-
const permissionGrant =
|
|
328
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
325
329
|
signer: Jws.createSigner(alice),
|
|
326
330
|
grantedTo: bob.did,
|
|
327
331
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -331,21 +335,21 @@ export function testMessagesReadHandler() {
|
|
|
331
335
|
}
|
|
332
336
|
});
|
|
333
337
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
334
|
-
const grantReply =
|
|
338
|
+
const grantReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
335
339
|
expect(grantReply.status.code).toBe(202);
|
|
336
340
|
// Bob invokes that grant to read a record from Alice's DWN
|
|
337
|
-
const messagesRead =
|
|
341
|
+
const messagesRead = await TestDataGenerator.generateMessagesRead({
|
|
338
342
|
author: bob,
|
|
339
343
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
340
344
|
messageCid,
|
|
341
345
|
});
|
|
342
|
-
const readReply =
|
|
346
|
+
const readReply = await dwn.processMessage(alice.did, messagesRead.message);
|
|
343
347
|
expect(readReply.status.code).toBe(200);
|
|
344
348
|
expect(readReply.entry).toBeDefined();
|
|
345
349
|
expect(readReply.entry.messageCid).toBe(messageCid);
|
|
346
|
-
})
|
|
350
|
+
});
|
|
347
351
|
describe('protocol scoped messages', () => {
|
|
348
|
-
it('allows reads of protocol messages with a protocol restricted grant scope', () =>
|
|
352
|
+
it('allows reads of protocol messages with a protocol restricted grant scope', async () => {
|
|
349
353
|
// This test will verify that a grant scoped to a specific protocol will allow a user to read messages associated with that protocol.
|
|
350
354
|
// These messages include the ProtocolConfiguration itself, even if not published,
|
|
351
355
|
// any RecordsWrite or RecordsDelete messages associated with the protocol,
|
|
@@ -358,20 +362,20 @@ export function testMessagesReadHandler() {
|
|
|
358
362
|
// Alice revokes the grant to Carol.
|
|
359
363
|
// Bob invokes his grant to read the various messages.
|
|
360
364
|
// As a control, Alice writes a record not associated with the protocol and Bob tries to unsuccessfully read it.
|
|
361
|
-
const alice =
|
|
362
|
-
const bob =
|
|
363
|
-
const carol =
|
|
364
|
-
const protocolDefinition =
|
|
365
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
366
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
367
|
+
const carol = await TestDataGenerator.generateDidKeyPersona();
|
|
368
|
+
const protocolDefinition = { ...minimalProtocolDefinition, published: false };
|
|
365
369
|
// Alice installs the unpublished protocol
|
|
366
|
-
const protocolsConfig =
|
|
370
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
367
371
|
author: alice,
|
|
368
372
|
protocolDefinition
|
|
369
373
|
});
|
|
370
|
-
const protocolsConfigureReply =
|
|
374
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
371
375
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
372
|
-
const protocolConfigureMessageCid =
|
|
376
|
+
const protocolConfigureMessageCid = await Message.getCid(protocolsConfig.message);
|
|
373
377
|
// Carol requests a grant to write records to the protocol
|
|
374
|
-
const permissionRequestCarol =
|
|
378
|
+
const permissionRequestCarol = await PermissionsProtocol.createRequest({
|
|
375
379
|
signer: Jws.createSigner(alice),
|
|
376
380
|
delegated: false,
|
|
377
381
|
scope: {
|
|
@@ -381,10 +385,10 @@ export function testMessagesReadHandler() {
|
|
|
381
385
|
}
|
|
382
386
|
});
|
|
383
387
|
const requestDataStreamCarol = DataStream.fromBytes(permissionRequestCarol.permissionRequestBytes);
|
|
384
|
-
const permissionRequestWriteReplyCarol =
|
|
388
|
+
const permissionRequestWriteReplyCarol = await dwn.processMessage(alice.did, permissionRequestCarol.recordsWrite.message, { dataStream: requestDataStreamCarol });
|
|
385
389
|
expect(permissionRequestWriteReplyCarol.status.code).toBe(202);
|
|
386
390
|
// Alice gives Carol a grant to write records to the protocol
|
|
387
|
-
const permissionGrantCarol =
|
|
391
|
+
const permissionGrantCarol = await PermissionsProtocol.createGrant({
|
|
388
392
|
signer: Jws.createSigner(alice),
|
|
389
393
|
grantedTo: carol.did,
|
|
390
394
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -392,45 +396,45 @@ export function testMessagesReadHandler() {
|
|
|
392
396
|
scope: permissionRequestCarol.permissionRequestData.scope,
|
|
393
397
|
});
|
|
394
398
|
const grantDataStreamCarol = DataStream.fromBytes(permissionGrantCarol.permissionGrantBytes);
|
|
395
|
-
const permissionGrantWriteReplyCarol =
|
|
399
|
+
const permissionGrantWriteReplyCarol = await dwn.processMessage(alice.did, permissionGrantCarol.recordsWrite.message, { dataStream: grantDataStreamCarol });
|
|
396
400
|
expect(permissionGrantWriteReplyCarol.status.code).toBe(202);
|
|
397
|
-
const carolGrantMessageCiD =
|
|
401
|
+
const carolGrantMessageCiD = await Message.getCid(permissionGrantCarol.recordsWrite.message);
|
|
398
402
|
// Alice writes a record associated with the protocol
|
|
399
|
-
const { recordsWrite, dataStream } =
|
|
403
|
+
const { recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
400
404
|
author: alice,
|
|
401
405
|
protocol: protocolDefinition.protocol,
|
|
402
406
|
protocolPath: 'foo',
|
|
403
407
|
});
|
|
404
|
-
const recordsWriteReply =
|
|
408
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream });
|
|
405
409
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
406
|
-
const aliceRecordMessageCid =
|
|
410
|
+
const aliceRecordMessageCid = await Message.getCid(recordsWrite.message);
|
|
407
411
|
// Alice deletes a record associated with the protocol
|
|
408
|
-
const recordsDelete =
|
|
412
|
+
const recordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
409
413
|
author: alice,
|
|
410
414
|
recordId: recordsWrite.message.recordId,
|
|
411
415
|
});
|
|
412
|
-
const recordsDeleteReply =
|
|
416
|
+
const recordsDeleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
413
417
|
expect(recordsDeleteReply.status.code).toBe(202);
|
|
414
418
|
// Carol writes a record associated with the protocol
|
|
415
|
-
const { recordsWrite: recordsWriteCarol, dataStream: dataStreamCarol } =
|
|
419
|
+
const { recordsWrite: recordsWriteCarol, dataStream: dataStreamCarol } = await TestDataGenerator.generateRecordsWrite({
|
|
416
420
|
author: carol,
|
|
417
421
|
protocol: protocolDefinition.protocol,
|
|
418
422
|
protocolPath: 'foo',
|
|
419
423
|
permissionGrantId: permissionGrantCarol.recordsWrite.message.recordId,
|
|
420
424
|
});
|
|
421
|
-
const recordsWriteReplyCarol =
|
|
425
|
+
const recordsWriteReplyCarol = await dwn.processMessage(alice.did, recordsWriteCarol.message, { dataStream: dataStreamCarol });
|
|
422
426
|
expect(recordsWriteReplyCarol.status.code).toBe(202);
|
|
423
|
-
const carolRecordMessageCid =
|
|
427
|
+
const carolRecordMessageCid = await Message.getCid(recordsWriteCarol.message);
|
|
424
428
|
// Alice revokes Carol's grant
|
|
425
|
-
const permissionRevocationCarol =
|
|
429
|
+
const permissionRevocationCarol = await PermissionsProtocol.createRevocation({
|
|
426
430
|
signer: Jws.createSigner(alice),
|
|
427
|
-
grant:
|
|
431
|
+
grant: PermissionGrant.parse(permissionGrantCarol.dataEncodedMessage),
|
|
428
432
|
});
|
|
429
433
|
const permissionRevocationCarolDataStream = DataStream.fromBytes(permissionRevocationCarol.permissionRevocationBytes);
|
|
430
|
-
const permissionRevocationCarolReply =
|
|
434
|
+
const permissionRevocationCarolReply = await dwn.processMessage(alice.did, permissionRevocationCarol.recordsWrite.message, { dataStream: permissionRevocationCarolDataStream });
|
|
431
435
|
expect(permissionRevocationCarolReply.status.code).toBe(202);
|
|
432
436
|
// Alice gives Bob a permission grant with scope MessagesRead
|
|
433
|
-
const permissionGrant =
|
|
437
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
434
438
|
signer: Jws.createSigner(alice),
|
|
435
439
|
grantedTo: bob.did,
|
|
436
440
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -441,14 +445,14 @@ export function testMessagesReadHandler() {
|
|
|
441
445
|
}
|
|
442
446
|
});
|
|
443
447
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
444
|
-
const permissionGrantWriteReply =
|
|
448
|
+
const permissionGrantWriteReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
445
449
|
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
446
450
|
// Bob is unable to read the message without using the permission grant
|
|
447
|
-
const messagesReadWithoutGrant =
|
|
451
|
+
const messagesReadWithoutGrant = await TestDataGenerator.generateMessagesRead({
|
|
448
452
|
author: bob,
|
|
449
453
|
messageCid: aliceRecordMessageCid,
|
|
450
454
|
});
|
|
451
|
-
const messagesReadWithoutGrantReply =
|
|
455
|
+
const messagesReadWithoutGrantReply = await dwn.processMessage(alice.did, messagesReadWithoutGrant.message);
|
|
452
456
|
expect(messagesReadWithoutGrantReply.status.code).toBe(401);
|
|
453
457
|
expect(messagesReadWithoutGrantReply.status.detail).toContain(DwnErrorCode.MessagesReadAuthorizationFailed);
|
|
454
458
|
// Bob is able to read all the associated messages when using the permission grant
|
|
@@ -461,113 +465,114 @@ export function testMessagesReadHandler() {
|
|
|
461
465
|
// - Carol's RecordsWrite
|
|
462
466
|
// - Alice's Revocation of Carol's Grant
|
|
463
467
|
// Protocol configuration
|
|
464
|
-
const messagesReadProtocolConfigure =
|
|
468
|
+
const messagesReadProtocolConfigure = await TestDataGenerator.generateMessagesRead({
|
|
465
469
|
author: bob,
|
|
466
470
|
messageCid: protocolConfigureMessageCid,
|
|
467
471
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
468
472
|
});
|
|
469
|
-
const messagesReadProtocolConfigureReply =
|
|
473
|
+
const messagesReadProtocolConfigureReply = await dwn.processMessage(alice.did, messagesReadProtocolConfigure.message);
|
|
470
474
|
expect(messagesReadProtocolConfigureReply.status.code).toBe(200);
|
|
471
475
|
expect(messagesReadProtocolConfigureReply.entry).toBeDefined();
|
|
472
476
|
expect(messagesReadProtocolConfigureReply.entry.message).toEqual(protocolsConfig.message);
|
|
473
477
|
// alice RecordsWrite
|
|
474
|
-
const messagesReadWithGrant =
|
|
478
|
+
const messagesReadWithGrant = await TestDataGenerator.generateMessagesRead({
|
|
475
479
|
author: bob,
|
|
476
480
|
messageCid: aliceRecordMessageCid,
|
|
477
481
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
478
482
|
});
|
|
479
|
-
const messagesReadWithGrantReply =
|
|
483
|
+
const messagesReadWithGrantReply = await dwn.processMessage(alice.did, messagesReadWithGrant.message);
|
|
480
484
|
expect(messagesReadWithGrantReply.status.code).toBe(200);
|
|
481
485
|
expect(messagesReadWithGrantReply.entry).toBeDefined();
|
|
482
486
|
expect(messagesReadWithGrantReply.entry.message).toEqual(recordsWrite.message);
|
|
483
487
|
// alice RecordsDelete
|
|
484
|
-
const messagesReadDelete =
|
|
488
|
+
const messagesReadDelete = await TestDataGenerator.generateMessagesRead({
|
|
485
489
|
author: bob,
|
|
486
|
-
messageCid:
|
|
490
|
+
messageCid: await Message.getCid(recordsDelete.message),
|
|
487
491
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
488
492
|
});
|
|
489
|
-
const messagesReadDeleteReply =
|
|
493
|
+
const messagesReadDeleteReply = await dwn.processMessage(alice.did, messagesReadDelete.message);
|
|
490
494
|
expect(messagesReadDeleteReply.status.code).toBe(200);
|
|
491
495
|
expect(messagesReadDeleteReply.entry).toBeDefined();
|
|
492
496
|
expect(messagesReadDeleteReply.entry.message).toEqual(recordsDelete.message);
|
|
493
497
|
// carol's Permission Request
|
|
494
|
-
const messagesReadCarolRequest =
|
|
498
|
+
const messagesReadCarolRequest = await TestDataGenerator.generateMessagesRead({
|
|
495
499
|
author: bob,
|
|
496
|
-
messageCid:
|
|
500
|
+
messageCid: await Message.getCid(permissionRequestCarol.recordsWrite.message),
|
|
497
501
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
498
502
|
});
|
|
499
|
-
const messagesReadCarolRequestReply =
|
|
503
|
+
const messagesReadCarolRequestReply = await dwn.processMessage(alice.did, messagesReadCarolRequest.message);
|
|
500
504
|
expect(messagesReadCarolRequestReply.status.code).toBe(200);
|
|
501
505
|
expect(messagesReadCarolRequestReply.entry).toBeDefined();
|
|
502
506
|
expect(messagesReadCarolRequestReply.entry.message).toEqual(permissionRequestCarol.recordsWrite.message);
|
|
503
507
|
// carol's Permission Grant
|
|
504
|
-
const messagesReadCarolGrant =
|
|
508
|
+
const messagesReadCarolGrant = await TestDataGenerator.generateMessagesRead({
|
|
505
509
|
author: bob,
|
|
506
510
|
messageCid: carolGrantMessageCiD,
|
|
507
511
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
508
512
|
});
|
|
509
|
-
const messagesReadCarolGrantReply =
|
|
513
|
+
const messagesReadCarolGrantReply = await dwn.processMessage(alice.did, messagesReadCarolGrant.message);
|
|
510
514
|
expect(messagesReadCarolGrantReply.status.code).toBe(200);
|
|
511
515
|
expect(messagesReadCarolGrantReply.entry).toBeDefined();
|
|
512
516
|
expect(messagesReadCarolGrantReply.entry.message).toEqual(permissionGrantCarol.recordsWrite.message);
|
|
513
517
|
// carol's RecordsWrite
|
|
514
|
-
const messagesReadCarolRecord =
|
|
518
|
+
const messagesReadCarolRecord = await TestDataGenerator.generateMessagesRead({
|
|
515
519
|
author: bob,
|
|
516
520
|
messageCid: carolRecordMessageCid,
|
|
517
521
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
518
522
|
});
|
|
519
|
-
const messagesReadCarolRecordReply =
|
|
523
|
+
const messagesReadCarolRecordReply = await dwn.processMessage(alice.did, messagesReadCarolRecord.message);
|
|
520
524
|
expect(messagesReadCarolRecordReply.status.code).toBe(200);
|
|
521
525
|
expect(messagesReadCarolRecordReply.entry).toBeDefined();
|
|
522
526
|
expect(messagesReadCarolRecordReply.entry.message).toEqual(recordsWriteCarol.message);
|
|
523
527
|
// carol's Grant Revocation
|
|
524
|
-
const messagesReadCarolGrantRevocation =
|
|
528
|
+
const messagesReadCarolGrantRevocation = await TestDataGenerator.generateMessagesRead({
|
|
525
529
|
author: bob,
|
|
526
|
-
messageCid:
|
|
530
|
+
messageCid: await Message.getCid(permissionRevocationCarol.recordsWrite.message),
|
|
527
531
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
528
532
|
});
|
|
529
|
-
const messagesReadCarolGrantRevocationReply =
|
|
533
|
+
const messagesReadCarolGrantRevocationReply = await dwn.processMessage(alice.did, messagesReadCarolGrantRevocation.message);
|
|
530
534
|
expect(messagesReadCarolGrantRevocationReply.status.code).toBe(200);
|
|
531
535
|
expect(messagesReadCarolGrantRevocationReply.entry).toBeDefined();
|
|
532
536
|
expect(messagesReadCarolGrantRevocationReply.entry.message).toEqual(permissionRevocationCarol.recordsWrite.message);
|
|
533
537
|
// CONTROL: Alice writes a record not associated with the protocol
|
|
534
|
-
|
|
538
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
539
|
+
const { recordsWrite: recordsWriteControl, dataStream: dataStreamControl } = await TestDataGenerator.generateRecordsWrite({
|
|
535
540
|
author: alice,
|
|
536
541
|
});
|
|
537
|
-
const recordsWriteControlReply =
|
|
542
|
+
const recordsWriteControlReply = await dwn.processMessage(alice.did, recordsWriteControl.message, { dataStream: dataStreamControl });
|
|
538
543
|
expect(recordsWriteControlReply.status.code).toBe(202);
|
|
539
544
|
// Bob is unable to read the control message
|
|
540
|
-
const messagesReadControl =
|
|
545
|
+
const messagesReadControl = await TestDataGenerator.generateMessagesRead({
|
|
541
546
|
author: bob,
|
|
542
|
-
messageCid:
|
|
547
|
+
messageCid: await Message.getCid(recordsWriteControl.message),
|
|
543
548
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
544
549
|
});
|
|
545
|
-
const messagesReadControlReply =
|
|
550
|
+
const messagesReadControlReply = await dwn.processMessage(alice.did, messagesReadControl.message);
|
|
546
551
|
expect(messagesReadControlReply.status.code).toBe(401);
|
|
547
|
-
})
|
|
548
|
-
it('rejects message read of protocol messages with mismatching protocol grant scopes', () =>
|
|
552
|
+
});
|
|
553
|
+
it('rejects message read of protocol messages with mismatching protocol grant scopes', async () => {
|
|
549
554
|
// scenario: Alice writes a protocol record. Alice gives Bob a grant to read messages from a different protocol
|
|
550
555
|
// Bob invokes that grant to read the protocol message, but fails.
|
|
551
|
-
const alice =
|
|
552
|
-
const bob =
|
|
556
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
557
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
553
558
|
const protocolDefinition = minimalProtocolDefinition;
|
|
554
559
|
// Alice installs the protocol
|
|
555
|
-
const protocolsConfig =
|
|
560
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
556
561
|
author: alice,
|
|
557
562
|
protocolDefinition
|
|
558
563
|
});
|
|
559
|
-
const protocolsConfigureReply =
|
|
564
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
560
565
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
561
566
|
// Alice writes a record which Bob will later try to read
|
|
562
|
-
const { recordsWrite, dataStream } =
|
|
567
|
+
const { recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
563
568
|
author: alice,
|
|
564
569
|
protocol: protocolDefinition.protocol,
|
|
565
570
|
protocolPath: 'foo',
|
|
566
571
|
});
|
|
567
|
-
const recordsWriteReply =
|
|
572
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream });
|
|
568
573
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
569
574
|
// Alice gives Bob a permission grant with scope MessagesRead
|
|
570
|
-
const permissionGrant =
|
|
575
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
571
576
|
signer: Jws.createSigner(alice),
|
|
572
577
|
grantedTo: bob.did,
|
|
573
578
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -578,32 +583,32 @@ export function testMessagesReadHandler() {
|
|
|
578
583
|
}
|
|
579
584
|
});
|
|
580
585
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
581
|
-
const permissionGrantWriteReply =
|
|
586
|
+
const permissionGrantWriteReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
582
587
|
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
583
588
|
// Bob is unable to read the record using the mismatched permission grant
|
|
584
|
-
const messagesReadWithoutGrant =
|
|
589
|
+
const messagesReadWithoutGrant = await TestDataGenerator.generateMessagesRead({
|
|
585
590
|
author: bob,
|
|
586
|
-
messageCid:
|
|
591
|
+
messageCid: await Message.getCid(recordsWrite.message),
|
|
587
592
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
588
593
|
});
|
|
589
|
-
const messagesReadWithoutGrantReply =
|
|
594
|
+
const messagesReadWithoutGrantReply = await dwn.processMessage(alice.did, messagesReadWithoutGrant.message);
|
|
590
595
|
expect(messagesReadWithoutGrantReply.status.code).toBe(401);
|
|
591
596
|
expect(messagesReadWithoutGrantReply.status.detail).toContain(DwnErrorCode.MessagesReadVerifyScopeFailed);
|
|
592
|
-
})
|
|
593
|
-
it('rejects message if the RecordsWrite message is not found for a RecordsDelete being retrieved', () =>
|
|
597
|
+
});
|
|
598
|
+
it('rejects message if the RecordsWrite message is not found for a RecordsDelete being retrieved', async () => {
|
|
594
599
|
// NOTE: This is a corner case that is unlikely to happen in practice, but is tested for completeness
|
|
595
|
-
const alice =
|
|
596
|
-
const bob =
|
|
600
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
601
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
597
602
|
const protocolDefinition = minimalProtocolDefinition;
|
|
598
603
|
// Alice installs the protocol
|
|
599
|
-
const protocolsConfig =
|
|
604
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
600
605
|
author: alice,
|
|
601
606
|
protocolDefinition,
|
|
602
607
|
});
|
|
603
|
-
const protocolsConfigureReply =
|
|
608
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
604
609
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
605
610
|
// Alice gives bob a grant to read messages in the protocol
|
|
606
|
-
const permissionGrant =
|
|
611
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
607
612
|
signer: Jws.createSigner(alice),
|
|
608
613
|
grantedTo: bob.did,
|
|
609
614
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }), // 24 hours
|
|
@@ -614,32 +619,32 @@ export function testMessagesReadHandler() {
|
|
|
614
619
|
}
|
|
615
620
|
});
|
|
616
621
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
617
|
-
const permissionGrantWriteReply =
|
|
622
|
+
const permissionGrantWriteReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
618
623
|
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
619
624
|
// Alice creates the records write and records delete messages
|
|
620
|
-
const { recordsWrite } =
|
|
625
|
+
const { recordsWrite } = await TestDataGenerator.generateRecordsWrite({
|
|
621
626
|
author: alice,
|
|
622
627
|
protocol: protocolDefinition.protocol,
|
|
623
628
|
protocolPath: 'foo',
|
|
624
629
|
});
|
|
625
|
-
const { recordsDelete } =
|
|
630
|
+
const { recordsDelete } = await TestDataGenerator.generateRecordsDelete({
|
|
626
631
|
author: alice,
|
|
627
632
|
recordId: recordsWrite.message.recordId,
|
|
628
633
|
});
|
|
629
634
|
// Alice inserts the RecordsDelete message directly into the message store
|
|
630
|
-
const recordsDeleteCid =
|
|
635
|
+
const recordsDeleteCid = await Message.getCid(recordsDelete.message);
|
|
631
636
|
const indexes = recordsDelete.constructIndexes(recordsWrite.message);
|
|
632
|
-
|
|
637
|
+
await messageStore.put(alice.did, recordsDelete.message, indexes);
|
|
633
638
|
// Bob tries to read the message
|
|
634
|
-
const messagesRead =
|
|
639
|
+
const messagesRead = await TestDataGenerator.generateMessagesRead({
|
|
635
640
|
author: bob,
|
|
636
641
|
messageCid: recordsDeleteCid,
|
|
637
642
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
638
643
|
});
|
|
639
|
-
const messagesReadReply =
|
|
644
|
+
const messagesReadReply = await dwn.processMessage(alice.did, messagesRead.message);
|
|
640
645
|
expect(messagesReadReply.status.code).toBe(401);
|
|
641
646
|
expect(messagesReadReply.status.detail).toContain(DwnErrorCode.RecordsWriteGetNewestWriteRecordNotFound);
|
|
642
|
-
})
|
|
647
|
+
});
|
|
643
648
|
});
|
|
644
649
|
});
|
|
645
650
|
});
|