@enbox/dwn-sdk-js 0.0.6 → 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 +100 -125
- 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 +549 -564
- 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 +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 +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/tests/features/permissions.spec.d.ts.map +1 -1
- package/package.json +2 -2
- 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 +1 -1
|
@@ -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 { authenticate } from '../core/auth.js';
|
|
11
2
|
import { DateSort } from '../types/records-types.js';
|
|
12
3
|
import { Message } from '../core/message.js';
|
|
@@ -18,63 +9,64 @@ import { RecordsWrite } from '../interfaces/records-write.js';
|
|
|
18
9
|
import { SortDirection } from '../types/query-types.js';
|
|
19
10
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
20
11
|
export class RecordsQueryHandler {
|
|
12
|
+
didResolver;
|
|
13
|
+
messageStore;
|
|
14
|
+
dataStore;
|
|
21
15
|
constructor(didResolver, messageStore, dataStore) {
|
|
22
16
|
this.didResolver = didResolver;
|
|
23
17
|
this.messageStore = messageStore;
|
|
24
18
|
this.dataStore = dataStore;
|
|
25
19
|
}
|
|
26
|
-
handle(
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
async handle({ tenant, message }) {
|
|
21
|
+
let recordsQuery;
|
|
22
|
+
try {
|
|
23
|
+
recordsQuery = await RecordsQuery.parse(message);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return messageReplyFromError(e, 400);
|
|
27
|
+
}
|
|
28
|
+
let recordsWrites;
|
|
29
|
+
let cursor;
|
|
30
|
+
// if this is an anonymous query and the filter supports published records, query only published records
|
|
31
|
+
if (Records.filterIncludesPublishedRecords(recordsQuery.message.descriptor.filter) && recordsQuery.author === undefined) {
|
|
32
|
+
const results = await this.fetchPublishedRecords(tenant, recordsQuery);
|
|
33
|
+
recordsWrites = results.messages;
|
|
34
|
+
cursor = results.cursor;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// authentication and authorization
|
|
29
38
|
try {
|
|
30
|
-
|
|
39
|
+
await authenticate(message.authorization, this.didResolver);
|
|
40
|
+
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.messageStore);
|
|
31
41
|
}
|
|
32
42
|
catch (e) {
|
|
33
|
-
return messageReplyFromError(e,
|
|
43
|
+
return messageReplyFromError(e, 401);
|
|
34
44
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// if this is an anonymous query and the filter supports published records, query only published records
|
|
38
|
-
if (Records.filterIncludesPublishedRecords(recordsQuery.message.descriptor.filter) && recordsQuery.author === undefined) {
|
|
39
|
-
const results = yield this.fetchPublishedRecords(tenant, recordsQuery);
|
|
45
|
+
if (recordsQuery.author === tenant) {
|
|
46
|
+
const results = await this.fetchRecordsAsOwner(tenant, recordsQuery);
|
|
40
47
|
recordsWrites = results.messages;
|
|
41
48
|
cursor = results.cursor;
|
|
42
49
|
}
|
|
43
50
|
else {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
yield RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.messageStore);
|
|
48
|
-
}
|
|
49
|
-
catch (e) {
|
|
50
|
-
return messageReplyFromError(e, 401);
|
|
51
|
-
}
|
|
52
|
-
if (recordsQuery.author === tenant) {
|
|
53
|
-
const results = yield this.fetchRecordsAsOwner(tenant, recordsQuery);
|
|
54
|
-
recordsWrites = results.messages;
|
|
55
|
-
cursor = results.cursor;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
const results = yield this.fetchRecordsAsNonOwner(tenant, recordsQuery);
|
|
59
|
-
recordsWrites = results.messages;
|
|
60
|
-
cursor = results.cursor;
|
|
61
|
-
}
|
|
51
|
+
const results = await this.fetchRecordsAsNonOwner(tenant, recordsQuery);
|
|
52
|
+
recordsWrites = results.messages;
|
|
53
|
+
cursor = results.cursor;
|
|
62
54
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
55
|
+
}
|
|
56
|
+
// attach initial write if returned RecordsWrite is not initial write
|
|
57
|
+
for (const recordsWrite of recordsWrites) {
|
|
58
|
+
if (!await RecordsWrite.isInitialWrite(recordsWrite)) {
|
|
59
|
+
const initialWriteQueryResult = await this.messageStore.query(tenant, [{ recordId: recordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]);
|
|
60
|
+
const initialWrite = initialWriteQueryResult.messages[0];
|
|
61
|
+
delete initialWrite.encodedData; // defensive measure but technically optional because we do this when an update RecordsWrite takes place
|
|
62
|
+
recordsWrite.initialWrite = initialWrite;
|
|
71
63
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
status: { code: 200, detail: 'OK' },
|
|
67
|
+
entries: recordsWrites,
|
|
68
|
+
cursor
|
|
69
|
+
};
|
|
78
70
|
}
|
|
79
71
|
/**
|
|
80
72
|
* Convert an incoming DateSort to a sort type accepted by MessageStore
|
|
@@ -104,14 +96,17 @@ export class RecordsQueryHandler {
|
|
|
104
96
|
/**
|
|
105
97
|
* Fetches the records as the owner of the DWN with no additional filtering.
|
|
106
98
|
*/
|
|
107
|
-
fetchRecordsAsOwner(tenant, recordsQuery) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
99
|
+
async fetchRecordsAsOwner(tenant, recordsQuery) {
|
|
100
|
+
const { dateSort, filter, pagination } = recordsQuery.message.descriptor;
|
|
101
|
+
// fetch all published records matching the query
|
|
102
|
+
const queryFilter = {
|
|
103
|
+
...Records.convertFilter(filter, dateSort),
|
|
104
|
+
interface: DwnInterfaceName.Records,
|
|
105
|
+
method: DwnMethodName.Write,
|
|
106
|
+
isLatestBaseState: true
|
|
107
|
+
};
|
|
108
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
109
|
+
return this.messageStore.query(tenant, [queryFilter], messageSort, pagination);
|
|
115
110
|
}
|
|
116
111
|
/**
|
|
117
112
|
* Fetches the records as a non-owner.
|
|
@@ -132,43 +127,45 @@ export class RecordsQueryHandler {
|
|
|
132
127
|
* 2. unpublished records authorized by a protocol rule.
|
|
133
128
|
*
|
|
134
129
|
*/
|
|
135
|
-
fetchRecordsAsNonOwner(tenant, recordsQuery) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
130
|
+
async fetchRecordsAsNonOwner(tenant, recordsQuery) {
|
|
131
|
+
const { dateSort, pagination, filter } = recordsQuery.message.descriptor;
|
|
132
|
+
const filters = [];
|
|
133
|
+
if (Records.filterIncludesPublishedRecords(filter)) {
|
|
134
|
+
filters.push(RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery));
|
|
135
|
+
}
|
|
136
|
+
if (Records.filterIncludesUnpublishedRecords(filter)) {
|
|
137
|
+
if (Records.shouldBuildUnpublishedAuthorFilter(filter, recordsQuery.author)) {
|
|
138
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery));
|
|
141
139
|
}
|
|
142
|
-
if (Records.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
filters.push(RecordsQueryHandler.buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery));
|
|
148
|
-
}
|
|
149
|
-
if (Records.shouldBuildUnpublishedRecipientFilter(filter, recordsQuery.author)) {
|
|
150
|
-
filters.push(RecordsQueryHandler.buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery));
|
|
151
|
-
}
|
|
140
|
+
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload)) {
|
|
141
|
+
filters.push(RecordsQueryHandler.buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery));
|
|
142
|
+
}
|
|
143
|
+
if (Records.shouldBuildUnpublishedRecipientFilter(filter, recordsQuery.author)) {
|
|
144
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery));
|
|
152
145
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
146
|
+
}
|
|
147
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
148
|
+
return this.messageStore.query(tenant, filters, messageSort, pagination);
|
|
156
149
|
}
|
|
157
150
|
/**
|
|
158
151
|
* Fetches only published records.
|
|
159
152
|
*/
|
|
160
|
-
fetchPublishedRecords(tenant, recordsQuery) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return this.messageStore.query(tenant, [filter], messageSort, pagination);
|
|
166
|
-
});
|
|
153
|
+
async fetchPublishedRecords(tenant, recordsQuery) {
|
|
154
|
+
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
155
|
+
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
156
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
157
|
+
return this.messageStore.query(tenant, [filter], messageSort, pagination);
|
|
167
158
|
}
|
|
168
159
|
static buildPublishedRecordsFilter(recordsQuery) {
|
|
169
160
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
170
161
|
// fetch all published records matching the query
|
|
171
|
-
return
|
|
162
|
+
return {
|
|
163
|
+
...Records.convertFilter(filter, dateSort),
|
|
164
|
+
interface: DwnInterfaceName.Records,
|
|
165
|
+
method: DwnMethodName.Write,
|
|
166
|
+
published: true,
|
|
167
|
+
isLatestBaseState: true
|
|
168
|
+
};
|
|
172
169
|
}
|
|
173
170
|
/**
|
|
174
171
|
* Creates a filter for unpublished records that are intended for the query author (where `recipient` is the author).
|
|
@@ -176,7 +173,14 @@ export class RecordsQueryHandler {
|
|
|
176
173
|
static buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery) {
|
|
177
174
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
178
175
|
// include records where recipient is query author
|
|
179
|
-
return
|
|
176
|
+
return {
|
|
177
|
+
...Records.convertFilter(filter, dateSort),
|
|
178
|
+
interface: DwnInterfaceName.Records,
|
|
179
|
+
method: DwnMethodName.Write,
|
|
180
|
+
recipient: recordsQuery.author,
|
|
181
|
+
isLatestBaseState: true,
|
|
182
|
+
published: false
|
|
183
|
+
};
|
|
180
184
|
}
|
|
181
185
|
/**
|
|
182
186
|
* Creates a filter for unpublished records that are within the specified protocol.
|
|
@@ -184,7 +188,13 @@ export class RecordsQueryHandler {
|
|
|
184
188
|
*/
|
|
185
189
|
static buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery) {
|
|
186
190
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
187
|
-
return
|
|
191
|
+
return {
|
|
192
|
+
...Records.convertFilter(filter, dateSort),
|
|
193
|
+
interface: DwnInterfaceName.Records,
|
|
194
|
+
method: DwnMethodName.Write,
|
|
195
|
+
isLatestBaseState: true,
|
|
196
|
+
published: false
|
|
197
|
+
};
|
|
188
198
|
}
|
|
189
199
|
/**
|
|
190
200
|
* Creates a filter for only unpublished records where the author is the same as the query author.
|
|
@@ -192,23 +202,28 @@ export class RecordsQueryHandler {
|
|
|
192
202
|
static buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery) {
|
|
193
203
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
194
204
|
// include records where author is the same as the query author
|
|
195
|
-
return
|
|
205
|
+
return {
|
|
206
|
+
...Records.convertFilter(filter, dateSort),
|
|
207
|
+
author: recordsQuery.author,
|
|
208
|
+
interface: DwnInterfaceName.Records,
|
|
209
|
+
method: DwnMethodName.Write,
|
|
210
|
+
isLatestBaseState: true,
|
|
211
|
+
published: false
|
|
212
|
+
};
|
|
196
213
|
}
|
|
197
214
|
/**
|
|
198
215
|
* @param messageStore Used to check if the grant has been revoked.
|
|
199
216
|
*/
|
|
200
|
-
static authorizeRecordsQuery(tenant, recordsQuery, messageStore) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
});
|
|
217
|
+
static async authorizeRecordsQuery(tenant, recordsQuery, messageStore) {
|
|
218
|
+
if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
|
|
219
|
+
await recordsQuery.authorizeDelegate(messageStore);
|
|
220
|
+
}
|
|
221
|
+
// NOTE: not all RecordsQuery messages require protocol authorization even if the filter includes protocol-related fields,
|
|
222
|
+
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
223
|
+
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
224
|
+
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload)) {
|
|
225
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore);
|
|
226
|
+
}
|
|
212
227
|
}
|
|
213
228
|
}
|
|
214
229
|
//# sourceMappingURL=records-query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records-query.js","sourceRoot":"","sources":["../../../../src/handlers/records-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"records-query.js","sourceRoot":"","sources":["../../../../src/handlers/records-query.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEnF,MAAM,OAAO,mBAAmB;IAEV;IAAkC;IAAoC;IAA1F,YAAoB,WAAwB,EAAU,YAA0B,EAAU,SAAoB;QAA1F,gBAAW,GAAX,WAAW,CAAa;QAAU,iBAAY,GAAZ,YAAY,CAAc;QAAU,cAAS,GAAT,SAAS,CAAW;IAAI,CAAC;IAE5G,KAAK,CAAC,MAAM,CAAC,EAClB,MAAM,EACN,OAAO,EACwC;QAC/C,IAAI,YAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,aAAuC,CAAC;QAC5C,IAAI,MAAoC,CAAC;QACzC,wGAAwG;QACxG,IAAI,OAAO,CAAC,8BAA8B,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACvE,aAAa,GAAG,OAAO,CAAC,QAAoC,CAAC;YAC7D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,OAAO,CAAC,aAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAE7D,MAAM,mBAAmB,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,qBAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBACrE,aAAa,GAAG,OAAO,CAAC,QAAoC,CAAC;gBAC7D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBACxE,aAAa,GAAG,OAAO,CAAC,QAAoC,CAAC;gBAC7D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAC3D,MAAM,EACN,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAC7F,CAAC;gBACF,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAA2B,CAAC;gBACnF,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC,wGAAwG;gBACzI,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;YACrC,OAAO,EAAG,aAAa;YACvB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,QAAmB;QACzC,QAAQ,QAAQ,EAAE,CAAC;YACnB,KAAK,QAAQ,CAAC,gBAAgB;gBAC5B,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;YAClD,KAAK,QAAQ,CAAC,iBAAiB;gBAC7B,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;YACnD,KAAK,QAAQ,CAAC,kBAAkB;gBAC9B,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;YACpD,KAAK,QAAQ,CAAC,mBAAmB;gBAC/B,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;YACrD,KAAK,QAAQ,CAAC,gBAAgB;gBAC5B,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;YACvD,KAAK,QAAQ,CAAC,iBAAiB;gBAC7B,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;YACxD;gBACE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,MAAc,EACd,YAA0B;QAE1B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACzE,iDAAiD;QACjD,MAAM,WAAW,GAAG;YAClB,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1C,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;SACzB,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAE,WAAW,CAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACnF,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACK,KAAK,CAAC,sBAAsB,CAClC,MAAc,EAAE,YAA0B;QAE1C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACzE,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,CAAC,gCAAgC,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,kCAAkC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAO,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,0CAA0C,CAAC,YAAY,CAAC,CAAC,CAAC;YAC7F,CAAC;YAED,IAAI,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,gBAAiB,CAAC,EAAE,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,+CAA+C,CAAC,YAAY,CAAC,CAAC,CAAC;YAClG,CAAC;YAED,IAAI,OAAO,CAAC,qCAAqC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAO,CAAC,EAAE,CAAC;gBAChF,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,2CAA2C,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAE,CAAC;IAC5E,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CACjC,MAAc,EAAE,YAA0B;QAE1C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAE,MAAM,CAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;IAEO,MAAM,CAAC,2BAA2B,CAAC,YAA0B;QACnE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7D,iDAAiD;QACjD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1C,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,SAAS,EAAW,IAAI;YACxB,iBAAiB,EAAG,IAAI;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,2CAA2C,CAAC,YAA0B;QACnF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7D,kDAAkD;QAClD,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1C,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,SAAS,EAAW,YAAY,CAAC,MAAO;YACxC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,+CAA+C,CAAC,YAA0B;QACvF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7D,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1C,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,0CAA0C,CAAC,YAA0B;QAClF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7D,+DAA+D;QAC/D,OAAO;YACL,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC1C,MAAM,EAAc,YAAY,CAAC,MAAO;YACxC,SAAS,EAAW,gBAAgB,CAAC,OAAO;YAC5C,MAAM,EAAc,aAAa,CAAC,KAAK;YACvC,iBAAiB,EAAG,IAAI;YACxB,SAAS,EAAW,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,qBAAqB,CACxC,MAAc,EACd,YAA0B,EAC1B,YAA0B;QAG1B,IAAI,OAAO,CAAC,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,MAAM,YAAY,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;QAED,0HAA0H;QAC1H,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAI,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,gBAAiB,CAAC,EAAE,CAAC;YACpE,MAAM,qBAAqB,CAAC,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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 { authenticate } from '../core/auth.js';
|
|
11
2
|
import { DataStream } from '../utils/data-stream.js';
|
|
12
3
|
import { Encoder } from '../utils/encoder.js';
|
|
@@ -21,147 +12,149 @@ import { RecordsWrite } from '../interfaces/records-write.js';
|
|
|
21
12
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
22
13
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
23
14
|
export class RecordsReadHandler {
|
|
15
|
+
didResolver;
|
|
16
|
+
messageStore;
|
|
17
|
+
dataStore;
|
|
24
18
|
constructor(didResolver, messageStore, dataStore) {
|
|
25
19
|
this.didResolver = didResolver;
|
|
26
20
|
this.messageStore = messageStore;
|
|
27
21
|
this.dataStore = dataStore;
|
|
28
22
|
}
|
|
29
|
-
handle(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
return messageReplyFromError(error, 401);
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
status: { code: 404, detail: 'Not Found' },
|
|
78
|
-
entry: {
|
|
79
|
-
recordsDelete: recordsDeleteMessage,
|
|
80
|
-
initialWrite
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
// else the matched message is a RecordsWrite
|
|
85
|
-
const matchedRecordsWrite = matchedMessage;
|
|
23
|
+
async handle({ tenant, message }) {
|
|
24
|
+
let recordsRead;
|
|
25
|
+
try {
|
|
26
|
+
recordsRead = await RecordsRead.parse(message);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
return messageReplyFromError(e, 400);
|
|
30
|
+
}
|
|
31
|
+
// authentication
|
|
32
|
+
try {
|
|
33
|
+
if (recordsRead.author !== undefined) {
|
|
34
|
+
await authenticate(message.authorization, this.didResolver);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
return messageReplyFromError(e, 401);
|
|
39
|
+
}
|
|
40
|
+
// get the latest active message matching the supplied filter, sorted and limited to 1 result
|
|
41
|
+
const query = {
|
|
42
|
+
// NOTE: we don't filter by `method` so that we get both RecordsWrite and RecordsDelete messages
|
|
43
|
+
interface: DwnInterfaceName.Records,
|
|
44
|
+
isLatestBaseState: true,
|
|
45
|
+
...Records.convertFilter(message.descriptor.filter)
|
|
46
|
+
};
|
|
47
|
+
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
48
|
+
const { messages: existingMessages } = await this.messageStore.query(tenant, [query], messageSort, { limit: 1 });
|
|
49
|
+
if (existingMessages.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
status: { code: 404, detail: 'Not Found' }
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const matchedMessage = existingMessages[0];
|
|
55
|
+
// if the matched message is a RecordsDelete, we mark the record as not-found and return both the RecordsDelete and the initial RecordsWrite
|
|
56
|
+
// TODO: https://github.com/enboxorg/enbox/issues/222
|
|
57
|
+
// Consider performing authorization checks like when records exists before returning RecordsDelete and initial RecordsWrite of a deleted record
|
|
58
|
+
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
59
|
+
const recordsDeleteMessage = matchedMessage;
|
|
60
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.messageStore, tenant, recordsDeleteMessage.descriptor.recordId);
|
|
61
|
+
if (initialWrite === undefined) {
|
|
62
|
+
return messageReplyFromError(new DwnError(DwnErrorCode.RecordsReadInitialWriteNotFound, 'Initial write for deleted record not found'), 400);
|
|
63
|
+
}
|
|
64
|
+
// Perform authorization before returning the delete and initial write messages
|
|
65
|
+
const parsedInitialWrite = await RecordsWrite.parse(initialWrite);
|
|
86
66
|
try {
|
|
87
|
-
|
|
67
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedInitialWrite, this.messageStore);
|
|
88
68
|
}
|
|
89
69
|
catch (error) {
|
|
90
70
|
return messageReplyFromError(error, 401);
|
|
91
71
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
|
|
95
|
-
data = DataStream.fromBytes(dataBytes);
|
|
96
|
-
delete matchedRecordsWrite.encodedData;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
const result = yield this.dataStore.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
100
|
-
if ((result === null || result === void 0 ? void 0 : result.dataStream) === undefined) {
|
|
101
|
-
return {
|
|
102
|
-
status: { code: 404, detail: 'Not Found' }
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
data = result.dataStream;
|
|
106
|
-
}
|
|
107
|
-
const recordsReadReply = {
|
|
108
|
-
status: { code: 200, detail: 'OK' },
|
|
72
|
+
return {
|
|
73
|
+
status: { code: 404, detail: 'Not Found' },
|
|
109
74
|
entry: {
|
|
110
|
-
|
|
111
|
-
|
|
75
|
+
recordsDelete: recordsDeleteMessage,
|
|
76
|
+
initialWrite
|
|
112
77
|
}
|
|
113
78
|
};
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
79
|
+
}
|
|
80
|
+
// else the matched message is a RecordsWrite
|
|
81
|
+
const matchedRecordsWrite = matchedMessage;
|
|
82
|
+
try {
|
|
83
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, await RecordsWrite.parse(matchedRecordsWrite), this.messageStore);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return messageReplyFromError(error, 401);
|
|
87
|
+
}
|
|
88
|
+
let data;
|
|
89
|
+
if (matchedRecordsWrite.encodedData !== undefined) {
|
|
90
|
+
const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
|
|
91
|
+
data = DataStream.fromBytes(dataBytes);
|
|
92
|
+
delete matchedRecordsWrite.encodedData;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const result = await this.dataStore.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
96
|
+
if (result?.dataStream === undefined) {
|
|
97
|
+
return {
|
|
98
|
+
status: { code: 404, detail: 'Not Found' }
|
|
99
|
+
};
|
|
120
100
|
}
|
|
121
|
-
|
|
122
|
-
}
|
|
101
|
+
data = result.dataStream;
|
|
102
|
+
}
|
|
103
|
+
const recordsReadReply = {
|
|
104
|
+
status: { code: 200, detail: 'OK' },
|
|
105
|
+
entry: {
|
|
106
|
+
recordsWrite: matchedRecordsWrite,
|
|
107
|
+
data
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
// attach initial write if latest RecordsWrite is not initial write
|
|
111
|
+
if (!await RecordsWrite.isInitialWrite(matchedRecordsWrite)) {
|
|
112
|
+
const initialWriteQueryResult = await this.messageStore.query(tenant, [{ recordId: matchedRecordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]);
|
|
113
|
+
const initialWrite = initialWriteQueryResult.messages[0];
|
|
114
|
+
delete initialWrite.encodedData; // just defensive because technically should already be deleted when a later RecordsWrite is written
|
|
115
|
+
recordsReadReply.entry.initialWrite = initialWrite;
|
|
116
|
+
}
|
|
117
|
+
return recordsReadReply;
|
|
123
118
|
}
|
|
124
119
|
;
|
|
125
120
|
/**
|
|
126
121
|
* @param messageStore Used to check if the grant has been revoked.
|
|
127
122
|
*/
|
|
128
|
-
static authorizeRecordsRead(tenant, recordsRead, matchedRecordsWrite, messageStore) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
});
|
|
123
|
+
static async authorizeRecordsRead(tenant, recordsRead, matchedRecordsWrite, messageStore) {
|
|
124
|
+
if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
|
|
125
|
+
await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
|
|
126
|
+
}
|
|
127
|
+
const { descriptor } = matchedRecordsWrite.message;
|
|
128
|
+
// if author is the same as the target tenant, we can directly grant access
|
|
129
|
+
if (recordsRead.author === tenant) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
else if (descriptor.published === true) {
|
|
133
|
+
// authentication is not required for published data
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
else if (recordsRead.author !== undefined &&
|
|
137
|
+
(recordsRead.author === descriptor.recipient || recordsRead.author === matchedRecordsWrite.author)) {
|
|
138
|
+
// The recipient or author of a message may always read it
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
else if (recordsRead.author !== undefined && recordsRead.signaturePayload.permissionGrantId !== undefined) {
|
|
142
|
+
const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, recordsRead.signaturePayload.permissionGrantId);
|
|
143
|
+
await RecordsGrantAuthorization.authorizeRead({
|
|
144
|
+
recordsReadMessage: recordsRead.message,
|
|
145
|
+
recordsWriteMessageToBeRead: matchedRecordsWrite.message,
|
|
146
|
+
expectedGrantor: tenant,
|
|
147
|
+
expectedGrantee: recordsRead.author,
|
|
148
|
+
permissionGrant,
|
|
149
|
+
messageStore
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
else if (descriptor.protocol !== undefined) {
|
|
153
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw new DwnError(DwnErrorCode.RecordsReadAuthorizationFailed, 'message failed authorization');
|
|
157
|
+
}
|
|
165
158
|
}
|
|
166
159
|
}
|
|
167
160
|
//# sourceMappingURL=records-read.js.map
|