@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
|
@@ -7,7 +7,6 @@ import type { PublicKeyJwk } from '../types/jose-types.js';
|
|
|
7
7
|
import type {
|
|
8
8
|
DataEncodedRecordsWriteMessage,
|
|
9
9
|
InternalRecordsWriteMessage,
|
|
10
|
-
RecordsWriteAttestationPayload,
|
|
11
10
|
RecordsWriteDescriptor,
|
|
12
11
|
RecordsWriteMessage,
|
|
13
12
|
RecordsWriteSignaturePayload,
|
|
@@ -17,25 +16,35 @@ import type { EncryptionInput, JweEncryption } from '../utils/encryption.js';
|
|
|
17
16
|
import type { GenericMessage, GenericSignaturePayload } from '../types/message-types.js';
|
|
18
17
|
|
|
19
18
|
import { Cid } from '../utils/cid.js';
|
|
20
|
-
import { Encoder } from '../utils/encoder.js';
|
|
21
|
-
import { Encryption } from '../utils/encryption.js';
|
|
22
|
-
import { GeneralJwsBuilder } from '../jose/jws/general/builder.js';
|
|
23
19
|
import { Jws } from '../utils/jws.js';
|
|
24
|
-
import { KeyDerivationScheme } from '../utils/hd-key.js';
|
|
25
20
|
import { Message } from '../core/message.js';
|
|
26
21
|
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
27
22
|
import { Records } from '../utils/records.js';
|
|
28
23
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
29
24
|
import { removeUndefinedProperties } from '../utils/object.js';
|
|
30
25
|
import { Time } from '../utils/time.js';
|
|
26
|
+
import {
|
|
27
|
+
createAttestation,
|
|
28
|
+
createEncryptionProperty,
|
|
29
|
+
createSignerSignature,
|
|
30
|
+
validateAttestationIntegrity,
|
|
31
|
+
} from './records-write-signing.js';
|
|
31
32
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
32
33
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
34
|
+
import {
|
|
35
|
+
fetchInitialRecordsWrite,
|
|
36
|
+
fetchInitialRecordsWriteMessage,
|
|
37
|
+
fetchNewestRecordsWrite,
|
|
38
|
+
getAttesters,
|
|
39
|
+
getInitialWrite,
|
|
40
|
+
verifyEqualityOfImmutableProperties,
|
|
41
|
+
} from './records-write-query.js';
|
|
33
42
|
import { normalizeProtocolUrl, normalizeSchemaUrl, validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../utils/url.js';
|
|
34
43
|
|
|
35
44
|
export type RecordsWriteOptions = {
|
|
36
45
|
recipient?: string;
|
|
37
|
-
protocol
|
|
38
|
-
protocolPath
|
|
46
|
+
protocol: string;
|
|
47
|
+
protocolPath: string;
|
|
39
48
|
protocolRole?: string;
|
|
40
49
|
schema?: string;
|
|
41
50
|
tags?: RecordsWriteTags;
|
|
@@ -43,7 +52,7 @@ export type RecordsWriteOptions = {
|
|
|
43
52
|
|
|
44
53
|
/**
|
|
45
54
|
* Must be given if this message is for a non-root protocol record.
|
|
46
|
-
* If not given, it
|
|
55
|
+
* If not given, it means this write is for a root protocol record.
|
|
47
56
|
*/
|
|
48
57
|
parentContextId?: string;
|
|
49
58
|
|
|
@@ -226,7 +235,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
226
235
|
}
|
|
227
236
|
}
|
|
228
237
|
|
|
229
|
-
this.attesters =
|
|
238
|
+
this.attesters = getAttesters(message);
|
|
230
239
|
|
|
231
240
|
// consider converting isInitialWrite() & getEntryId() into properties for performance and convenience
|
|
232
241
|
}
|
|
@@ -254,7 +263,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
254
263
|
await Message.validateSignatureStructure(message.authorization.ownerSignature, message.descriptor);
|
|
255
264
|
}
|
|
256
265
|
|
|
257
|
-
await
|
|
266
|
+
await validateAttestationIntegrity(message);
|
|
258
267
|
|
|
259
268
|
const recordsWrite = new RecordsWrite(message);
|
|
260
269
|
|
|
@@ -273,12 +282,11 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
273
282
|
* @param options.dateCreated If `undefined`, it will be auto-filled with current time.
|
|
274
283
|
* @param options.messageTimestamp If `undefined`, it will be auto-filled with current time.
|
|
275
284
|
* @param options.parentContextId Must be given if this message is for a non-root protocol record.
|
|
276
|
-
* If not given, it
|
|
285
|
+
* If not given, it means this write is for a root protocol record.
|
|
277
286
|
*/
|
|
278
287
|
public static async create(options: RecordsWriteOptions): Promise<RecordsWrite> {
|
|
279
|
-
if (
|
|
280
|
-
(
|
|
281
|
-
throw new DwnError(DwnErrorCode.RecordsWriteCreateProtocolAndProtocolPathMutuallyInclusive, '`protocol` and `protocolPath` must both be defined or undefined at the same time');
|
|
288
|
+
if (options.protocol === undefined || options.protocolPath === undefined) {
|
|
289
|
+
throw new DwnError(DwnErrorCode.RecordsWriteCreateMissingProtocol, '`protocol` and `protocolPath` are required');
|
|
282
290
|
}
|
|
283
291
|
|
|
284
292
|
if ((options.data === undefined && options.dataCid === undefined) ||
|
|
@@ -303,7 +311,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
303
311
|
const descriptor: RecordsWriteDescriptor = {
|
|
304
312
|
interface : DwnInterfaceName.Records,
|
|
305
313
|
method : DwnMethodName.Write,
|
|
306
|
-
protocol :
|
|
314
|
+
protocol : normalizeProtocolUrl(options.protocol),
|
|
307
315
|
protocolPath : options.protocolPath,
|
|
308
316
|
recipient : options.recipient,
|
|
309
317
|
schema : options.schema !== undefined ? normalizeSchemaUrl(options.schema) : undefined,
|
|
@@ -334,10 +342,10 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
334
342
|
|
|
335
343
|
// `attestation` generation
|
|
336
344
|
const descriptorCid = await Cid.computeCid(descriptor);
|
|
337
|
-
const attestation = await
|
|
345
|
+
const attestation = await createAttestation(descriptorCid, options.attestationSigners);
|
|
338
346
|
|
|
339
347
|
// `encryption` generation
|
|
340
|
-
const encryption = await
|
|
348
|
+
const encryption = await createEncryptionProperty(options.encryptionInput);
|
|
341
349
|
|
|
342
350
|
const message: InternalRecordsWriteMessage = {
|
|
343
351
|
recordId,
|
|
@@ -465,7 +473,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
465
473
|
}
|
|
466
474
|
|
|
467
475
|
// Build only the new recipients (reuses createEncryptionProperty for ECDH-ES+A256KW logic)
|
|
468
|
-
const newEncryption = await
|
|
476
|
+
const newEncryption = await createEncryptionProperty(encryptionInput);
|
|
469
477
|
if (newEncryption) {
|
|
470
478
|
this._message.encryption.recipients.push(...newEncryption.recipients);
|
|
471
479
|
}
|
|
@@ -484,7 +492,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
484
492
|
// the contextKey schema. We chose the in-record approach because it keeps
|
|
485
493
|
// records self-contained and the read/decrypt path unchanged.
|
|
486
494
|
} else {
|
|
487
|
-
this._message.encryption = await
|
|
495
|
+
this._message.encryption = await createEncryptionProperty(encryptionInput);
|
|
488
496
|
|
|
489
497
|
// Full replacement invalidates the authorization — caller must re-sign.
|
|
490
498
|
delete this._message.authorization;
|
|
@@ -521,22 +529,19 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
521
529
|
// compute `recordId` if not given at construction time
|
|
522
530
|
this._message.recordId = this._message.recordId ?? await RecordsWrite.getEntryId(authorDid, descriptor);
|
|
523
531
|
|
|
524
|
-
// compute `contextId`
|
|
525
|
-
if (this.
|
|
526
|
-
//
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
this._message.contextId = this.parentContextId + '/' + this._message.recordId;
|
|
533
|
-
}
|
|
532
|
+
// compute `contextId` — all records belong to a protocol
|
|
533
|
+
if (this.parentContextId === undefined || this.parentContextId === '') {
|
|
534
|
+
// root protocol record
|
|
535
|
+
this._message.contextId = this._message.recordId;
|
|
536
|
+
} else {
|
|
537
|
+
// non-root protocol record
|
|
538
|
+
this._message.contextId = this.parentContextId + '/' + this._message.recordId;
|
|
534
539
|
}
|
|
535
540
|
|
|
536
541
|
// `signature` generation
|
|
537
|
-
const signature = await
|
|
542
|
+
const signature = await createSignerSignature({
|
|
538
543
|
recordId : this._message.recordId,
|
|
539
|
-
contextId : this._message.contextId,
|
|
544
|
+
contextId : this._message.contextId!, // contextId is computed just above, always defined here
|
|
540
545
|
descriptorCid,
|
|
541
546
|
attestation : this._message.attestation,
|
|
542
547
|
encryption : this._message.encryption,
|
|
@@ -580,7 +585,6 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
580
585
|
|
|
581
586
|
this._ownerSignaturePayload = Jws.decodePlainObjectPayload(ownerSignature);
|
|
582
587
|
this._owner = Jws.extractDid(signer.keyId);
|
|
583
|
-
;
|
|
584
588
|
}
|
|
585
589
|
|
|
586
590
|
/**
|
|
@@ -625,9 +629,8 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
625
629
|
);
|
|
626
630
|
}
|
|
627
631
|
|
|
628
|
-
// if the message is
|
|
629
|
-
if (this.message.descriptor.
|
|
630
|
-
this.message.descriptor.parentId === undefined) {
|
|
632
|
+
// if the message is a protocol context root, the `contextId` must match the expected deterministic value
|
|
633
|
+
if (this.message.descriptor.parentId === undefined) {
|
|
631
634
|
const expectedContextId = await this.getEntryId();
|
|
632
635
|
|
|
633
636
|
if (this.message.contextId !== expectedContextId) {
|
|
@@ -690,9 +693,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
690
693
|
}
|
|
691
694
|
}
|
|
692
695
|
|
|
693
|
-
|
|
694
|
-
validateProtocolUrlNormalized(this.message.descriptor.protocol);
|
|
695
|
-
}
|
|
696
|
+
validateProtocolUrlNormalized(this.message.descriptor.protocol);
|
|
696
697
|
if (this.message.descriptor.schema !== undefined) {
|
|
697
698
|
validateSchemaUrlNormalized(this.message.descriptor.schema);
|
|
698
699
|
}
|
|
@@ -704,45 +705,6 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
704
705
|
}
|
|
705
706
|
}
|
|
706
707
|
|
|
707
|
-
/**
|
|
708
|
-
* Validates the structural integrity of the `attestation` property.
|
|
709
|
-
* NOTE: Cryptographic verification of attestation signatures is performed in `authenticate()`.
|
|
710
|
-
*/
|
|
711
|
-
private static async validateAttestationIntegrity(message: RecordsWriteMessage): Promise<void> {
|
|
712
|
-
if (message.attestation === undefined) {
|
|
713
|
-
return;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// TODO: multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/enboxorg/enbox/issues/205)
|
|
717
|
-
if (message.attestation.signatures.length !== 1) {
|
|
718
|
-
throw new DwnError(
|
|
719
|
-
DwnErrorCode.RecordsWriteAttestationIntegrityMoreThanOneSignature,
|
|
720
|
-
`Currently implementation only supports 1 attester, but got ${message.attestation.signatures.length}`
|
|
721
|
-
);
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
const payloadJson = Jws.decodePlainObjectPayload(message.attestation);
|
|
725
|
-
const { descriptorCid } = payloadJson;
|
|
726
|
-
|
|
727
|
-
// `descriptorCid` validation - ensure that the provided descriptorCid matches the CID of the actual message
|
|
728
|
-
const expectedDescriptorCid = await Cid.computeCid(message.descriptor);
|
|
729
|
-
if (descriptorCid !== expectedDescriptorCid) {
|
|
730
|
-
throw new DwnError(
|
|
731
|
-
DwnErrorCode.RecordsWriteAttestationIntegrityDescriptorCidMismatch,
|
|
732
|
-
`descriptorCid ${descriptorCid} does not match expected descriptorCid ${expectedDescriptorCid}`
|
|
733
|
-
);
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
// check to ensure that no other unexpected properties exist in payload.
|
|
737
|
-
const propertyCount = Object.keys(payloadJson).length;
|
|
738
|
-
if (propertyCount > 1) {
|
|
739
|
-
throw new DwnError(
|
|
740
|
-
DwnErrorCode.RecordsWriteAttestationIntegrityInvalidPayloadProperty,
|
|
741
|
-
`Only 'descriptorCid' is allowed in attestation payload, but got ${propertyCount} properties.`
|
|
742
|
-
);
|
|
743
|
-
}
|
|
744
|
-
};
|
|
745
|
-
|
|
746
708
|
/**
|
|
747
709
|
* Computes the deterministic Entry ID of this message.
|
|
748
710
|
*/
|
|
@@ -799,9 +761,9 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
799
761
|
}
|
|
800
762
|
|
|
801
763
|
// add additional indexes to optional values if given
|
|
802
|
-
// TODO: index
|
|
764
|
+
// TODO: index multiple attesters (https://github.com/enboxorg/enbox/issues/223)
|
|
803
765
|
if (this.attesters.length > 0) { indexes.attester = this.attesters[0]; }
|
|
804
|
-
|
|
766
|
+
indexes.contextId = message.contextId;
|
|
805
767
|
|
|
806
768
|
return indexes;
|
|
807
769
|
}
|
|
@@ -811,7 +773,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
811
773
|
* @param messageStore Used to check if the grant has been revoked.
|
|
812
774
|
*/
|
|
813
775
|
public async authorizeAuthorDelegate(messageStore: MessageStore): Promise<void> {
|
|
814
|
-
const delegatedGrant =
|
|
776
|
+
const delegatedGrant = PermissionGrant.parse(this.message.authorization.authorDelegatedGrant!);
|
|
815
777
|
await RecordsGrantAuthorization.authorizeWrite({
|
|
816
778
|
recordsWriteMessage : this.message,
|
|
817
779
|
expectedGrantor : this.author!,
|
|
@@ -826,7 +788,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
826
788
|
* @param messageStore Used to check if the grant has been revoked.
|
|
827
789
|
*/
|
|
828
790
|
public async authorizeOwnerDelegate(messageStore: MessageStore): Promise<void> {
|
|
829
|
-
const delegatedGrant =
|
|
791
|
+
const delegatedGrant = PermissionGrant.parse(this.message.authorization.ownerDelegatedGrant!);
|
|
830
792
|
await RecordsGrantAuthorization.authorizeWrite({
|
|
831
793
|
recordsWriteMessage : this.message,
|
|
832
794
|
expectedGrantor : this.owner!,
|
|
@@ -852,76 +814,15 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
852
814
|
return (entryId === recordsWriteMessage.recordId);
|
|
853
815
|
}
|
|
854
816
|
|
|
855
|
-
/**
|
|
856
|
-
* Creates the JWE `encryption` property if encryption input is given. Else `undefined` is returned.
|
|
857
|
-
* Uses ECDH-ES+A256KW key agreement with X25519 and AEAD content encryption (A256GCM or XC20P).
|
|
858
|
-
* @param descriptor Descriptor of the `RecordsWrite` message which contains the information needed by key path derivation schemes.
|
|
859
|
-
*/
|
|
860
|
-
/**
|
|
861
|
-
* Creates the JWE `encryption` property if encryption input is given. Else `undefined` is returned.
|
|
862
|
-
* Uses ECDH-ES+A256KW key agreement with X25519 and AEAD content encryption (A256GCM or XC20P).
|
|
863
|
-
* @param descriptor Descriptor of the `RecordsWrite` message which contains the information needed by key path derivation schemes.
|
|
864
|
-
* @param encryptionInput The encryption input containing CEK, IV, and recipient key encryption inputs.
|
|
865
|
-
* @param tag The authentication tag from the AEAD content encryption (stored in the JWE, separate from the ciphertext).
|
|
866
|
-
*/
|
|
867
|
-
/**
|
|
868
|
-
* Creates the JWE `encryption` property if encryption input is given. Else `undefined` is returned.
|
|
869
|
-
* Uses ECDH-ES+A256KW key agreement with X25519 and AEAD content encryption (A256GCM or XC20P).
|
|
870
|
-
* @param descriptor Descriptor of the `RecordsWrite` message which contains the information needed by key path derivation schemes.
|
|
871
|
-
* @param encryptionInput The encryption input containing CEK, IV, authentication tag, and recipient key encryption inputs.
|
|
872
|
-
*/
|
|
873
|
-
private static async createEncryptionProperty(
|
|
874
|
-
descriptor: RecordsWriteDescriptor,
|
|
875
|
-
encryptionInput: EncryptionInput | undefined,
|
|
876
|
-
): Promise<JweEncryption | undefined> {
|
|
877
|
-
if (encryptionInput === undefined) {
|
|
878
|
-
return undefined;
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
// Validate derivation scheme prerequisites
|
|
882
|
-
for (const keyEncryptionInput of encryptionInput.keyEncryptionInputs) {
|
|
883
|
-
if (keyEncryptionInput.derivationScheme === KeyDerivationScheme.ProtocolPath && descriptor.protocol === undefined) {
|
|
884
|
-
throw new DwnError(
|
|
885
|
-
DwnErrorCode.RecordsWriteMissingProtocol,
|
|
886
|
-
'`protocols` encryption scheme cannot be applied to record without the `protocol` property.'
|
|
887
|
-
);
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
if (keyEncryptionInput.derivationScheme === KeyDerivationScheme.Schemas && descriptor.schema === undefined) {
|
|
891
|
-
throw new DwnError(
|
|
892
|
-
DwnErrorCode.RecordsWriteMissingSchema,
|
|
893
|
-
'`schemas` encryption scheme cannot be applied to record without the `schema` property.'
|
|
894
|
-
);
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
// Build the JWE structure. The authentication tag comes from the AEAD encryption of record data.
|
|
899
|
-
const jwe = await Encryption.buildJwe(encryptionInput, encryptionInput.authenticationTag);
|
|
900
|
-
|
|
901
|
-
return jwe;
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
/**
|
|
905
|
-
* Creates the `attestation` property of a RecordsWrite message if given signature inputs; returns `undefined` otherwise.
|
|
906
|
-
*/
|
|
817
|
+
/** Delegate to `createAttestation` in `records-write-signing.ts`. */
|
|
907
818
|
public static async createAttestation(descriptorCid: string, signers?: MessageSigner[]): Promise<GeneralJws | undefined> {
|
|
908
|
-
|
|
909
|
-
return undefined;
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
const attestationPayload: RecordsWriteAttestationPayload = { descriptorCid };
|
|
913
|
-
const attestationPayloadBytes = Encoder.objectToBytes(attestationPayload);
|
|
914
|
-
|
|
915
|
-
const builder = await GeneralJwsBuilder.create(attestationPayloadBytes, signers);
|
|
916
|
-
return builder.getJws();
|
|
819
|
+
return createAttestation(descriptorCid, signers);
|
|
917
820
|
}
|
|
918
821
|
|
|
919
|
-
/**
|
|
920
|
-
* Creates the `signature` property in the `authorization` of a `RecordsWrite` message.
|
|
921
|
-
*/
|
|
822
|
+
/** Delegate to `createSignerSignature` in `records-write-signing.ts`. */
|
|
922
823
|
public static async createSignerSignature(input: {
|
|
923
824
|
recordId: string,
|
|
924
|
-
contextId: string
|
|
825
|
+
contextId: string,
|
|
925
826
|
descriptorCid: string,
|
|
926
827
|
attestation: GeneralJws | undefined,
|
|
927
828
|
encryption: JweEncryption | undefined,
|
|
@@ -930,140 +831,44 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
930
831
|
permissionGrantId?: string,
|
|
931
832
|
protocolRole?: string
|
|
932
833
|
}): Promise<GeneralJws> {
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
const attestationCid = attestation ? await Cid.computeCid(attestation) : undefined;
|
|
936
|
-
const encryptionCid = encryption ? await Cid.computeCid(encryption) : undefined;
|
|
937
|
-
|
|
938
|
-
const signaturePayload: RecordsWriteSignaturePayload = {
|
|
939
|
-
recordId,
|
|
940
|
-
descriptorCid,
|
|
941
|
-
contextId,
|
|
942
|
-
attestationCid,
|
|
943
|
-
encryptionCid,
|
|
944
|
-
delegatedGrantId,
|
|
945
|
-
permissionGrantId,
|
|
946
|
-
protocolRole
|
|
947
|
-
};
|
|
948
|
-
removeUndefinedProperties(signaturePayload);
|
|
949
|
-
|
|
950
|
-
const signaturePayloadBytes = Encoder.objectToBytes(signaturePayload);
|
|
951
|
-
|
|
952
|
-
const builder = await GeneralJwsBuilder.create(signaturePayloadBytes, [signer]);
|
|
953
|
-
const signature = builder.getJws();
|
|
954
|
-
|
|
955
|
-
return signature;
|
|
834
|
+
return createSignerSignature(input);
|
|
956
835
|
}
|
|
957
836
|
|
|
958
|
-
/**
|
|
959
|
-
* Gets the initial write from the given list of `RecordsWrite`.
|
|
960
|
-
*/
|
|
837
|
+
/** Delegate to `getInitialWrite` in `records-write-query.ts`. */
|
|
961
838
|
public static async getInitialWrite(messages: GenericMessage[]): Promise<RecordsWriteMessage> {
|
|
962
|
-
|
|
963
|
-
if (await RecordsWrite.isInitialWrite(message)) {
|
|
964
|
-
return message as RecordsWriteMessage;
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
throw new DwnError(DwnErrorCode.RecordsWriteGetInitialWriteNotFound, `Initial write is not found.`);
|
|
839
|
+
return getInitialWrite(messages);
|
|
969
840
|
}
|
|
970
841
|
|
|
971
|
-
/**
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
const mutableDescriptorProperties = ['dataCid', 'dataSize', 'dataFormat', 'datePublished', 'published', 'messageTimestamp', 'tags'];
|
|
977
|
-
|
|
978
|
-
// get distinct property names that exist in either the existing message given or new message
|
|
979
|
-
let descriptorPropertyNames: string[] = [];
|
|
980
|
-
descriptorPropertyNames.push(...Object.keys(existingWriteMessage.descriptor));
|
|
981
|
-
descriptorPropertyNames.push(...Object.keys(newMessage.descriptor));
|
|
982
|
-
descriptorPropertyNames = [...new Set(descriptorPropertyNames)]; // step to remove duplicates
|
|
983
|
-
|
|
984
|
-
// ensure all immutable properties are not modified
|
|
985
|
-
for (const descriptorPropertyName of descriptorPropertyNames) {
|
|
986
|
-
// if property is supposed to be immutable
|
|
987
|
-
if (mutableDescriptorProperties.indexOf(descriptorPropertyName) === -1) {
|
|
988
|
-
const valueInExistingWrite = (existingWriteMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
|
|
989
|
-
const valueInNewMessage = (newMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
|
|
990
|
-
if (valueInNewMessage !== valueInExistingWrite) {
|
|
991
|
-
throw new DwnError(
|
|
992
|
-
DwnErrorCode.RecordsWriteImmutablePropertyChanged,
|
|
993
|
-
`${descriptorPropertyName} is an immutable property: cannot change '${valueInExistingWrite}' to '${valueInNewMessage}'`
|
|
994
|
-
);
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
|
|
999
|
-
return true;
|
|
842
|
+
/** Delegate to `verifyEqualityOfImmutableProperties` in `records-write-query.ts`. */
|
|
843
|
+
public static verifyEqualityOfImmutableProperties(
|
|
844
|
+
existingWriteMessage: RecordsWriteMessage, newMessage: RecordsWriteMessage
|
|
845
|
+
): boolean {
|
|
846
|
+
return verifyEqualityOfImmutableProperties(existingWriteMessage, newMessage);
|
|
1000
847
|
}
|
|
1001
848
|
|
|
1002
|
-
/**
|
|
1003
|
-
* Gets the DID of the attesters of the given message.
|
|
1004
|
-
*/
|
|
849
|
+
/** Delegate to `getAttesters` in `records-write-query.ts`. */
|
|
1005
850
|
public static getAttesters(message: InternalRecordsWriteMessage): string[] {
|
|
1006
|
-
|
|
1007
|
-
const attesters = attestationSignatures.map((signature) => Jws.getSignerDid(signature));
|
|
1008
|
-
return attesters;
|
|
851
|
+
return getAttesters(message);
|
|
1009
852
|
}
|
|
1010
853
|
|
|
854
|
+
/** Delegate to `fetchNewestRecordsWrite` in `records-write-query.ts`. */
|
|
1011
855
|
public static async fetchNewestRecordsWrite(
|
|
1012
|
-
messageStore: MessageStore,
|
|
1013
|
-
tenant: string,
|
|
1014
|
-
recordId: string,
|
|
856
|
+
messageStore: MessageStore, tenant: string, recordId: string,
|
|
1015
857
|
): Promise<RecordsWriteMessage> {
|
|
1016
|
-
|
|
1017
|
-
const query = {
|
|
1018
|
-
interface : DwnInterfaceName.Records,
|
|
1019
|
-
method : DwnMethodName.Write,
|
|
1020
|
-
recordId : recordId
|
|
1021
|
-
};
|
|
1022
|
-
|
|
1023
|
-
const { messages: existingMessages } = await messageStore.query(tenant, [ query ]);
|
|
1024
|
-
const newestWrite = await Message.getNewestMessage(existingMessages);
|
|
1025
|
-
if (newestWrite !== undefined) {
|
|
1026
|
-
return newestWrite as RecordsWriteMessage;
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
throw new DwnError(DwnErrorCode.RecordsWriteGetNewestWriteRecordNotFound, 'record not found');
|
|
858
|
+
return fetchNewestRecordsWrite(messageStore, tenant, recordId);
|
|
1030
859
|
}
|
|
1031
860
|
|
|
1032
|
-
/**
|
|
1033
|
-
* Fetches the initial RecordsWrite of a record.
|
|
1034
|
-
* @returns The initial RecordsWrite if found; `undefined` otherwise.
|
|
1035
|
-
*/
|
|
861
|
+
/** Delegate to `fetchInitialRecordsWrite` in `records-write-query.ts`. */
|
|
1036
862
|
public static async fetchInitialRecordsWrite(
|
|
1037
|
-
messageStore: MessageStore,
|
|
1038
|
-
tenant: string,
|
|
1039
|
-
recordId: string
|
|
863
|
+
messageStore: MessageStore, tenant: string, recordId: string
|
|
1040
864
|
): Promise<RecordsWrite | undefined> {
|
|
1041
|
-
|
|
1042
|
-
const initialRecordsWriteMessage = await RecordsWrite.fetchInitialRecordsWriteMessage(messageStore, tenant, recordId);
|
|
1043
|
-
if (initialRecordsWriteMessage === undefined) {
|
|
1044
|
-
return undefined;
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
const initialRecordsWrite = await RecordsWrite.parse(initialRecordsWriteMessage);
|
|
1048
|
-
return initialRecordsWrite;
|
|
865
|
+
return fetchInitialRecordsWrite(messageStore, tenant, recordId) as Promise<RecordsWrite | undefined>;
|
|
1049
866
|
}
|
|
1050
867
|
|
|
1051
|
-
/**
|
|
1052
|
-
* Fetches the initial RecordsWrite message of a record.
|
|
1053
|
-
* @returns The initial RecordsWriteMessage if found; `undefined` otherwise.
|
|
1054
|
-
*/
|
|
868
|
+
/** Delegate to `fetchInitialRecordsWriteMessage` in `records-write-query.ts`. */
|
|
1055
869
|
public static async fetchInitialRecordsWriteMessage(
|
|
1056
|
-
messageStore: MessageStore,
|
|
1057
|
-
tenant: string,
|
|
1058
|
-
recordId: string
|
|
870
|
+
messageStore: MessageStore, tenant: string, recordId: string
|
|
1059
871
|
): Promise<RecordsWriteMessage | undefined> {
|
|
1060
|
-
|
|
1061
|
-
const { messages } = await messageStore.query(tenant, [query]);
|
|
1062
|
-
|
|
1063
|
-
if (messages.length === 0) {
|
|
1064
|
-
return undefined;
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
return messages[0] as RecordsWriteMessage;
|
|
872
|
+
return fetchInitialRecordsWriteMessage(messageStore, tenant, recordId);
|
|
1068
873
|
}
|
|
1069
874
|
}
|
|
@@ -68,7 +68,7 @@ export class PermissionGrant {
|
|
|
68
68
|
* and that the decoded data contains `scope` and `dateExpires`.
|
|
69
69
|
* @throws {DwnError} if any required field is missing.
|
|
70
70
|
*/
|
|
71
|
-
public static
|
|
71
|
+
public static parse(message: DataEncodedRecordsWriteMessage): PermissionGrant {
|
|
72
72
|
PermissionGrant.validateMessage(message);
|
|
73
73
|
const permissionGrant = new PermissionGrant(message);
|
|
74
74
|
return permissionGrant;
|
|
@@ -49,7 +49,7 @@ export class PermissionRequest {
|
|
|
49
49
|
* and that the decoded data contains `scope`.
|
|
50
50
|
* @throws {DwnError} if any required field is missing.
|
|
51
51
|
*/
|
|
52
|
-
public static
|
|
52
|
+
public static parse(message: DataEncodedRecordsWriteMessage): PermissionRequest {
|
|
53
53
|
PermissionRequest.validateMessage(message);
|
|
54
54
|
const permissionRequest = new PermissionRequest(message);
|
|
55
55
|
return permissionRequest;
|