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