@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 { 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,60 @@ 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 {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.
|
|
24
|
-
this.dataStore = dataStore;
|
|
12
|
+
deps;
|
|
13
|
+
constructor(deps) {
|
|
14
|
+
this.deps = deps;
|
|
25
15
|
}
|
|
26
|
-
handle(
|
|
27
|
-
|
|
28
|
-
|
|
16
|
+
async handle({ tenant, message }) {
|
|
17
|
+
let recordsQuery;
|
|
18
|
+
try {
|
|
19
|
+
recordsQuery = await RecordsQuery.parse(message);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return messageReplyFromError(e, 400);
|
|
23
|
+
}
|
|
24
|
+
let recordsWrites;
|
|
25
|
+
let cursor;
|
|
26
|
+
// if this is an anonymous query and the filter supports published records, query only published records
|
|
27
|
+
if (Records.filterIncludesPublishedRecords(recordsQuery.message.descriptor.filter) && recordsQuery.author === undefined) {
|
|
28
|
+
const results = await this.fetchPublishedRecords(tenant, recordsQuery);
|
|
29
|
+
recordsWrites = results.messages;
|
|
30
|
+
cursor = results.cursor;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// authentication and authorization
|
|
29
34
|
try {
|
|
30
|
-
|
|
35
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
36
|
+
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps.messageStore, this.deps.coreProtocols);
|
|
31
37
|
}
|
|
32
38
|
catch (e) {
|
|
33
|
-
return messageReplyFromError(e,
|
|
39
|
+
return messageReplyFromError(e, 401);
|
|
34
40
|
}
|
|
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);
|
|
41
|
+
if (recordsQuery.author === tenant) {
|
|
42
|
+
const results = await this.fetchRecordsAsOwner(tenant, recordsQuery);
|
|
40
43
|
recordsWrites = results.messages;
|
|
41
44
|
cursor = results.cursor;
|
|
42
45
|
}
|
|
43
46
|
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
|
-
}
|
|
47
|
+
const results = await this.fetchRecordsAsNonOwner(tenant, recordsQuery);
|
|
48
|
+
recordsWrites = results.messages;
|
|
49
|
+
cursor = results.cursor;
|
|
62
50
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
51
|
+
}
|
|
52
|
+
// attach initial write if returned RecordsWrite is not initial write
|
|
53
|
+
for (const recordsWrite of recordsWrites) {
|
|
54
|
+
if (!await RecordsWrite.isInitialWrite(recordsWrite)) {
|
|
55
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(tenant, [{ recordId: recordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]);
|
|
56
|
+
const initialWrite = initialWriteQueryResult.messages[0];
|
|
57
|
+
delete initialWrite.encodedData; // defensive measure but technically optional because we do this when an update RecordsWrite takes place
|
|
58
|
+
recordsWrite.initialWrite = initialWrite;
|
|
71
59
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
status: { code: 200, detail: 'OK' },
|
|
63
|
+
entries: recordsWrites,
|
|
64
|
+
cursor
|
|
65
|
+
};
|
|
78
66
|
}
|
|
79
67
|
/**
|
|
80
68
|
* Convert an incoming DateSort to a sort type accepted by MessageStore
|
|
@@ -104,14 +92,17 @@ export class RecordsQueryHandler {
|
|
|
104
92
|
/**
|
|
105
93
|
* Fetches the records as the owner of the DWN with no additional filtering.
|
|
106
94
|
*/
|
|
107
|
-
fetchRecordsAsOwner(tenant, recordsQuery) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
95
|
+
async fetchRecordsAsOwner(tenant, recordsQuery) {
|
|
96
|
+
const { dateSort, filter, pagination } = recordsQuery.message.descriptor;
|
|
97
|
+
// fetch all published records matching the query
|
|
98
|
+
const queryFilter = {
|
|
99
|
+
...Records.convertFilter(filter, dateSort),
|
|
100
|
+
interface: DwnInterfaceName.Records,
|
|
101
|
+
method: DwnMethodName.Write,
|
|
102
|
+
isLatestBaseState: true
|
|
103
|
+
};
|
|
104
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
105
|
+
return this.deps.messageStore.query(tenant, [queryFilter], messageSort, pagination);
|
|
115
106
|
}
|
|
116
107
|
/**
|
|
117
108
|
* Fetches the records as a non-owner.
|
|
@@ -132,43 +123,45 @@ export class RecordsQueryHandler {
|
|
|
132
123
|
* 2. unpublished records authorized by a protocol rule.
|
|
133
124
|
*
|
|
134
125
|
*/
|
|
135
|
-
fetchRecordsAsNonOwner(tenant, recordsQuery) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
126
|
+
async fetchRecordsAsNonOwner(tenant, recordsQuery) {
|
|
127
|
+
const { dateSort, pagination, filter } = recordsQuery.message.descriptor;
|
|
128
|
+
const filters = [];
|
|
129
|
+
if (Records.filterIncludesPublishedRecords(filter)) {
|
|
130
|
+
filters.push(RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery));
|
|
131
|
+
}
|
|
132
|
+
if (Records.filterIncludesUnpublishedRecords(filter)) {
|
|
133
|
+
if (Records.shouldBuildUnpublishedAuthorFilter(filter, recordsQuery.author)) {
|
|
134
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery));
|
|
141
135
|
}
|
|
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
|
-
}
|
|
136
|
+
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload)) {
|
|
137
|
+
filters.push(RecordsQueryHandler.buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery));
|
|
138
|
+
}
|
|
139
|
+
if (Records.shouldBuildUnpublishedRecipientFilter(filter, recordsQuery.author)) {
|
|
140
|
+
filters.push(RecordsQueryHandler.buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery));
|
|
152
141
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
}
|
|
143
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
144
|
+
return this.deps.messageStore.query(tenant, filters, messageSort, pagination);
|
|
156
145
|
}
|
|
157
146
|
/**
|
|
158
147
|
* Fetches only published records.
|
|
159
148
|
*/
|
|
160
|
-
fetchPublishedRecords(tenant, recordsQuery) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return this.messageStore.query(tenant, [filter], messageSort, pagination);
|
|
166
|
-
});
|
|
149
|
+
async fetchPublishedRecords(tenant, recordsQuery) {
|
|
150
|
+
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
151
|
+
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
152
|
+
const messageSort = this.convertDateSort(dateSort);
|
|
153
|
+
return this.deps.messageStore.query(tenant, [filter], messageSort, pagination);
|
|
167
154
|
}
|
|
168
155
|
static buildPublishedRecordsFilter(recordsQuery) {
|
|
169
156
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
170
157
|
// fetch all published records matching the query
|
|
171
|
-
return
|
|
158
|
+
return {
|
|
159
|
+
...Records.convertFilter(filter, dateSort),
|
|
160
|
+
interface: DwnInterfaceName.Records,
|
|
161
|
+
method: DwnMethodName.Write,
|
|
162
|
+
published: true,
|
|
163
|
+
isLatestBaseState: true
|
|
164
|
+
};
|
|
172
165
|
}
|
|
173
166
|
/**
|
|
174
167
|
* Creates a filter for unpublished records that are intended for the query author (where `recipient` is the author).
|
|
@@ -176,7 +169,14 @@ export class RecordsQueryHandler {
|
|
|
176
169
|
static buildUnpublishedRecordsForQueryAuthorFilter(recordsQuery) {
|
|
177
170
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
178
171
|
// include records where recipient is query author
|
|
179
|
-
return
|
|
172
|
+
return {
|
|
173
|
+
...Records.convertFilter(filter, dateSort),
|
|
174
|
+
interface: DwnInterfaceName.Records,
|
|
175
|
+
method: DwnMethodName.Write,
|
|
176
|
+
recipient: recordsQuery.author,
|
|
177
|
+
isLatestBaseState: true,
|
|
178
|
+
published: false
|
|
179
|
+
};
|
|
180
180
|
}
|
|
181
181
|
/**
|
|
182
182
|
* Creates a filter for unpublished records that are within the specified protocol.
|
|
@@ -184,7 +184,13 @@ export class RecordsQueryHandler {
|
|
|
184
184
|
*/
|
|
185
185
|
static buildUnpublishedProtocolAuthorizedRecordsFilter(recordsQuery) {
|
|
186
186
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
187
|
-
return
|
|
187
|
+
return {
|
|
188
|
+
...Records.convertFilter(filter, dateSort),
|
|
189
|
+
interface: DwnInterfaceName.Records,
|
|
190
|
+
method: DwnMethodName.Write,
|
|
191
|
+
isLatestBaseState: true,
|
|
192
|
+
published: false
|
|
193
|
+
};
|
|
188
194
|
}
|
|
189
195
|
/**
|
|
190
196
|
* Creates a filter for only unpublished records where the author is the same as the query author.
|
|
@@ -192,23 +198,28 @@ export class RecordsQueryHandler {
|
|
|
192
198
|
static buildUnpublishedRecordsByQueryAuthorFilter(recordsQuery) {
|
|
193
199
|
const { dateSort, filter } = recordsQuery.message.descriptor;
|
|
194
200
|
// include records where author is the same as the query author
|
|
195
|
-
return
|
|
201
|
+
return {
|
|
202
|
+
...Records.convertFilter(filter, dateSort),
|
|
203
|
+
author: recordsQuery.author,
|
|
204
|
+
interface: DwnInterfaceName.Records,
|
|
205
|
+
method: DwnMethodName.Write,
|
|
206
|
+
isLatestBaseState: true,
|
|
207
|
+
published: false
|
|
208
|
+
};
|
|
196
209
|
}
|
|
197
210
|
/**
|
|
198
211
|
* @param messageStore Used to check if the grant has been revoked.
|
|
199
212
|
*/
|
|
200
|
-
static authorizeRecordsQuery(tenant, recordsQuery, messageStore) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
});
|
|
213
|
+
static async authorizeRecordsQuery(tenant, recordsQuery, messageStore, coreProtocols) {
|
|
214
|
+
if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
|
|
215
|
+
await recordsQuery.authorizeDelegate(messageStore);
|
|
216
|
+
}
|
|
217
|
+
// NOTE: not all RecordsQuery messages require protocol authorization even if the filter includes protocol-related fields,
|
|
218
|
+
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
219
|
+
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
220
|
+
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload)) {
|
|
221
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore, coreProtocols);
|
|
222
|
+
}
|
|
212
223
|
}
|
|
213
224
|
}
|
|
214
225
|
//# 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":"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"}
|
|
@@ -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,154 @@ 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 {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
this.dataStore = dataStore;
|
|
15
|
+
deps;
|
|
16
|
+
constructor(deps) {
|
|
17
|
+
this.deps = deps;
|
|
28
18
|
}
|
|
29
|
-
handle(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
async handle({ tenant, message }) {
|
|
20
|
+
let recordsRead;
|
|
21
|
+
try {
|
|
22
|
+
recordsRead = await RecordsRead.parse(message);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return messageReplyFromError(e, 400);
|
|
26
|
+
}
|
|
27
|
+
// authentication
|
|
28
|
+
try {
|
|
29
|
+
if (recordsRead.author !== undefined) {
|
|
30
|
+
await authenticate(message.authorization, this.deps.didResolver);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return messageReplyFromError(e, 401);
|
|
35
|
+
}
|
|
36
|
+
// get the latest active message matching the supplied filter, sorted and limited to 1 result
|
|
37
|
+
const query = {
|
|
38
|
+
// NOTE: we don't filter by `method` so that we get both RecordsWrite and RecordsDelete messages
|
|
39
|
+
interface: DwnInterfaceName.Records,
|
|
40
|
+
isLatestBaseState: true,
|
|
41
|
+
...Records.convertFilter(message.descriptor.filter)
|
|
42
|
+
};
|
|
43
|
+
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
44
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [query], messageSort, { limit: 1 });
|
|
45
|
+
if (existingMessages.length === 0) {
|
|
46
|
+
return {
|
|
47
|
+
status: { code: 404, detail: 'Not Found' }
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const matchedMessage = existingMessages[0];
|
|
51
|
+
// If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
|
|
52
|
+
// (for parity with the live-record path which authorizes against the latest write),
|
|
53
|
+
// then return 404 with both the RecordsDelete and the initial RecordsWrite.
|
|
54
|
+
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
55
|
+
const recordsDeleteMessage = matchedMessage;
|
|
56
|
+
const recordId = recordsDeleteMessage.descriptor.recordId;
|
|
57
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
|
|
58
|
+
if (initialWrite === undefined) {
|
|
59
|
+
return messageReplyFromError(new DwnError(DwnErrorCode.RecordsReadInitialWriteNotFound, 'initial write for deleted record not found'), 400);
|
|
60
|
+
}
|
|
61
|
+
// Authorize against the newest RecordsWrite so that mutable properties like `published`
|
|
62
|
+
// reflect the record's state at the time of deletion, not just the initial write.
|
|
63
|
+
let newestWrite;
|
|
39
64
|
try {
|
|
40
|
-
|
|
41
|
-
yield authenticate(message.authorization, this.didResolver);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
return messageReplyFromError(e, 401);
|
|
46
|
-
}
|
|
47
|
-
// get the latest active message matching the supplied filter, sorted and limited to 1 result
|
|
48
|
-
const query = Object.assign({
|
|
49
|
-
// NOTE: we don't filter by `method` so that we get both RecordsWrite and RecordsDelete messages
|
|
50
|
-
interface: DwnInterfaceName.Records, isLatestBaseState: true }, Records.convertFilter(message.descriptor.filter));
|
|
51
|
-
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
52
|
-
const { messages: existingMessages } = yield this.messageStore.query(tenant, [query], messageSort, { limit: 1 });
|
|
53
|
-
if (existingMessages.length === 0) {
|
|
54
|
-
return {
|
|
55
|
-
status: { code: 404, detail: 'Not Found' }
|
|
56
|
-
};
|
|
65
|
+
newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
|
|
57
66
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
63
|
-
const recordsDeleteMessage = matchedMessage;
|
|
64
|
-
const initialWrite = yield RecordsWrite.fetchInitialRecordsWriteMessage(this.messageStore, tenant, recordsDeleteMessage.descriptor.recordId);
|
|
65
|
-
if (initialWrite === undefined) {
|
|
66
|
-
return messageReplyFromError(new DwnError(DwnErrorCode.RecordsReadInitialWriteNotFound, 'Initial write for deleted record not found'), 400);
|
|
67
|
-
}
|
|
68
|
-
// Perform authorization before returning the delete and initial write messages
|
|
69
|
-
const parsedInitialWrite = yield RecordsWrite.parse(initialWrite);
|
|
70
|
-
try {
|
|
71
|
-
yield RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedInitialWrite, this.messageStore);
|
|
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
|
-
};
|
|
67
|
+
catch {
|
|
68
|
+
// If newest write is not found (should not happen since initial write exists),
|
|
69
|
+
// fall back to the initial write for authorization.
|
|
70
|
+
newestWrite = initialWrite;
|
|
83
71
|
}
|
|
84
|
-
|
|
85
|
-
const matchedRecordsWrite = matchedMessage;
|
|
72
|
+
const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
|
|
86
73
|
try {
|
|
87
|
-
|
|
74
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps.messageStore, this.deps.coreProtocols);
|
|
88
75
|
}
|
|
89
76
|
catch (error) {
|
|
90
77
|
return messageReplyFromError(error, 401);
|
|
91
78
|
}
|
|
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' },
|
|
79
|
+
return {
|
|
80
|
+
status: { code: 404, detail: 'Not Found' },
|
|
109
81
|
entry: {
|
|
110
|
-
|
|
111
|
-
|
|
82
|
+
recordsDelete: recordsDeleteMessage,
|
|
83
|
+
initialWrite,
|
|
112
84
|
}
|
|
113
85
|
};
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
86
|
+
}
|
|
87
|
+
// else the matched message is a RecordsWrite
|
|
88
|
+
const matchedRecordsWrite = matchedMessage;
|
|
89
|
+
try {
|
|
90
|
+
const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
|
|
91
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedWrite, this.deps.messageStore, this.deps.coreProtocols);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return messageReplyFromError(error, 401);
|
|
95
|
+
}
|
|
96
|
+
let data;
|
|
97
|
+
if (matchedRecordsWrite.encodedData !== undefined) {
|
|
98
|
+
const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
|
|
99
|
+
data = DataStream.fromBytes(dataBytes);
|
|
100
|
+
delete matchedRecordsWrite.encodedData;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const result = await this.deps.dataStore.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
104
|
+
if (result?.dataStream === undefined) {
|
|
105
|
+
return {
|
|
106
|
+
status: { code: 404, detail: 'Not Found' }
|
|
107
|
+
};
|
|
120
108
|
}
|
|
121
|
-
|
|
122
|
-
}
|
|
109
|
+
data = result.dataStream;
|
|
110
|
+
}
|
|
111
|
+
const recordsReadReply = {
|
|
112
|
+
status: { code: 200, detail: 'OK' },
|
|
113
|
+
entry: {
|
|
114
|
+
recordsWrite: matchedRecordsWrite,
|
|
115
|
+
data
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
// attach initial write if latest RecordsWrite is not initial write
|
|
119
|
+
if (!await RecordsWrite.isInitialWrite(matchedRecordsWrite)) {
|
|
120
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(tenant, [{ recordId: matchedRecordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]);
|
|
121
|
+
const initialWrite = initialWriteQueryResult.messages[0];
|
|
122
|
+
delete initialWrite.encodedData; // just defensive because technically should already be deleted when a later RecordsWrite is written
|
|
123
|
+
recordsReadReply.entry.initialWrite = initialWrite;
|
|
124
|
+
}
|
|
125
|
+
return recordsReadReply;
|
|
123
126
|
}
|
|
124
127
|
;
|
|
125
128
|
/**
|
|
126
129
|
* @param messageStore Used to check if the grant has been revoked.
|
|
127
130
|
*/
|
|
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
|
-
else {
|
|
162
|
-
throw new DwnError(DwnErrorCode.RecordsReadAuthorizationFailed, 'message failed authorization');
|
|
163
|
-
}
|
|
164
|
-
});
|
|
131
|
+
static async authorizeRecordsRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols) {
|
|
132
|
+
if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
|
|
133
|
+
await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
|
|
134
|
+
}
|
|
135
|
+
const { descriptor } = matchedRecordsWrite.message;
|
|
136
|
+
// if author is the same as the target tenant, we can directly grant access
|
|
137
|
+
if (recordsRead.author === tenant) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
else if (descriptor.published === true) {
|
|
141
|
+
// authentication is not required for published data
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
else if (recordsRead.author !== undefined &&
|
|
145
|
+
(recordsRead.author === descriptor.recipient || recordsRead.author === matchedRecordsWrite.author)) {
|
|
146
|
+
// The recipient or author of a message may always read it
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
else if (recordsRead.author !== undefined && recordsRead.signaturePayload.permissionGrantId !== undefined) {
|
|
150
|
+
const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, recordsRead.signaturePayload.permissionGrantId);
|
|
151
|
+
await RecordsGrantAuthorization.authorizeRead({
|
|
152
|
+
recordsReadMessage: recordsRead.message,
|
|
153
|
+
recordsWriteMessageToBeRead: matchedRecordsWrite.message,
|
|
154
|
+
expectedGrantor: tenant,
|
|
155
|
+
expectedGrantee: recordsRead.author,
|
|
156
|
+
permissionGrant,
|
|
157
|
+
messageStore
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols);
|
|
162
|
+
}
|
|
165
163
|
}
|
|
166
164
|
}
|
|
167
165
|
//# sourceMappingURL=records-read.js.map
|