@enbox/dwn-sdk-js 0.0.2 → 0.0.4
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,7 +1,7 @@
|
|
|
1
1
|
import type { DataEncodedRecordsWriteMessage } from '../types/records-types.js';
|
|
2
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
3
|
import type { MessageStore } from '../types/message-store.js';
|
|
3
|
-
import type {
|
|
4
|
-
import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor, ProtocolsConfigureMessage } from '../types/protocols-types.js';
|
|
4
|
+
import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor, ProtocolsConfigureMessage, ProtocolUses } from '../types/protocols-types.js';
|
|
5
5
|
|
|
6
6
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
7
7
|
import Ajv from 'ajv/dist/2020.js';
|
|
@@ -11,13 +11,14 @@ import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorizati
|
|
|
11
11
|
import { Time } from '../utils/time.js';
|
|
12
12
|
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
13
13
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
14
|
+
import { isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
14
15
|
import { normalizeProtocolUrl, normalizeSchemaUrl, validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../utils/url.js';
|
|
15
16
|
import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
|
|
16
17
|
|
|
17
18
|
export type ProtocolsConfigureOptions = {
|
|
18
19
|
messageTimestamp?: string;
|
|
19
20
|
definition: ProtocolDefinition;
|
|
20
|
-
signer:
|
|
21
|
+
signer: MessageSigner;
|
|
21
22
|
/**
|
|
22
23
|
* The delegated grant invoked to sign on behalf of the logical author, which is the grantor of the delegated grant.
|
|
23
24
|
*/
|
|
@@ -40,7 +41,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
40
41
|
interface : DwnInterfaceName.Protocols,
|
|
41
42
|
method : DwnMethodName.Configure,
|
|
42
43
|
messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
|
|
43
|
-
definition : ProtocolsConfigure.normalizeDefinition(options.definition)
|
|
44
|
+
definition : ProtocolsConfigure.normalizeDefinition(options.definition),
|
|
45
|
+
...(options.permissionGrantId !== undefined && { permissionGrantId: options.permissionGrantId }),
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
const authorization = await Message.createAuthorization({
|
|
@@ -77,7 +79,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
77
79
|
* Performs validation on the given protocol definition that are not easy to do using a JSON schema.
|
|
78
80
|
*/
|
|
79
81
|
private static validateProtocolDefinition(definition: ProtocolDefinition): void {
|
|
80
|
-
const { protocol, types } = definition;
|
|
82
|
+
const { protocol, types, uses } = definition;
|
|
81
83
|
|
|
82
84
|
// validate protocol url
|
|
83
85
|
validateProtocolUrlNormalized(protocol);
|
|
@@ -90,16 +92,57 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
90
92
|
}
|
|
91
93
|
}
|
|
92
94
|
|
|
93
|
-
// validate `
|
|
95
|
+
// validate `uses` — alias names must be simple identifiers, values must be normalized URLs, and no self-references
|
|
96
|
+
if (uses !== undefined) {
|
|
97
|
+
ProtocolsConfigure.validateUses(uses, protocol);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// validate `structure`
|
|
94
101
|
ProtocolsConfigure.validateStructure(definition);
|
|
95
102
|
}
|
|
96
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Validates the `uses` map: alias names must match `^[a-zA-Z][a-zA-Z0-9_-]*$`,
|
|
106
|
+
* values must be normalized protocol URLs, and no alias may reference the protocol itself.
|
|
107
|
+
*/
|
|
108
|
+
private static validateUses(uses: ProtocolUses, ownProtocolUri: string): void {
|
|
109
|
+
const aliasPattern = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
|
|
110
|
+
|
|
111
|
+
for (const alias in uses) {
|
|
112
|
+
if (!aliasPattern.test(alias)) {
|
|
113
|
+
throw new DwnError(
|
|
114
|
+
DwnErrorCode.ProtocolsConfigureInvalidUsesAlias,
|
|
115
|
+
`invalid 'uses' alias '${alias}': must match pattern ${aliasPattern.toString()}.`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
validateProtocolUrlNormalized(uses[alias]);
|
|
121
|
+
} catch {
|
|
122
|
+
throw new DwnError(
|
|
123
|
+
DwnErrorCode.ProtocolsConfigureInvalidUsesProtocolUrl,
|
|
124
|
+
`invalid 'uses' protocol URL for alias '${alias}': '${uses[alias]}' is not a valid normalized protocol URL.`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// reject self-references: a protocol cannot compose itself
|
|
129
|
+
if (uses[alias] === ownProtocolUri) {
|
|
130
|
+
throw new DwnError(
|
|
131
|
+
DwnErrorCode.ProtocolsConfigureInvalidUsesSelfReference,
|
|
132
|
+
`'uses' alias '${alias}' references the protocol's own URI '${ownProtocolUri}'. ` +
|
|
133
|
+
`a protocol cannot compose itself.`
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
97
139
|
private static validateStructure(definition: ProtocolDefinition): void {
|
|
140
|
+
const { uses } = definition;
|
|
98
141
|
|
|
99
142
|
// gather all declared record types
|
|
100
143
|
const recordTypes = Object.keys(definition.types);
|
|
101
144
|
|
|
102
|
-
// gather all roles
|
|
145
|
+
// gather all roles (local roles only — cross-protocol roles are validated by alias existence)
|
|
103
146
|
const roles = ProtocolsConfigure.fetchAllRolePathsRecursively('', definition.structure, []);
|
|
104
147
|
|
|
105
148
|
// validate the entire rule set structure recursively
|
|
@@ -107,7 +150,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
107
150
|
ruleSet : definition.structure,
|
|
108
151
|
ruleSetProtocolPath : '',
|
|
109
152
|
recordTypes,
|
|
110
|
-
roles
|
|
153
|
+
roles,
|
|
154
|
+
uses
|
|
111
155
|
});
|
|
112
156
|
}
|
|
113
157
|
|
|
@@ -152,11 +196,24 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
152
196
|
* Validates the given rule set structure then recursively validates its nested child rule sets.
|
|
153
197
|
*/
|
|
154
198
|
private static validateRuleSetRecursively(
|
|
155
|
-
input: { ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, recordTypes: string[], roles: string[] }
|
|
199
|
+
input: { ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, recordTypes: string[], roles: string[], uses?: ProtocolUses }
|
|
156
200
|
): void {
|
|
157
|
-
const { ruleSet, ruleSetProtocolPath, recordTypes, roles } = input;
|
|
201
|
+
const { ruleSet, ruleSetProtocolPath, recordTypes, roles, uses } = input;
|
|
158
202
|
|
|
159
|
-
// Validate $
|
|
203
|
+
// Validate $ref constraints: $ref is only supported at root level (no `/` in protocol path),
|
|
204
|
+
// and a $ref node is a pure attachment point with no other directives.
|
|
205
|
+
if (ruleSet.$ref !== undefined) {
|
|
206
|
+
if (ruleSetProtocolPath.includes('/')) {
|
|
207
|
+
throw new DwnError(
|
|
208
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefNotAtRoot,
|
|
209
|
+
`'$ref' at protocol path '${ruleSetProtocolPath}' is not allowed: '$ref' nodes are only supported at the root level of the structure.`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
ProtocolsConfigure.validateRefNode(ruleSet, ruleSetProtocolPath, uses);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Validate $size
|
|
160
217
|
if (ruleSet.$size !== undefined) {
|
|
161
218
|
const { min = 0, max } = ruleSet.$size;
|
|
162
219
|
|
|
@@ -190,20 +247,15 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
190
247
|
|
|
191
248
|
// Validate the `role` property of an `action` if exists.
|
|
192
249
|
if (actionRule.role !== undefined) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
DwnErrorCode.ProtocolsConfigureRoleDoesNotExistAtGivenPath,
|
|
197
|
-
`Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath} does not exist.`
|
|
198
|
-
);
|
|
250
|
+
if (isCrossProtocolRef(actionRule.role)) {
|
|
251
|
+
// Cross-protocol role reference: validate alias exists in `uses`
|
|
252
|
+
ProtocolsConfigure.validateCrossProtocolAlias(actionRule.role, uses, ruleSetProtocolPath, 'role');
|
|
199
253
|
} else {
|
|
200
|
-
//
|
|
201
|
-
|
|
202
|
-
const readActions = [ProtocolAction.Read, ProtocolAction.Query, ProtocolAction.Subscribe];
|
|
203
|
-
if (readActions.find( action => actionRule.can.includes(action)) && !readActions.every(action => actionRule.can.includes(action))) {
|
|
254
|
+
// Local role: make sure the role contains a valid protocol path to a role record
|
|
255
|
+
if (!roles.includes(actionRule.role)) {
|
|
204
256
|
throw new DwnError(
|
|
205
|
-
DwnErrorCode.
|
|
206
|
-
`Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath}
|
|
257
|
+
DwnErrorCode.ProtocolsConfigureRoleDoesNotExistAtGivenPath,
|
|
258
|
+
`Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath} does not exist.`
|
|
207
259
|
);
|
|
208
260
|
}
|
|
209
261
|
}
|
|
@@ -218,12 +270,11 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
218
270
|
}
|
|
219
271
|
|
|
220
272
|
// Validate that if `who === recipient` and `of === undefined`, then `can` can only contain `co-update`, `co-delete`, and `co-prune`.
|
|
221
|
-
// We do not allow `read
|
|
222
|
-
// - `read` - Recipients are always allowed to
|
|
273
|
+
// We do not allow `read` or `write` in the `can` array because:
|
|
274
|
+
// - `read` - Recipients are always allowed to read.
|
|
223
275
|
// - `write` - Entails ability to create and update.
|
|
224
276
|
// Since `of` is undefined, it implies the recipient of THIS record,
|
|
225
277
|
// there is no 'recipient' until this record has been created, so it makes no sense to allow recipient to write this record.
|
|
226
|
-
// - `query` - Only authorized using roles, so allowing direct recipients to query is outside the scope.
|
|
227
278
|
if (actionRule.who === ProtocolActor.Recipient && actionRule.of === undefined) {
|
|
228
279
|
|
|
229
280
|
// throw if `can` contains a value that is not `co-update`, `co-delete`, or `co-prune`
|
|
@@ -246,7 +297,29 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
246
297
|
);
|
|
247
298
|
}
|
|
248
299
|
|
|
249
|
-
//
|
|
300
|
+
// Validate that `of` points to the current protocol path or an ancestor of it.
|
|
301
|
+
// At runtime, `checkActor()` searches the record chain for a matching `protocolPath` equal to `actionRule.of`.
|
|
302
|
+
// If `of` is not the current path or one of its ancestors, the action rule would silently never authorize anyone.
|
|
303
|
+
if (actionRule.of !== undefined && ruleSetProtocolPath !== '') {
|
|
304
|
+
if (isCrossProtocolRef(actionRule.of)) {
|
|
305
|
+
// Cross-protocol `of` reference: validate alias exists in `uses`
|
|
306
|
+
ProtocolsConfigure.validateCrossProtocolAlias(actionRule.of, uses, ruleSetProtocolPath, 'of');
|
|
307
|
+
} else {
|
|
308
|
+
// Local `of`: must be self or ancestor
|
|
309
|
+
const isSelfOrAncestor = ruleSetProtocolPath === actionRule.of
|
|
310
|
+
|| ruleSetProtocolPath.startsWith(actionRule.of + '/');
|
|
311
|
+
if (!isSelfOrAncestor) {
|
|
312
|
+
throw new DwnError(
|
|
313
|
+
DwnErrorCode.ProtocolsConfigureInvalidActionOfNotAnAncestor,
|
|
314
|
+
`'of' value '${actionRule.of}' is not an ancestor of protocol path '${ruleSetProtocolPath}' ` +
|
|
315
|
+
`in action rule ${JSON.stringify(actionRule)}.`
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// validate that if `can` contains `update`, `delete`, or `prune`, it must also contain `create`
|
|
322
|
+
// because these are author-only actions, and you can only be the author if you can create
|
|
250
323
|
if (actionRule.can !== undefined) {
|
|
251
324
|
if (actionRule.can.includes(ProtocolAction.Update) && !actionRule.can.includes(ProtocolAction.Create)) {
|
|
252
325
|
throw new DwnError(
|
|
@@ -261,6 +334,13 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
261
334
|
`Action rule ${JSON.stringify(actionRule)} contains 'delete' action but missing the required 'create' action.`
|
|
262
335
|
);
|
|
263
336
|
}
|
|
337
|
+
|
|
338
|
+
if (actionRule.can.includes(ProtocolAction.Prune) && !actionRule.can.includes(ProtocolAction.Create)) {
|
|
339
|
+
throw new DwnError(
|
|
340
|
+
DwnErrorCode.ProtocolsConfigureInvalidActionPruneWithoutCreate,
|
|
341
|
+
`Action rule ${JSON.stringify(actionRule)} contains 'prune' action but missing the required 'create' action.`
|
|
342
|
+
);
|
|
343
|
+
}
|
|
264
344
|
}
|
|
265
345
|
|
|
266
346
|
// Validate that there are no duplicate actors or roles in the remaining action rules:
|
|
@@ -273,7 +353,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
273
353
|
if (actionRule.who === otherActionRule.who && actionRule.of === otherActionRule.of) {
|
|
274
354
|
throw new DwnError(
|
|
275
355
|
DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
|
|
276
|
-
`More than one action rule per actor ${actionRule.who} of ${actionRule.of}
|
|
356
|
+
`More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
|
|
357
|
+
`not allowed within a rule set: ${JSON.stringify(actionRule)}`
|
|
277
358
|
);
|
|
278
359
|
}
|
|
279
360
|
} else {
|
|
@@ -295,15 +376,17 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
295
376
|
continue;
|
|
296
377
|
}
|
|
297
378
|
|
|
298
|
-
|
|
379
|
+
const childRuleSet = ruleSet[recordType];
|
|
380
|
+
|
|
381
|
+
// A structure key whose rule set has `$ref` does not need to be in the local `types` map —
|
|
382
|
+
// the type comes from the referenced protocol. All other keys must be in `types`.
|
|
383
|
+
if (childRuleSet.$ref === undefined && !recordTypes.includes(recordType)) {
|
|
299
384
|
throw new DwnError(
|
|
300
385
|
DwnErrorCode.ProtocolsConfigureInvalidRuleSetRecordType,
|
|
301
386
|
`Rule set ${recordType} is not declared as an allowed type in the protocol definition.`
|
|
302
387
|
);
|
|
303
388
|
}
|
|
304
389
|
|
|
305
|
-
const childRuleSet = ruleSet[recordType];
|
|
306
|
-
|
|
307
390
|
let childRuleSetProtocolPath;
|
|
308
391
|
if (ruleSetProtocolPath === '') {
|
|
309
392
|
childRuleSetProtocolPath = recordType; // case of initial definition structure
|
|
@@ -315,13 +398,94 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
315
398
|
ruleSet : childRuleSet,
|
|
316
399
|
ruleSetProtocolPath : childRuleSetProtocolPath,
|
|
317
400
|
recordTypes,
|
|
318
|
-
roles
|
|
401
|
+
roles,
|
|
402
|
+
uses
|
|
319
403
|
});
|
|
320
404
|
}
|
|
321
405
|
}
|
|
322
406
|
|
|
407
|
+
/**
|
|
408
|
+
* Validates that a `$ref` node is a pure attachment point: it must NOT have
|
|
409
|
+
* `$actions`, `$role`, `$size`, `$tags`, or `$encryption`.
|
|
410
|
+
* Also validates that the `$ref` alias exists in the `uses` map.
|
|
411
|
+
*/
|
|
412
|
+
private static validateRefNode(ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, uses: ProtocolUses | undefined): void {
|
|
413
|
+
const ref = ruleSet.$ref!;
|
|
414
|
+
const parsed = parseCrossProtocolRef(ref);
|
|
415
|
+
|
|
416
|
+
if (parsed === undefined) {
|
|
417
|
+
throw new DwnError(
|
|
418
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
|
|
419
|
+
`'$ref' value '${ref}' at protocol path '${ruleSetProtocolPath}' must be in 'alias:typePath' format.`
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// validate alias exists in `uses`
|
|
424
|
+
if (uses === undefined || uses[parsed.alias] === undefined) {
|
|
425
|
+
throw new DwnError(
|
|
426
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
|
|
427
|
+
`'$ref' alias '${parsed.alias}' at protocol path '${ruleSetProtocolPath}' does not exist in the 'uses' map.`
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// validate that `$ref` nodes do not have other directives
|
|
432
|
+
const forbiddenDirectives = ['$actions', '$role', '$size', '$tags', '$encryption'] as const;
|
|
433
|
+
for (const directive of forbiddenDirectives) {
|
|
434
|
+
if (ruleSet[directive] !== undefined) {
|
|
435
|
+
throw new DwnError(
|
|
436
|
+
DwnErrorCode.ProtocolsConfigureInvalidRefNodeHasDirectives,
|
|
437
|
+
`'$ref' node at protocol path '${ruleSetProtocolPath}' must not have '${directive}'. ` +
|
|
438
|
+
`$ref nodes are pure attachment points — directives belong on child rule sets.`
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Validates that a cross-protocol reference (in `alias:path` format) has a valid alias
|
|
446
|
+
* that exists in the `uses` map.
|
|
447
|
+
* @param ref - The cross-protocol reference string (e.g., "threads:thread/participant")
|
|
448
|
+
* @param uses - The protocol definition's `uses` map
|
|
449
|
+
* @param ruleSetProtocolPath - The current protocol path (for error messages)
|
|
450
|
+
* @param fieldName - The field name ('role' or 'of') for error messages
|
|
451
|
+
*/
|
|
452
|
+
private static validateCrossProtocolAlias(
|
|
453
|
+
ref: string, uses: ProtocolUses | undefined, ruleSetProtocolPath: string, fieldName: string
|
|
454
|
+
): void {
|
|
455
|
+
const parsed = parseCrossProtocolRef(ref);
|
|
456
|
+
|
|
457
|
+
if (parsed === undefined) {
|
|
458
|
+
// should not happen if isCrossProtocolRef() returned true, but guard defensively
|
|
459
|
+
const errorCode = fieldName === 'role'
|
|
460
|
+
? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
|
|
461
|
+
: DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
|
|
462
|
+
|
|
463
|
+
throw new DwnError(
|
|
464
|
+
errorCode,
|
|
465
|
+
`cross-protocol '${fieldName}' reference '${ref}' at protocol path '${ruleSetProtocolPath}' ` +
|
|
466
|
+
`could not be parsed as a valid 'alias:path' format.`
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if (uses === undefined || uses[parsed.alias] === undefined) {
|
|
471
|
+
const errorCode = fieldName === 'role'
|
|
472
|
+
? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
|
|
473
|
+
: DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
|
|
474
|
+
|
|
475
|
+
throw new DwnError(
|
|
476
|
+
errorCode,
|
|
477
|
+
`cross-protocol '${fieldName}' alias '${parsed.alias}' in '${ref}' at protocol path '${ruleSetProtocolPath}' ` +
|
|
478
|
+
`does not exist in the 'uses' map.`
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
323
483
|
private static normalizeDefinition(definition: ProtocolDefinition): ProtocolDefinition {
|
|
324
|
-
|
|
484
|
+
// Deep clone types to avoid mutating the caller's nested objects
|
|
485
|
+
const typesCopy: ProtocolDefinition['types'] = {};
|
|
486
|
+
for (const typeName in definition.types) {
|
|
487
|
+
typesCopy[typeName] = { ...definition.types[typeName] };
|
|
488
|
+
}
|
|
325
489
|
|
|
326
490
|
// Normalize schema url
|
|
327
491
|
for (const typeName in typesCopy) {
|
|
@@ -331,10 +495,24 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
|
|
|
331
495
|
}
|
|
332
496
|
}
|
|
333
497
|
|
|
498
|
+
// Normalize `uses` protocol URLs (skip invalid URLs — they will be caught by validateUses)
|
|
499
|
+
let usesCopy: ProtocolDefinition['uses'];
|
|
500
|
+
if (definition.uses !== undefined) {
|
|
501
|
+
usesCopy = {};
|
|
502
|
+
for (const alias in definition.uses) {
|
|
503
|
+
try {
|
|
504
|
+
usesCopy[alias] = normalizeProtocolUrl(definition.uses[alias]);
|
|
505
|
+
} catch {
|
|
506
|
+
usesCopy[alias] = definition.uses[alias];
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
334
511
|
return {
|
|
335
512
|
...definition,
|
|
336
513
|
protocol : normalizeProtocolUrl(definition.protocol),
|
|
337
514
|
types : typesCopy,
|
|
515
|
+
...(usesCopy !== undefined && { uses: usesCopy }),
|
|
338
516
|
};
|
|
339
517
|
}
|
|
340
518
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AuthorizationModel } from '../types/message-types.js';
|
|
2
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
3
|
import type { MessageStore } from '../types/message-store.js';
|
|
3
|
-
import type { Signer } from '../types/signer.js';
|
|
4
4
|
import type { ProtocolsQueryDescriptor, ProtocolsQueryFilter, ProtocolsQueryMessage } from '../types/protocols-types.js';
|
|
5
5
|
|
|
6
6
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
@@ -16,7 +16,7 @@ import { normalizeProtocolUrl, validateProtocolUrlNormalized } from '../utils/ur
|
|
|
16
16
|
export type ProtocolsQueryOptions = {
|
|
17
17
|
messageTimestamp?: string;
|
|
18
18
|
filter?: ProtocolsQueryFilter,
|
|
19
|
-
signer?:
|
|
19
|
+
signer?: MessageSigner;
|
|
20
20
|
permissionGrantId?: string;
|
|
21
21
|
};
|
|
22
22
|
|
|
@@ -38,10 +38,11 @@ export class ProtocolsQuery extends AbstractMessage<ProtocolsQueryMessage> {
|
|
|
38
38
|
public static async create(options: ProtocolsQueryOptions): Promise<ProtocolsQuery> {
|
|
39
39
|
|
|
40
40
|
const descriptor: ProtocolsQueryDescriptor = {
|
|
41
|
-
interface
|
|
42
|
-
method
|
|
43
|
-
messageTimestamp
|
|
44
|
-
filter
|
|
41
|
+
interface : DwnInterfaceName.Protocols,
|
|
42
|
+
method : DwnMethodName.Query,
|
|
43
|
+
messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
|
|
44
|
+
filter : options.filter ? ProtocolsQuery.normalizeFilter(options.filter) : undefined,
|
|
45
|
+
permissionGrantId : options.permissionGrantId,
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
// delete all descriptor properties that are `undefined` else the code will encounter the following IPLD issue when attempting to generate CID:
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
|
+
import type { MessageStore } from '../types/message-store.js';
|
|
3
|
+
import type { DataEncodedRecordsWriteMessage, RecordsCountDescriptor, RecordsCountMessage, RecordsFilter } from '../types/records-types.js';
|
|
4
|
+
|
|
5
|
+
import { AbstractMessage } from '../core/abstract-message.js';
|
|
6
|
+
import { Message } from '../core/message.js';
|
|
7
|
+
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
8
|
+
import { Records } from '../utils/records.js';
|
|
9
|
+
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
10
|
+
import { removeUndefinedProperties } from '../utils/object.js';
|
|
11
|
+
import { Time } from '../utils/time.js';
|
|
12
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
13
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
14
|
+
import { validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../utils/url.js';
|
|
15
|
+
|
|
16
|
+
export type RecordsCountOptions = {
|
|
17
|
+
messageTimestamp?: string;
|
|
18
|
+
filter: RecordsFilter;
|
|
19
|
+
signer?: MessageSigner;
|
|
20
|
+
protocolRole?: string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The delegated grant to sign on behalf of the logical author, which is the grantor (`grantedBy`) of the delegated grant.
|
|
24
|
+
*/
|
|
25
|
+
delegatedGrant?: DataEncodedRecordsWriteMessage;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A class representing a RecordsCount DWN message.
|
|
30
|
+
*/
|
|
31
|
+
export class RecordsCount extends AbstractMessage<RecordsCountMessage> {
|
|
32
|
+
|
|
33
|
+
public static async parse(message: RecordsCountMessage): Promise<RecordsCount> {
|
|
34
|
+
let signaturePayload;
|
|
35
|
+
if (message.authorization !== undefined) {
|
|
36
|
+
signaturePayload = await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await Records.validateDelegatedGrantReferentialIntegrity(message, signaturePayload);
|
|
40
|
+
|
|
41
|
+
if (signaturePayload?.protocolRole !== undefined) {
|
|
42
|
+
if (message.descriptor.filter.protocolPath === undefined) {
|
|
43
|
+
throw new DwnError(
|
|
44
|
+
DwnErrorCode.RecordsCountFilterMissingRequiredProperties,
|
|
45
|
+
'Role-authorized counts must include `protocolPath` in the filter'
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (message.descriptor.filter.protocol !== undefined) {
|
|
51
|
+
validateProtocolUrlNormalized(message.descriptor.filter.protocol);
|
|
52
|
+
}
|
|
53
|
+
if (message.descriptor.filter.schema !== undefined) {
|
|
54
|
+
validateSchemaUrlNormalized(message.descriptor.filter.schema);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Time.validateTimestamp(message.descriptor.messageTimestamp);
|
|
58
|
+
|
|
59
|
+
return new RecordsCount(message);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public static async create(options: RecordsCountOptions): Promise<RecordsCount> {
|
|
63
|
+
const descriptor: RecordsCountDescriptor = {
|
|
64
|
+
interface : DwnInterfaceName.Records,
|
|
65
|
+
method : DwnMethodName.Count,
|
|
66
|
+
messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
|
|
67
|
+
filter : Records.normalizeFilter(options.filter),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// delete all descriptor properties that are `undefined` else the code will encounter the following IPLD issue when attempting to generate CID:
|
|
71
|
+
// Error: `undefined` is not supported by the IPLD Data Model and cannot be encoded
|
|
72
|
+
removeUndefinedProperties(descriptor);
|
|
73
|
+
|
|
74
|
+
// only generate the `authorization` property if signature input is given
|
|
75
|
+
const signer = options.signer;
|
|
76
|
+
let authorization;
|
|
77
|
+
if (signer) {
|
|
78
|
+
authorization = await Message.createAuthorization({
|
|
79
|
+
descriptor,
|
|
80
|
+
signer,
|
|
81
|
+
protocolRole : options.protocolRole,
|
|
82
|
+
delegatedGrant : options.delegatedGrant
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const message = { descriptor, authorization };
|
|
86
|
+
|
|
87
|
+
Message.validateJsonSchema(message);
|
|
88
|
+
|
|
89
|
+
return new RecordsCount(message);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Authorizes the delegate who signed the message.
|
|
94
|
+
* @param messageStore Used to check if the grant has been revoked.
|
|
95
|
+
*/
|
|
96
|
+
public async authorizeDelegate(messageStore: MessageStore): Promise<void> {
|
|
97
|
+
const delegatedGrant = await PermissionGrant.parse(this.message.authorization!.authorDelegatedGrant!);
|
|
98
|
+
await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
|
|
99
|
+
incomingMessage : this.message,
|
|
100
|
+
expectedGrantor : this.author!,
|
|
101
|
+
expectedGrantee : this.signer!,
|
|
102
|
+
permissionGrant : delegatedGrant,
|
|
103
|
+
messageStore
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { KeyValues } from '../types/query-types.js';
|
|
2
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
2
3
|
import type { MessageStore } from '../types//message-store.js';
|
|
3
|
-
import type { Signer } from '../types/signer.js';
|
|
4
4
|
import type { DataEncodedRecordsWriteMessage, RecordsDeleteDescriptor, RecordsDeleteMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
5
5
|
|
|
6
6
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
@@ -16,7 +16,7 @@ export type RecordsDeleteOptions = {
|
|
|
16
16
|
recordId: string;
|
|
17
17
|
messageTimestamp?: string;
|
|
18
18
|
protocolRole?: string;
|
|
19
|
-
signer:
|
|
19
|
+
signer: MessageSigner;
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Denotes if all the descendent records should be purged. Defaults to `false`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
1
2
|
import type { MessageStore } from '../types//message-store.js';
|
|
2
3
|
import type { Pagination } from '../types/message-types.js';
|
|
3
|
-
import type { Signer } from '../types/signer.js';
|
|
4
4
|
import type { DataEncodedRecordsWriteMessage, RecordsFilter, RecordsQueryDescriptor, RecordsQueryMessage } from '../types/records-types.js';
|
|
5
5
|
|
|
6
6
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
@@ -20,7 +20,7 @@ export type RecordsQueryOptions = {
|
|
|
20
20
|
filter: RecordsFilter;
|
|
21
21
|
dateSort?: DateSort;
|
|
22
22
|
pagination?: Pagination;
|
|
23
|
-
signer?:
|
|
23
|
+
signer?: MessageSigner;
|
|
24
24
|
protocolRole?: string;
|
|
25
25
|
|
|
26
26
|
/**
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
1
2
|
import type { MessageStore } from '../types//message-store.js';
|
|
2
|
-
import type { Signer } from '../types/signer.js';
|
|
3
3
|
import type { DataEncodedRecordsWriteMessage, RecordsFilter , RecordsReadDescriptor, RecordsReadMessage, RecordsWriteMessage } from '../types/records-types.js';
|
|
4
4
|
|
|
5
5
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
6
|
+
import { DateSort } from '../types/records-types.js';
|
|
6
7
|
import { Message } from '../core/message.js';
|
|
7
8
|
import { PermissionGrant } from '../protocols/permission-grant.js';
|
|
8
9
|
import { Records } from '../utils/records.js';
|
|
9
10
|
import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
|
|
10
11
|
import { removeUndefinedProperties } from '../utils/object.js';
|
|
11
12
|
import { Time } from '../utils/time.js';
|
|
13
|
+
import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
|
|
12
14
|
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
13
15
|
|
|
14
16
|
export type RecordsReadOptions = {
|
|
15
17
|
filter: RecordsFilter;
|
|
16
18
|
messageTimestamp?: string;
|
|
17
|
-
|
|
19
|
+
dateSort?: DateSort;
|
|
20
|
+
signer?: MessageSigner;
|
|
18
21
|
permissionGrantId?: string;
|
|
19
22
|
/**
|
|
20
23
|
* Used when authorizing protocol records.
|
|
@@ -31,6 +34,15 @@ export type RecordsReadOptions = {
|
|
|
31
34
|
export class RecordsRead extends AbstractMessage<RecordsReadMessage> {
|
|
32
35
|
|
|
33
36
|
public static async parse(message: RecordsReadMessage): Promise<RecordsRead> {
|
|
37
|
+
if (message.descriptor.filter.published === false) {
|
|
38
|
+
if (message.descriptor.dateSort === DateSort.PublishedAscending || message.descriptor.dateSort === DateSort.PublishedDescending) {
|
|
39
|
+
throw new DwnError(
|
|
40
|
+
DwnErrorCode.RecordsReadParseFilterPublishedSortInvalid,
|
|
41
|
+
`reads must not filter for \`published:false\` and sort by ${message.descriptor.dateSort}`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
34
46
|
let signaturePayload;
|
|
35
47
|
if (message.authorization !== undefined) {
|
|
36
48
|
signaturePayload = await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
|
|
@@ -52,14 +64,25 @@ export class RecordsRead extends AbstractMessage<RecordsReadMessage> {
|
|
|
52
64
|
* @throws {DwnError} when a combination of required RecordsReadOptions are missing
|
|
53
65
|
*/
|
|
54
66
|
public static async create(options: RecordsReadOptions): Promise<RecordsRead> {
|
|
55
|
-
const { filter, signer, permissionGrantId, protocolRole } = options;
|
|
67
|
+
const { filter, signer, permissionGrantId, protocolRole, dateSort } = options;
|
|
56
68
|
const currentTime = Time.getCurrentTimestamp();
|
|
57
69
|
|
|
70
|
+
if (options.filter.published === false) {
|
|
71
|
+
if (dateSort === DateSort.PublishedAscending || dateSort === DateSort.PublishedDescending) {
|
|
72
|
+
throw new DwnError(
|
|
73
|
+
DwnErrorCode.RecordsReadCreateFilterPublishedSortInvalid,
|
|
74
|
+
`reads must not filter for \`published:false\` and sort by ${dateSort}`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
58
79
|
const descriptor: RecordsReadDescriptor = {
|
|
59
80
|
interface : DwnInterfaceName.Records,
|
|
60
81
|
method : DwnMethodName.Read,
|
|
61
82
|
filter : Records.normalizeFilter(filter),
|
|
62
83
|
messageTimestamp : options.messageTimestamp ?? currentTime,
|
|
84
|
+
permissionGrantId,
|
|
85
|
+
dateSort,
|
|
63
86
|
};
|
|
64
87
|
|
|
65
88
|
removeUndefinedProperties(descriptor);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { MessageSigner } from '../types/signer.js';
|
|
1
2
|
import type { MessageStore } from '../types/message-store.js';
|
|
2
|
-
import type { Signer } from '../types/signer.js';
|
|
3
3
|
import type { DataEncodedRecordsWriteMessage, RecordsFilter, RecordsSubscribeDescriptor, RecordsSubscribeMessage } from '../types/records-types.js';
|
|
4
4
|
|
|
5
5
|
import { AbstractMessage } from '../core/abstract-message.js';
|
|
@@ -16,7 +16,7 @@ import { validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../u
|
|
|
16
16
|
export type RecordsSubscribeOptions = {
|
|
17
17
|
messageTimestamp?: string;
|
|
18
18
|
filter: RecordsFilter;
|
|
19
|
-
signer?:
|
|
19
|
+
signer?: MessageSigner;
|
|
20
20
|
protocolRole?: string;
|
|
21
21
|
|
|
22
22
|
/**
|