@enbox/dwn-sdk-js 0.0.2 → 0.0.3
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/README.md +52 -301
- package/dist/bundles/dwn.js +19 -21
- package/dist/esm/generated/precompiled-validators.js +2764 -1773
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +27 -3
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +17 -6
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +245 -69
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +4 -4
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/dwn.js +10 -8
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/enums/dwn-interface-method.js +4 -2
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -0
- package/dist/esm/src/handlers/messages-subscribe.js +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +116 -0
- package/dist/esm/src/handlers/messages-sync.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +149 -16
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +2 -2
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +143 -0
- package/dist/esm/src/handlers/records-count.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +4 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +4 -6
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +17 -18
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +9 -5
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +2 -7
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/{messages-query.js → messages-sync.js} +11 -12
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +153 -30
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +1 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +91 -0
- package/dist/esm/src/interfaces/records-count.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +15 -1
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +64 -15
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +30 -0
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +24 -0
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +1 -1
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/schema-validator.js +0 -1
- package/dist/esm/src/schema-validator.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +125 -0
- package/dist/esm/src/smt/smt-store-level.js.map +1 -0
- package/dist/esm/src/smt/smt-store-memory.js +67 -0
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -0
- package/dist/esm/src/smt/smt-utils.js +146 -0
- package/dist/esm/src/smt/smt-utils.js.map +1 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js +622 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -0
- package/dist/esm/src/state-index/state-index-level.js +228 -0
- package/dist/esm/src/state-index/state-index-level.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +6 -6
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level.js +375 -17
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +56 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +19 -16
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/encryption-types.js +2 -0
- package/dist/esm/src/types/encryption-types.js.map +1 -0
- package/dist/esm/src/types/message-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +0 -2
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js +2 -0
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/types/smt-types.js +5 -0
- package/dist/esm/src/types/smt-types.js.map +1 -0
- package/dist/esm/src/types/state-index.js +2 -0
- package/dist/esm/src/types/state-index.js.map +1 -0
- package/dist/esm/src/utils/cid.js +2 -1
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +84 -29
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +22 -31
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +3 -3
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +4 -4
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +4 -3
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +82 -9
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +82 -26
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +4 -3
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +3 -2
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +1 -1
- package/dist/esm/src/utils/url.js +1 -1
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +2 -2
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message-reply.spec.js +3 -3
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +13 -13
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +3 -3
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +27 -37
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/{event-log → event-stream}/event-emitter-stream.spec.js +14 -15
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -0
- package/dist/esm/tests/{event-log → event-stream}/event-stream.spec.js +13 -15
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +281 -135
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +57 -59
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +32 -34
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +73 -95
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +1645 -0
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-create-action.spec.js +25 -27
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +42 -44
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +53 -55
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +126 -100
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +272 -272
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +35 -37
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +112 -112
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +78 -76
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +528 -0
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +545 -152
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +70 -72
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +313 -0
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +106 -109
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +863 -463
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +439 -209
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +292 -97
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +481 -483
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +31 -11
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +5 -5
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +64 -134
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +4 -6
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +3 -5
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +9 -11
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +76 -7
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +7 -9
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +244 -48
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +15 -18
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +114 -0
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -0
- package/dist/esm/tests/protocols/permission-request.spec.js +43 -7
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +9 -11
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +90 -92
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +17 -19
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +27 -29
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +37 -39
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +163 -163
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +143 -0
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +741 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js +254 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-level.spec.js +136 -0
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-mock.spec.js +29 -28
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +23 -25
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +544 -194
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +4 -4
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +147 -73
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/store-dependent-tests.spec.js +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -1
- package/dist/esm/tests/test-stores.js +5 -5
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +9 -8
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +8 -11
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +167 -13
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +233 -0
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +34 -85
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +67 -69
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +3 -3
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +54 -3
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +6 -9
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +63 -29
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/object.spec.js +3 -3
- package/dist/esm/tests/utils/object.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +1 -1
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +6 -6
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +37 -5
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +47 -28
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/time.spec.js +7 -7
- package/dist/esm/tests/utils/time.spec.js.map +1 -1
- package/dist/esm/tests/utils/url.spec.js +25 -27
- package/dist/esm/tests/utils/url.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +4 -4
- 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 +15 -3
- 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 -8
- 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 +8 -18
- 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 +3 -3
- 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 +9 -9
- 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 +106 -0
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +18 -18
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/email.json +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +2 -4
- package/dist/esm/tests/vectors/protocol-definitions/slack.json +2 -6
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +2 -6
- package/dist/types/generated/precompiled-validators.d.ts +82 -64
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +27 -3
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/message-reply.d.ts +1 -1
- package/dist/types/src/core/message.d.ts +3 -3
- package/dist/types/src/core/message.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +4 -4
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +43 -2
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/records-grant-authorization.d.ts +2 -2
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +8 -8
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts +5 -3
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-sync.d.ts +21 -0
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +24 -4
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +43 -0
- package/dist/types/src/handlers/records-count.d.ts.map +1 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +5 -5
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +72 -37
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-read.d.ts +2 -2
- package/dist/types/src/interfaces/messages-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +16 -0
- package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +22 -2
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-count.d.ts +27 -0
- package/dist/types/src/interfaces/records-count.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-delete.d.ts +2 -2
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-query.d.ts +2 -2
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-read.d.ts +4 -2
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +37 -15
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +5 -1
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -1
- package/dist/types/src/jose/jws/general/builder.d.ts +3 -3
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +11 -0
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +11 -0
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +4 -4
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/schema-validator.d.ts +1 -1
- package/dist/types/src/schema-validator.d.ts.map +1 -1
- package/dist/types/src/smt/smt-store-level.d.ts +32 -0
- package/dist/types/src/smt/smt-store-level.d.ts.map +1 -0
- package/dist/types/src/smt/smt-store-memory.d.ts +22 -0
- package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -0
- package/dist/types/src/smt/smt-utils.d.ts +58 -0
- package/dist/types/src/smt/smt-utils.d.ts.map +1 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +124 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -0
- package/dist/types/src/state-index/state-index-level.d.ts +83 -0
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +1 -2
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +98 -2
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +5 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +7 -7
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/data-store.d.ts +2 -3
- package/dist/types/src/types/data-store.d.ts.map +1 -1
- package/dist/types/src/types/encryption-types.d.ts +48 -0
- package/dist/types/src/types/encryption-types.d.ts.map +1 -0
- package/dist/types/src/types/jose-types.d.ts +9 -40
- package/dist/types/src/types/jose-types.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +5 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +19 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +16 -11
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +1 -2
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +2 -2
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +49 -5
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +23 -7
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/signer.d.ts +1 -1
- package/dist/types/src/types/signer.d.ts.map +1 -1
- package/dist/types/src/types/smt-types.d.ts +81 -0
- package/dist/types/src/types/smt-types.d.ts.map +1 -0
- package/dist/types/src/types/state-index.d.ts +90 -0
- package/dist/types/src/types/state-index.d.ts.map +1 -0
- package/dist/types/src/utils/cid.d.ts +1 -2
- package/dist/types/src/utils/cid.d.ts.map +1 -1
- package/dist/types/src/utils/data-stream.d.ts +14 -7
- package/dist/types/src/utils/data-stream.d.ts.map +1 -1
- package/dist/types/src/utils/encryption.d.ts +2 -3
- package/dist/types/src/utils/encryption.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +4 -4
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/jws.d.ts +7 -7
- package/dist/types/src/utils/jws.d.ts.map +1 -1
- package/dist/types/src/utils/private-key-signer.d.ts +4 -4
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +46 -3
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +33 -6
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/secp256k1.d.ts +11 -11
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
- package/dist/types/src/utils/secp256r1.d.ts +8 -8
- package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
- package/dist/types/src/utils/time.d.ts +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/event-stream/event-stream.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 +5 -0
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
- 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 +2 -0
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -0
- 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/protocols/permission-grant.spec.d.ts +2 -0
- package/dist/types/tests/protocols/permission-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
- package/dist/types/tests/smt/smt-store-level.spec.d.ts +2 -0
- package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +2 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +1 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts +2 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts +2 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
- package/dist/types/tests/test-stores.d.ts +4 -4
- package/dist/types/tests/test-stores.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/encryption-callbacks.spec.d.ts +2 -0
- package/dist/types/tests/utils/encryption-callbacks.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +31 -28
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts.map +1 -0
- package/package.json +27 -46
- package/src/core/dwn-error.ts +27 -3
- package/src/core/message-reply.ts +1 -1
- package/src/core/message.ts +5 -5
- package/src/core/messages-grant-authorization.ts +22 -8
- package/src/core/protocol-authorization.ts +345 -68
- package/src/core/records-grant-authorization.ts +2 -2
- package/src/core/resumable-task-manager.ts +4 -5
- package/src/dwn.ts +25 -20
- package/src/enums/dwn-interface-method.ts +5 -3
- package/src/handlers/messages-subscribe.ts +1 -1
- package/src/handlers/messages-sync.ts +129 -0
- package/src/handlers/protocols-configure.ts +195 -17
- package/src/handlers/protocols-query.ts +7 -5
- package/src/handlers/records-count.ts +184 -0
- package/src/handlers/records-query.ts +4 -0
- package/src/handlers/records-read.ts +4 -8
- package/src/handlers/records-write.ts +20 -21
- package/src/index.ts +74 -37
- package/src/interfaces/messages-read.ts +6 -5
- package/src/interfaces/messages-subscribe.ts +7 -6
- package/src/interfaces/messages-sync.ts +59 -0
- package/src/interfaces/protocols-configure.ts +211 -33
- package/src/interfaces/protocols-query.ts +7 -6
- package/src/interfaces/records-count.ts +106 -0
- package/src/interfaces/records-delete.ts +2 -2
- package/src/interfaces/records-query.ts +2 -2
- package/src/interfaces/records-read.ts +26 -3
- package/src/interfaces/records-subscribe.ts +2 -2
- package/src/interfaces/records-write.ts +115 -46
- package/src/jose/algorithms/signing/ed25519.ts +13 -12
- package/src/jose/algorithms/signing/signature-algorithms.ts +6 -1
- package/src/jose/jws/general/builder.ts +3 -3
- package/src/jose/jws/general/verifier.ts +3 -3
- package/src/protocols/permission-grant.ts +51 -0
- package/src/protocols/permission-request.ts +37 -0
- package/src/protocols/permissions.ts +5 -5
- package/src/schema-validator.ts +11 -3
- package/src/smt/smt-store-level.ts +143 -0
- package/src/smt/smt-store-memory.ts +53 -0
- package/src/smt/smt-utils.ts +149 -0
- package/src/smt/sparse-merkle-tree.ts +698 -0
- package/src/state-index/state-index-level.ts +241 -0
- package/src/store/data-store-level.ts +8 -7
- package/src/store/index-level.ts +415 -19
- package/src/store/level-wrapper.ts +1 -1
- package/src/store/message-store-level.ts +62 -0
- package/src/store/storage-controller.ts +21 -19
- package/src/types/data-store.ts +2 -4
- package/src/types/encryption-types.ts +52 -0
- package/src/types/jose-types.ts +10 -42
- package/src/types/message-store.ts +11 -0
- package/src/types/message-types.ts +21 -0
- package/src/types/messages-types.ts +21 -15
- package/src/types/method-handler.ts +1 -2
- package/src/types/permission-types.ts +2 -2
- package/src/types/protocols-types.ts +55 -6
- package/src/types/records-types.ts +26 -7
- package/src/types/signer.ts +1 -1
- package/src/types/smt-types.ts +95 -0
- package/src/types/state-index.ts +100 -0
- package/src/utils/cid.ts +3 -4
- package/src/utils/data-stream.ts +75 -38
- package/src/utils/encryption.ts +24 -39
- package/src/utils/hd-key.ts +6 -6
- package/src/utils/jws.ts +9 -9
- package/src/utils/private-key-signer.ts +9 -8
- package/src/utils/protocols.ts +132 -6
- package/src/utils/records.ts +118 -29
- package/src/utils/secp256k1.ts +23 -21
- package/src/utils/secp256r1.ts +17 -15
- package/src/utils/time.ts +1 -1
- package/src/utils/url.ts +1 -1
- package/dist/cjs/index.js +0 -36749
- package/dist/cjs/package.json +0 -1
- package/dist/esm/src/event-log/event-emitter-stream.js.map +0 -1
- package/dist/esm/src/event-log/event-log-level.js +0 -63
- package/dist/esm/src/event-log/event-log-level.js.map +0 -1
- package/dist/esm/src/handlers/messages-query.js +0 -71
- package/dist/esm/src/handlers/messages-query.js.map +0 -1
- package/dist/esm/src/interfaces/messages-query.js.map +0 -1
- package/dist/esm/src/types/event-log.js +0 -2
- package/dist/esm/src/types/event-log.js.map +0 -1
- package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log-level.spec.js +0 -44
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log.spec.js +0 -236
- package/dist/esm/tests/event-log/event-log.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-stream.spec.js.map +0 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +0 -349
- package/dist/esm/tests/handlers/messages-query.spec.js.map +0 -1
- package/dist/esm/tests/interfaces/messagess-query.spec.js +0 -127
- package/dist/esm/tests/interfaces/messagess-query.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/messages-query.spec.js +0 -395
- package/dist/esm/tests/scenarios/messages-query.spec.js.map +0 -1
- package/dist/types/src/event-log/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/src/event-log/event-log-level.d.ts +0 -35
- package/dist/types/src/event-log/event-log-level.d.ts.map +0 -1
- package/dist/types/src/handlers/messages-query.d.ts +0 -17
- package/dist/types/src/handlers/messages-query.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-query.d.ts +0 -16
- package/dist/types/src/interfaces/messages-query.d.ts.map +0 -1
- package/dist/types/src/types/event-log.d.ts +0 -52
- package/dist/types/src/types/event-log.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log-level.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/handlers/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +0 -1
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts +0 -2
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +0 -1
- package/dist/types/tests/scenarios/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +0 -1
- package/src/event-log/event-log-level.ts +0 -72
- package/src/handlers/messages-query.ts +0 -67
- package/src/interfaces/messages-query.ts +0 -60
- package/src/types/event-log.ts +0 -52
- /package/dist/esm/src/{event-log → event-stream}/event-emitter-stream.js +0 -0
- /package/dist/types/src/{event-log → event-stream}/event-emitter-stream.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-emitter-stream.spec.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-stream.spec.d.ts +0 -0
- /package/src/{event-log → event-stream}/event-emitter-stream.ts +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { GeneralJws } from '../types/jws-types.js';
|
|
2
2
|
import type { KeyValues } from '../types/query-types.js';
|
|
3
3
|
import type { MessageInterface } from '../types/message-interface.js';
|
|
4
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
4
5
|
import type { MessageStore } from '../types/message-store.js';
|
|
5
|
-
import type {
|
|
6
|
-
import type { Signer } from '../types/signer.js';
|
|
6
|
+
import type { PublicKeyJwk } from '../types/jose-types.js';
|
|
7
7
|
import type {
|
|
8
8
|
DataEncodedRecordsWriteMessage,
|
|
9
9
|
EncryptedKey,
|
|
@@ -62,20 +62,31 @@ export type RecordsWriteOptions = {
|
|
|
62
62
|
/**
|
|
63
63
|
* The signer of the message, which is commonly the author, but can also be a delegate.
|
|
64
64
|
*/
|
|
65
|
-
signer?:
|
|
65
|
+
signer?: MessageSigner;
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* The delegated grant invoked to sign on behalf of the logical author, which is the grantor of the delegated grant.
|
|
69
69
|
*/
|
|
70
70
|
delegatedGrant?: DataEncodedRecordsWriteMessage;
|
|
71
71
|
|
|
72
|
-
attestationSigners?:
|
|
72
|
+
attestationSigners?: MessageSigner[];
|
|
73
73
|
encryptionInput?: EncryptionInput;
|
|
74
74
|
permissionGrantId?: string;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The author's ProtocolPath-derived public key for key delivery.
|
|
78
|
+
* When set, this is attached to the authorization model so the DWN owner
|
|
79
|
+
* can encrypt context keys back to the author without querying the
|
|
80
|
+
* author's DWN.
|
|
81
|
+
*/
|
|
82
|
+
authorKeyDeliveryPublicKey?: {
|
|
83
|
+
rootKeyId: string;
|
|
84
|
+
publicKeyJwk: PublicKeyJwk;
|
|
85
|
+
};
|
|
75
86
|
};
|
|
76
87
|
|
|
77
88
|
/**
|
|
78
|
-
* Input that describes how data is encrypted as spec-ed in TP18
|
|
89
|
+
* Input that describes how data is encrypted as spec-ed in TP18.
|
|
79
90
|
*/
|
|
80
91
|
export type EncryptionInput = {
|
|
81
92
|
/**
|
|
@@ -118,7 +129,7 @@ export type KeyEncryptionInput = {
|
|
|
118
129
|
/**
|
|
119
130
|
* Public key to be used to encrypt the symmetric key.
|
|
120
131
|
*/
|
|
121
|
-
publicKey:
|
|
132
|
+
publicKey: PublicKeyJwk;
|
|
122
133
|
|
|
123
134
|
/**
|
|
124
135
|
* Algorithm used for encrypting the symmetric key. Uses {EncryptionAlgorithm.EciesSecp256k1} if not given.
|
|
@@ -144,14 +155,14 @@ export type CreateFromOptions = {
|
|
|
144
155
|
/**
|
|
145
156
|
* The signer of the message, which is commonly the author, but can also be a delegate.
|
|
146
157
|
*/
|
|
147
|
-
signer?:
|
|
158
|
+
signer?: MessageSigner;
|
|
148
159
|
|
|
149
160
|
/**
|
|
150
161
|
* The delegated grant to sign on behalf of the logical author, which is the grantor (`grantedBy`) of the delegated grant.
|
|
151
162
|
*/
|
|
152
163
|
delegatedGrant?: DataEncodedRecordsWriteMessage;
|
|
153
164
|
|
|
154
|
-
attestationSigners?:
|
|
165
|
+
attestationSigners?: MessageSigner[];
|
|
155
166
|
encryptionInput?: EncryptionInput;
|
|
156
167
|
protocolRole?: string;
|
|
157
168
|
};
|
|
@@ -280,6 +291,14 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
280
291
|
// Make a copy so that the stored copy is not subject to external, unexpected modification.
|
|
281
292
|
const message = JSON.parse(JSON.stringify(recordsWriteMessage)) as RecordsWriteMessage;
|
|
282
293
|
|
|
294
|
+
// Validate the message against the JSON schema.
|
|
295
|
+
// We strip internal properties that the MessageStore may attach to stored messages
|
|
296
|
+
// but are not part of the RecordsWrite JSON schema:
|
|
297
|
+
// - `encodedData`: base64url-encoded payload for small records
|
|
298
|
+
// - `initialWrite`: the initial RecordsWrite when this message is an update
|
|
299
|
+
const { encodedData: _, initialWrite: __, ...messageToValidate } = message as RecordsWriteMessage & Record<string, unknown>;
|
|
300
|
+
Message.validateJsonSchema(messageToValidate);
|
|
301
|
+
|
|
283
302
|
// asynchronous checks that are required by the constructor to initialize members properly
|
|
284
303
|
|
|
285
304
|
await Message.validateSignatureStructure(message.authorization.signature, message.descriptor, 'RecordsWriteSignaturePayload');
|
|
@@ -335,21 +354,22 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
335
354
|
const currentTime = Time.getCurrentTimestamp();
|
|
336
355
|
|
|
337
356
|
const descriptor: RecordsWriteDescriptor = {
|
|
338
|
-
interface
|
|
339
|
-
method
|
|
340
|
-
protocol
|
|
341
|
-
protocolPath
|
|
342
|
-
recipient
|
|
343
|
-
schema
|
|
344
|
-
tags
|
|
345
|
-
parentId
|
|
357
|
+
interface : DwnInterfaceName.Records,
|
|
358
|
+
method : DwnMethodName.Write,
|
|
359
|
+
protocol : options.protocol !== undefined ? normalizeProtocolUrl(options.protocol) : undefined,
|
|
360
|
+
protocolPath : options.protocolPath,
|
|
361
|
+
recipient : options.recipient,
|
|
362
|
+
schema : options.schema !== undefined ? normalizeSchemaUrl(options.schema) : undefined,
|
|
363
|
+
tags : options.tags,
|
|
364
|
+
parentId : RecordsWrite.getRecordIdFromContextId(options.parentContextId),
|
|
346
365
|
dataCid,
|
|
347
366
|
dataSize,
|
|
348
|
-
dateCreated
|
|
349
|
-
messageTimestamp
|
|
350
|
-
published
|
|
351
|
-
datePublished
|
|
352
|
-
dataFormat
|
|
367
|
+
dateCreated : options.dateCreated ?? currentTime,
|
|
368
|
+
messageTimestamp : options.messageTimestamp ?? currentTime,
|
|
369
|
+
published : options.published,
|
|
370
|
+
datePublished : options.datePublished,
|
|
371
|
+
dataFormat : options.dataFormat,
|
|
372
|
+
permissionGrantId : options.permissionGrantId,
|
|
353
373
|
};
|
|
354
374
|
|
|
355
375
|
// generate `datePublished` if the message is to be published but `datePublished` is not given
|
|
@@ -385,10 +405,11 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
385
405
|
|
|
386
406
|
if (options.signer !== undefined) {
|
|
387
407
|
await recordsWrite.sign({
|
|
388
|
-
signer
|
|
389
|
-
delegatedGrant
|
|
390
|
-
permissionGrantId
|
|
391
|
-
protocolRole
|
|
408
|
+
signer : options.signer,
|
|
409
|
+
delegatedGrant : options.delegatedGrant,
|
|
410
|
+
permissionGrantId : options.permissionGrantId,
|
|
411
|
+
protocolRole : options.protocolRole,
|
|
412
|
+
authorKeyDeliveryPublicKey : options.authorKeyDeliveryPublicKey,
|
|
392
413
|
});
|
|
393
414
|
}
|
|
394
415
|
|
|
@@ -477,26 +498,65 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
477
498
|
|
|
478
499
|
/**
|
|
479
500
|
* Encrypts the symmetric encryption key using the public keys given and attach the resulting `encryption` property to the RecordsWrite.
|
|
501
|
+
*
|
|
502
|
+
* @param options.append - When `true`, appends new `keyEncryption` entries to the existing
|
|
503
|
+
* `encryption` property instead of replacing it. Requires `this._message.encryption` to
|
|
504
|
+
* already exist (i.e., the record must already be encrypted). This is used for the reactive
|
|
505
|
+
* root-record upgrade: adding a ProtocolContext `keyEncryption` entry alongside an existing
|
|
506
|
+
* ProtocolPath entry so both the owner and context key holders can decrypt.
|
|
480
507
|
*/
|
|
481
|
-
public async encryptSymmetricEncryptionKey(
|
|
482
|
-
|
|
508
|
+
public async encryptSymmetricEncryptionKey(
|
|
509
|
+
encryptionInput: EncryptionInput,
|
|
510
|
+
options?: { append?: boolean },
|
|
511
|
+
): Promise<void> {
|
|
512
|
+
if (options?.append) {
|
|
513
|
+
if (!this._message.encryption) {
|
|
514
|
+
throw new DwnError(
|
|
515
|
+
DwnErrorCode.RecordsWriteMissingEncryption,
|
|
516
|
+
'Cannot append keyEncryption entries: record does not have an existing `encryption` property.'
|
|
517
|
+
);
|
|
518
|
+
}
|
|
483
519
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
520
|
+
// Build only the new keyEncryption entries (reuses createEncryptionProperty for ECIES logic)
|
|
521
|
+
const newEncryption = await RecordsWrite.createEncryptionProperty(this._message.descriptor, encryptionInput);
|
|
522
|
+
if (newEncryption) {
|
|
523
|
+
this._message.encryption.keyEncryption.push(...newEncryption.keyEncryption);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// In append mode, preserve the author's identity and authorization so
|
|
527
|
+
// that signAsOwner() can be called afterwards. The author's signature
|
|
528
|
+
// payload will have a stale encryptionCid (since we just appended new
|
|
529
|
+
// keyEncryption entries), but the owner's signature vouches for the
|
|
530
|
+
// updated state. validateIntegrity() skips the encryptionCid check on
|
|
531
|
+
// the author's signature when an ownerSignature is present.
|
|
532
|
+
//
|
|
533
|
+
// NOTE: An alternative design would deliver the DEK out-of-band via the
|
|
534
|
+
// key-delivery protocol (as a field on the contextKey record) instead of
|
|
535
|
+
// mutating the record's encryption property. That avoids the stale
|
|
536
|
+
// encryptionCid issue entirely but adds complexity to the read path and
|
|
537
|
+
// the contextKey schema. We chose the in-record approach because it keeps
|
|
538
|
+
// records self-contained and the read/decrypt path unchanged.
|
|
539
|
+
} else {
|
|
540
|
+
this._message.encryption = await RecordsWrite.createEncryptionProperty(this._message.descriptor, encryptionInput);
|
|
541
|
+
|
|
542
|
+
// Full replacement invalidates the authorization — caller must re-sign.
|
|
543
|
+
delete this._message.authorization;
|
|
544
|
+
this._signaturePayload = undefined;
|
|
545
|
+
this._author = undefined;
|
|
546
|
+
}
|
|
488
547
|
}
|
|
489
548
|
|
|
490
549
|
/**
|
|
491
550
|
* Signs the RecordsWrite, the signer is commonly the author, but can also be a delegate.
|
|
492
551
|
*/
|
|
493
552
|
public async sign(options: {
|
|
494
|
-
signer:
|
|
553
|
+
signer: MessageSigner,
|
|
495
554
|
delegatedGrant?: DataEncodedRecordsWriteMessage,
|
|
496
555
|
permissionGrantId?: string,
|
|
497
|
-
protocolRole?: string
|
|
556
|
+
protocolRole?: string,
|
|
557
|
+
authorKeyDeliveryPublicKey?: { rootKeyId: string; publicKeyJwk: PublicKeyJwk },
|
|
498
558
|
}): Promise<void> {
|
|
499
|
-
const { signer, delegatedGrant, permissionGrantId, protocolRole } = options;
|
|
559
|
+
const { signer, delegatedGrant, permissionGrantId, protocolRole, authorKeyDeliveryPublicKey } = options;
|
|
500
560
|
|
|
501
561
|
// compute delegated grant ID and author if delegated grant is given
|
|
502
562
|
let delegatedGrantId;
|
|
@@ -545,6 +605,10 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
545
605
|
this._message.authorization.authorDelegatedGrant = delegatedGrant;
|
|
546
606
|
}
|
|
547
607
|
|
|
608
|
+
if (authorKeyDeliveryPublicKey !== undefined) {
|
|
609
|
+
this._message.authorization.authorKeyDeliveryPublicKey = authorKeyDeliveryPublicKey;
|
|
610
|
+
}
|
|
611
|
+
|
|
548
612
|
// there is opportunity to optimize here as the payload is constructed within `createAuthorization(...)`
|
|
549
613
|
this._signaturePayload = Jws.decodePlainObjectPayload(signature);
|
|
550
614
|
this._author = authorDid;
|
|
@@ -555,7 +619,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
555
619
|
* This is used when the DWN owner wants to retain a copy of a message that the owner did not author.
|
|
556
620
|
* NOTE: requires the `RecordsWrite` to already have the author's signature.
|
|
557
621
|
*/
|
|
558
|
-
public async signAsOwner(signer:
|
|
622
|
+
public async signAsOwner(signer: MessageSigner): Promise<void> {
|
|
559
623
|
if (this._author === undefined) {
|
|
560
624
|
throw new DwnError(
|
|
561
625
|
DwnErrorCode.RecordsWriteSignAsOwnerUnknownAuthor,
|
|
@@ -577,7 +641,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
577
641
|
* This is used when a DWN owner-delegate wants to retain a copy of a message that the owner did not author.
|
|
578
642
|
* NOTE: requires the `RecordsWrite` to already have the author's signature.
|
|
579
643
|
*/
|
|
580
|
-
public async signAsOwnerDelegate(signer:
|
|
644
|
+
public async signAsOwnerDelegate(signer: MessageSigner, delegatedGrant: DataEncodedRecordsWriteMessage): Promise<void> {
|
|
581
645
|
if (this._author === undefined) {
|
|
582
646
|
throw new DwnError(
|
|
583
647
|
DwnErrorCode.RecordsWriteSignAsOwnerDelegateUnknownAuthor,
|
|
@@ -661,8 +725,14 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
661
725
|
}
|
|
662
726
|
}
|
|
663
727
|
|
|
664
|
-
//
|
|
665
|
-
|
|
728
|
+
// If `encryption` is given in message, make sure the correct `encryptionCid`
|
|
729
|
+
// is in the payload of the message signature — UNLESS the message has an
|
|
730
|
+
// ownerSignature. When the DWN owner appends keyEncryption entries to an
|
|
731
|
+
// externally-authored record (reactive root-record upgrade), the author's
|
|
732
|
+
// encryptionCid becomes stale. The owner's signature vouches for the
|
|
733
|
+
// updated encryption property, so the mismatch is expected and safe.
|
|
734
|
+
const hasOwnerSignature = this.message.authorization?.ownerSignature !== undefined;
|
|
735
|
+
if (signaturePayload.encryptionCid !== undefined && !hasOwnerSignature) {
|
|
666
736
|
const expectedEncryptionCid = await Cid.computeCid(this.message.encryption);
|
|
667
737
|
const actualEncryptionCid = signaturePayload.encryptionCid;
|
|
668
738
|
if (actualEncryptionCid !== expectedEncryptionCid) {
|
|
@@ -696,7 +766,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
696
766
|
return;
|
|
697
767
|
}
|
|
698
768
|
|
|
699
|
-
// TODO: multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/
|
|
769
|
+
// TODO: multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/enboxorg/enbox/issues/205)
|
|
700
770
|
if (message.attestation.signatures.length !== 1) {
|
|
701
771
|
throw new DwnError(
|
|
702
772
|
DwnErrorCode.RecordsWriteAttestationIntegrityMoreThanOneSignature,
|
|
@@ -742,8 +812,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
742
812
|
throw new DwnError(DwnErrorCode.RecordsWriteGetEntryIdUndefinedAuthor, 'Property `author` is needed to compute entry ID.');
|
|
743
813
|
}
|
|
744
814
|
|
|
745
|
-
const entryIdInput = { ...descriptor };
|
|
746
|
-
(entryIdInput as any).author = author;
|
|
815
|
+
const entryIdInput: Record<string, unknown> = { ...descriptor, author };
|
|
747
816
|
|
|
748
817
|
const cid = await Cid.computeCid(entryIdInput);
|
|
749
818
|
return cid;
|
|
@@ -783,7 +852,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
783
852
|
}
|
|
784
853
|
|
|
785
854
|
// add additional indexes to optional values if given
|
|
786
|
-
// TODO: index multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/
|
|
855
|
+
// TODO: index multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/enboxorg/enbox/issues/205)
|
|
787
856
|
if (this.attesters.length > 0) { indexes.attester = this.attesters[0]; }
|
|
788
857
|
if (message.contextId !== undefined) { indexes.contextId = message.contextId; }
|
|
789
858
|
|
|
@@ -907,7 +976,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
907
976
|
/**
|
|
908
977
|
* Creates the `attestation` property of a RecordsWrite message if given signature inputs; returns `undefined` otherwise.
|
|
909
978
|
*/
|
|
910
|
-
public static async createAttestation(descriptorCid: string, signers?:
|
|
979
|
+
public static async createAttestation(descriptorCid: string, signers?: MessageSigner[]): Promise<GeneralJws | undefined> {
|
|
911
980
|
if (signers === undefined || signers.length === 0) {
|
|
912
981
|
return undefined;
|
|
913
982
|
}
|
|
@@ -928,7 +997,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
928
997
|
descriptorCid: string,
|
|
929
998
|
attestation: GeneralJws | undefined,
|
|
930
999
|
encryption: EncryptionProperty | undefined,
|
|
931
|
-
signer:
|
|
1000
|
+
signer: MessageSigner,
|
|
932
1001
|
delegatedGrantId?: string,
|
|
933
1002
|
permissionGrantId?: string,
|
|
934
1003
|
protocolRole?: string
|
|
@@ -988,8 +1057,8 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
|
|
|
988
1057
|
for (const descriptorPropertyName of descriptorPropertyNames) {
|
|
989
1058
|
// if property is supposed to be immutable
|
|
990
1059
|
if (mutableDescriptorProperties.indexOf(descriptorPropertyName) === -1) {
|
|
991
|
-
const valueInExistingWrite = (existingWriteMessage.descriptor as
|
|
992
|
-
const valueInNewMessage = (newMessage.descriptor as
|
|
1060
|
+
const valueInExistingWrite = (existingWriteMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
|
|
1061
|
+
const valueInNewMessage = (newMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
|
|
993
1062
|
if (valueInNewMessage !== valueInExistingWrite) {
|
|
994
1063
|
throw new DwnError(
|
|
995
1064
|
DwnErrorCode.RecordsWriteImmutablePropertyChanged,
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import * as Ed25519 from '@noble/ed25519';
|
|
2
|
-
import type {
|
|
2
|
+
import type { JwkParamsOkpPrivate, JwkParamsOkpPublic } from '@enbox/crypto';
|
|
3
|
+
import type { PrivateKeyJwk, PublicKeyJwk, SignatureAlgorithm } from '../../../types/jose-types.js';
|
|
3
4
|
|
|
4
5
|
import { Encoder } from '../../../utils/encoder.js';
|
|
5
6
|
import { DwnError, DwnErrorCode } from '../../../core/dwn-error.js';
|
|
6
7
|
|
|
7
|
-
function validateKey(jwk:
|
|
8
|
-
if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
|
|
8
|
+
function validateKey(jwk: PrivateKeyJwk | PublicKeyJwk): void {
|
|
9
|
+
if (jwk.kty !== 'OKP' || (jwk as JwkParamsOkpPublic).crv !== 'Ed25519') {
|
|
9
10
|
throw new DwnError(DwnErrorCode.Ed25519InvalidJwk, 'invalid jwk. kty MUST be OKP. crv MUST be Ed25519');
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
function publicKeyToJwk(publicKeyBytes: Uint8Array):
|
|
14
|
+
function publicKeyToJwk(publicKeyBytes: Uint8Array): PublicKeyJwk {
|
|
14
15
|
const x = Encoder.bytesToBase64Url(publicKeyBytes);
|
|
15
16
|
|
|
16
|
-
const publicJwk:
|
|
17
|
+
const publicJwk: PublicKeyJwk = {
|
|
17
18
|
alg : 'EdDSA',
|
|
18
19
|
kty : 'OKP',
|
|
19
20
|
crv : 'Ed25519',
|
|
@@ -24,35 +25,35 @@ function publicKeyToJwk(publicKeyBytes: Uint8Array): PublicJwk {
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export const ed25519: SignatureAlgorithm = {
|
|
27
|
-
sign: async (content: Uint8Array, privateJwk:
|
|
28
|
+
sign: async (content: Uint8Array, privateJwk: PrivateKeyJwk): Promise<Uint8Array> => {
|
|
28
29
|
validateKey(privateJwk);
|
|
29
30
|
|
|
30
|
-
const privateKeyBytes = Encoder.base64UrlToBytes(privateJwk.d);
|
|
31
|
+
const privateKeyBytes = Encoder.base64UrlToBytes((privateJwk as JwkParamsOkpPrivate).d);
|
|
31
32
|
|
|
32
33
|
return Ed25519.signAsync(content, privateKeyBytes);
|
|
33
34
|
},
|
|
34
35
|
|
|
35
|
-
verify: async (content: Uint8Array, signature: Uint8Array, publicJwk:
|
|
36
|
+
verify: async (content: Uint8Array, signature: Uint8Array, publicJwk: PublicKeyJwk): Promise<boolean> => {
|
|
36
37
|
validateKey(publicJwk);
|
|
37
38
|
|
|
38
|
-
const publicKeyBytes = Encoder.base64UrlToBytes(publicJwk.x);
|
|
39
|
+
const publicKeyBytes = Encoder.base64UrlToBytes((publicJwk as JwkParamsOkpPublic).x);
|
|
39
40
|
|
|
40
41
|
return Ed25519.verifyAsync(signature, content, publicKeyBytes);
|
|
41
42
|
},
|
|
42
43
|
|
|
43
|
-
generateKeyPair: async (): Promise<{publicJwk:
|
|
44
|
+
generateKeyPair: async (): Promise<{publicJwk: PublicKeyJwk, privateJwk: PrivateKeyJwk}> => {
|
|
44
45
|
const privateKeyBytes = Ed25519.utils.randomPrivateKey();
|
|
45
46
|
const publicKeyBytes = await Ed25519.getPublicKeyAsync(privateKeyBytes);
|
|
46
47
|
|
|
47
48
|
const d = Encoder.bytesToBase64Url(privateKeyBytes);
|
|
48
49
|
|
|
49
50
|
const publicJwk = publicKeyToJwk(publicKeyBytes);
|
|
50
|
-
const privateJwk:
|
|
51
|
+
const privateJwk: PrivateKeyJwk = { ...publicJwk, d };
|
|
51
52
|
|
|
52
53
|
return { publicJwk, privateJwk };
|
|
53
54
|
},
|
|
54
55
|
|
|
55
|
-
publicKeyToJwk: async (publicKeyBytes: Uint8Array): Promise<
|
|
56
|
+
publicKeyToJwk: async (publicKeyBytes: Uint8Array): Promise<PublicKeyJwk> => {
|
|
56
57
|
return publicKeyToJwk(publicKeyBytes);
|
|
57
58
|
}
|
|
58
59
|
};
|
|
@@ -4,8 +4,13 @@ import { ed25519 } from './ed25519.js';
|
|
|
4
4
|
import { Secp256k1 } from '../../../utils/secp256k1.js';
|
|
5
5
|
import { Secp256r1 } from '../../../utils/secp256r1.js';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Curves supported by the DWN for signing and verification.
|
|
9
|
+
*/
|
|
10
|
+
export type SupportedCurve = 'Ed25519' | 'secp256k1' | 'P-256';
|
|
11
|
+
|
|
7
12
|
// the key should be the appropriate `crv` value
|
|
8
|
-
export const signatureAlgorithms: Record<
|
|
13
|
+
export const signatureAlgorithms: Record<SupportedCurve, SignatureAlgorithm> = {
|
|
9
14
|
'Ed25519' : ed25519,
|
|
10
15
|
'secp256k1' : {
|
|
11
16
|
sign : Secp256k1.sign,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { GeneralJws } from '../../../types/jws-types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { MessageSigner } from '../../../types/signer.js';
|
|
3
3
|
|
|
4
4
|
import { Encoder } from '../../../utils/encoder.js';
|
|
5
5
|
|
|
@@ -10,7 +10,7 @@ export class GeneralJwsBuilder {
|
|
|
10
10
|
this.jws = jws;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
static async create(payload: Uint8Array, signers:
|
|
13
|
+
static async create(payload: Uint8Array, signers: MessageSigner[] = []): Promise<GeneralJwsBuilder> {
|
|
14
14
|
const jws: GeneralJws = {
|
|
15
15
|
payload : Encoder.bytesToBase64Url(payload),
|
|
16
16
|
signatures : []
|
|
@@ -25,7 +25,7 @@ export class GeneralJwsBuilder {
|
|
|
25
25
|
return builder;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
async addSignature(signer:
|
|
28
|
+
async addSignature(signer: MessageSigner): Promise<void> {
|
|
29
29
|
const protectedHeader = {
|
|
30
30
|
kid : signer.keyId,
|
|
31
31
|
alg : signer.algorithm
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Cache } from '../../../types/cache.js';
|
|
2
2
|
import type { GeneralJws } from '../../../types/jws-types.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { PublicKeyJwk } from '../../../types/jose-types.js';
|
|
4
4
|
import type { DidResolver, DidVerificationMethod } from '@enbox/dids';
|
|
5
5
|
|
|
6
6
|
import { Jws } from '../../../utils/jws.js';
|
|
@@ -80,7 +80,7 @@ export class GeneralJwsVerifier {
|
|
|
80
80
|
/**
|
|
81
81
|
* Gets the public key given a fully qualified key ID (`kid`) by resolving the DID to its DID Document.
|
|
82
82
|
*/
|
|
83
|
-
private static async getPublicKey(kid: string, didResolver: DidResolver): Promise<
|
|
83
|
+
private static async getPublicKey(kid: string, didResolver: DidResolver): Promise<PublicKeyJwk> {
|
|
84
84
|
// `resolve` throws exception if DID is invalid, DID method is not supported,
|
|
85
85
|
// or resolving DID fails
|
|
86
86
|
const did = Jws.extractDid(kid);
|
|
@@ -107,6 +107,6 @@ export class GeneralJwsVerifier {
|
|
|
107
107
|
|
|
108
108
|
const { publicKeyJwk: publicJwk } = verificationMethod;
|
|
109
109
|
|
|
110
|
-
return publicJwk as
|
|
110
|
+
return publicJwk as PublicKeyJwk;
|
|
111
111
|
}
|
|
112
112
|
}
|
|
@@ -3,6 +3,7 @@ import type { PermissionConditions, PermissionGrantData, PermissionScope } from
|
|
|
3
3
|
|
|
4
4
|
import { Encoder } from '../utils/encoder.js';
|
|
5
5
|
import { Message } from '../core/message.js';
|
|
6
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -60,11 +61,61 @@ export class PermissionGrant {
|
|
|
60
61
|
*/
|
|
61
62
|
public readonly conditions?: PermissionConditions;
|
|
62
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Parses a `DataEncodedRecordsWriteMessage` into a `PermissionGrant`.
|
|
66
|
+
* Validates that the message contains required structural fields:
|
|
67
|
+
* `encodedData`, `authorization` (for grantor extraction), `descriptor.recipient` (grantee),
|
|
68
|
+
* and that the decoded data contains `scope` and `dateExpires`.
|
|
69
|
+
* @throws {DwnError} if any required field is missing.
|
|
70
|
+
*/
|
|
63
71
|
public static async parse(message: DataEncodedRecordsWriteMessage): Promise<PermissionGrant> {
|
|
72
|
+
PermissionGrant.validateMessage(message);
|
|
64
73
|
const permissionGrant = new PermissionGrant(message);
|
|
65
74
|
return permissionGrant;
|
|
66
75
|
}
|
|
67
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Validates that the message has the required structural fields for a permission grant.
|
|
79
|
+
*/
|
|
80
|
+
private static validateMessage(message: DataEncodedRecordsWriteMessage): void {
|
|
81
|
+
if (message.encodedData === undefined || message.encodedData === null) {
|
|
82
|
+
throw new DwnError(
|
|
83
|
+
DwnErrorCode.PermissionGrantParseMissingEncodedData,
|
|
84
|
+
'permission grant message is missing encodedData'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (Message.getSigner(message) === undefined) {
|
|
89
|
+
throw new DwnError(
|
|
90
|
+
DwnErrorCode.PermissionGrantParseMissingAuthorization,
|
|
91
|
+
'permission grant message is missing authorization (unable to extract grantor)'
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (message.descriptor.recipient === undefined) {
|
|
96
|
+
throw new DwnError(
|
|
97
|
+
DwnErrorCode.PermissionGrantParseMissingRecipient,
|
|
98
|
+
'permission grant message is missing descriptor.recipient (grantee)'
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const grantData = Encoder.base64UrlToObject(message.encodedData) as Partial<PermissionGrantData>;
|
|
103
|
+
|
|
104
|
+
if (grantData.scope === undefined) {
|
|
105
|
+
throw new DwnError(
|
|
106
|
+
DwnErrorCode.PermissionGrantParseMissingScope,
|
|
107
|
+
'permission grant data is missing required property `scope`'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (grantData.dateExpires === undefined) {
|
|
112
|
+
throw new DwnError(
|
|
113
|
+
DwnErrorCode.PermissionGrantParseMissingDateExpires,
|
|
114
|
+
'permission grant data is missing required property `dateExpires`'
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
68
119
|
private constructor(message: DataEncodedRecordsWriteMessage) {
|
|
69
120
|
// properties derived from the generic DWN message properties
|
|
70
121
|
this.id = message.recordId;
|
|
@@ -3,6 +3,7 @@ import type { PermissionConditions, PermissionRequestData, PermissionScope } fro
|
|
|
3
3
|
|
|
4
4
|
import { Encoder } from '../utils/encoder.js';
|
|
5
5
|
import { Message } from '../core/message.js';
|
|
6
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
/**
|
|
@@ -41,11 +42,47 @@ export class PermissionRequest {
|
|
|
41
42
|
*/
|
|
42
43
|
public readonly conditions?: PermissionConditions;
|
|
43
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Parses a `DataEncodedRecordsWriteMessage` into a `PermissionRequest`.
|
|
47
|
+
* Validates that the message contains required structural fields:
|
|
48
|
+
* `encodedData`, `authorization` (for requester extraction),
|
|
49
|
+
* and that the decoded data contains `scope`.
|
|
50
|
+
* @throws {DwnError} if any required field is missing.
|
|
51
|
+
*/
|
|
44
52
|
public static async parse(message: DataEncodedRecordsWriteMessage): Promise<PermissionRequest> {
|
|
53
|
+
PermissionRequest.validateMessage(message);
|
|
45
54
|
const permissionRequest = new PermissionRequest(message);
|
|
46
55
|
return permissionRequest;
|
|
47
56
|
}
|
|
48
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Validates that the message has the required structural fields for a permission request.
|
|
60
|
+
*/
|
|
61
|
+
private static validateMessage(message: DataEncodedRecordsWriteMessage): void {
|
|
62
|
+
if (message.encodedData === undefined || message.encodedData === null) {
|
|
63
|
+
throw new DwnError(
|
|
64
|
+
DwnErrorCode.PermissionRequestParseMissingEncodedData,
|
|
65
|
+
'permission request message is missing encodedData'
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (Message.getSigner(message) === undefined) {
|
|
70
|
+
throw new DwnError(
|
|
71
|
+
DwnErrorCode.PermissionRequestParseMissingAuthorization,
|
|
72
|
+
'permission request message is missing authorization (unable to extract requester)'
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const requestData = Encoder.base64UrlToObject(message.encodedData) as Partial<PermissionRequestData>;
|
|
77
|
+
|
|
78
|
+
if (requestData.scope === undefined) {
|
|
79
|
+
throw new DwnError(
|
|
80
|
+
DwnErrorCode.PermissionRequestParseMissingScope,
|
|
81
|
+
'permission request data is missing required property `scope`'
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
49
86
|
private constructor(message: DataEncodedRecordsWriteMessage) {
|
|
50
87
|
// properties derived from the generic DWN message properties
|
|
51
88
|
this.id = message.recordId;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GenericMessage } from '../types/message-types.js';
|
|
2
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
3
|
import type { MessageStore } from '../types/message-store.js';
|
|
3
4
|
import type { ProtocolDefinition } from '../types/protocols-types.js';
|
|
4
|
-
import type { Signer } from '../types/signer.js';
|
|
5
5
|
import type { DataEncodedRecordsWriteMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
6
6
|
import type { PermissionConditions, PermissionGrantData, PermissionRequestData, PermissionRevocationData, PermissionScope, RecordsPermissionScope } from '../types/permission-types.js';
|
|
7
7
|
|
|
@@ -22,7 +22,7 @@ export type PermissionRequestCreateOptions = {
|
|
|
22
22
|
/**
|
|
23
23
|
* The signer of the request.
|
|
24
24
|
*/
|
|
25
|
-
signer?:
|
|
25
|
+
signer?: MessageSigner;
|
|
26
26
|
|
|
27
27
|
dateRequested?: string;
|
|
28
28
|
|
|
@@ -41,7 +41,7 @@ export type PermissionGrantCreateOptions = {
|
|
|
41
41
|
/**
|
|
42
42
|
* The signer of the grant.
|
|
43
43
|
*/
|
|
44
|
-
signer?:
|
|
44
|
+
signer?: MessageSigner;
|
|
45
45
|
grantedTo: string;
|
|
46
46
|
dateGranted?: string;
|
|
47
47
|
|
|
@@ -65,7 +65,7 @@ export type PermissionRevocationCreateOptions = {
|
|
|
65
65
|
/**
|
|
66
66
|
* The signer of the grant.
|
|
67
67
|
*/
|
|
68
|
-
signer?:
|
|
68
|
+
signer?: MessageSigner;
|
|
69
69
|
/**
|
|
70
70
|
* The PermissionGrant this revocation is for.
|
|
71
71
|
*/
|
|
@@ -138,7 +138,7 @@ export class PermissionsProtocol {
|
|
|
138
138
|
{
|
|
139
139
|
who : 'recipient',
|
|
140
140
|
of : 'grant',
|
|
141
|
-
can : ['read'
|
|
141
|
+
can : ['read']
|
|
142
142
|
}
|
|
143
143
|
],
|
|
144
144
|
revocation: {
|
package/src/schema-validator.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import * as precompiledValidators from '../generated/precompiled-validators.js';
|
|
2
2
|
import { DwnError, DwnErrorCode } from './core/dwn-error.js';
|
|
3
3
|
|
|
4
|
+
/** AJV-style validate function with an optional `errors` array after invocation. */
|
|
5
|
+
interface ValidateError {
|
|
6
|
+
instancePath: string;
|
|
7
|
+
message: string;
|
|
8
|
+
keyword: string;
|
|
9
|
+
params: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
type ValidateFn = ((payload: unknown) => boolean) & { errors?: ValidateError[] };
|
|
12
|
+
|
|
4
13
|
/**
|
|
5
14
|
* Validates the given payload using JSON schema keyed by the given schema name. Throws if the given payload fails validation.
|
|
6
15
|
* @param schemaName the schema name use to look up the JSON schema to be used for schema validation.
|
|
7
16
|
* The list of schema names can be found in compile-validators.js
|
|
8
17
|
* @param payload javascript object to be validated
|
|
9
18
|
*/
|
|
10
|
-
export function validateJsonSchema(schemaName: string, payload:
|
|
11
|
-
|
|
12
|
-
const validateFn = (precompiledValidators as any)[schemaName];
|
|
19
|
+
export function validateJsonSchema(schemaName: string, payload: unknown): void {
|
|
20
|
+
const validateFn = (precompiledValidators as Record<string, ValidateFn>)[schemaName];
|
|
13
21
|
|
|
14
22
|
if (!validateFn) {
|
|
15
23
|
throw new DwnError(DwnErrorCode.SchemaValidatorSchemaNotFound, `schema for ${schemaName} not found.`);
|