@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
|
@@ -7,12 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import messageProtocolDefinition from '../vectors/protocol-definitions/message.json' assert { type: 'json' };
|
|
10
|
+
import emailProtocolDefinition from '../vectors/protocol-definitions/email.json' with { type: 'json' };
|
|
11
|
+
import messageProtocolDefinition from '../vectors/protocol-definitions/message.json' with { type: 'json' };
|
|
13
12
|
import sinon from 'sinon';
|
|
14
|
-
import threadRoleProtocolDefinition from '../vectors/protocol-definitions/thread-role.json'
|
|
15
|
-
import chai, { expect } from 'chai';
|
|
13
|
+
import threadRoleProtocolDefinition from '../vectors/protocol-definitions/thread-role.json' with { type: 'json' };
|
|
16
14
|
import { base64url } from 'multiformats/bases/base64';
|
|
17
15
|
import { DataStream } from '../../src/utils/data-stream.js';
|
|
18
16
|
import { Dwn } from '../../src/dwn.js';
|
|
@@ -25,29 +23,29 @@ import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
|
25
23
|
import { TestEventStream } from '../test-event-stream.js';
|
|
26
24
|
import { TestStores } from '../test-stores.js';
|
|
27
25
|
import { Time } from '../../src/utils/time.js';
|
|
26
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
28
27
|
import { DidKey, UniversalResolver } from '@enbox/dids';
|
|
29
28
|
import { DwnInterfaceName, DwnMethodName, Encoder, Message, PermissionsProtocol, RecordsDelete, RecordsQuery, RecordsRead, RecordsSubscribe } from '../../src/index.js';
|
|
30
|
-
chai.use(chaiAsPromised);
|
|
31
29
|
export function testAuthorDelegatedGrant() {
|
|
32
|
-
describe('author delegated grant', () =>
|
|
30
|
+
describe('author delegated grant', () => {
|
|
33
31
|
let didResolver;
|
|
34
32
|
let messageStore;
|
|
35
33
|
let dataStore;
|
|
36
34
|
let resumableTaskStore;
|
|
37
|
-
let
|
|
35
|
+
let stateIndex;
|
|
38
36
|
let eventStream;
|
|
39
37
|
let dwn;
|
|
40
38
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
41
39
|
// so that different test suites can reuse the same backend store for testing
|
|
42
|
-
|
|
40
|
+
beforeAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
43
41
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
44
42
|
const stores = TestStores.get();
|
|
45
43
|
messageStore = stores.messageStore;
|
|
46
44
|
dataStore = stores.dataStore;
|
|
47
45
|
resumableTaskStore = stores.resumableTaskStore;
|
|
48
|
-
|
|
46
|
+
stateIndex = stores.stateIndex;
|
|
49
47
|
eventStream = TestEventStream.get();
|
|
50
|
-
dwn = yield Dwn.create({ didResolver, messageStore, dataStore,
|
|
48
|
+
dwn = yield Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventStream, resumableTaskStore });
|
|
51
49
|
}));
|
|
52
50
|
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
|
|
53
51
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
@@ -55,9 +53,9 @@ export function testAuthorDelegatedGrant() {
|
|
|
55
53
|
yield messageStore.clear();
|
|
56
54
|
yield dataStore.clear();
|
|
57
55
|
yield resumableTaskStore.clear();
|
|
58
|
-
yield
|
|
56
|
+
yield stateIndex.clear();
|
|
59
57
|
}));
|
|
60
|
-
|
|
58
|
+
afterAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
61
59
|
yield dwn.close();
|
|
62
60
|
}));
|
|
63
61
|
describe('ProtocolsConfigure', () => {
|
|
@@ -85,22 +83,22 @@ export function testAuthorDelegatedGrant() {
|
|
|
85
83
|
});
|
|
86
84
|
// Bob should be able to configure a protocol on behalf of alice
|
|
87
85
|
const protocolConfigureReply = yield dwn.processMessage(alice.did, protocolConfigure.message);
|
|
88
|
-
expect(protocolConfigureReply.status.code).
|
|
86
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
89
87
|
// verify the protocol configure message was processed
|
|
90
88
|
const protocolsQuery = yield TestDataGenerator.generateProtocolsQuery({
|
|
91
89
|
author: alice,
|
|
92
90
|
filter: { protocol: emailProtocolDefinition.protocol }
|
|
93
91
|
});
|
|
94
92
|
const { status, entries } = yield dwn.processMessage(alice.did, protocolsQuery.message);
|
|
95
|
-
expect(status.code).
|
|
96
|
-
expect(entries === null || entries === void 0 ? void 0 : entries.length).
|
|
93
|
+
expect(status.code).toBe(200);
|
|
94
|
+
expect(entries === null || entries === void 0 ? void 0 : entries.length).toBe(1);
|
|
97
95
|
const fetchedProtocolConfigure = entries[0];
|
|
98
|
-
expect(fetchedProtocolConfigure.descriptor.definition).
|
|
96
|
+
expect(fetchedProtocolConfigure.descriptor.definition).toEqual(emailProtocolDefinition);
|
|
99
97
|
// author should be alice
|
|
100
98
|
const author = Message.getAuthor(fetchedProtocolConfigure);
|
|
101
|
-
expect(author).
|
|
99
|
+
expect(author).toBe(alice.did);
|
|
102
100
|
const signer = Message.getSigner(fetchedProtocolConfigure);
|
|
103
|
-
expect(signer).
|
|
101
|
+
expect(signer).toBe(bob.did);
|
|
104
102
|
}));
|
|
105
103
|
it('should allow author-delegated grant to configure a specific protocol', () => __awaiter(this, void 0, void 0, function* () {
|
|
106
104
|
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
@@ -127,22 +125,22 @@ export function testAuthorDelegatedGrant() {
|
|
|
127
125
|
});
|
|
128
126
|
// Bob should be able to configure a protocol on behalf of alice
|
|
129
127
|
const protocolConfigureReply = yield dwn.processMessage(alice.did, protocolConfigure.message);
|
|
130
|
-
expect(protocolConfigureReply.status.code).
|
|
128
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
131
129
|
// verify the protocol configure message was processed
|
|
132
130
|
const protocolsQuery = yield TestDataGenerator.generateProtocolsQuery({
|
|
133
131
|
author: alice,
|
|
134
132
|
filter: { protocol: emailProtocolDefinition.protocol }
|
|
135
133
|
});
|
|
136
134
|
const { status, entries } = yield dwn.processMessage(alice.did, protocolsQuery.message);
|
|
137
|
-
expect(status.code).
|
|
138
|
-
expect(entries === null || entries === void 0 ? void 0 : entries.length).
|
|
135
|
+
expect(status.code).toBe(200);
|
|
136
|
+
expect(entries === null || entries === void 0 ? void 0 : entries.length).toBe(1);
|
|
139
137
|
const fetchedProtocolConfigure = entries[0];
|
|
140
|
-
expect(fetchedProtocolConfigure.descriptor.definition).
|
|
138
|
+
expect(fetchedProtocolConfigure.descriptor.definition).toEqual(emailProtocolDefinition);
|
|
141
139
|
// author should be alice
|
|
142
140
|
const author = Message.getAuthor(fetchedProtocolConfigure);
|
|
143
|
-
expect(author).
|
|
141
|
+
expect(author).toBe(alice.did);
|
|
144
142
|
const signer = Message.getSigner(fetchedProtocolConfigure);
|
|
145
|
-
expect(signer).
|
|
143
|
+
expect(signer).toBe(bob.did);
|
|
146
144
|
// verify that bob cannot configure a different protocol
|
|
147
145
|
const otherProtocolDefinition = Object.assign(Object.assign({}, emailProtocolDefinition), { protocol: 'https://example.com/protocol/otherProtocol' });
|
|
148
146
|
const otherProtocolConfigure = yield TestDataGenerator.generateProtocolsConfigure({
|
|
@@ -151,11 +149,11 @@ export function testAuthorDelegatedGrant() {
|
|
|
151
149
|
protocolDefinition: otherProtocolDefinition,
|
|
152
150
|
});
|
|
153
151
|
const otherProtocolConfigureReply = yield dwn.processMessage(alice.did, otherProtocolConfigure.message);
|
|
154
|
-
expect(otherProtocolConfigureReply.status.code).
|
|
155
|
-
expect(otherProtocolConfigureReply.status.detail).
|
|
152
|
+
expect(otherProtocolConfigureReply.status.code).toBe(401);
|
|
153
|
+
expect(otherProtocolConfigureReply.status.detail).toContain(DwnErrorCode.ProtocolsGrantAuthorizationScopeProtocolMismatch);
|
|
156
154
|
}));
|
|
157
155
|
});
|
|
158
|
-
describe('RecordsWrite.parse()', () =>
|
|
156
|
+
describe('RecordsWrite.parse()', () => {
|
|
159
157
|
it('should throw if a message invokes a author-delegated grant (ID) but the author-delegated grant is not given', () => __awaiter(this, void 0, void 0, function* () {
|
|
160
158
|
const alice = yield TestDataGenerator.generatePersona();
|
|
161
159
|
const bob = yield TestDataGenerator.generatePersona();
|
|
@@ -182,7 +180,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
182
180
|
});
|
|
183
181
|
delete recordsWrite.message.authorization.authorDelegatedGrant; // intentionally remove `authorDelegatedGrant`
|
|
184
182
|
const parsePromise = RecordsWrite.parse(recordsWrite.message);
|
|
185
|
-
yield expect(parsePromise).
|
|
183
|
+
yield expect(parsePromise).rejects.toThrow(DwnErrorCode.RecordsAuthorDelegatedGrantAndIdExistenceMismatch);
|
|
186
184
|
}));
|
|
187
185
|
it('should throw if a message includes an author-delegated grant but does not reference it in author signature', () => __awaiter(this, void 0, void 0, function* () {
|
|
188
186
|
const alice = yield TestDataGenerator.generatePersona();
|
|
@@ -213,9 +211,9 @@ export function testAuthorDelegatedGrant() {
|
|
|
213
211
|
delete authorSignaturePayloadCopy.delegatedGrantId; // intentionally remove `delegatedGrantId` in author signature
|
|
214
212
|
recordsWrite.message.authorization.signature.payload = Encoder.stringToBase64Url(JSON.stringify(authorSignaturePayloadCopy));
|
|
215
213
|
const parsePromise = RecordsWrite.parse(recordsWrite.message);
|
|
216
|
-
yield expect(parsePromise).
|
|
214
|
+
yield expect(parsePromise).rejects.toThrow(DwnErrorCode.RecordsAuthorDelegatedGrantAndIdExistenceMismatch);
|
|
217
215
|
}));
|
|
218
|
-
})
|
|
216
|
+
});
|
|
219
217
|
it('should only allow correct entity invoking an author-delegated grant to write', () => __awaiter(this, void 0, void 0, function* () {
|
|
220
218
|
var _a, _b;
|
|
221
219
|
// scenario:
|
|
@@ -236,7 +234,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
236
234
|
protocolDefinition
|
|
237
235
|
});
|
|
238
236
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
239
|
-
expect(protocolConfigureReply.status.code).
|
|
237
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
240
238
|
// Alice creates a delegated grant for device X and device Y
|
|
241
239
|
const scope = {
|
|
242
240
|
interface: DwnInterfaceName.Records,
|
|
@@ -270,19 +268,19 @@ export function testAuthorDelegatedGrant() {
|
|
|
270
268
|
data: deviceXData
|
|
271
269
|
});
|
|
272
270
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
273
|
-
expect(deviceXWriteReply.status.code).
|
|
271
|
+
expect(deviceXWriteReply.status.code).toBe(202);
|
|
274
272
|
// verify the message by device X got written to Bob's DWN, AND Alice is the logical author
|
|
275
273
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
276
274
|
author: bob,
|
|
277
275
|
filter: { protocol }
|
|
278
276
|
});
|
|
279
277
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
280
|
-
expect(bobRecordsQueryReply.status.code).
|
|
281
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
278
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
279
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(1);
|
|
282
280
|
const fetchedDeviceXWriteEntry = bobRecordsQueryReply.entries[0];
|
|
283
|
-
expect(fetchedDeviceXWriteEntry.encodedData).
|
|
281
|
+
expect(fetchedDeviceXWriteEntry.encodedData).toBe(base64url.baseEncode(deviceXData));
|
|
284
282
|
const fetchedDeviceXWrite = yield RecordsWrite.parse(fetchedDeviceXWriteEntry);
|
|
285
|
-
expect(fetchedDeviceXWrite.author).
|
|
283
|
+
expect(fetchedDeviceXWrite.author).toBe(alice.did);
|
|
286
284
|
// generate a new message by device Y updating the existing record device X created, and write to Bob's DWN
|
|
287
285
|
const deviceYData = new TextEncoder().encode('message from device Y');
|
|
288
286
|
const deviceYDataStream = DataStream.fromBytes(deviceYData);
|
|
@@ -293,15 +291,15 @@ export function testAuthorDelegatedGrant() {
|
|
|
293
291
|
delegatedGrant: deviceYGrant.dataEncodedMessage,
|
|
294
292
|
});
|
|
295
293
|
const deviceYWriteReply = yield dwn.processMessage(bob.did, messageByDeviceY.message, { dataStream: deviceYDataStream });
|
|
296
|
-
expect(deviceYWriteReply.status.code).
|
|
294
|
+
expect(deviceYWriteReply.status.code).toBe(202);
|
|
297
295
|
// verify the message by device Y got written to Bob's DWN, AND Alice is the logical author
|
|
298
296
|
const bobRecordsQueryReply2 = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
299
|
-
expect(bobRecordsQueryReply2.status.code).
|
|
300
|
-
expect((_b = bobRecordsQueryReply2.entries) === null || _b === void 0 ? void 0 : _b.length).
|
|
297
|
+
expect(bobRecordsQueryReply2.status.code).toBe(200);
|
|
298
|
+
expect((_b = bobRecordsQueryReply2.entries) === null || _b === void 0 ? void 0 : _b.length).toBe(1);
|
|
301
299
|
const fetchedDeviceYWriteEntry = bobRecordsQueryReply2.entries[0];
|
|
302
|
-
expect(fetchedDeviceYWriteEntry.encodedData).
|
|
300
|
+
expect(fetchedDeviceYWriteEntry.encodedData).toBe(base64url.baseEncode(deviceYData));
|
|
303
301
|
const fetchedDeviceYWrite = yield RecordsWrite.parse(fetchedDeviceYWriteEntry);
|
|
304
|
-
expect(fetchedDeviceYWrite.author).
|
|
302
|
+
expect(fetchedDeviceYWrite.author).toBe(alice.did);
|
|
305
303
|
// Verify that Carol cannot write a chat message as Alice by invoking the Device X's grant
|
|
306
304
|
const messageByCarolAsAlice = new TextEncoder().encode('Message from Carol pretending to be Alice');
|
|
307
305
|
const writeByCarolAsAlice = yield RecordsWrite.create({
|
|
@@ -314,8 +312,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
314
312
|
data: messageByCarolAsAlice
|
|
315
313
|
});
|
|
316
314
|
const carolWriteReply = yield dwn.processMessage(carol.did, writeByCarolAsAlice.message, { dataStream: DataStream.fromBytes(messageByCarolAsAlice) });
|
|
317
|
-
expect(carolWriteReply.status.code).
|
|
318
|
-
expect(carolWriteReply.status.detail).
|
|
315
|
+
expect(carolWriteReply.status.code).toBe(400);
|
|
316
|
+
expect(carolWriteReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantGrantedToAndOwnerSignatureMismatch);
|
|
319
317
|
}));
|
|
320
318
|
it('should only allow correct entity invoking an author-delegated grant to read and query ', () => __awaiter(this, void 0, void 0, function* () {
|
|
321
319
|
var _a, _b, _c, _d;
|
|
@@ -336,7 +334,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
336
334
|
protocolDefinition
|
|
337
335
|
});
|
|
338
336
|
const protocolsConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
339
|
-
expect(protocolsConfigureReply.status.code).
|
|
337
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
340
338
|
// Bob starts a chat thread
|
|
341
339
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
342
340
|
author: bob,
|
|
@@ -344,7 +342,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
344
342
|
protocolPath: 'thread',
|
|
345
343
|
});
|
|
346
344
|
const threadRoleReply = yield dwn.processMessage(bob.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
347
|
-
expect(threadRoleReply.status.code).
|
|
345
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
348
346
|
// Bob adds Alice as a participant in the thread
|
|
349
347
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
350
348
|
author: bob,
|
|
@@ -355,7 +353,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
355
353
|
data: new TextEncoder().encode('Alice is my friend'),
|
|
356
354
|
});
|
|
357
355
|
const participantRoleReply = yield dwn.processMessage(bob.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
358
|
-
expect(participantRoleReply.status.code).
|
|
356
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
359
357
|
// Bob writes a chat message in the thread
|
|
360
358
|
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
361
359
|
author: bob,
|
|
@@ -364,7 +362,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
364
362
|
parentContextId: threadRecord.message.contextId,
|
|
365
363
|
});
|
|
366
364
|
const chatRecordReply = yield dwn.processMessage(bob.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
367
|
-
expect(chatRecordReply.status.code).
|
|
365
|
+
expect(chatRecordReply.status.code).toBe(202);
|
|
368
366
|
// Alice creates a delegated query grant for device X to act as Alice.
|
|
369
367
|
const queryGrantForDeviceX = yield PermissionsProtocol.createGrant({
|
|
370
368
|
delegated: true, // this is a delegated grant
|
|
@@ -395,8 +393,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
395
393
|
filter: { protocol }
|
|
396
394
|
});
|
|
397
395
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
398
|
-
expect(bobRecordsQueryReply.status.code).
|
|
399
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
396
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
397
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(3);
|
|
400
398
|
// sanity verify Alice herself is able to query for the chat message from Bob's DWN
|
|
401
399
|
const recordsQueryByAlice = yield RecordsQuery.create({
|
|
402
400
|
signer: Jws.createSigner(alice),
|
|
@@ -408,8 +406,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
408
406
|
}
|
|
409
407
|
});
|
|
410
408
|
const aliceRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByAlice.message);
|
|
411
|
-
expect(aliceRecordsQueryReply.status.code).
|
|
412
|
-
expect((_b = aliceRecordsQueryReply.entries) === null || _b === void 0 ? void 0 : _b.length).
|
|
409
|
+
expect(aliceRecordsQueryReply.status.code).toBe(200);
|
|
410
|
+
expect((_b = aliceRecordsQueryReply.entries) === null || _b === void 0 ? void 0 : _b.length).toBe(1);
|
|
413
411
|
// verify device X is able to query for the chat message from Bob's DWN
|
|
414
412
|
const recordsQueryByDeviceX = yield RecordsQuery.create({
|
|
415
413
|
signer: Jws.createSigner(deviceX),
|
|
@@ -422,8 +420,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
422
420
|
}
|
|
423
421
|
});
|
|
424
422
|
const deviceXRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByDeviceX.message);
|
|
425
|
-
expect(deviceXRecordsQueryReply.status.code).
|
|
426
|
-
expect((_c = deviceXRecordsQueryReply.entries) === null || _c === void 0 ? void 0 : _c.length).
|
|
423
|
+
expect(deviceXRecordsQueryReply.status.code).toBe(200);
|
|
424
|
+
expect((_c = deviceXRecordsQueryReply.entries) === null || _c === void 0 ? void 0 : _c.length).toBe(1);
|
|
427
425
|
// verify device X is able to read the chat message from Bob's DWN
|
|
428
426
|
const recordsReadByDeviceX = yield RecordsRead.create({
|
|
429
427
|
signer: Jws.createSigner(deviceX),
|
|
@@ -434,8 +432,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
434
432
|
}
|
|
435
433
|
});
|
|
436
434
|
const deviceXRecordsReadReply = yield dwn.processMessage(bob.did, recordsReadByDeviceX.message);
|
|
437
|
-
expect(deviceXRecordsReadReply.status.code).
|
|
438
|
-
expect((_d = deviceXRecordsReadReply.entry.recordsWrite) === null || _d === void 0 ? void 0 : _d.recordId).
|
|
435
|
+
expect(deviceXRecordsReadReply.status.code).toBe(200);
|
|
436
|
+
expect((_d = deviceXRecordsReadReply.entry.recordsWrite) === null || _d === void 0 ? void 0 : _d.recordId).toBe(chatRecord.message.recordId);
|
|
439
437
|
// Verify that Carol cannot query as Alice by invoking the delegated grant granted to Device X
|
|
440
438
|
const recordsQueryByCarol = yield RecordsQuery.create({
|
|
441
439
|
signer: Jws.createSigner(carol),
|
|
@@ -448,8 +446,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
448
446
|
}
|
|
449
447
|
});
|
|
450
448
|
const recordsQueryByCarolReply = yield dwn.processMessage(bob.did, recordsQueryByCarol.message);
|
|
451
|
-
expect(recordsQueryByCarolReply.status.code).
|
|
452
|
-
expect(recordsQueryByCarolReply.status.detail).
|
|
449
|
+
expect(recordsQueryByCarolReply.status.code).toBe(400);
|
|
450
|
+
expect(recordsQueryByCarolReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantGrantedToAndOwnerSignatureMismatch);
|
|
453
451
|
// Verify that Carol cannot read as Alice by invoking the delegated grant granted to Device X
|
|
454
452
|
const recordsReadByCarol = yield RecordsRead.create({
|
|
455
453
|
signer: Jws.createSigner(carol),
|
|
@@ -460,8 +458,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
460
458
|
}
|
|
461
459
|
});
|
|
462
460
|
const recordsReadByCarolReply = yield dwn.processMessage(bob.did, recordsReadByCarol.message);
|
|
463
|
-
expect(recordsReadByCarolReply.status.code).
|
|
464
|
-
expect(recordsQueryByCarolReply.status.detail).
|
|
461
|
+
expect(recordsReadByCarolReply.status.code).toBe(400);
|
|
462
|
+
expect(recordsQueryByCarolReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantGrantedToAndOwnerSignatureMismatch);
|
|
465
463
|
}));
|
|
466
464
|
it('should only allow correct entity invoking an author-delegated grant to subscribe', () => __awaiter(this, void 0, void 0, function* () {
|
|
467
465
|
// scenario:
|
|
@@ -486,7 +484,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
486
484
|
protocolDefinition
|
|
487
485
|
});
|
|
488
486
|
const protocolsConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
489
|
-
expect(protocolsConfigureReply.status.code).
|
|
487
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
490
488
|
// Bob starts a chat thread
|
|
491
489
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
492
490
|
author: bob,
|
|
@@ -494,7 +492,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
494
492
|
protocolPath: 'thread',
|
|
495
493
|
});
|
|
496
494
|
const threadRoleReply = yield dwn.processMessage(bob.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
497
|
-
expect(threadRoleReply.status.code).
|
|
495
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
498
496
|
// Bob adds Alice as a participant in the thread
|
|
499
497
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
500
498
|
author: bob,
|
|
@@ -505,7 +503,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
505
503
|
data: new TextEncoder().encode('Alice is my friend'),
|
|
506
504
|
});
|
|
507
505
|
const participantRoleReply = yield dwn.processMessage(bob.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
508
|
-
expect(participantRoleReply.status.code).
|
|
506
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
509
507
|
// Alice creates a delegated subscribe grant for device X to act as Alice.
|
|
510
508
|
const subscribeGrantForDeviceX = yield PermissionsProtocol.createGrant({
|
|
511
509
|
delegated: true, // this is a delegated grant
|
|
@@ -542,7 +540,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
542
540
|
}
|
|
543
541
|
});
|
|
544
542
|
const recordsSubscribeByDeviceXWithoutGrantReply = yield dwn.processMessage(bob.did, recordsSubscribeByDeviceXWithoutGrant.message);
|
|
545
|
-
expect(recordsSubscribeByDeviceXWithoutGrantReply.status.code).
|
|
543
|
+
expect(recordsSubscribeByDeviceXWithoutGrantReply.status.code).toBe(401, 'device X without grant subscribe');
|
|
546
544
|
// control: verify that Carol cannot subscribe as Alice by invoking the delegated grant granted to Device X
|
|
547
545
|
const recordsSubscribeByCarol = yield RecordsSubscribe.create({
|
|
548
546
|
signer: Jws.createSigner(carol),
|
|
@@ -555,8 +553,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
555
553
|
}
|
|
556
554
|
});
|
|
557
555
|
const recordsSubscribeByCarolReply = yield dwn.processMessage(bob.did, recordsSubscribeByCarol.message);
|
|
558
|
-
expect(recordsSubscribeByCarolReply.status.code).
|
|
559
|
-
expect(recordsSubscribeByCarolReply.status.detail).
|
|
556
|
+
expect(recordsSubscribeByCarolReply.status.code).toBe(400, 'carol subscribe');
|
|
557
|
+
expect(recordsSubscribeByCarolReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantGrantedToAndOwnerSignatureMismatch);
|
|
560
558
|
// verify device X is able to subscribe the chat message from Bob's DWN using the delegated grant
|
|
561
559
|
const recordsSubscribeByDeviceX = yield RecordsSubscribe.create({
|
|
562
560
|
signer: Jws.createSigner(deviceX),
|
|
@@ -571,7 +569,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
571
569
|
const recordsSubscribeByDeviceXReply = yield dwn.processMessage(bob.did, recordsSubscribeByDeviceX.message, {
|
|
572
570
|
subscriptionHandler: captureChatRecords
|
|
573
571
|
});
|
|
574
|
-
expect(recordsSubscribeByDeviceXReply.status.code).
|
|
572
|
+
expect(recordsSubscribeByDeviceXReply.status.code).toBe(200, 'subscribe');
|
|
575
573
|
// Bob writes chat messages in the thread
|
|
576
574
|
const chatRecord1 = yield TestDataGenerator.generateRecordsWrite({
|
|
577
575
|
author: bob,
|
|
@@ -580,7 +578,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
580
578
|
parentContextId: threadRecord.message.contextId,
|
|
581
579
|
});
|
|
582
580
|
const chatRecord1Reply = yield dwn.processMessage(bob.did, chatRecord1.message, { dataStream: chatRecord1.dataStream });
|
|
583
|
-
expect(chatRecord1Reply.status.code).
|
|
581
|
+
expect(chatRecord1Reply.status.code).toBe(202);
|
|
584
582
|
const chatRecord2 = yield TestDataGenerator.generateRecordsWrite({
|
|
585
583
|
author: bob,
|
|
586
584
|
protocol: protocolDefinition.protocol,
|
|
@@ -588,10 +586,10 @@ export function testAuthorDelegatedGrant() {
|
|
|
588
586
|
parentContextId: threadRecord.message.contextId,
|
|
589
587
|
});
|
|
590
588
|
const chatRecord2Reply = yield dwn.processMessage(bob.did, chatRecord2.message, { dataStream: chatRecord2.dataStream });
|
|
591
|
-
expect(chatRecord2Reply.status.code).
|
|
589
|
+
expect(chatRecord2Reply.status.code).toBe(202);
|
|
592
590
|
yield Poller.pollUntilSuccessOrTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
593
|
-
expect(subscriptionChatRecords.size).
|
|
594
|
-
expect([...subscriptionChatRecords]).
|
|
591
|
+
expect(subscriptionChatRecords.size).toBe(2);
|
|
592
|
+
expect([...subscriptionChatRecords]).toEqual(expect.arrayContaining([chatRecord1.message.recordId, chatRecord2.message.recordId]));
|
|
595
593
|
}));
|
|
596
594
|
yield ((_a = recordsSubscribeByDeviceXReply.subscription) === null || _a === void 0 ? void 0 : _a.close());
|
|
597
595
|
}));
|
|
@@ -615,7 +613,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
615
613
|
protocolDefinition
|
|
616
614
|
});
|
|
617
615
|
const protocolsConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
618
|
-
expect(protocolsConfigureReply.status.code).
|
|
616
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
619
617
|
// Bob adds Alice as an admin
|
|
620
618
|
const globalAdminRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
621
619
|
author: bob,
|
|
@@ -625,7 +623,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
625
623
|
data: new TextEncoder().encode('I trust Alice to manage my chat thread'),
|
|
626
624
|
});
|
|
627
625
|
const globalAdminRecordReply = yield dwn.processMessage(bob.did, globalAdminRecord.message, { dataStream: globalAdminRecord.dataStream });
|
|
628
|
-
expect(globalAdminRecordReply.status.code).
|
|
626
|
+
expect(globalAdminRecordReply.status.code).toBe(202);
|
|
629
627
|
// Bob starts a chat thread
|
|
630
628
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
631
629
|
author: bob,
|
|
@@ -633,7 +631,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
633
631
|
protocolPath: 'thread',
|
|
634
632
|
});
|
|
635
633
|
const threadRoleReply = yield dwn.processMessage(bob.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
636
|
-
expect(threadRoleReply.status.code).
|
|
634
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
637
635
|
// Bob adds Carol as a participant in the thread
|
|
638
636
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
639
637
|
author: bob,
|
|
@@ -643,7 +641,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
643
641
|
parentContextId: threadRecord.message.contextId
|
|
644
642
|
});
|
|
645
643
|
const participantRoleReply = yield dwn.processMessage(bob.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
646
|
-
expect(participantRoleReply.status.code).
|
|
644
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
647
645
|
// Carol writes a chat message in the thread
|
|
648
646
|
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
649
647
|
author: carol,
|
|
@@ -654,7 +652,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
654
652
|
data: new TextEncoder().encode('A rude message'),
|
|
655
653
|
});
|
|
656
654
|
const chatRecordReply = yield dwn.processMessage(bob.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
657
|
-
expect(chatRecordReply.status.code).
|
|
655
|
+
expect(chatRecordReply.status.code).toBe(202);
|
|
658
656
|
// Alice creates a delegated delete grant for device X to act as Alice.
|
|
659
657
|
const deleteGrantForDeviceX = yield PermissionsProtocol.createGrant({
|
|
660
658
|
delegated: true, // this is a delegated grant
|
|
@@ -675,15 +673,15 @@ export function testAuthorDelegatedGrant() {
|
|
|
675
673
|
recordId: chatRecord.message.recordId
|
|
676
674
|
});
|
|
677
675
|
const carolRecordsDeleteReply = yield dwn.processMessage(bob.did, recordsDeleteByCarol.message);
|
|
678
|
-
expect(carolRecordsDeleteReply.status.code).
|
|
676
|
+
expect(carolRecordsDeleteReply.status.code).toBe(400);
|
|
679
677
|
// sanity verify the chat message is still in Bob's DWN
|
|
680
678
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
681
679
|
author: bob,
|
|
682
680
|
filter: { protocolPath: 'thread/chat' }
|
|
683
681
|
});
|
|
684
682
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
685
|
-
expect(bobRecordsQueryReply.status.code).
|
|
686
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
683
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
684
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(1);
|
|
687
685
|
// verify device X is able to delete Carol's chat message from Bob's DWN
|
|
688
686
|
const recordsDeleteByDeviceX = yield RecordsDelete.create({
|
|
689
687
|
signer: Jws.createSigner(deviceX),
|
|
@@ -692,11 +690,11 @@ export function testAuthorDelegatedGrant() {
|
|
|
692
690
|
recordId: chatRecord.message.recordId
|
|
693
691
|
});
|
|
694
692
|
const deviceXRecordsDeleteReply = yield dwn.processMessage(bob.did, recordsDeleteByDeviceX.message);
|
|
695
|
-
expect(deviceXRecordsDeleteReply.status.code).
|
|
693
|
+
expect(deviceXRecordsDeleteReply.status.code).toBe(202);
|
|
696
694
|
// sanity verify the chat message is no longer queryable from Bob's DWN
|
|
697
695
|
const bobRecordsQueryReply2 = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
698
|
-
expect(bobRecordsQueryReply2.status.code).
|
|
699
|
-
expect((_b = bobRecordsQueryReply2.entries) === null || _b === void 0 ? void 0 : _b.length).
|
|
696
|
+
expect(bobRecordsQueryReply2.status.code).toBe(200);
|
|
697
|
+
expect((_b = bobRecordsQueryReply2.entries) === null || _b === void 0 ? void 0 : _b.length).toBe(0);
|
|
700
698
|
}));
|
|
701
699
|
it('should not allow entity using a non-delegated grant as an author-delegated grant to invoke write', () => __awaiter(this, void 0, void 0, function* () {
|
|
702
700
|
var _a;
|
|
@@ -716,7 +714,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
716
714
|
protocolDefinition
|
|
717
715
|
});
|
|
718
716
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
719
|
-
expect(protocolConfigureReply.status.code).
|
|
717
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
720
718
|
// 2. Alice creates a non-delegated grant for device X
|
|
721
719
|
const scope = {
|
|
722
720
|
interface: DwnInterfaceName.Records,
|
|
@@ -743,22 +741,170 @@ export function testAuthorDelegatedGrant() {
|
|
|
743
741
|
data: deviceXData
|
|
744
742
|
});
|
|
745
743
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
746
|
-
expect(deviceXWriteReply.status.code).
|
|
747
|
-
expect(deviceXWriteReply.status.detail).
|
|
744
|
+
expect(deviceXWriteReply.status.code).toBe(400);
|
|
745
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant);
|
|
748
746
|
// 4. Sanity verify the message by device X did not get written to Bob's DWN
|
|
749
747
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
750
748
|
author: bob,
|
|
751
749
|
filter: { protocol }
|
|
752
750
|
});
|
|
753
751
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
754
|
-
expect(bobRecordsQueryReply.status.code).
|
|
755
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
752
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
753
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(0);
|
|
756
754
|
}));
|
|
757
|
-
|
|
755
|
+
it('should not allow entity using a non-delegated grant as an author-delegated grant to invoke read', () => __awaiter(this, void 0, void 0, function* () {
|
|
756
|
+
// scenario:
|
|
757
|
+
// 1. Bob has the message protocol installed
|
|
758
|
+
// 2. Alice writes a message to Bob's DWN
|
|
759
|
+
// 3. Alice creates a non-delegated read grant for device X
|
|
760
|
+
// 4. Verify that device X cannot read the message from Bob's DWN as Alice using the non-delegated grant
|
|
761
|
+
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
762
|
+
const bob = yield TestDataGenerator.generateDidKeyPersona();
|
|
763
|
+
const deviceX = yield TestDataGenerator.generateDidKeyPersona();
|
|
764
|
+
// 1. Bob has the message protocol installed
|
|
765
|
+
const protocolDefinition = messageProtocolDefinition;
|
|
766
|
+
const protocol = protocolDefinition.protocol;
|
|
767
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
768
|
+
author: bob,
|
|
769
|
+
protocolDefinition
|
|
770
|
+
});
|
|
771
|
+
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
772
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
773
|
+
// 2. Alice writes a message to Bob's DWN
|
|
774
|
+
const messageByAlice = yield TestDataGenerator.generateRecordsWrite({
|
|
775
|
+
author: alice,
|
|
776
|
+
protocol,
|
|
777
|
+
protocolPath: 'message',
|
|
778
|
+
schema: protocolDefinition.types.message.schema,
|
|
779
|
+
dataFormat: protocolDefinition.types.message.dataFormats[0],
|
|
780
|
+
});
|
|
781
|
+
const aliceWriteReply = yield dwn.processMessage(bob.did, messageByAlice.message, { dataStream: messageByAlice.dataStream });
|
|
782
|
+
expect(aliceWriteReply.status.code).toBe(202);
|
|
783
|
+
// 3. Alice creates a non-delegated read grant for device X
|
|
784
|
+
const deviceXGrant = yield PermissionsProtocol.createGrant({
|
|
785
|
+
// delegated : true, // intentionally commented out to show that this is not a delegated grant
|
|
786
|
+
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
787
|
+
grantedTo: deviceX.did,
|
|
788
|
+
scope: {
|
|
789
|
+
interface: DwnInterfaceName.Records,
|
|
790
|
+
method: DwnMethodName.Read,
|
|
791
|
+
protocol
|
|
792
|
+
},
|
|
793
|
+
signer: Jws.createSigner(alice)
|
|
794
|
+
});
|
|
795
|
+
// 4. Verify that device X cannot read the message from Bob's DWN as Alice using the non-delegated grant
|
|
796
|
+
const recordsReadByDeviceX = yield RecordsRead.create({
|
|
797
|
+
signer: Jws.createSigner(deviceX),
|
|
798
|
+
delegatedGrant: deviceXGrant.dataEncodedMessage,
|
|
799
|
+
filter: {
|
|
800
|
+
recordId: messageByAlice.message.recordId
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
const deviceXReadReply = yield dwn.processMessage(bob.did, recordsReadByDeviceX.message);
|
|
804
|
+
expect(deviceXReadReply.status.code).toBe(400);
|
|
805
|
+
expect(deviceXReadReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant);
|
|
758
806
|
}));
|
|
759
|
-
|
|
807
|
+
it('should not allow entity using a non-delegated grant as an author-delegated grant to invoke query', () => __awaiter(this, void 0, void 0, function* () {
|
|
808
|
+
// scenario:
|
|
809
|
+
// 1. Bob has the message protocol installed
|
|
810
|
+
// 2. Alice creates a non-delegated query grant for device X
|
|
811
|
+
// 3. Verify that device X cannot query Bob's DWN as Alice using the non-delegated grant
|
|
812
|
+
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
813
|
+
const bob = yield TestDataGenerator.generateDidKeyPersona();
|
|
814
|
+
const deviceX = yield TestDataGenerator.generateDidKeyPersona();
|
|
815
|
+
// 1. Bob has the message protocol installed
|
|
816
|
+
const protocolDefinition = messageProtocolDefinition;
|
|
817
|
+
const protocol = protocolDefinition.protocol;
|
|
818
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
819
|
+
author: bob,
|
|
820
|
+
protocolDefinition
|
|
821
|
+
});
|
|
822
|
+
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
823
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
824
|
+
// 2. Alice creates a non-delegated query grant for device X
|
|
825
|
+
const deviceXGrant = yield PermissionsProtocol.createGrant({
|
|
826
|
+
// delegated : true, // intentionally commented out to show that this is not a delegated grant
|
|
827
|
+
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
828
|
+
grantedTo: deviceX.did,
|
|
829
|
+
scope: {
|
|
830
|
+
interface: DwnInterfaceName.Records,
|
|
831
|
+
method: DwnMethodName.Query,
|
|
832
|
+
protocol
|
|
833
|
+
},
|
|
834
|
+
signer: Jws.createSigner(alice)
|
|
835
|
+
});
|
|
836
|
+
// 3. Verify that device X cannot query Bob's DWN as Alice using the non-delegated grant
|
|
837
|
+
const recordsQueryByDeviceX = yield RecordsQuery.create({
|
|
838
|
+
signer: Jws.createSigner(deviceX),
|
|
839
|
+
delegatedGrant: deviceXGrant.dataEncodedMessage,
|
|
840
|
+
filter: {
|
|
841
|
+
protocol,
|
|
842
|
+
protocolPath: 'message'
|
|
843
|
+
}
|
|
844
|
+
});
|
|
845
|
+
const deviceXQueryReply = yield dwn.processMessage(bob.did, recordsQueryByDeviceX.message);
|
|
846
|
+
expect(deviceXQueryReply.status.code).toBe(400);
|
|
847
|
+
expect(deviceXQueryReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant);
|
|
760
848
|
}));
|
|
761
|
-
|
|
849
|
+
it('should not allow entity using a non-delegated grant as an author-delegated grant to invoke delete', () => __awaiter(this, void 0, void 0, function* () {
|
|
850
|
+
var _a;
|
|
851
|
+
// scenario:
|
|
852
|
+
// 1. Bob has the message protocol installed
|
|
853
|
+
// 2. Alice writes a message to Bob's DWN
|
|
854
|
+
// 3. Alice creates a non-delegated delete grant for device X
|
|
855
|
+
// 4. Verify that device X cannot delete the message from Bob's DWN as Alice using the non-delegated grant
|
|
856
|
+
// 5. Sanity verify the message still exists in Bob's DWN
|
|
857
|
+
const alice = yield TestDataGenerator.generateDidKeyPersona();
|
|
858
|
+
const bob = yield TestDataGenerator.generateDidKeyPersona();
|
|
859
|
+
const deviceX = yield TestDataGenerator.generateDidKeyPersona();
|
|
860
|
+
// 1. Bob has the message protocol installed
|
|
861
|
+
const protocolDefinition = messageProtocolDefinition;
|
|
862
|
+
const protocol = protocolDefinition.protocol;
|
|
863
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
864
|
+
author: bob,
|
|
865
|
+
protocolDefinition
|
|
866
|
+
});
|
|
867
|
+
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
868
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
869
|
+
// 2. Alice writes a message to Bob's DWN
|
|
870
|
+
const messageByAlice = yield TestDataGenerator.generateRecordsWrite({
|
|
871
|
+
author: alice,
|
|
872
|
+
protocol,
|
|
873
|
+
protocolPath: 'message',
|
|
874
|
+
schema: protocolDefinition.types.message.schema,
|
|
875
|
+
dataFormat: protocolDefinition.types.message.dataFormats[0],
|
|
876
|
+
});
|
|
877
|
+
const aliceWriteReply = yield dwn.processMessage(bob.did, messageByAlice.message, { dataStream: messageByAlice.dataStream });
|
|
878
|
+
expect(aliceWriteReply.status.code).toBe(202);
|
|
879
|
+
// 3. Alice creates a non-delegated delete grant for device X
|
|
880
|
+
const deviceXGrant = yield PermissionsProtocol.createGrant({
|
|
881
|
+
// delegated : true, // intentionally commented out to show that this is not a delegated grant
|
|
882
|
+
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
883
|
+
grantedTo: deviceX.did,
|
|
884
|
+
scope: {
|
|
885
|
+
interface: DwnInterfaceName.Records,
|
|
886
|
+
method: DwnMethodName.Delete,
|
|
887
|
+
protocol
|
|
888
|
+
},
|
|
889
|
+
signer: Jws.createSigner(alice)
|
|
890
|
+
});
|
|
891
|
+
// 4. Verify that device X cannot delete the message from Bob's DWN as Alice using the non-delegated grant
|
|
892
|
+
const recordsDeleteByDeviceX = yield RecordsDelete.create({
|
|
893
|
+
signer: Jws.createSigner(deviceX),
|
|
894
|
+
delegatedGrant: deviceXGrant.dataEncodedMessage,
|
|
895
|
+
recordId: messageByAlice.message.recordId
|
|
896
|
+
});
|
|
897
|
+
const deviceXDeleteReply = yield dwn.processMessage(bob.did, recordsDeleteByDeviceX.message);
|
|
898
|
+
expect(deviceXDeleteReply.status.code).toBe(400);
|
|
899
|
+
expect(deviceXDeleteReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant);
|
|
900
|
+
// 5. Sanity verify the message still exists in Bob's DWN
|
|
901
|
+
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
902
|
+
author: bob,
|
|
903
|
+
filter: { protocol }
|
|
904
|
+
});
|
|
905
|
+
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
906
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
907
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(1);
|
|
762
908
|
}));
|
|
763
909
|
it('should fail if author-delegated grant has a mismatching protocol scope - write', () => __awaiter(this, void 0, void 0, function* () {
|
|
764
910
|
// scenario:
|
|
@@ -790,7 +936,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
790
936
|
protocolDefinition
|
|
791
937
|
});
|
|
792
938
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
793
|
-
expect(protocolConfigureReply.status.code).
|
|
939
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
794
940
|
// 3. Device X attempts to use the delegated grant to write an email to Bob as Alice
|
|
795
941
|
const deviceXData = new TextEncoder().encode('message from device X');
|
|
796
942
|
const deviceXDataStream = DataStream.fromBytes(deviceXData);
|
|
@@ -804,8 +950,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
804
950
|
data: deviceXData
|
|
805
951
|
});
|
|
806
952
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
807
|
-
expect(deviceXWriteReply.status.code).
|
|
808
|
-
expect(deviceXWriteReply.status.detail).
|
|
953
|
+
expect(deviceXWriteReply.status.code).toBe(401);
|
|
954
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationScopeProtocolMismatch);
|
|
809
955
|
}));
|
|
810
956
|
it('should fail if author-delegated grant has a mismatching protocol scope - query, subscribe & read', () => __awaiter(this, void 0, void 0, function* () {
|
|
811
957
|
// scenario:
|
|
@@ -824,7 +970,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
824
970
|
protocolDefinition
|
|
825
971
|
});
|
|
826
972
|
const protocolsConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
827
|
-
expect(protocolsConfigureReply.status.code).
|
|
973
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
828
974
|
// Bob starts a chat thread
|
|
829
975
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
830
976
|
author: bob,
|
|
@@ -832,7 +978,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
832
978
|
protocolPath: 'thread',
|
|
833
979
|
});
|
|
834
980
|
const threadRoleReply = yield dwn.processMessage(bob.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
835
|
-
expect(threadRoleReply.status.code).
|
|
981
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
836
982
|
// Bob adds Alice as a participant in the thread
|
|
837
983
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
838
984
|
author: bob,
|
|
@@ -843,7 +989,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
843
989
|
data: new TextEncoder().encode('Alice is my friend'),
|
|
844
990
|
});
|
|
845
991
|
const participantRoleReply = yield dwn.processMessage(bob.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
846
|
-
expect(participantRoleReply.status.code).
|
|
992
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
847
993
|
// Bob writes a chat message in the thread
|
|
848
994
|
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
849
995
|
author: bob,
|
|
@@ -852,7 +998,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
852
998
|
parentContextId: threadRecord.message.contextId,
|
|
853
999
|
});
|
|
854
1000
|
const chatRecordReply = yield dwn.processMessage(bob.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
855
|
-
expect(chatRecordReply.status.code).
|
|
1001
|
+
expect(chatRecordReply.status.code).toBe(202);
|
|
856
1002
|
// 2. Alice creates a delegated grant for device X to act as her for a protocol that is NOT chat protocol
|
|
857
1003
|
// Alice creates a delegated query grant for device X to act as Alice but not for chat protocol
|
|
858
1004
|
const queryGrantForDeviceX = yield PermissionsProtocol.createGrant({
|
|
@@ -903,8 +1049,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
903
1049
|
}
|
|
904
1050
|
});
|
|
905
1051
|
const deviceXRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByDeviceX.message);
|
|
906
|
-
expect(deviceXRecordsQueryReply.status.code).
|
|
907
|
-
expect(deviceXRecordsQueryReply.status.detail).
|
|
1052
|
+
expect(deviceXRecordsQueryReply.status.code).toBe(401);
|
|
1053
|
+
expect(deviceXRecordsQueryReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationQueryOrSubscribeProtocolScopeMismatch);
|
|
908
1054
|
// verify device X reading for the chat message from Bob's DWN fails
|
|
909
1055
|
const recordsReadByDeviceX = yield RecordsRead.create({
|
|
910
1056
|
signer: Jws.createSigner(deviceX),
|
|
@@ -915,8 +1061,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
915
1061
|
}
|
|
916
1062
|
});
|
|
917
1063
|
const deviceXReadReply = yield dwn.processMessage(bob.did, recordsReadByDeviceX.message);
|
|
918
|
-
expect(deviceXReadReply.status.code).
|
|
919
|
-
expect(deviceXReadReply.status.detail).
|
|
1064
|
+
expect(deviceXReadReply.status.code).toBe(401);
|
|
1065
|
+
expect(deviceXReadReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationScopeProtocolMismatch);
|
|
920
1066
|
// verify device X subscribing to the chat message from Bob's DWN fails
|
|
921
1067
|
const recordsSubscribeByDeviceX = yield RecordsSubscribe.create({
|
|
922
1068
|
signer: Jws.createSigner(deviceX),
|
|
@@ -929,8 +1075,8 @@ export function testAuthorDelegatedGrant() {
|
|
|
929
1075
|
}
|
|
930
1076
|
});
|
|
931
1077
|
const deviceXRecordsSubscribeReply = yield dwn.processMessage(bob.did, recordsSubscribeByDeviceX.message);
|
|
932
|
-
expect(deviceXRecordsSubscribeReply.status.code).
|
|
933
|
-
expect(deviceXRecordsSubscribeReply.status.detail).
|
|
1078
|
+
expect(deviceXRecordsSubscribeReply.status.code).toBe(401);
|
|
1079
|
+
expect(deviceXRecordsSubscribeReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationQueryOrSubscribeProtocolScopeMismatch);
|
|
934
1080
|
}));
|
|
935
1081
|
it('should fail if author-delegated grant has a mismatching protocol scope - delete', () => __awaiter(this, void 0, void 0, function* () {
|
|
936
1082
|
var _a;
|
|
@@ -950,7 +1096,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
950
1096
|
protocolDefinition
|
|
951
1097
|
});
|
|
952
1098
|
const protocolsConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
953
|
-
expect(protocolsConfigureReply.status.code).
|
|
1099
|
+
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
954
1100
|
// Bob adds Alice as an admin
|
|
955
1101
|
const globalAdminRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
956
1102
|
author: bob,
|
|
@@ -960,7 +1106,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
960
1106
|
data: new TextEncoder().encode('I trust Alice to manage my chat thread'),
|
|
961
1107
|
});
|
|
962
1108
|
const globalAdminRecordReply = yield dwn.processMessage(bob.did, globalAdminRecord.message, { dataStream: globalAdminRecord.dataStream });
|
|
963
|
-
expect(globalAdminRecordReply.status.code).
|
|
1109
|
+
expect(globalAdminRecordReply.status.code).toBe(202);
|
|
964
1110
|
// Bob starts a chat thread
|
|
965
1111
|
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
966
1112
|
author: bob,
|
|
@@ -968,7 +1114,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
968
1114
|
protocolPath: 'thread',
|
|
969
1115
|
});
|
|
970
1116
|
const threadRoleReply = yield dwn.processMessage(bob.did, threadRecord.message, { dataStream: threadRecord.dataStream });
|
|
971
|
-
expect(threadRoleReply.status.code).
|
|
1117
|
+
expect(threadRoleReply.status.code).toBe(202);
|
|
972
1118
|
// Bob adds Carol as a participant in the thread
|
|
973
1119
|
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
974
1120
|
author: bob,
|
|
@@ -978,7 +1124,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
978
1124
|
parentContextId: threadRecord.message.contextId
|
|
979
1125
|
});
|
|
980
1126
|
const participantRoleReply = yield dwn.processMessage(bob.did, participantRoleRecord.message, { dataStream: participantRoleRecord.dataStream });
|
|
981
|
-
expect(participantRoleReply.status.code).
|
|
1127
|
+
expect(participantRoleReply.status.code).toBe(202);
|
|
982
1128
|
// Carol writes a chat message in the thread
|
|
983
1129
|
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
984
1130
|
author: carol,
|
|
@@ -989,7 +1135,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
989
1135
|
data: new TextEncoder().encode('A rude message'),
|
|
990
1136
|
});
|
|
991
1137
|
const chatRecordReply = yield dwn.processMessage(bob.did, chatRecord.message, { dataStream: chatRecord.dataStream });
|
|
992
|
-
expect(chatRecordReply.status.code).
|
|
1138
|
+
expect(chatRecordReply.status.code).toBe(202);
|
|
993
1139
|
// Alice creates a delegated delete grant for Device X to act as her for a protocol that is NOT chat protocol
|
|
994
1140
|
const delegatedGrantForDeviceX = yield PermissionsProtocol.createGrant({
|
|
995
1141
|
delegated: true, // this is a delegated grant
|
|
@@ -1010,16 +1156,16 @@ export function testAuthorDelegatedGrant() {
|
|
|
1010
1156
|
recordId: chatRecord.message.recordId
|
|
1011
1157
|
});
|
|
1012
1158
|
const deviceXRecordsDeleteReply = yield dwn.processMessage(bob.did, recordsDeleteByDeviceX.message);
|
|
1013
|
-
expect(deviceXRecordsDeleteReply.status.code).
|
|
1014
|
-
expect(deviceXRecordsDeleteReply.status.detail).
|
|
1159
|
+
expect(deviceXRecordsDeleteReply.status.code).toBe(401);
|
|
1160
|
+
expect(deviceXRecordsDeleteReply.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationDeleteProtocolScopeMismatch);
|
|
1015
1161
|
// sanity verify the chat message is still in Bob's DWN
|
|
1016
1162
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1017
1163
|
author: bob,
|
|
1018
1164
|
filter: { protocolPath: 'thread/chat' }
|
|
1019
1165
|
});
|
|
1020
1166
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
1021
|
-
expect(bobRecordsQueryReply.status.code).
|
|
1022
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
1167
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
1168
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(1);
|
|
1023
1169
|
}));
|
|
1024
1170
|
it('should fail if presented with an author-delegated grant with invalid grantor signature - write', () => __awaiter(this, void 0, void 0, function* () {
|
|
1025
1171
|
var _a;
|
|
@@ -1039,7 +1185,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1039
1185
|
protocolDefinition
|
|
1040
1186
|
});
|
|
1041
1187
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
1042
|
-
expect(protocolConfigureReply.status.code).
|
|
1188
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
1043
1189
|
// 2. Alice creates a delegated grant for device X to write as Alice, but with invalid signature
|
|
1044
1190
|
const scope = {
|
|
1045
1191
|
interface: DwnInterfaceName.Records,
|
|
@@ -1068,16 +1214,16 @@ export function testAuthorDelegatedGrant() {
|
|
|
1068
1214
|
data: deviceXData
|
|
1069
1215
|
});
|
|
1070
1216
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
1071
|
-
expect(deviceXWriteReply.status.code).
|
|
1072
|
-
expect(deviceXWriteReply.status.detail).
|
|
1217
|
+
expect(deviceXWriteReply.status.code).toBe(401);
|
|
1218
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.GeneralJwsVerifierInvalidSignature);
|
|
1073
1219
|
// 4. Sanity verify the message by device X did not get written to Bob's DWN
|
|
1074
1220
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1075
1221
|
author: bob,
|
|
1076
1222
|
filter: { protocol }
|
|
1077
1223
|
});
|
|
1078
1224
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
1079
|
-
expect(bobRecordsQueryReply.status.code).
|
|
1080
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
1225
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
1226
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(0);
|
|
1081
1227
|
}));
|
|
1082
1228
|
it('should fail if the CID of the author-delegated grant and the grant ID in the payload of the message signature is mismatching - write', () => __awaiter(this, void 0, void 0, function* () {
|
|
1083
1229
|
var _a;
|
|
@@ -1097,7 +1243,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1097
1243
|
protocolDefinition
|
|
1098
1244
|
});
|
|
1099
1245
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
1100
|
-
expect(protocolConfigureReply.status.code).
|
|
1246
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
1101
1247
|
// 2. Alice creates two delegated grants for device X to write as Alice
|
|
1102
1248
|
const scope = {
|
|
1103
1249
|
interface: DwnInterfaceName.Records,
|
|
@@ -1133,16 +1279,16 @@ export function testAuthorDelegatedGrant() {
|
|
|
1133
1279
|
});
|
|
1134
1280
|
messageByDeviceX.message.authorization.authorDelegatedGrant = deviceXGrant2.dataEncodedMessage; // intentionally have a mismatching grant
|
|
1135
1281
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
1136
|
-
expect(deviceXWriteReply.status.code).
|
|
1137
|
-
expect(deviceXWriteReply.status.detail).
|
|
1282
|
+
expect(deviceXWriteReply.status.code).toBe(400);
|
|
1283
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.RecordsAuthorDelegatedGrantCidMismatch);
|
|
1138
1284
|
// 4. Sanity verify the message by device X did not get written to Bob's DWN
|
|
1139
1285
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1140
1286
|
author: bob,
|
|
1141
1287
|
filter: { protocol }
|
|
1142
1288
|
});
|
|
1143
1289
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
1144
|
-
expect(bobRecordsQueryReply.status.code).
|
|
1145
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
1290
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
1291
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(0);
|
|
1146
1292
|
}));
|
|
1147
1293
|
it('should fail if author-delegated grant is revoked - write', () => __awaiter(this, void 0, void 0, function* () {
|
|
1148
1294
|
var _a;
|
|
@@ -1163,7 +1309,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1163
1309
|
protocolDefinition
|
|
1164
1310
|
});
|
|
1165
1311
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
1166
|
-
expect(protocolConfigureReply.status.code).
|
|
1312
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
1167
1313
|
// 2. Alice creates a delegated grant for device X to write as Alice
|
|
1168
1314
|
const scope = {
|
|
1169
1315
|
interface: DwnInterfaceName.Records,
|
|
@@ -1179,7 +1325,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1179
1325
|
});
|
|
1180
1326
|
const deviceXGrantDataStream = DataStream.fromBytes(deviceXGrant.permissionGrantBytes);
|
|
1181
1327
|
const permissionGrantWriteReply = yield dwn.processMessage(alice.did, deviceXGrant.recordsWrite.message, { dataStream: deviceXGrantDataStream });
|
|
1182
|
-
expect(permissionGrantWriteReply.status.code).
|
|
1328
|
+
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
1183
1329
|
// 3. Alice revokes the grant
|
|
1184
1330
|
const permissionRevoke = yield PermissionsProtocol.createRevocation({
|
|
1185
1331
|
signer: Jws.createSigner(alice),
|
|
@@ -1187,7 +1333,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1187
1333
|
});
|
|
1188
1334
|
const revocationDataStream = DataStream.fromBytes(permissionRevoke.permissionRevocationBytes);
|
|
1189
1335
|
const permissionRevokeReply = yield dwn.processMessage(alice.did, permissionRevoke.recordsWrite.message, { dataStream: revocationDataStream });
|
|
1190
|
-
expect(permissionRevokeReply.status.code).
|
|
1336
|
+
expect(permissionRevokeReply.status.code).toBe(202);
|
|
1191
1337
|
// 3. Verify that device X cannot write a `RecordsWrite` message to Bob's DWN as Alice using a mismatching delegated grant ID
|
|
1192
1338
|
const deviceXData = new TextEncoder().encode('message from device X');
|
|
1193
1339
|
const deviceXDataStream = DataStream.fromBytes(deviceXData);
|
|
@@ -1201,16 +1347,16 @@ export function testAuthorDelegatedGrant() {
|
|
|
1201
1347
|
data: deviceXData
|
|
1202
1348
|
});
|
|
1203
1349
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
1204
|
-
expect(deviceXWriteReply.status.code).
|
|
1205
|
-
expect(deviceXWriteReply.status.detail).
|
|
1350
|
+
expect(deviceXWriteReply.status.code).toBe(401);
|
|
1351
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationGrantRevoked);
|
|
1206
1352
|
// 4. Sanity verify the message by device X did not get written to Bob's DWN
|
|
1207
1353
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1208
1354
|
author: bob,
|
|
1209
1355
|
filter: { protocol }
|
|
1210
1356
|
});
|
|
1211
1357
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
1212
|
-
expect(bobRecordsQueryReply.status.code).
|
|
1213
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
1358
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
1359
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(0);
|
|
1214
1360
|
}));
|
|
1215
1361
|
it('should fail if author-delegated grant is expired - write', () => __awaiter(this, void 0, void 0, function* () {
|
|
1216
1362
|
var _a;
|
|
@@ -1230,7 +1376,7 @@ export function testAuthorDelegatedGrant() {
|
|
|
1230
1376
|
protocolDefinition
|
|
1231
1377
|
});
|
|
1232
1378
|
const protocolConfigureReply = yield dwn.processMessage(bob.did, protocolsConfig.message);
|
|
1233
|
-
expect(protocolConfigureReply.status.code).
|
|
1379
|
+
expect(protocolConfigureReply.status.code).toBe(202);
|
|
1234
1380
|
// 2. Alice creates a delegated grant for device X to write as Alice, but make it expired
|
|
1235
1381
|
const scope = {
|
|
1236
1382
|
interface: DwnInterfaceName.Records,
|
|
@@ -1257,17 +1403,17 @@ export function testAuthorDelegatedGrant() {
|
|
|
1257
1403
|
data: deviceXData
|
|
1258
1404
|
});
|
|
1259
1405
|
const deviceXWriteReply = yield dwn.processMessage(bob.did, messageByDeviceX.message, { dataStream: deviceXDataStream });
|
|
1260
|
-
expect(deviceXWriteReply.status.code).
|
|
1261
|
-
expect(deviceXWriteReply.status.detail).
|
|
1406
|
+
expect(deviceXWriteReply.status.code).toBe(401);
|
|
1407
|
+
expect(deviceXWriteReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationGrantExpired);
|
|
1262
1408
|
// 4. Sanity verify the message by device X did not get written to Bob's DWN
|
|
1263
1409
|
const recordsQueryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1264
1410
|
author: bob,
|
|
1265
1411
|
filter: { protocol }
|
|
1266
1412
|
});
|
|
1267
1413
|
const bobRecordsQueryReply = yield dwn.processMessage(bob.did, recordsQueryByBob.message);
|
|
1268
|
-
expect(bobRecordsQueryReply.status.code).
|
|
1269
|
-
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).
|
|
1414
|
+
expect(bobRecordsQueryReply.status.code).toBe(200);
|
|
1415
|
+
expect((_a = bobRecordsQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).toBe(0);
|
|
1270
1416
|
}));
|
|
1271
|
-
})
|
|
1417
|
+
});
|
|
1272
1418
|
}
|
|
1273
1419
|
//# sourceMappingURL=author-delegated-grant.spec.js.map
|