@enbox/dwn-sdk-js 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.mjs +8 -8
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +762 -911
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/abstract-message.js +4 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -1
- package/dist/esm/src/core/auth.js +22 -33
- package/dist/esm/src/core/auth.js.map +1 -1
- package/dist/esm/src/core/constants.js +11 -0
- package/dist/esm/src/core/constants.js.map +1 -0
- package/dist/esm/src/core/core-protocol.js +44 -0
- package/dist/esm/src/core/core-protocol.js.map +1 -0
- package/dist/esm/src/core/dwn-constant.js +7 -7
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +10 -12
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +50 -52
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message.js +85 -116
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +63 -78
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +266 -0
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization-validation.js +321 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +144 -741
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/record-chain.js +64 -0
- package/dist/esm/src/core/record-chain.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +53 -72
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +50 -65
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/tenant-gate.js +2 -13
- package/dist/esm/src/core/tenant-gate.js.map +1 -1
- package/dist/esm/src/dwn.js +108 -101
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +67 -81
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +51 -63
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +75 -89
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +153 -163
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +52 -55
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +97 -85
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +75 -93
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +116 -105
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +130 -132
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +164 -104
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +213 -280
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +5 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +24 -32
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +28 -41
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +26 -40
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +87 -65
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +55 -68
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +50 -66
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +45 -55
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +60 -76
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +51 -67
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +53 -68
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-query.js +102 -0
- package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-write-signing.js +81 -0
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +396 -610
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js +23 -35
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +56 -69
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +43 -14
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +28 -14
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +325 -227
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +42 -64
- package/dist/esm/src/smt/smt-store-level.js.map +1 -1
- package/dist/esm/src/smt/smt-store-memory.js +19 -45
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
- package/dist/esm/src/smt/smt-utils.js +28 -45
- package/dist/esm/src/smt/smt-utils.js.map +1 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js +113 -150
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-level.js +54 -156
- package/dist/esm/src/store/blockstore-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-mock.js +48 -153
- package/dist/esm/src/store/blockstore-mock.js.map +1 -1
- package/dist/esm/src/store/data-store-level.js +137 -100
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level-compound.js +246 -0
- package/dist/esm/src/store/index-level-compound.js.map +1 -0
- package/dist/esm/src/store/index-level.js +307 -715
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +143 -244
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +71 -94
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/resumable-task-store-level.js +62 -101
- package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +131 -146
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/permission-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +10 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/utils/abort.js +8 -19
- package/dist/esm/src/utils/abort.js.map +1 -1
- package/dist/esm/src/utils/array.js +15 -49
- package/dist/esm/src/utils/array.js.map +1 -1
- package/dist/esm/src/utils/cid.js +29 -77
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +37 -65
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +136 -162
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/filter.js +1 -12
- package/dist/esm/src/utils/filter.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +45 -71
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +9 -20
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js +12 -23
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/messages.js +21 -33
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +9 -17
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +62 -70
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +103 -166
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +60 -96
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +54 -71
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +5 -18
- package/dist/esm/src/utils/time.js.map +1 -1
- package/dist/esm/src/utils/url.js +3 -3
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +3 -12
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +50 -59
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +10 -18
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +65 -89
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +337 -347
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +160 -172
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +78 -82
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +449 -184
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +981 -360
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +45 -54
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +99 -108
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +108 -117
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-immutable.spec.js +315 -0
- package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune.spec.js +178 -194
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
- package/dist/esm/tests/features/records-tags.spec.js +456 -463
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +88 -98
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +215 -210
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +309 -171
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +272 -199
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +247 -241
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +159 -172
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +101 -105
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +266 -279
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +984 -996
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +542 -671
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +433 -302
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1216 -1140
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +190 -219
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +36 -45
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +49 -55
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +127 -138
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +372 -36
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +55 -64
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +66 -76
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +451 -354
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +160 -108
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +404 -414
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +13 -22
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +229 -238
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +12 -13
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-stores.js +16 -13
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +8 -15
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +24 -33
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +48 -57
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption.spec.js +229 -82
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +46 -55
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +10 -19
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +3 -12
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +18 -20
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +22 -33
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +14 -27
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +446 -467
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -17
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +3 -12
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +44 -24
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts +49 -40
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/constants.d.ts +11 -0
- package/dist/types/src/core/constants.d.ts.map +1 -0
- package/dist/types/src/core/core-protocol.d.ts +89 -0
- package/dist/types/src/core/core-protocol.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +9 -12
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts +6 -2
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts +42 -0
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts +81 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +24 -106
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/record-chain.d.ts +24 -0
- package/dist/types/src/core/record-chain.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +19 -7
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-read.d.ts +3 -8
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts +3 -8
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts +3 -8
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +3 -6
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +3 -8
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +3 -8
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts +3 -8
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +4 -24
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +8 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write-query.d.ts +33 -0
- package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts +34 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +13 -53
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +1 -1
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +40 -3
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
- package/dist/types/src/store/data-store-level.d.ts +20 -4
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level-compound.d.ts +70 -0
- package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +4 -58
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +4 -4
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +3 -3
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +12 -3
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +24 -3
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +7 -0
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +41 -1
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +16 -6
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/subscriptions.d.ts +151 -13
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +1 -9
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/messages.d.ts +7 -5
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +5 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +1 -11
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
- package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
- package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
- package/dist/types/tests/test-event-stream.d.ts +11 -12
- package/dist/types/tests/test-event-stream.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +2 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +18 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/core/constants.ts +11 -0
- package/src/core/core-protocol.ts +129 -0
- package/src/core/dwn-error.ts +15 -12
- package/src/core/grant-authorization.ts +20 -3
- package/src/core/protocol-authorization-action.ts +377 -0
- package/src/core/protocol-authorization-validation.ts +487 -0
- package/src/core/protocol-authorization.ts +111 -856
- package/src/core/record-chain.ts +99 -0
- package/src/core/records-grant-authorization.ts +6 -8
- package/src/dwn.ts +58 -73
- package/src/event-stream/event-emitter-event-log.ts +283 -0
- package/src/handlers/messages-read.ts +8 -9
- package/src/handlers/messages-subscribe.ts +24 -28
- package/src/handlers/messages-sync.ts +10 -16
- package/src/handlers/protocols-configure.ts +47 -32
- package/src/handlers/protocols-query.ts +6 -9
- package/src/handlers/records-count.ts +11 -10
- package/src/handlers/records-delete.ts +12 -21
- package/src/handlers/records-query.ts +12 -12
- package/src/handlers/records-read.ts +34 -22
- package/src/handlers/records-subscribe.ts +47 -26
- package/src/handlers/records-write.ts +47 -104
- package/src/index.ts +9 -5
- package/src/interfaces/messages-subscribe.ts +7 -1
- package/src/interfaces/protocols-configure.ts +73 -8
- package/src/interfaces/records-count.ts +1 -1
- package/src/interfaces/records-delete.ts +1 -1
- package/src/interfaces/records-query.ts +1 -1
- package/src/interfaces/records-read.ts +1 -1
- package/src/interfaces/records-subscribe.ts +8 -1
- package/src/interfaces/records-write-query.ts +139 -0
- package/src/interfaces/records-write-signing.ts +123 -0
- package/src/interfaces/records-write.ts +66 -261
- package/src/protocols/permission-grant.ts +1 -1
- package/src/protocols/permission-request.ts +1 -1
- package/src/protocols/permissions.ts +148 -6
- package/src/state-index/state-index-level.ts +5 -7
- package/src/store/data-store-level.ts +124 -34
- package/src/store/index-level-compound.ts +324 -0
- package/src/store/index-level.ts +68 -341
- package/src/store/storage-controller.ts +11 -11
- package/src/types/message-types.ts +3 -3
- package/src/types/messages-types.ts +12 -3
- package/src/types/method-handler.ts +26 -4
- package/src/types/mitt.d.ts +28 -0
- package/src/types/permission-types.ts +7 -0
- package/src/types/protocols-types.ts +46 -0
- package/src/types/records-types.ts +16 -6
- package/src/types/subscriptions.ts +178 -14
- package/src/utils/hd-key.ts +0 -9
- package/src/utils/messages.ts +17 -37
- package/src/utils/protocols.ts +8 -0
- package/src/utils/records.ts +8 -59
- package/dist/esm/src/event-stream/event-emitter-stream.js +0 -60
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -77
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-stream/event-stream.spec.js +0 -123
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
- package/src/event-stream/event-emitter-stream.ts +0 -69
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { ResumableTaskManager } from '../../src/core/resumable-task-manager.js';
|
|
11
2
|
import sinon from 'sinon';
|
|
12
3
|
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
@@ -21,7 +12,7 @@ import { Message } from '../../src/core/message.js';
|
|
|
21
12
|
import { normalizeSchemaUrl } from '../../src/utils/url.js';
|
|
22
13
|
import { RecordsDeleteHandler } from '../../src/handlers/records-delete.js';
|
|
23
14
|
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
24
|
-
import {
|
|
15
|
+
import { TestEventLog } from '../test-event-stream.js';
|
|
25
16
|
import { TestStores } from '../test-stores.js';
|
|
26
17
|
import { TestStubGenerator } from '../utils/test-stub-generator.js';
|
|
27
18
|
import { Time } from '../../src/utils/time.js';
|
|
@@ -35,7 +26,7 @@ export function testRecordsDeleteHandler() {
|
|
|
35
26
|
let dataStore;
|
|
36
27
|
let resumableTaskStore;
|
|
37
28
|
let stateIndex;
|
|
38
|
-
let
|
|
29
|
+
let eventLog;
|
|
39
30
|
let dwn;
|
|
40
31
|
beforeEach(() => {
|
|
41
32
|
sinon.restore();
|
|
@@ -46,519 +37,521 @@ export function testRecordsDeleteHandler() {
|
|
|
46
37
|
describe('functional tests', () => {
|
|
47
38
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
48
39
|
// so that different test suites can reuse the same backend store for testing
|
|
49
|
-
beforeAll(() =>
|
|
40
|
+
beforeAll(async () => {
|
|
50
41
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
51
42
|
const stores = TestStores.get();
|
|
52
43
|
messageStore = stores.messageStore;
|
|
53
44
|
dataStore = stores.dataStore;
|
|
54
45
|
resumableTaskStore = stores.resumableTaskStore;
|
|
55
46
|
stateIndex = stores.stateIndex;
|
|
56
|
-
|
|
57
|
-
dwn =
|
|
58
|
-
})
|
|
59
|
-
beforeEach(() =>
|
|
47
|
+
eventLog = TestEventLog.get();
|
|
48
|
+
dwn = await Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventLog, resumableTaskStore });
|
|
49
|
+
});
|
|
50
|
+
beforeEach(async () => {
|
|
60
51
|
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
})
|
|
66
|
-
afterAll(() =>
|
|
67
|
-
|
|
68
|
-
})
|
|
69
|
-
it('should handle RecordsDelete successfully and return 404 if deleting a deleted record', () =>
|
|
70
|
-
|
|
71
|
-
|
|
52
|
+
await messageStore.clear();
|
|
53
|
+
await dataStore.clear();
|
|
54
|
+
await resumableTaskStore.clear();
|
|
55
|
+
await stateIndex.clear();
|
|
56
|
+
});
|
|
57
|
+
afterAll(async () => {
|
|
58
|
+
await dwn.close();
|
|
59
|
+
});
|
|
60
|
+
it('should handle RecordsDelete successfully and return 404 if deleting a deleted record', async () => {
|
|
61
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
62
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
72
63
|
// insert data
|
|
73
|
-
const { message, dataStream } =
|
|
74
|
-
const writeReply =
|
|
64
|
+
const { message, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
65
|
+
const writeReply = await dwn.processMessage(alice.did, message, { dataStream });
|
|
75
66
|
expect(writeReply.status.code).toBe(202);
|
|
76
67
|
// ensure data is inserted
|
|
77
|
-
const queryData =
|
|
68
|
+
const queryData = await TestDataGenerator.generateRecordsQuery({
|
|
78
69
|
author: alice,
|
|
79
70
|
filter: { recordId: message.recordId }
|
|
80
71
|
});
|
|
81
|
-
const reply =
|
|
72
|
+
const reply = await dwn.processMessage(alice.did, queryData.message);
|
|
82
73
|
expect(reply.status.code).toBe(200);
|
|
83
|
-
expect(
|
|
74
|
+
expect(reply.entries?.length).toBe(1);
|
|
84
75
|
// testing delete
|
|
85
|
-
const recordsDelete =
|
|
76
|
+
const recordsDelete = await RecordsDelete.create({
|
|
86
77
|
recordId: message.recordId,
|
|
87
78
|
signer: Jws.createSigner(alice)
|
|
88
79
|
});
|
|
89
|
-
const deleteReply =
|
|
80
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
90
81
|
expect(deleteReply.status.code).toBe(202);
|
|
91
82
|
// ensure a query will no longer find the deleted record
|
|
92
|
-
const reply2 =
|
|
83
|
+
const reply2 = await dwn.processMessage(alice.did, queryData.message);
|
|
93
84
|
expect(reply2.status.code).toBe(200);
|
|
94
|
-
expect(
|
|
85
|
+
expect(reply2.entries?.length).toBe(0);
|
|
95
86
|
// testing deleting a deleted record
|
|
96
|
-
const recordsDelete2 =
|
|
87
|
+
const recordsDelete2 = await RecordsDelete.create({
|
|
97
88
|
recordId: message.recordId,
|
|
98
89
|
signer: Jws.createSigner(alice)
|
|
99
90
|
});
|
|
100
|
-
const recordsDelete2Reply =
|
|
91
|
+
const recordsDelete2Reply = await dwn.processMessage(alice.did, recordsDelete2.message);
|
|
101
92
|
expect(recordsDelete2Reply.status.code).toBe(404);
|
|
102
|
-
})
|
|
103
|
-
it('should not affect other records or tenants with the same data', () =>
|
|
104
|
-
const alice =
|
|
105
|
-
const bob =
|
|
93
|
+
});
|
|
94
|
+
it('should not affect other records or tenants with the same data', async () => {
|
|
95
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
96
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
97
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
98
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, bob);
|
|
106
99
|
const data = Encoder.stringToBytes('test');
|
|
107
100
|
// alice writes a records with data
|
|
108
|
-
const aliceWriteData =
|
|
109
|
-
const aliceWriteReply =
|
|
101
|
+
const aliceWriteData = await TestDataGenerator.generateRecordsWrite({ author: alice, data });
|
|
102
|
+
const aliceWriteReply = await dwn.processMessage(alice.did, aliceWriteData.message, { dataStream: aliceWriteData.dataStream });
|
|
110
103
|
expect(aliceWriteReply.status.code).toBe(202);
|
|
111
104
|
// alice writes another record with the same data
|
|
112
|
-
const aliceWrite2Data =
|
|
113
|
-
const aliceWrite2Reply =
|
|
105
|
+
const aliceWrite2Data = await TestDataGenerator.generateRecordsWrite({ author: alice, data });
|
|
106
|
+
const aliceWrite2Reply = await dwn.processMessage(alice.did, aliceWrite2Data.message, { dataStream: aliceWrite2Data.dataStream });
|
|
114
107
|
expect(aliceWrite2Reply.status.code).toBe(202);
|
|
115
108
|
// bob writes a records with same data
|
|
116
|
-
const bobWriteData =
|
|
117
|
-
const bobWriteReply =
|
|
109
|
+
const bobWriteData = await TestDataGenerator.generateRecordsWrite({ author: bob, data });
|
|
110
|
+
const bobWriteReply = await dwn.processMessage(bob.did, bobWriteData.message, { dataStream: bobWriteData.dataStream });
|
|
118
111
|
expect(bobWriteReply.status.code).toBe(202);
|
|
119
112
|
// bob writes another record with the same data
|
|
120
|
-
const bobWrite2Data =
|
|
121
|
-
const bobWrite2Reply =
|
|
113
|
+
const bobWrite2Data = await TestDataGenerator.generateRecordsWrite({ author: bob, data });
|
|
114
|
+
const bobWrite2Reply = await dwn.processMessage(bob.did, bobWrite2Data.message, { dataStream: bobWrite2Data.dataStream });
|
|
122
115
|
expect(bobWrite2Reply.status.code).toBe(202);
|
|
123
116
|
// alice deletes one of the two records
|
|
124
|
-
const aliceDeleteWriteData =
|
|
117
|
+
const aliceDeleteWriteData = await TestDataGenerator.generateRecordsDelete({
|
|
125
118
|
author: alice,
|
|
126
119
|
recordId: aliceWriteData.message.recordId
|
|
127
120
|
});
|
|
128
|
-
const aliceDeleteWriteReply =
|
|
121
|
+
const aliceDeleteWriteReply = await dwn.processMessage(alice.did, aliceDeleteWriteData.message);
|
|
129
122
|
expect(aliceDeleteWriteReply.status.code).toBe(202);
|
|
130
123
|
// verify the other record with the same data is unaffected
|
|
131
|
-
const aliceRead1 =
|
|
124
|
+
const aliceRead1 = await RecordsRead.create({
|
|
132
125
|
filter: {
|
|
133
126
|
recordId: aliceWrite2Data.message.recordId,
|
|
134
127
|
},
|
|
135
128
|
signer: Jws.createSigner(alice)
|
|
136
129
|
});
|
|
137
|
-
const aliceRead1Reply =
|
|
130
|
+
const aliceRead1Reply = await dwn.processMessage(alice.did, aliceRead1.message);
|
|
138
131
|
expect(aliceRead1Reply.status.code).toBe(200);
|
|
139
|
-
const aliceDataFetched =
|
|
132
|
+
const aliceDataFetched = await DataStream.toBytes(aliceRead1Reply.entry.data);
|
|
140
133
|
expect(ArrayUtility.byteArraysEqual(aliceDataFetched, data)).toBe(true);
|
|
141
134
|
// alice deletes the other record
|
|
142
|
-
const aliceDeleteWrite2Data =
|
|
135
|
+
const aliceDeleteWrite2Data = await TestDataGenerator.generateRecordsDelete({
|
|
143
136
|
author: alice,
|
|
144
137
|
recordId: aliceWrite2Data.message.recordId
|
|
145
138
|
});
|
|
146
|
-
const aliceDeleteWrite2Reply =
|
|
139
|
+
const aliceDeleteWrite2Reply = await dwn.processMessage(alice.did, aliceDeleteWrite2Data.message);
|
|
147
140
|
expect(aliceDeleteWrite2Reply.status.code).toBe(202);
|
|
148
141
|
// verify that alice can no longer fetch the 2nd record
|
|
149
|
-
const aliceRead2Reply =
|
|
142
|
+
const aliceRead2Reply = await dwn.processMessage(alice.did, aliceRead1.message);
|
|
150
143
|
expect(aliceRead2Reply.status.code).toBe(404);
|
|
151
144
|
// verify that bob can still fetch record with the same data
|
|
152
|
-
const bobRead1 =
|
|
145
|
+
const bobRead1 = await RecordsRead.create({
|
|
153
146
|
filter: {
|
|
154
147
|
recordId: bobWriteData.message.recordId,
|
|
155
148
|
},
|
|
156
149
|
signer: Jws.createSigner(bob)
|
|
157
150
|
});
|
|
158
|
-
const bobRead1Reply =
|
|
151
|
+
const bobRead1Reply = await dwn.processMessage(bob.did, bobRead1.message);
|
|
159
152
|
expect(bobRead1Reply.status.code).toBe(200);
|
|
160
|
-
const bobDataFetched =
|
|
153
|
+
const bobDataFetched = await DataStream.toBytes(bobRead1Reply.entry.data);
|
|
161
154
|
expect(ArrayUtility.byteArraysEqual(bobDataFetched, data)).toBe(true);
|
|
162
|
-
})
|
|
163
|
-
it('should return 404 if deleting a non-existent record', () =>
|
|
164
|
-
const alice =
|
|
155
|
+
});
|
|
156
|
+
it('should return 404 if deleting a non-existent record', async () => {
|
|
157
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
165
158
|
// testing deleting a non-existent record
|
|
166
|
-
const recordsDelete =
|
|
159
|
+
const recordsDelete = await RecordsDelete.create({
|
|
167
160
|
recordId: 'nonExistentRecordId',
|
|
168
161
|
signer: Jws.createSigner(alice)
|
|
169
162
|
});
|
|
170
|
-
const deleteReply =
|
|
163
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
171
164
|
expect(deleteReply.status.code).toBe(404);
|
|
172
|
-
})
|
|
173
|
-
it('should be disallowed if there is a newer RecordsWrite already in the DWN ', () =>
|
|
174
|
-
|
|
175
|
-
|
|
165
|
+
});
|
|
166
|
+
it('should be disallowed if there is a newer RecordsWrite already in the DWN ', async () => {
|
|
167
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
168
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
176
169
|
// initial write
|
|
177
|
-
const initialWriteData =
|
|
178
|
-
const initialWriteReply =
|
|
170
|
+
const initialWriteData = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
171
|
+
const initialWriteReply = await dwn.processMessage(alice.did, initialWriteData.message, { dataStream: initialWriteData.dataStream });
|
|
179
172
|
expect(initialWriteReply.status.code).toBe(202);
|
|
180
173
|
// generate subsequent write and delete with the delete having an earlier timestamp
|
|
181
174
|
// NOTE: creating RecordsDelete first ensures it has an earlier `messageTimestamp` time
|
|
182
|
-
const recordsDelete =
|
|
175
|
+
const recordsDelete = await RecordsDelete.create({
|
|
183
176
|
recordId: initialWriteData.message.recordId,
|
|
184
177
|
signer: Jws.createSigner(alice)
|
|
185
178
|
});
|
|
186
|
-
|
|
187
|
-
const subsequentWriteData =
|
|
179
|
+
await Time.minimalSleep();
|
|
180
|
+
const subsequentWriteData = await TestDataGenerator.generateFromRecordsWrite({
|
|
188
181
|
existingWrite: initialWriteData.recordsWrite,
|
|
189
182
|
author: alice
|
|
190
183
|
});
|
|
191
184
|
// subsequent write
|
|
192
|
-
const subsequentWriteReply =
|
|
185
|
+
const subsequentWriteReply = await dwn.processMessage(alice.did, subsequentWriteData.message, { dataStream: subsequentWriteData.dataStream });
|
|
193
186
|
expect(subsequentWriteReply.status.code).toBe(202);
|
|
194
187
|
// test that a delete with an earlier `messageTimestamp` results in a 409
|
|
195
|
-
const deleteReply =
|
|
188
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
196
189
|
expect(deleteReply.status.code).toBe(409);
|
|
197
190
|
// ensure data still exists
|
|
198
|
-
const queryData =
|
|
191
|
+
const queryData = await TestDataGenerator.generateRecordsQuery({
|
|
199
192
|
author: alice,
|
|
200
193
|
filter: { recordId: initialWriteData.message.recordId }
|
|
201
194
|
});
|
|
202
195
|
const expectedEncodedData = Encoder.bytesToBase64Url(subsequentWriteData.dataBytes);
|
|
203
|
-
const reply =
|
|
196
|
+
const reply = await dwn.processMessage(alice.did, queryData.message);
|
|
204
197
|
expect(reply.status.code).toBe(200);
|
|
205
|
-
expect(
|
|
198
|
+
expect(reply.entries?.length).toBe(1);
|
|
206
199
|
expect(reply.entries[0].encodedData).toBe(expectedEncodedData);
|
|
207
|
-
})
|
|
208
|
-
it('should be able to delete then rewrite the same data', () =>
|
|
209
|
-
|
|
210
|
-
|
|
200
|
+
});
|
|
201
|
+
it('should be able to delete then rewrite the same data', async () => {
|
|
202
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
203
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
211
204
|
const data = Encoder.stringToBytes('test');
|
|
212
205
|
const encodedData = Encoder.bytesToBase64Url(data);
|
|
213
206
|
// alice writes a record
|
|
214
|
-
const aliceWriteData =
|
|
207
|
+
const aliceWriteData = await TestDataGenerator.generateRecordsWrite({
|
|
215
208
|
author: alice,
|
|
216
209
|
data
|
|
217
210
|
});
|
|
218
|
-
const aliceWriteReply =
|
|
211
|
+
const aliceWriteReply = await dwn.processMessage(alice.did, aliceWriteData.message, { dataStream: aliceWriteData.dataStream });
|
|
219
212
|
expect(aliceWriteReply.status.code).toBe(202);
|
|
220
|
-
const aliceQueryWriteAfterAliceWriteData =
|
|
213
|
+
const aliceQueryWriteAfterAliceWriteData = await TestDataGenerator.generateRecordsQuery({
|
|
221
214
|
author: alice,
|
|
222
215
|
filter: { recordId: aliceWriteData.message.recordId }
|
|
223
216
|
});
|
|
224
|
-
const aliceQueryWriteAfterAliceWriteReply =
|
|
217
|
+
const aliceQueryWriteAfterAliceWriteReply = await dwn.processMessage(alice.did, aliceQueryWriteAfterAliceWriteData.message);
|
|
225
218
|
expect(aliceQueryWriteAfterAliceWriteReply.status.code).toBe(200);
|
|
226
|
-
expect(
|
|
219
|
+
expect(aliceQueryWriteAfterAliceWriteReply.entries?.length).toBe(1);
|
|
227
220
|
expect(aliceQueryWriteAfterAliceWriteReply.entries[0].encodedData).toBe(encodedData);
|
|
228
221
|
// alice deleting the record
|
|
229
|
-
const aliceDeleteWriteData =
|
|
222
|
+
const aliceDeleteWriteData = await TestDataGenerator.generateRecordsDelete({
|
|
230
223
|
author: alice,
|
|
231
224
|
recordId: aliceWriteData.message.recordId
|
|
232
225
|
});
|
|
233
|
-
const aliceDeleteWriteReply =
|
|
226
|
+
const aliceDeleteWriteReply = await dwn.processMessage(alice.did, aliceDeleteWriteData.message);
|
|
234
227
|
expect(aliceDeleteWriteReply.status.code).toBe(202);
|
|
235
|
-
const aliceQueryWriteAfterAliceDeleteData =
|
|
228
|
+
const aliceQueryWriteAfterAliceDeleteData = await TestDataGenerator.generateRecordsQuery({
|
|
236
229
|
author: alice,
|
|
237
230
|
filter: { recordId: aliceWriteData.message.recordId }
|
|
238
231
|
});
|
|
239
|
-
const aliceQueryWriteAfterAliceDeleteReply =
|
|
232
|
+
const aliceQueryWriteAfterAliceDeleteReply = await dwn.processMessage(alice.did, aliceQueryWriteAfterAliceDeleteData.message);
|
|
240
233
|
expect(aliceQueryWriteAfterAliceDeleteReply.status.code).toBe(200);
|
|
241
|
-
expect(
|
|
234
|
+
expect(aliceQueryWriteAfterAliceDeleteReply.entries?.length).toBe(0);
|
|
242
235
|
// alice writes a new record with the same data
|
|
243
|
-
const aliceRewriteData =
|
|
236
|
+
const aliceRewriteData = await TestDataGenerator.generateRecordsWrite({
|
|
244
237
|
author: alice,
|
|
245
238
|
data
|
|
246
239
|
});
|
|
247
|
-
const aliceRewriteReply =
|
|
240
|
+
const aliceRewriteReply = await dwn.processMessage(alice.did, aliceRewriteData.message, { dataStream: aliceRewriteData.dataStream });
|
|
248
241
|
expect(aliceRewriteReply.status.code).toBe(202);
|
|
249
|
-
const aliceQueryWriteAfterAliceRewriteData =
|
|
242
|
+
const aliceQueryWriteAfterAliceRewriteData = await TestDataGenerator.generateRecordsQuery({
|
|
250
243
|
author: alice,
|
|
251
244
|
filter: { recordId: aliceRewriteData.message.recordId }
|
|
252
245
|
});
|
|
253
|
-
const aliceQueryWriteAfterAliceRewriteReply =
|
|
246
|
+
const aliceQueryWriteAfterAliceRewriteReply = await dwn.processMessage(alice.did, aliceQueryWriteAfterAliceRewriteData.message);
|
|
254
247
|
expect(aliceQueryWriteAfterAliceRewriteReply.status.code).toBe(200);
|
|
255
|
-
expect(
|
|
248
|
+
expect(aliceQueryWriteAfterAliceRewriteReply.entries?.length).toBe(1);
|
|
256
249
|
expect(aliceQueryWriteAfterAliceRewriteReply.entries[0].encodedData).toBe(encodedData);
|
|
257
|
-
})
|
|
250
|
+
});
|
|
258
251
|
describe('protocol based deletes', () => {
|
|
259
|
-
it('should allow delete with allow-anyone rule', () =>
|
|
252
|
+
it('should allow delete with allow-anyone rule', async () => {
|
|
260
253
|
// scenario: Alice creates a record in her DWN. Bob (anyone) is able to delete the record.
|
|
261
254
|
const protocolDefinition = anyoneCollaborateProtocolDefinition;
|
|
262
|
-
const alice =
|
|
263
|
-
const bob =
|
|
264
|
-
const protocolsConfig =
|
|
255
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
256
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
257
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
265
258
|
author: alice,
|
|
266
259
|
protocolDefinition
|
|
267
260
|
});
|
|
268
261
|
// setting up a stub DID resolver
|
|
269
262
|
TestStubGenerator.stubDidResolver(didResolver, [alice, bob]);
|
|
270
|
-
const protocolsConfigureReply =
|
|
263
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
271
264
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
272
265
|
// Alice writes a record
|
|
273
|
-
const recordsWrite =
|
|
266
|
+
const recordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
274
267
|
author: alice,
|
|
275
268
|
protocol: protocolDefinition.protocol,
|
|
276
269
|
protocolPath: 'doc',
|
|
277
270
|
});
|
|
278
|
-
const recordsWriteReply =
|
|
271
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream: recordsWrite.dataStream });
|
|
279
272
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
280
273
|
// Bob (anyone) is able to delete the record
|
|
281
|
-
const recordsDelete =
|
|
274
|
+
const recordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
282
275
|
author: bob,
|
|
283
276
|
recordId: recordsWrite.message.recordId,
|
|
284
277
|
});
|
|
285
|
-
const recordsDeleteReply =
|
|
278
|
+
const recordsDeleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
286
279
|
expect(recordsDeleteReply.status.code).toBe(202);
|
|
287
|
-
})
|
|
280
|
+
});
|
|
288
281
|
describe('recipient rules', () => {
|
|
289
|
-
it('should allow delete with ancestor recipient rule', () =>
|
|
282
|
+
it('should allow delete with ancestor recipient rule', async () => {
|
|
290
283
|
// scenario: Alice creates a 'post' with Bob as recipient and a 'post/tag'. Bob is able to delete
|
|
291
284
|
// the 'chat/tag' because he was recipient of the 'chat'. Carol is not able to delete.
|
|
292
285
|
const protocolDefinition = recipientCanProtocolDefinition;
|
|
293
|
-
const alice =
|
|
294
|
-
const bob =
|
|
295
|
-
const carol =
|
|
296
|
-
const protocolsConfig =
|
|
286
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
287
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
288
|
+
const carol = await TestDataGenerator.generatePersona();
|
|
289
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
297
290
|
author: alice,
|
|
298
291
|
protocolDefinition
|
|
299
292
|
});
|
|
300
293
|
// setting up a stub DID resolver
|
|
301
294
|
TestStubGenerator.stubDidResolver(didResolver, [alice, bob, carol]);
|
|
302
|
-
const protocolsConfigureReply =
|
|
295
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
303
296
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
304
297
|
// Alice writes a chat
|
|
305
|
-
const chatRecordsWrite =
|
|
298
|
+
const chatRecordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
306
299
|
author: alice,
|
|
307
300
|
recipient: bob.did,
|
|
308
301
|
protocol: protocolDefinition.protocol,
|
|
309
302
|
protocolPath: 'post',
|
|
310
303
|
});
|
|
311
|
-
const chatRecordsWriteReply =
|
|
304
|
+
const chatRecordsWriteReply = await dwn.processMessage(alice.did, chatRecordsWrite.message, { dataStream: chatRecordsWrite.dataStream });
|
|
312
305
|
expect(chatRecordsWriteReply.status.code).toBe(202);
|
|
313
306
|
// Alice writes a 'chat/tag'
|
|
314
|
-
const tagRecordsWrite =
|
|
307
|
+
const tagRecordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
315
308
|
author: alice,
|
|
316
309
|
protocol: protocolDefinition.protocol,
|
|
317
310
|
protocolPath: 'post/tag',
|
|
318
311
|
parentContextId: chatRecordsWrite.message.contextId,
|
|
319
312
|
});
|
|
320
|
-
const tagRecordsWriteReply =
|
|
313
|
+
const tagRecordsWriteReply = await dwn.processMessage(alice.did, tagRecordsWrite.message, { dataStream: tagRecordsWrite.dataStream });
|
|
321
314
|
expect(tagRecordsWriteReply.status.code).toBe(202);
|
|
322
315
|
// Carol is unable to delete the 'chat/tag'
|
|
323
|
-
const recordsDeleteCarol =
|
|
316
|
+
const recordsDeleteCarol = await TestDataGenerator.generateRecordsDelete({
|
|
324
317
|
author: carol,
|
|
325
318
|
recordId: tagRecordsWrite.message.recordId,
|
|
326
319
|
});
|
|
327
|
-
const recordsDeleteCarolReply =
|
|
320
|
+
const recordsDeleteCarolReply = await dwn.processMessage(alice.did, recordsDeleteCarol.message);
|
|
328
321
|
expect(recordsDeleteCarolReply.status.code).toBe(401);
|
|
329
322
|
expect(recordsDeleteCarolReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationActionNotAllowed);
|
|
330
323
|
// Bob is able to delete the 'chat/tag'
|
|
331
|
-
const recordsDelete =
|
|
324
|
+
const recordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
332
325
|
author: bob,
|
|
333
326
|
recordId: tagRecordsWrite.message.recordId,
|
|
334
327
|
});
|
|
335
|
-
const recordsDeleteReply =
|
|
328
|
+
const recordsDeleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
336
329
|
expect(recordsDeleteReply.status.code).toBe(202);
|
|
337
|
-
})
|
|
338
|
-
it('should allow delete with direct recipient rule', () =>
|
|
330
|
+
});
|
|
331
|
+
it('should allow delete with direct recipient rule', async () => {
|
|
339
332
|
// scenario: Alice creates a 'post' with Bob as recipient. Bob is able to delete
|
|
340
333
|
// the 'post' because he was recipient of it. Carol is not able to delete.
|
|
341
334
|
const protocolDefinition = recipientCanProtocolDefinition;
|
|
342
|
-
const alice =
|
|
343
|
-
const bob =
|
|
344
|
-
const carol =
|
|
345
|
-
const protocolsConfig =
|
|
335
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
336
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
337
|
+
const carol = await TestDataGenerator.generatePersona();
|
|
338
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
346
339
|
author: alice,
|
|
347
340
|
protocolDefinition
|
|
348
341
|
});
|
|
349
342
|
// setting up a stub DID resolver
|
|
350
343
|
TestStubGenerator.stubDidResolver(didResolver, [alice, bob, carol]);
|
|
351
|
-
const protocolsConfigureReply =
|
|
344
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
352
345
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
353
346
|
// Alice creates a 'post' with Bob as recipient
|
|
354
|
-
const recordsWrite =
|
|
347
|
+
const recordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
355
348
|
author: alice,
|
|
356
349
|
recipient: bob.did,
|
|
357
350
|
protocol: protocolDefinition.protocol,
|
|
358
351
|
protocolPath: 'post',
|
|
359
352
|
});
|
|
360
|
-
const recordsWriteReply =
|
|
353
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream: recordsWrite.dataStream });
|
|
361
354
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
362
355
|
// Carol is unable to delete the 'post'
|
|
363
|
-
const carolRecordsDelete =
|
|
356
|
+
const carolRecordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
364
357
|
author: carol,
|
|
365
358
|
recordId: recordsWrite.message.recordId,
|
|
366
359
|
});
|
|
367
|
-
const carolRecordsDeleteReply =
|
|
360
|
+
const carolRecordsDeleteReply = await dwn.processMessage(alice.did, carolRecordsDelete.message);
|
|
368
361
|
expect(carolRecordsDeleteReply.status.code).toBe(401);
|
|
369
362
|
expect(carolRecordsDeleteReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationActionNotAllowed);
|
|
370
363
|
// Bob is able to delete the post
|
|
371
|
-
const bobRecordsDelete =
|
|
364
|
+
const bobRecordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
372
365
|
author: bob,
|
|
373
366
|
recordId: recordsWrite.message.recordId,
|
|
374
367
|
});
|
|
375
|
-
const bobRecordsDeleteReply =
|
|
368
|
+
const bobRecordsDeleteReply = await dwn.processMessage(alice.did, bobRecordsDelete.message);
|
|
376
369
|
expect(bobRecordsDeleteReply.status.code).toBe(202);
|
|
377
|
-
})
|
|
370
|
+
});
|
|
378
371
|
});
|
|
379
372
|
describe('author action rules', () => {
|
|
380
|
-
it('allow author to delete with ancestor author rule', () =>
|
|
373
|
+
it('allow author to delete with ancestor author rule', async () => {
|
|
381
374
|
// scenario: Bob writes a 'post' and Alice writes a 'post/comment' to her DWN. Bob deletes the comment
|
|
382
375
|
// because author of post can delete. Carol is unable to delete the comment.
|
|
383
376
|
const protocolDefinition = authorCanProtocolDefinition;
|
|
384
|
-
const alice =
|
|
385
|
-
const bob =
|
|
386
|
-
const carol =
|
|
387
|
-
const protocolsConfig =
|
|
377
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
378
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
379
|
+
const carol = await TestDataGenerator.generatePersona();
|
|
380
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
388
381
|
author: alice,
|
|
389
382
|
protocolDefinition
|
|
390
383
|
});
|
|
391
384
|
// setting up a stub DID resolver
|
|
392
385
|
TestStubGenerator.stubDidResolver(didResolver, [alice, bob, carol]);
|
|
393
|
-
const protocolsConfigureReply =
|
|
386
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
394
387
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
395
388
|
// Bob writes a post
|
|
396
|
-
const postRecordsWrite =
|
|
389
|
+
const postRecordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
397
390
|
author: bob,
|
|
398
391
|
protocol: protocolDefinition.protocol,
|
|
399
392
|
protocolPath: 'post',
|
|
400
393
|
});
|
|
401
|
-
const postRecordsWriteReply =
|
|
394
|
+
const postRecordsWriteReply = await dwn.processMessage(alice.did, postRecordsWrite.message, { dataStream: postRecordsWrite.dataStream });
|
|
402
395
|
expect(postRecordsWriteReply.status.code).toBe(202);
|
|
403
396
|
// Alice writes a 'post/comment'
|
|
404
|
-
const commentRecordsWrite =
|
|
397
|
+
const commentRecordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
405
398
|
author: alice,
|
|
406
399
|
protocol: protocolDefinition.protocol,
|
|
407
400
|
protocolPath: 'post/comment',
|
|
408
401
|
parentContextId: postRecordsWrite.message.contextId,
|
|
409
402
|
});
|
|
410
|
-
const commentRecordsWriteReply =
|
|
403
|
+
const commentRecordsWriteReply = await dwn.processMessage(alice.did, commentRecordsWrite.message, { dataStream: commentRecordsWrite.dataStream });
|
|
411
404
|
expect(commentRecordsWriteReply.status.code).toBe(202);
|
|
412
405
|
// Carol is unable to delete Alice's 'post/comment'
|
|
413
|
-
const recordsDeleteCarol =
|
|
406
|
+
const recordsDeleteCarol = await TestDataGenerator.generateRecordsDelete({
|
|
414
407
|
author: carol,
|
|
415
408
|
recordId: commentRecordsWrite.message.recordId,
|
|
416
409
|
});
|
|
417
|
-
const recordsDeleteCarolReply =
|
|
410
|
+
const recordsDeleteCarolReply = await dwn.processMessage(alice.did, recordsDeleteCarol.message);
|
|
418
411
|
expect(recordsDeleteCarolReply.status.code).toBe(401);
|
|
419
412
|
expect(recordsDeleteCarolReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationActionNotAllowed);
|
|
420
413
|
// Bob is able to delete the Alice's 'post/comment'
|
|
421
|
-
const recordsDelete =
|
|
414
|
+
const recordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
422
415
|
author: bob,
|
|
423
416
|
recordId: commentRecordsWrite.message.recordId,
|
|
424
417
|
});
|
|
425
|
-
const recordsDeleteReply =
|
|
418
|
+
const recordsDeleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
426
419
|
expect(recordsDeleteReply.status.code).toBe(202);
|
|
427
|
-
})
|
|
420
|
+
});
|
|
428
421
|
});
|
|
429
422
|
describe('role based deletes', () => {
|
|
430
|
-
it('should allow co-delete by invoking a context role', () =>
|
|
423
|
+
it('should allow co-delete by invoking a context role', async () => {
|
|
431
424
|
// scenario: Alice adds Bob as a 'thread/admin' role. She writes a 'thread/chat'.
|
|
432
425
|
// Bob invokes his admin role to delete the 'thread/chat'. Carol is unable to delete
|
|
433
426
|
// the 'thread/chat'.
|
|
434
|
-
const alice =
|
|
435
|
-
const bob =
|
|
436
|
-
const carol =
|
|
427
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
428
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
429
|
+
const carol = await TestDataGenerator.generateDidKeyPersona();
|
|
437
430
|
const protocolDefinition = threadRoleProtocolDefinition;
|
|
438
|
-
const protocolsConfig =
|
|
431
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
439
432
|
author: alice,
|
|
440
433
|
protocolDefinition
|
|
441
434
|
});
|
|
442
|
-
const protocolsConfigureReply =
|
|
435
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
443
436
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
444
437
|
// Alice creates a thread
|
|
445
|
-
const threadRecord =
|
|
438
|
+
const threadRecord = await TestDataGenerator.generateRecordsWrite({
|
|
446
439
|
author: alice,
|
|
447
440
|
recipient: bob.did,
|
|
448
441
|
protocol: protocolDefinition.protocol,
|
|
449
442
|
protocolPath: 'thread'
|
|
450
443
|
});
|
|
451
|
-
const threadRecordReply =
|
|
444
|
+
const threadRecordReply = await dwn.processMessage(alice.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
452
445
|
expect(threadRecordReply.status.code).toBe(202);
|
|
453
446
|
// Alice adds Bob as a 'thread/admin' in that thread
|
|
454
|
-
const participantRecord =
|
|
447
|
+
const participantRecord = await TestDataGenerator.generateRecordsWrite({
|
|
455
448
|
author: alice,
|
|
456
449
|
recipient: bob.did,
|
|
457
450
|
protocol: protocolDefinition.protocol,
|
|
458
451
|
protocolPath: 'thread/admin',
|
|
459
452
|
parentContextId: threadRecord.message.contextId,
|
|
460
453
|
});
|
|
461
|
-
const participantRecordReply =
|
|
454
|
+
const participantRecordReply = await dwn.processMessage(alice.did, participantRecord.message, { dataStream: participantRecord.dataStream });
|
|
462
455
|
expect(participantRecordReply.status.code).toBe(202);
|
|
463
456
|
// Alice writes a chat message in that thread
|
|
464
|
-
const chatRecord =
|
|
457
|
+
const chatRecord = await TestDataGenerator.generateRecordsWrite({
|
|
465
458
|
author: alice,
|
|
466
459
|
recipient: alice.did,
|
|
467
460
|
protocol: protocolDefinition.protocol,
|
|
468
461
|
protocolPath: 'thread/chat',
|
|
469
462
|
parentContextId: threadRecord.message.contextId,
|
|
470
463
|
});
|
|
471
|
-
const chatRecordReply =
|
|
464
|
+
const chatRecordReply = await dwn.processMessage(alice.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
472
465
|
expect(chatRecordReply.status.code).toBe(202);
|
|
473
466
|
// Verifies that Carol cannot delete without appropriate role
|
|
474
|
-
const chatDeleteCarol =
|
|
467
|
+
const chatDeleteCarol = await TestDataGenerator.generateRecordsDelete({
|
|
475
468
|
author: carol,
|
|
476
469
|
recordId: chatRecord.message.recordId,
|
|
477
470
|
});
|
|
478
|
-
const chatDeleteReplyCarol =
|
|
471
|
+
const chatDeleteReplyCarol = await dwn.processMessage(alice.did, chatDeleteCarol.message);
|
|
479
472
|
expect(chatDeleteReplyCarol.status.code).toBe(401);
|
|
480
473
|
expect(chatDeleteReplyCarol.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationActionNotAllowed);
|
|
481
474
|
// Bob invokes the role to delete the chat message
|
|
482
|
-
const chatDelete =
|
|
475
|
+
const chatDelete = await TestDataGenerator.generateRecordsDelete({
|
|
483
476
|
author: bob,
|
|
484
477
|
recordId: chatRecord.message.recordId,
|
|
485
478
|
protocolRole: 'thread/admin',
|
|
486
479
|
});
|
|
487
|
-
const chatDeleteReply =
|
|
480
|
+
const chatDeleteReply = await dwn.processMessage(alice.did, chatDelete.message);
|
|
488
481
|
expect(chatDeleteReply.status.code).toBe(202);
|
|
489
|
-
})
|
|
490
|
-
it('should allow co-delete invoking a root-level role', () =>
|
|
482
|
+
});
|
|
483
|
+
it('should allow co-delete invoking a root-level role', async () => {
|
|
491
484
|
// scenario: Alice adds Bob as a root-level 'admin' role. She writes a 'chat'.
|
|
492
485
|
// Bob invokes his admin role to delete the 'chat'.
|
|
493
|
-
const alice =
|
|
494
|
-
const bob =
|
|
495
|
-
const carol =
|
|
486
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
487
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
488
|
+
const carol = await TestDataGenerator.generateDidKeyPersona();
|
|
496
489
|
const protocolDefinition = friendRoleProtocolDefinition;
|
|
497
|
-
const protocolsConfig =
|
|
490
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
498
491
|
author: alice,
|
|
499
492
|
protocolDefinition
|
|
500
493
|
});
|
|
501
|
-
const protocolsConfigureReply =
|
|
494
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
502
495
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
503
496
|
// Alice adds Bob as a 'thread/admin' in that thread
|
|
504
|
-
const participantRecord =
|
|
497
|
+
const participantRecord = await TestDataGenerator.generateRecordsWrite({
|
|
505
498
|
author: alice,
|
|
506
499
|
recipient: bob.did,
|
|
507
500
|
protocol: protocolDefinition.protocol,
|
|
508
501
|
protocolPath: 'admin',
|
|
509
502
|
});
|
|
510
|
-
const participantRecordReply =
|
|
503
|
+
const participantRecordReply = await dwn.processMessage(alice.did, participantRecord.message, { dataStream: participantRecord.dataStream });
|
|
511
504
|
expect(participantRecordReply.status.code).toBe(202);
|
|
512
505
|
// Alice writes a chat message in that thread
|
|
513
|
-
const chatRecord =
|
|
506
|
+
const chatRecord = await TestDataGenerator.generateRecordsWrite({
|
|
514
507
|
author: alice,
|
|
515
508
|
recipient: alice.did,
|
|
516
509
|
protocol: protocolDefinition.protocol,
|
|
517
510
|
protocolPath: 'chat',
|
|
518
511
|
});
|
|
519
|
-
const chatRecordReply =
|
|
512
|
+
const chatRecordReply = await dwn.processMessage(alice.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
520
513
|
expect(chatRecordReply.status.code).toBe(202);
|
|
521
514
|
// Carol is unable to delete the chat message
|
|
522
|
-
const chatDeleteCarol =
|
|
515
|
+
const chatDeleteCarol = await TestDataGenerator.generateRecordsDelete({
|
|
523
516
|
author: carol,
|
|
524
517
|
recordId: chatRecord.message.recordId,
|
|
525
518
|
});
|
|
526
|
-
const chatDeleteCarolReply =
|
|
519
|
+
const chatDeleteCarolReply = await dwn.processMessage(alice.did, chatDeleteCarol.message);
|
|
527
520
|
expect(chatDeleteCarolReply.status.code).toBe(401);
|
|
528
521
|
expect(chatDeleteCarolReply.status.detail).toContain(DwnErrorCode.ProtocolAuthorizationActionNotAllowed);
|
|
529
522
|
// Bob invokes the role to delete the chat message
|
|
530
|
-
const chatDelete =
|
|
523
|
+
const chatDelete = await TestDataGenerator.generateRecordsDelete({
|
|
531
524
|
author: bob,
|
|
532
525
|
recordId: chatRecord.message.recordId,
|
|
533
526
|
protocolRole: 'admin',
|
|
534
527
|
});
|
|
535
|
-
const chatDeleteReply =
|
|
528
|
+
const chatDeleteReply = await dwn.processMessage(alice.did, chatDelete.message);
|
|
536
529
|
expect(chatDeleteReply.status.code).toBe(202);
|
|
537
|
-
})
|
|
530
|
+
});
|
|
538
531
|
});
|
|
539
532
|
});
|
|
540
|
-
it('should return 401 if message is not authorized', () =>
|
|
533
|
+
it('should return 401 if message is not authorized', async () => {
|
|
541
534
|
// scenario: Alice creates a record and Bob is unable to delete it.
|
|
542
|
-
const alice =
|
|
543
|
-
const bob =
|
|
544
|
-
|
|
535
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
536
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
537
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
538
|
+
const recordsWrite = await TestDataGenerator.generateRecordsWrite({
|
|
545
539
|
author: alice,
|
|
546
540
|
});
|
|
547
|
-
const recordsWriteReply =
|
|
541
|
+
const recordsWriteReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream: recordsWrite.dataStream });
|
|
548
542
|
expect(recordsWriteReply.status.code).toBe(202);
|
|
549
|
-
const recordsDelete =
|
|
543
|
+
const recordsDelete = await TestDataGenerator.generateRecordsDelete({
|
|
550
544
|
author: bob,
|
|
551
545
|
recordId: recordsWrite.message.recordId,
|
|
552
546
|
});
|
|
553
|
-
const recordsDeleteReply =
|
|
547
|
+
const recordsDeleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
554
548
|
expect(recordsDeleteReply.status.code).toBe(401);
|
|
555
|
-
|
|
556
|
-
}));
|
|
549
|
+
});
|
|
557
550
|
describe('grant based deletes', () => {
|
|
558
|
-
it('should allow delete with a matching protocol grant scope', () =>
|
|
551
|
+
it('should allow delete with a matching protocol grant scope', async () => {
|
|
559
552
|
// scenario: Alice writes a protocol record, grants Bob delete permission, Bob deletes it.
|
|
560
|
-
const alice =
|
|
561
|
-
const bob =
|
|
553
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
554
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
562
555
|
const protocolDefinition = {
|
|
563
556
|
protocol: 'http://grant-delete-test.xyz',
|
|
564
557
|
published: false,
|
|
@@ -566,22 +559,22 @@ export function testRecordsDeleteHandler() {
|
|
|
566
559
|
structure: { foo: {} }
|
|
567
560
|
};
|
|
568
561
|
// Alice installs the protocol
|
|
569
|
-
const protocolsConfig =
|
|
562
|
+
const protocolsConfig = await TestDataGenerator.generateProtocolsConfigure({
|
|
570
563
|
author: alice,
|
|
571
564
|
protocolDefinition
|
|
572
565
|
});
|
|
573
|
-
const protocolsConfigureReply =
|
|
566
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
574
567
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
575
568
|
// Alice writes a record
|
|
576
|
-
const { recordsWrite, dataStream } =
|
|
569
|
+
const { recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
577
570
|
author: alice,
|
|
578
571
|
protocol: protocolDefinition.protocol,
|
|
579
572
|
protocolPath: 'foo',
|
|
580
573
|
});
|
|
581
|
-
const writeReply =
|
|
574
|
+
const writeReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream });
|
|
582
575
|
expect(writeReply.status.code).toBe(202);
|
|
583
576
|
// Alice grants Bob delete permission scoped to the protocol
|
|
584
|
-
const permissionGrant =
|
|
577
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
585
578
|
signer: Jws.createSigner(alice),
|
|
586
579
|
grantedTo: bob.did,
|
|
587
580
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }),
|
|
@@ -592,22 +585,22 @@ export function testRecordsDeleteHandler() {
|
|
|
592
585
|
}
|
|
593
586
|
});
|
|
594
587
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
595
|
-
const grantWriteReply =
|
|
588
|
+
const grantWriteReply = await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
596
589
|
expect(grantWriteReply.status.code).toBe(202);
|
|
597
590
|
// Bob deletes the record using the grant
|
|
598
|
-
const recordsDelete =
|
|
591
|
+
const recordsDelete = await RecordsDelete.create({
|
|
599
592
|
recordId: recordsWrite.message.recordId,
|
|
600
593
|
signer: Jws.createSigner(bob),
|
|
601
594
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
602
595
|
});
|
|
603
|
-
const deleteReply =
|
|
596
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
604
597
|
expect(deleteReply.status.code).toBe(202);
|
|
605
|
-
})
|
|
606
|
-
it('should reject delete when grant has mismatching protocol scope', () =>
|
|
598
|
+
});
|
|
599
|
+
it('should reject delete when grant has mismatching protocol scope', async () => {
|
|
607
600
|
// scenario: Alice grants Bob delete permission for protocol A,
|
|
608
601
|
// Bob tries to delete a record in protocol B.
|
|
609
|
-
const alice =
|
|
610
|
-
const bob =
|
|
602
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
603
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
611
604
|
const protocolA = {
|
|
612
605
|
protocol: 'http://protocol-a.xyz',
|
|
613
606
|
published: false,
|
|
@@ -621,20 +614,20 @@ export function testRecordsDeleteHandler() {
|
|
|
621
614
|
structure: { foo: {} }
|
|
622
615
|
};
|
|
623
616
|
// Alice installs both protocols
|
|
624
|
-
const configA =
|
|
625
|
-
expect((
|
|
626
|
-
const configB =
|
|
627
|
-
expect((
|
|
617
|
+
const configA = await TestDataGenerator.generateProtocolsConfigure({ author: alice, protocolDefinition: protocolA });
|
|
618
|
+
expect((await dwn.processMessage(alice.did, configA.message)).status.code).toBe(202);
|
|
619
|
+
const configB = await TestDataGenerator.generateProtocolsConfigure({ author: alice, protocolDefinition: protocolB });
|
|
620
|
+
expect((await dwn.processMessage(alice.did, configB.message)).status.code).toBe(202);
|
|
628
621
|
// Alice writes a record in protocol B
|
|
629
|
-
const { recordsWrite, dataStream } =
|
|
622
|
+
const { recordsWrite, dataStream } = await TestDataGenerator.generateRecordsWrite({
|
|
630
623
|
author: alice,
|
|
631
624
|
protocol: protocolB.protocol,
|
|
632
625
|
protocolPath: 'foo',
|
|
633
626
|
});
|
|
634
|
-
const writeReply =
|
|
627
|
+
const writeReply = await dwn.processMessage(alice.did, recordsWrite.message, { dataStream });
|
|
635
628
|
expect(writeReply.status.code).toBe(202);
|
|
636
629
|
// Alice grants Bob delete permission scoped to protocol A (not B)
|
|
637
|
-
const permissionGrant =
|
|
630
|
+
const permissionGrant = await PermissionsProtocol.createGrant({
|
|
638
631
|
signer: Jws.createSigner(alice),
|
|
639
632
|
grantedTo: bob.did,
|
|
640
633
|
dateExpires: Time.createOffsetTimestamp({ seconds: 60 * 60 * 24 }),
|
|
@@ -645,133 +638,127 @@ export function testRecordsDeleteHandler() {
|
|
|
645
638
|
}
|
|
646
639
|
});
|
|
647
640
|
const grantDataStream = DataStream.fromBytes(permissionGrant.permissionGrantBytes);
|
|
648
|
-
expect((
|
|
641
|
+
expect((await dwn.processMessage(alice.did, permissionGrant.recordsWrite.message, { dataStream: grantDataStream })).status.code).toBe(202);
|
|
649
642
|
// Bob tries to delete the protocol B record with the protocol A grant — should fail
|
|
650
|
-
const recordsDelete =
|
|
643
|
+
const recordsDelete = await RecordsDelete.create({
|
|
651
644
|
recordId: recordsWrite.message.recordId,
|
|
652
645
|
signer: Jws.createSigner(bob),
|
|
653
646
|
permissionGrantId: permissionGrant.recordsWrite.message.recordId,
|
|
654
647
|
});
|
|
655
|
-
const deleteReply =
|
|
648
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
656
649
|
expect(deleteReply.status.code).toBe(401);
|
|
657
650
|
expect(deleteReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationDeleteProtocolScopeMismatch);
|
|
658
|
-
})
|
|
659
|
-
it('should reject delete without a grant when non-owner tries to delete a non-protocol record', () => __awaiter(this, void 0, void 0, function* () {
|
|
660
|
-
// scenario: Alice writes a non-protocol record, Bob tries to delete it without any grant.
|
|
661
|
-
// This test verifies the fallback error path is unchanged.
|
|
662
|
-
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
663
|
-
const bob = yield TestDataGenerator.generateDidKeyPersona();
|
|
664
|
-
const { recordsWrite, dataStream } = yield TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
665
|
-
expect((yield dwn.processMessage(alice.did, recordsWrite.message, { dataStream })).status.code).toBe(202);
|
|
666
|
-
const recordsDelete = yield RecordsDelete.create({
|
|
667
|
-
recordId: recordsWrite.message.recordId,
|
|
668
|
-
signer: Jws.createSigner(bob),
|
|
669
|
-
});
|
|
670
|
-
const deleteReply = yield dwn.processMessage(alice.did, recordsDelete.message);
|
|
671
|
-
expect(deleteReply.status.code).toBe(401);
|
|
672
|
-
expect(deleteReply.status.detail).toContain(DwnErrorCode.RecordsDeleteAuthorizationFailed);
|
|
673
|
-
}));
|
|
651
|
+
});
|
|
674
652
|
});
|
|
675
|
-
it('should index additional properties from the RecordsWrite being deleted', () =>
|
|
676
|
-
const alice =
|
|
653
|
+
it('should index additional properties from the RecordsWrite being deleted', async () => {
|
|
654
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
655
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
677
656
|
// initial write
|
|
678
|
-
const initialWriteData =
|
|
679
|
-
const initialWriteReply =
|
|
657
|
+
const initialWriteData = await TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'testSchema' });
|
|
658
|
+
const initialWriteReply = await dwn.processMessage(alice.did, initialWriteData.message, { dataStream: initialWriteData.dataStream });
|
|
680
659
|
expect(initialWriteReply.status.code).toBe(202);
|
|
681
660
|
// generate subsequent write and delete with the delete having an earlier timestamp
|
|
682
661
|
// NOTE: creating RecordsDelete first ensures it has an earlier `messageTimestamp` time
|
|
683
|
-
const recordsDelete =
|
|
662
|
+
const recordsDelete = await RecordsDelete.create({
|
|
684
663
|
recordId: initialWriteData.message.recordId,
|
|
685
664
|
signer: Jws.createSigner(alice)
|
|
686
665
|
});
|
|
687
|
-
const deleteMessageCid =
|
|
688
|
-
const deleteReply =
|
|
666
|
+
const deleteMessageCid = await Message.getCid(recordsDelete.message);
|
|
667
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
689
668
|
expect(deleteReply.status.code).toBe(202);
|
|
690
669
|
// message store
|
|
691
|
-
const { messages } =
|
|
670
|
+
const { messages } = await messageStore.query(alice.did, [{ schema: normalizeSchemaUrl('testSchema'), method: DwnMethodName.Delete }]);
|
|
692
671
|
expect(messages.length).toBe(1);
|
|
693
|
-
expect(
|
|
672
|
+
expect(await Message.getCid(messages[0])).toBe(deleteMessageCid);
|
|
694
673
|
// state index
|
|
695
|
-
const events =
|
|
674
|
+
const events = await stateIndex.getLeaves(alice.did, []);
|
|
696
675
|
expect(events).toContain(deleteMessageCid);
|
|
697
|
-
})
|
|
676
|
+
});
|
|
698
677
|
describe('state index', () => {
|
|
699
|
-
it('should include RecordsDelete event and keep initial RecordsWrite event', () =>
|
|
700
|
-
const alice =
|
|
701
|
-
|
|
702
|
-
const
|
|
678
|
+
it('should include RecordsDelete event and keep initial RecordsWrite event', async () => {
|
|
679
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
680
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, alice);
|
|
681
|
+
const { message, dataStream } = await TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
682
|
+
const writeReply = await dwn.processMessage(alice.did, message, { dataStream });
|
|
703
683
|
expect(writeReply.status.code).toBe(202);
|
|
704
|
-
const recordsDelete =
|
|
684
|
+
const recordsDelete = await RecordsDelete.create({
|
|
705
685
|
recordId: message.recordId,
|
|
706
686
|
signer: Jws.createSigner(alice)
|
|
707
687
|
});
|
|
708
|
-
const deleteReply =
|
|
688
|
+
const deleteReply = await dwn.processMessage(alice.did, recordsDelete.message);
|
|
709
689
|
expect(deleteReply.status.code).toBe(202);
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
const
|
|
690
|
+
// NOTE: getLeaves returns ALL messageCids (including ProtocolsConfigure), so count is 3 not 2
|
|
691
|
+
const events = await stateIndex.getLeaves(alice.did, []);
|
|
692
|
+
expect(events.length).toBe(3);
|
|
693
|
+
const writeMessageCid = await Message.getCid(message);
|
|
694
|
+
const deleteMessageCid = await Message.getCid(recordsDelete.message);
|
|
714
695
|
const expectedMessageCids = new Set([writeMessageCid, deleteMessageCid]);
|
|
715
696
|
for (const messageCid of events) {
|
|
716
697
|
expectedMessageCids.delete(messageCid);
|
|
717
698
|
}
|
|
718
699
|
expect(expectedMessageCids.size).toBe(0);
|
|
719
|
-
})
|
|
720
|
-
it('should only keep first write and delete when subsequent writes happen', () =>
|
|
721
|
-
const
|
|
700
|
+
});
|
|
701
|
+
it('should only keep first write and delete when subsequent writes happen', async () => {
|
|
702
|
+
const author = await TestDataGenerator.generatePersona();
|
|
722
703
|
TestStubGenerator.stubDidResolver(didResolver, [author]);
|
|
723
|
-
|
|
704
|
+
await TestDataGenerator.installDefaultTestProtocol(dwn, author);
|
|
705
|
+
const { message, dataStream, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ author });
|
|
706
|
+
const reply = await dwn.processMessage(author.did, message, { dataStream });
|
|
724
707
|
expect(reply.status.code).toBe(202);
|
|
725
|
-
const newWrite =
|
|
708
|
+
const newWrite = await RecordsWrite.createFrom({
|
|
726
709
|
recordsWriteMessage: recordsWrite.message,
|
|
727
710
|
published: true,
|
|
728
711
|
signer: Jws.createSigner(author)
|
|
729
712
|
});
|
|
730
|
-
const newWriteReply =
|
|
713
|
+
const newWriteReply = await dwn.processMessage(author.did, newWrite.message);
|
|
731
714
|
expect(newWriteReply.status.code).toBe(202);
|
|
732
|
-
const recordsDelete =
|
|
715
|
+
const recordsDelete = await RecordsDelete.create({
|
|
733
716
|
recordId: message.recordId,
|
|
734
717
|
signer: Jws.createSigner(author)
|
|
735
718
|
});
|
|
736
|
-
const deleteReply =
|
|
719
|
+
const deleteReply = await dwn.processMessage(author.did, recordsDelete.message);
|
|
737
720
|
expect(deleteReply.status.code).toBe(202);
|
|
738
|
-
const events =
|
|
739
|
-
expect(events.length).toBe(
|
|
740
|
-
const deletedMessageCid =
|
|
721
|
+
const events = await stateIndex.getLeaves(author.did, []);
|
|
722
|
+
expect(events.length).toBe(3);
|
|
723
|
+
const deletedMessageCid = await Message.getCid(newWrite.message);
|
|
741
724
|
for (const messageCid of events) {
|
|
742
725
|
if (messageCid === deletedMessageCid) {
|
|
743
726
|
throw new Error(`${messageCid} should not exist`);
|
|
744
727
|
}
|
|
745
728
|
}
|
|
746
|
-
})
|
|
729
|
+
});
|
|
747
730
|
});
|
|
748
731
|
});
|
|
749
|
-
it('should return 401 if signature check fails', () =>
|
|
750
|
-
const { author, message } =
|
|
732
|
+
it('should return 401 if signature check fails', async () => {
|
|
733
|
+
const { author, message } = await TestDataGenerator.generateRecordsDelete();
|
|
751
734
|
const tenant = author.did;
|
|
752
735
|
// setting up a stub did resolver & message store
|
|
753
736
|
// intentionally not supplying the public key so a different public key is generated to simulate invalid signature
|
|
754
|
-
const mismatchingPersona =
|
|
737
|
+
const mismatchingPersona = await TestDataGenerator.generatePersona({ did: author.did, keyId: author.keyId });
|
|
755
738
|
const didResolver = TestStubGenerator.createDidResolverStub(mismatchingPersona);
|
|
756
739
|
// setting up a stub method resolver & message store
|
|
757
740
|
const messageStoreStub = sinon.createStubInstance(MessageStoreLevel);
|
|
758
741
|
const resumableTaskManagerStub = sinon.createStubInstance(ResumableTaskManager);
|
|
759
|
-
const recordsDeleteHandler = new RecordsDeleteHandler(
|
|
760
|
-
|
|
742
|
+
const recordsDeleteHandler = new RecordsDeleteHandler({
|
|
743
|
+
didResolver, messageStore: messageStoreStub, resumableTaskManager: resumableTaskManagerStub,
|
|
744
|
+
});
|
|
745
|
+
const reply = await recordsDeleteHandler.handle({ tenant, message });
|
|
761
746
|
expect(reply.status.code).toBe(401);
|
|
762
|
-
})
|
|
763
|
-
it('should return 400 if fail parsing the message', () =>
|
|
764
|
-
const { author, message } =
|
|
747
|
+
});
|
|
748
|
+
it('should return 400 if fail parsing the message', async () => {
|
|
749
|
+
const { author, message } = await TestDataGenerator.generateRecordsDelete();
|
|
765
750
|
const tenant = author.did;
|
|
766
751
|
// setting up a stub method resolver & message store
|
|
767
752
|
const messageStoreStub = sinon.createStubInstance(MessageStoreLevel);
|
|
768
753
|
const resumableTaskManagerStub = sinon.createStubInstance(ResumableTaskManager);
|
|
769
|
-
const recordsDeleteHandler = new RecordsDeleteHandler(
|
|
754
|
+
const recordsDeleteHandler = new RecordsDeleteHandler({
|
|
755
|
+
didResolver, messageStore: messageStoreStub, resumableTaskManager: resumableTaskManagerStub,
|
|
756
|
+
});
|
|
770
757
|
// stub the `parse()` function to throw an error
|
|
771
758
|
sinon.stub(RecordsDelete, 'parse').throws('anyError');
|
|
772
|
-
const reply =
|
|
759
|
+
const reply = await recordsDeleteHandler.handle({ tenant, message });
|
|
773
760
|
expect(reply.status.code).toBe(400);
|
|
774
|
-
})
|
|
761
|
+
});
|
|
775
762
|
});
|
|
776
763
|
}
|
|
777
764
|
//# sourceMappingURL=records-delete.spec.js.map
|