@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,9 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
3
2
|
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
5
3
|
import type { Filter, PaginationCursor } from '../types/query-types.js';
|
|
6
4
|
import type { GenericMessage, MessageSort } from '../types/message-types.js';
|
|
5
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
7
6
|
import type { RecordsQueryMessage, RecordsQueryReply, RecordsQueryReplyEntry } from '../types/records-types.js';
|
|
8
7
|
|
|
9
8
|
import { authenticate } from '../core/auth.js';
|
|
@@ -19,7 +18,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
19
18
|
|
|
20
19
|
export class RecordsQueryHandler implements MethodHandler {
|
|
21
20
|
|
|
22
|
-
constructor(private
|
|
21
|
+
constructor(private deps: HandlerDependencies) { }
|
|
23
22
|
|
|
24
23
|
public async handle({
|
|
25
24
|
tenant,
|
|
@@ -42,9 +41,9 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
42
41
|
} else {
|
|
43
42
|
// authentication and authorization
|
|
44
43
|
try {
|
|
45
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
44
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
46
45
|
|
|
47
|
-
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.messageStore);
|
|
46
|
+
await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps.messageStore, this.deps.coreProtocols);
|
|
48
47
|
} catch (e) {
|
|
49
48
|
return messageReplyFromError(e, 401);
|
|
50
49
|
}
|
|
@@ -63,7 +62,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
63
62
|
// attach initial write if returned RecordsWrite is not initial write
|
|
64
63
|
for (const recordsWrite of recordsWrites) {
|
|
65
64
|
if (!await RecordsWrite.isInitialWrite(recordsWrite)) {
|
|
66
|
-
const initialWriteQueryResult = await this.messageStore.query(
|
|
65
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(
|
|
67
66
|
tenant,
|
|
68
67
|
[{ recordId: recordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
|
|
69
68
|
);
|
|
@@ -123,7 +122,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
123
122
|
};
|
|
124
123
|
|
|
125
124
|
const messageSort = this.convertDateSort(dateSort);
|
|
126
|
-
return this.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
|
|
125
|
+
return this.deps.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
/**
|
|
@@ -169,7 +168,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
169
168
|
}
|
|
170
169
|
|
|
171
170
|
const messageSort = this.convertDateSort(dateSort);
|
|
172
|
-
return this.messageStore.query(tenant, filters, messageSort, pagination );
|
|
171
|
+
return this.deps.messageStore.query(tenant, filters, messageSort, pagination );
|
|
173
172
|
}
|
|
174
173
|
|
|
175
174
|
/**
|
|
@@ -181,7 +180,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
181
180
|
const { dateSort, pagination } = recordsQuery.message.descriptor;
|
|
182
181
|
const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
|
|
183
182
|
const messageSort = this.convertDateSort(dateSort);
|
|
184
|
-
return this.messageStore.query(tenant, [ filter ], messageSort, pagination);
|
|
183
|
+
return this.deps.messageStore.query(tenant, [ filter ], messageSort, pagination);
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
|
|
@@ -249,7 +248,8 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
249
248
|
private static async authorizeRecordsQuery(
|
|
250
249
|
tenant: string,
|
|
251
250
|
recordsQuery: RecordsQuery,
|
|
252
|
-
messageStore: MessageStore
|
|
251
|
+
messageStore: MessageStore,
|
|
252
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
253
253
|
): Promise<void> {
|
|
254
254
|
|
|
255
255
|
if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
|
|
@@ -260,7 +260,7 @@ export class RecordsQueryHandler implements MethodHandler {
|
|
|
260
260
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
261
261
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
262
262
|
if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload!)) {
|
|
263
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore);
|
|
263
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore, coreProtocols);
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
266
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
3
2
|
import type { Filter } from '../types/query-types.js';
|
|
4
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
5
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
4
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
6
5
|
import type { RecordsDeleteMessage, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply } from '../types/records-types.js';
|
|
7
6
|
|
|
8
7
|
import { authenticate } from '../core/auth.js';
|
|
@@ -21,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
21
20
|
|
|
22
21
|
export class RecordsReadHandler implements MethodHandler {
|
|
23
22
|
|
|
24
|
-
constructor(private
|
|
23
|
+
constructor(private deps: HandlerDependencies) { }
|
|
25
24
|
|
|
26
25
|
public async handle({
|
|
27
26
|
tenant,
|
|
@@ -38,7 +37,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
38
37
|
// authentication
|
|
39
38
|
try {
|
|
40
39
|
if (recordsRead.author !== undefined) {
|
|
41
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
40
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
42
41
|
}
|
|
43
42
|
} catch (e) {
|
|
44
43
|
return messageReplyFromError(e, 401);
|
|
@@ -52,7 +51,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
52
51
|
...Records.convertFilter(message.descriptor.filter)
|
|
53
52
|
};
|
|
54
53
|
const messageSort = Records.convertDateSort(message.descriptor.dateSort);
|
|
55
|
-
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
|
|
54
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
|
|
56
55
|
if (existingMessages.length === 0) {
|
|
57
56
|
return {
|
|
58
57
|
status: { code: 404, detail: 'Not Found' }
|
|
@@ -61,24 +60,35 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
61
60
|
|
|
62
61
|
const matchedMessage = existingMessages[0];
|
|
63
62
|
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
63
|
+
// If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
|
|
64
|
+
// (for parity with the live-record path which authorizes against the latest write),
|
|
65
|
+
// then return 404 with both the RecordsDelete and the initial RecordsWrite.
|
|
67
66
|
if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
|
|
68
67
|
const recordsDeleteMessage = matchedMessage as RecordsDeleteMessage;
|
|
69
|
-
const
|
|
68
|
+
const recordId = recordsDeleteMessage.descriptor.recordId;
|
|
70
69
|
|
|
70
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
|
|
71
71
|
if (initialWrite === undefined) {
|
|
72
72
|
return messageReplyFromError(new DwnError(
|
|
73
73
|
DwnErrorCode.RecordsReadInitialWriteNotFound,
|
|
74
|
-
'
|
|
74
|
+
'initial write for deleted record not found'
|
|
75
75
|
), 400);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
//
|
|
79
|
-
|
|
78
|
+
// Authorize against the newest RecordsWrite so that mutable properties like `published`
|
|
79
|
+
// reflect the record's state at the time of deletion, not just the initial write.
|
|
80
|
+
let newestWrite;
|
|
80
81
|
try {
|
|
81
|
-
await
|
|
82
|
+
newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
|
|
83
|
+
} catch {
|
|
84
|
+
// If newest write is not found (should not happen since initial write exists),
|
|
85
|
+
// fall back to the initial write for authorization.
|
|
86
|
+
newestWrite = initialWrite;
|
|
87
|
+
}
|
|
88
|
+
const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps.messageStore, this.deps.coreProtocols);
|
|
82
92
|
} catch (error) {
|
|
83
93
|
return messageReplyFromError(error, 401);
|
|
84
94
|
}
|
|
@@ -87,7 +97,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
87
97
|
status : { code: 404, detail: 'Not Found' },
|
|
88
98
|
entry : {
|
|
89
99
|
recordsDelete: recordsDeleteMessage,
|
|
90
|
-
initialWrite
|
|
100
|
+
initialWrite,
|
|
91
101
|
}
|
|
92
102
|
};
|
|
93
103
|
}
|
|
@@ -96,7 +106,10 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
96
106
|
const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
|
|
97
107
|
|
|
98
108
|
try {
|
|
99
|
-
|
|
109
|
+
const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
|
|
110
|
+
await RecordsReadHandler.authorizeRecordsRead(
|
|
111
|
+
tenant, recordsRead, parsedWrite, this.deps.messageStore, this.deps.coreProtocols,
|
|
112
|
+
);
|
|
100
113
|
} catch (error) {
|
|
101
114
|
return messageReplyFromError(error, 401);
|
|
102
115
|
}
|
|
@@ -107,7 +120,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
107
120
|
data = DataStream.fromBytes(dataBytes);
|
|
108
121
|
delete matchedRecordsWrite.encodedData;
|
|
109
122
|
} else {
|
|
110
|
-
const result = await this.dataStore
|
|
123
|
+
const result = await this.deps.dataStore!.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
|
|
111
124
|
if (result?.dataStream === undefined) {
|
|
112
125
|
return {
|
|
113
126
|
status: { code: 404, detail: 'Not Found' }
|
|
@@ -126,7 +139,7 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
126
139
|
|
|
127
140
|
// attach initial write if latest RecordsWrite is not initial write
|
|
128
141
|
if (!await RecordsWrite.isInitialWrite(matchedRecordsWrite)) {
|
|
129
|
-
const initialWriteQueryResult = await this.messageStore.query(
|
|
142
|
+
const initialWriteQueryResult = await this.deps.messageStore.query(
|
|
130
143
|
tenant,
|
|
131
144
|
[{ recordId: matchedRecordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
|
|
132
145
|
);
|
|
@@ -145,7 +158,8 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
145
158
|
tenant: string,
|
|
146
159
|
recordsRead: RecordsRead,
|
|
147
160
|
matchedRecordsWrite: RecordsWrite,
|
|
148
|
-
messageStore: MessageStore
|
|
161
|
+
messageStore: MessageStore,
|
|
162
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
149
163
|
): Promise<void> {
|
|
150
164
|
if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
|
|
151
165
|
await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
|
|
@@ -174,10 +188,8 @@ export class RecordsReadHandler implements MethodHandler {
|
|
|
174
188
|
permissionGrant,
|
|
175
189
|
messageStore
|
|
176
190
|
});
|
|
177
|
-
} else if (descriptor.protocol !== undefined) {
|
|
178
|
-
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore);
|
|
179
191
|
} else {
|
|
180
|
-
|
|
192
|
+
await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols);
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CoreProtocolRegistry } from '../core/core-protocol.js';
|
|
2
2
|
import type { MessageSort } from '../types/message-types.js';
|
|
3
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
4
|
-
import type {
|
|
5
|
-
import type { EventListener, EventStream } from '../types/subscriptions.js';
|
|
4
|
+
import type { SubscriptionListener } from '../types/subscriptions.js';
|
|
6
5
|
import type { Filter, PaginationCursor } from '../types/query-types.js';
|
|
7
|
-
import type {
|
|
6
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
7
|
+
import type { RecordsQueryReplyEntry, RecordsSubscribeMessage, RecordsSubscribeReply } from '../types/records-types.js';
|
|
8
8
|
|
|
9
9
|
import { authenticate } from '../core/auth.js';
|
|
10
10
|
import { DateSort } from '../types/records-types.js';
|
|
11
|
-
import { FilterUtility } from '../utils/filter.js';
|
|
12
11
|
import { Message } from '../core/message.js';
|
|
13
12
|
import { messageReplyFromError } from '../core/message-reply.js';
|
|
14
13
|
import { ProtocolAuthorization } from '../core/protocol-authorization.js';
|
|
@@ -21,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
|
|
|
21
20
|
|
|
22
21
|
export class RecordsSubscribeHandler implements MethodHandler {
|
|
23
22
|
|
|
24
|
-
constructor(private
|
|
23
|
+
constructor(private deps: HandlerDependencies) { }
|
|
25
24
|
|
|
26
25
|
public async handle({
|
|
27
26
|
tenant,
|
|
@@ -30,11 +29,11 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
30
29
|
}: {
|
|
31
30
|
tenant: string,
|
|
32
31
|
message: RecordsSubscribeMessage,
|
|
33
|
-
subscriptionHandler:
|
|
32
|
+
subscriptionHandler: SubscriptionListener,
|
|
34
33
|
}): Promise<RecordsSubscribeReply> {
|
|
35
|
-
if (this.
|
|
34
|
+
if (this.deps.eventLog === undefined) {
|
|
36
35
|
return messageReplyFromError(new DwnError(
|
|
37
|
-
DwnErrorCode.
|
|
36
|
+
DwnErrorCode.RecordsSubscribeEventLogUnimplemented,
|
|
38
37
|
'Subscriptions are not supported'
|
|
39
38
|
), 501);
|
|
40
39
|
}
|
|
@@ -59,8 +58,8 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
59
58
|
} else {
|
|
60
59
|
// authentication and authorization
|
|
61
60
|
try {
|
|
62
|
-
await authenticate(message.authorization!, this.didResolver);
|
|
63
|
-
await RecordsSubscribeHandler.authorizeRecordsSubscribe(tenant, recordsSubscribe, this.messageStore);
|
|
61
|
+
await authenticate(message.authorization!, this.deps.didResolver);
|
|
62
|
+
await RecordsSubscribeHandler.authorizeRecordsSubscribe(tenant, recordsSubscribe, this.deps.messageStore, this.deps.coreProtocols);
|
|
64
63
|
} catch (error) {
|
|
65
64
|
return messageReplyFromError(error, 401);
|
|
66
65
|
}
|
|
@@ -74,30 +73,51 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
74
73
|
}
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
const messageCid = await Message.getCid(message);
|
|
77
|
+
const { cursor: eventLogCursor } = recordsSubscribe.message.descriptor;
|
|
78
|
+
|
|
79
|
+
if (eventLogCursor !== undefined) {
|
|
80
|
+
// ---- Cursor mode: catch-up from EventLog + EOSE + live ----
|
|
81
|
+
// All catch-up, buffering, dedup, and EOSE delivery are handled by the
|
|
82
|
+
// EventLog implementation. The handler just passes the cursor and filters.
|
|
83
|
+
// The subscriptionHandler receives SubscriptionMessage (event + EOSE) directly.
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const subscription = await this.deps.eventLog!.subscribe(tenant, messageCid, subscriptionHandler, {
|
|
87
|
+
cursor : eventLogCursor,
|
|
88
|
+
filters : eventFilters,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
status: { code: 200, detail: 'OK' },
|
|
93
|
+
subscription,
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return messageReplyFromError(error, 500);
|
|
81
97
|
}
|
|
82
|
-
}
|
|
98
|
+
}
|
|
83
99
|
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
// ---- No cursor: existing behavior (initial snapshot from MessageStore) ----
|
|
101
|
+
|
|
102
|
+
// Step 1: Register event listener FIRST to ensure no events are missed between query and subscribe
|
|
103
|
+
const subscription = await this.deps.eventLog!.subscribe(tenant, messageCid, subscriptionHandler, {
|
|
104
|
+
filters: eventFilters,
|
|
105
|
+
});
|
|
86
106
|
|
|
87
107
|
// Step 2: Query for initial snapshot of matching records
|
|
88
108
|
let entries: RecordsQueryReplyEntry[];
|
|
89
|
-
let
|
|
109
|
+
let paginationCursor: PaginationCursor | undefined;
|
|
90
110
|
try {
|
|
91
111
|
const { dateSort, pagination } = recordsSubscribe.message.descriptor;
|
|
92
112
|
const messageSort = RecordsSubscribeHandler.convertDateSort(dateSort);
|
|
93
|
-
const queryResult = await this.messageStore.query(tenant, queryFilters, messageSort, pagination);
|
|
113
|
+
const queryResult = await this.deps.messageStore.query(tenant, queryFilters, messageSort, pagination);
|
|
94
114
|
entries = queryResult.messages as RecordsQueryReplyEntry[];
|
|
95
|
-
|
|
115
|
+
paginationCursor = queryResult.cursor;
|
|
96
116
|
|
|
97
117
|
// attach initialWrite for non-initial writes
|
|
98
118
|
for (const entry of entries) {
|
|
99
119
|
if (!await RecordsWrite.isInitialWrite(entry)) {
|
|
100
|
-
const initialWriteResult = await this.messageStore.query(
|
|
120
|
+
const initialWriteResult = await this.deps.messageStore.query(
|
|
101
121
|
tenant,
|
|
102
122
|
[{ recordId: entry.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
|
|
103
123
|
);
|
|
@@ -114,10 +134,10 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
114
134
|
|
|
115
135
|
// Step 3: Return subscription + initial entries + cursor
|
|
116
136
|
return {
|
|
117
|
-
status: { code: 200, detail: 'OK' },
|
|
137
|
+
status : { code: 200, detail: 'OK' },
|
|
118
138
|
subscription,
|
|
119
139
|
entries,
|
|
120
|
-
cursor
|
|
140
|
+
cursor : paginationCursor,
|
|
121
141
|
};
|
|
122
142
|
}
|
|
123
143
|
|
|
@@ -300,7 +320,8 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
300
320
|
public static async authorizeRecordsSubscribe(
|
|
301
321
|
tenant: string,
|
|
302
322
|
recordsSubscribe: RecordsSubscribe,
|
|
303
|
-
messageStore: MessageStore
|
|
323
|
+
messageStore: MessageStore,
|
|
324
|
+
coreProtocols?: CoreProtocolRegistry,
|
|
304
325
|
): Promise<void> {
|
|
305
326
|
|
|
306
327
|
if (Message.isSignedByAuthorDelegate(recordsSubscribe.message)) {
|
|
@@ -311,7 +332,7 @@ export class RecordsSubscribeHandler implements MethodHandler {
|
|
|
311
332
|
// this is because we dynamically filter out records that the caller is not authorized to see.
|
|
312
333
|
// Currently only run protocol authorization if message deliberately invokes a protocol role.
|
|
313
334
|
if (Records.shouldProtocolAuthorize(recordsSubscribe.signaturePayload!)) {
|
|
314
|
-
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsSubscribe, messageStore);
|
|
335
|
+
await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsSubscribe, messageStore, coreProtocols);
|
|
315
336
|
}
|
|
316
337
|
}
|
|
317
338
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import type { DataStore } from '../types/data-store.js';
|
|
2
|
-
import type { DidResolver } from '@enbox/dids';
|
|
3
|
-
import type { EventStream } from '../types/subscriptions.js';
|
|
4
1
|
import type { GenericMessageReply } from '../types/message-types.js';
|
|
5
2
|
import type { MessageStore } from '../types/message-store.js';
|
|
6
|
-
import type { MethodHandler } from '../types/method-handler.js';
|
|
7
|
-
import type { StateIndex } from '../types/state-index.js';
|
|
3
|
+
import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
|
|
8
4
|
import type { RecordsQueryReplyEntry, RecordsWriteMessage } from '../types/records-types.js';
|
|
9
5
|
|
|
10
6
|
import { authenticate } from '../core/auth.js';
|
|
@@ -26,13 +22,7 @@ type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?:
|
|
|
26
22
|
|
|
27
23
|
export class RecordsWriteHandler implements MethodHandler {
|
|
28
24
|
|
|
29
|
-
constructor(
|
|
30
|
-
private didResolver: DidResolver,
|
|
31
|
-
private messageStore: MessageStore,
|
|
32
|
-
private dataStore: DataStore,
|
|
33
|
-
private stateIndex: StateIndex,
|
|
34
|
-
private eventStream?: EventStream
|
|
35
|
-
) { }
|
|
25
|
+
constructor(private deps: HandlerDependencies) { }
|
|
36
26
|
|
|
37
27
|
public async handle({
|
|
38
28
|
tenant,
|
|
@@ -43,18 +33,15 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
43
33
|
try {
|
|
44
34
|
recordsWrite = await RecordsWrite.parse(message);
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
if (message.descriptor.protocol !== undefined) {
|
|
48
|
-
await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.messageStore);
|
|
49
|
-
}
|
|
36
|
+
await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.messageStore, this.deps.coreProtocols);
|
|
50
37
|
} catch (e) {
|
|
51
38
|
return messageReplyFromError(e, 400);
|
|
52
39
|
}
|
|
53
40
|
|
|
54
41
|
// authentication & authorization
|
|
55
42
|
try {
|
|
56
|
-
await authenticate(message.authorization, this.didResolver, message.attestation);
|
|
57
|
-
await
|
|
43
|
+
await authenticate(message.authorization, this.deps.didResolver, message.attestation);
|
|
44
|
+
await this.authorizeRecordsWrite(tenant, recordsWrite, this.deps.messageStore);
|
|
58
45
|
} catch (e) {
|
|
59
46
|
return messageReplyFromError(e, 401);
|
|
60
47
|
}
|
|
@@ -64,7 +51,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
64
51
|
interface : DwnInterfaceName.Records,
|
|
65
52
|
recordId : message.recordId
|
|
66
53
|
};
|
|
67
|
-
const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
|
|
54
|
+
const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
|
|
68
55
|
|
|
69
56
|
// if the incoming write is not the initial write, then it must not modify any immutable properties defined by the initial write
|
|
70
57
|
const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
|
|
@@ -95,6 +82,12 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
95
82
|
};
|
|
96
83
|
}
|
|
97
84
|
|
|
85
|
+
// Look up the core protocol (if any) for the incoming message so that lifecycle hooks
|
|
86
|
+
// can be dispatched generically rather than checking for specific protocol URIs.
|
|
87
|
+
const coreProtocol = message.descriptor.protocol !== undefined
|
|
88
|
+
? this.deps.coreProtocols?.get(message.descriptor.protocol)
|
|
89
|
+
: undefined;
|
|
90
|
+
|
|
98
91
|
try {
|
|
99
92
|
if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
|
|
100
93
|
throw new DwnError(
|
|
@@ -103,11 +96,12 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
103
96
|
);
|
|
104
97
|
}
|
|
105
98
|
|
|
106
|
-
//
|
|
107
|
-
// This
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
99
|
+
// Dispatch pre-processing hooks to the core protocol, if applicable.
|
|
100
|
+
// This allows core protocols to perform cross-record validation before storage
|
|
101
|
+
// (e.g. ensuring revocation tag consistency with the parent grant's scoped protocol).
|
|
102
|
+
if (coreProtocol?.preProcessWrite !== undefined) {
|
|
103
|
+
await coreProtocol.preProcessWrite(tenant, message, this.deps.messageStore);
|
|
104
|
+
}
|
|
111
105
|
|
|
112
106
|
// NOTE: We allow isLatestBaseState to be true ONLY if the incoming message comes with data, or if the incoming message is NOT an initial write
|
|
113
107
|
// This would allow an initial write to be written to the DB without data, but having it not queryable,
|
|
@@ -133,14 +127,14 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
133
127
|
}
|
|
134
128
|
|
|
135
129
|
const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
|
|
136
|
-
await this.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
|
|
137
|
-
await this.stateIndex
|
|
130
|
+
await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
|
|
131
|
+
await this.deps.stateIndex!.insert(tenant, await Message.getCid(message), indexes);
|
|
138
132
|
|
|
139
133
|
// NOTE: We only emit a `RecordsWrite` when the message is the latest base state.
|
|
140
134
|
// Because we allow a `RecordsWrite` which is not the latest state to be written, but not queried, we shouldn't emit it either.
|
|
141
135
|
// It will be emitted as a part of a subsequent next write, if it is the latest base state.
|
|
142
|
-
if (this.
|
|
143
|
-
this.
|
|
136
|
+
if (this.deps.eventLog !== undefined && isLatestBaseState) {
|
|
137
|
+
await this.deps.eventLog.emit(tenant, { message, initialWrite }, indexes);
|
|
144
138
|
}
|
|
145
139
|
} catch (error) {
|
|
146
140
|
if (error instanceof DwnError) {
|
|
@@ -149,8 +143,8 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
149
143
|
error.code === DwnErrorCode.RecordsWriteNotAllowedAfterDelete ||
|
|
150
144
|
error.code === DwnErrorCode.RecordsWriteDataCidMismatch ||
|
|
151
145
|
error.code === DwnErrorCode.RecordsWriteDataSizeMismatch ||
|
|
152
|
-
error.code.startsWith('
|
|
153
|
-
error.code
|
|
146
|
+
error.code.startsWith('SchemaValidator') ||
|
|
147
|
+
this.deps.coreProtocols?.mapErrorToStatusCode(error.code) !== undefined) {
|
|
154
148
|
return messageReplyFromError(error, 400);
|
|
155
149
|
}
|
|
156
150
|
}
|
|
@@ -170,78 +164,23 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
170
164
|
|
|
171
165
|
// delete all existing messages of the same record that are not newest, except for the initial write
|
|
172
166
|
await StorageController.deleteAllOlderMessagesButKeepInitialWrite(
|
|
173
|
-
tenant, existingMessages, newestMessage, this.messageStore, this.dataStore
|
|
167
|
+
tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!, this.deps.stateIndex!
|
|
174
168
|
);
|
|
175
169
|
|
|
176
|
-
|
|
170
|
+
// Dispatch post-processing hooks to the core protocol, if applicable.
|
|
171
|
+
// This allows core protocols to perform cascading side effects after a successful write
|
|
172
|
+
// (e.g. deleting messages authorized by a revoked grant).
|
|
173
|
+
if (coreProtocol?.postProcessWrite !== undefined) {
|
|
174
|
+
await coreProtocol.postProcessWrite(tenant, recordsWrite, {
|
|
175
|
+
messageStore : this.deps.messageStore,
|
|
176
|
+
dataStore : this.deps.dataStore!,
|
|
177
|
+
stateIndex : this.deps.stateIndex!,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
177
180
|
|
|
178
181
|
return messageReply;
|
|
179
182
|
};
|
|
180
183
|
|
|
181
|
-
/**
|
|
182
|
-
* Performs additional necessary validation before storing the RecordsWrite if it is a core DWN RecordsWrite that needs additional processing.
|
|
183
|
-
* For instance: a Permission revocation RecordsWrite.
|
|
184
|
-
*/
|
|
185
|
-
private async preProcessingForCoreRecordsWrite(tenant: string, recordsWriteMessage: RecordsWriteMessage): Promise<void> {
|
|
186
|
-
|
|
187
|
-
// we validate the protocol tag of the revocation message against the grant's scoped protocol
|
|
188
|
-
// to do this we will fetch the grant, and compare the the scoped protocol value to the protocol tag of the revocation message
|
|
189
|
-
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri &&
|
|
190
|
-
recordsWriteMessage.descriptor.protocolPath === PermissionsProtocol.revocationPath) {
|
|
191
|
-
|
|
192
|
-
// get the parentId of the revocation message, which is the permissionGrantId
|
|
193
|
-
// fetch the grant in order to get the grant's protocol
|
|
194
|
-
const permissionGrantId = recordsWriteMessage.descriptor.parentId!;
|
|
195
|
-
const grant = await PermissionsProtocol.fetchGrant(tenant, this.messageStore, permissionGrantId);
|
|
196
|
-
|
|
197
|
-
// get the protocol values of the revocation message from the protocol tag and the protocol from the grant scope if they are defined
|
|
198
|
-
// compare the two values ensuring they must match
|
|
199
|
-
const revokeTagProtocol = recordsWriteMessage.descriptor.tags?.protocol;
|
|
200
|
-
const grantProtocol = 'protocol' in grant.scope ? grant.scope.protocol : undefined;
|
|
201
|
-
if (grantProtocol !== revokeTagProtocol) {
|
|
202
|
-
throw new DwnError(
|
|
203
|
-
DwnErrorCode.PermissionsProtocolValidateRevocationProtocolTagMismatch,
|
|
204
|
-
`Revocation protocol ${revokeTagProtocol} does not match grant protocol ${grantProtocol}`
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
private static validateSchemaForCoreRecordsWrite(recordsWriteMessage: RecordsWriteMessage, dataBytes: Uint8Array): void {
|
|
211
|
-
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
212
|
-
PermissionsProtocol.validateSchema(recordsWriteMessage, dataBytes);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Performs additional necessary tasks if the RecordsWrite handled is a core DWN RecordsWrite that need additional processing.
|
|
218
|
-
* For instance: a Permission revocation RecordsWrite.
|
|
219
|
-
*/
|
|
220
|
-
private async postProcessingForCoreRecordsWrite(tenant: string, recordsWrite: RecordsWrite): Promise<void> {
|
|
221
|
-
// If this message is a Permission revocation, we need to delete all grant-authorized messages with timestamp after revocation
|
|
222
|
-
// TODO: https://github.com/enboxorg/enbox/issues/716
|
|
223
|
-
// This code is a direct copy and paste from the original PermissionsRevokeHandler (no longer exists),
|
|
224
|
-
// but it appears that there was no test for it and it does not look like the code worked:
|
|
225
|
-
// - not seeing `permissionGrantId` being an index
|
|
226
|
-
// - not seeing `this.dataStore` being called to delete actual data
|
|
227
|
-
// - test coverage is missing for the main delete logic
|
|
228
|
-
if (recordsWrite.message.descriptor.protocol === PermissionsProtocol.uri &&
|
|
229
|
-
recordsWrite.message.descriptor.protocolPath === PermissionsProtocol.revocationPath) {
|
|
230
|
-
const permissionGrantId = recordsWrite.message.descriptor.parentId!;
|
|
231
|
-
const grantAuthorizedMessagesQuery = {
|
|
232
|
-
permissionGrantId,
|
|
233
|
-
dateCreated: { gte: recordsWrite.message.descriptor.messageTimestamp },
|
|
234
|
-
};
|
|
235
|
-
const { messages: grantAuthorizedMessagesAfterRevoke } = await this.messageStore.query(tenant, [ grantAuthorizedMessagesQuery ]);
|
|
236
|
-
const grantAuthorizedMessageCidsAfterRevoke: string[] = [];
|
|
237
|
-
for (const grantAuthorizedMessage of grantAuthorizedMessagesAfterRevoke) {
|
|
238
|
-
const messageCid = await Message.getCid(grantAuthorizedMessage);
|
|
239
|
-
await this.messageStore.delete(tenant, messageCid);
|
|
240
|
-
}
|
|
241
|
-
this.stateIndex.delete(tenant, grantAuthorizedMessageCidsAfterRevoke);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
184
|
/**
|
|
246
185
|
* Returns a `RecordsQueryReplyEntry` with a copy of the incoming message and the incoming data encoded to `Base64URL`.
|
|
247
186
|
*/
|
|
@@ -265,7 +204,13 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
265
204
|
const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
|
|
266
205
|
RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
|
|
267
206
|
|
|
268
|
-
|
|
207
|
+
// Dispatch schema validation to the core protocol, if applicable.
|
|
208
|
+
const coreProtocol = message.descriptor.protocol !== undefined
|
|
209
|
+
? this.deps.coreProtocols?.get(message.descriptor.protocol)
|
|
210
|
+
: undefined;
|
|
211
|
+
if (coreProtocol?.validateRecord !== undefined) {
|
|
212
|
+
coreProtocol.validateRecord(message, dataBytes);
|
|
213
|
+
}
|
|
269
214
|
|
|
270
215
|
messageWithOptionalEncodedData = await this.cloneAndAddEncodedData(message, dataBytes);
|
|
271
216
|
} else {
|
|
@@ -276,13 +221,13 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
276
221
|
// perform storage and CID computation in parallel
|
|
277
222
|
const [dataCid, DataStorePutResult] = await Promise.all([
|
|
278
223
|
Cid.computeDagPbCidFromStream(dataStreamCopy1),
|
|
279
|
-
this.dataStore
|
|
224
|
+
this.deps.dataStore!.put(tenant, message.recordId, message.descriptor.dataCid, dataStreamCopy2)
|
|
280
225
|
]);
|
|
281
226
|
|
|
282
227
|
RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, DataStorePutResult.dataSize);
|
|
283
228
|
} catch (error) {
|
|
284
229
|
// unwind/delete data if we have issue with storage or the data failed integrity validation
|
|
285
|
-
await this.dataStore
|
|
230
|
+
await this.deps.dataStore!.delete(tenant, message.recordId, message.descriptor.dataCid);
|
|
286
231
|
|
|
287
232
|
throw error;
|
|
288
233
|
}
|
|
@@ -319,7 +264,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
319
264
|
// else just make sure the data is in the data store
|
|
320
265
|
|
|
321
266
|
// attempt to retrieve the data from the previous message
|
|
322
|
-
const DataStoreGetResult = await this.dataStore
|
|
267
|
+
const DataStoreGetResult = await this.deps.dataStore!.get(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
|
|
323
268
|
|
|
324
269
|
if (DataStoreGetResult === undefined) {
|
|
325
270
|
throw new DwnError(
|
|
@@ -361,7 +306,7 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
361
306
|
}
|
|
362
307
|
}
|
|
363
308
|
|
|
364
|
-
private
|
|
309
|
+
private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite, messageStore: MessageStore): Promise<void> {
|
|
365
310
|
// if owner signature is given (`owner` is not `undefined`), it must be the same as the tenant DID
|
|
366
311
|
if (recordsWrite.owner !== undefined && recordsWrite.owner !== tenant) {
|
|
367
312
|
throw new DwnError(
|
|
@@ -394,10 +339,8 @@ export class RecordsWriteHandler implements MethodHandler {
|
|
|
394
339
|
permissionGrant,
|
|
395
340
|
messageStore
|
|
396
341
|
});
|
|
397
|
-
} else if (recordsWrite.message.descriptor.protocol !== undefined) {
|
|
398
|
-
await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore);
|
|
399
342
|
} else {
|
|
400
|
-
|
|
343
|
+
await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore, this.deps.coreProtocols);
|
|
401
344
|
}
|
|
402
345
|
}
|
|
403
346
|
}
|