@abaxxtech/id 0.0.0
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/LICENSE +201 -0
- package/README.md +31 -0
- package/README.npm.md +31 -0
- package/dist/bundles/dwn.js +83 -0
- package/dist/cjs/index.js +31250 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/generated/precompiled-validators.js +7820 -0
- package/dist/esm/generated/precompiled-validators.js.map +1 -0
- package/dist/esm/json-schemas/definitions.json +23 -0
- package/dist/esm/src/core/abstract-message.js +37 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -0
- package/dist/esm/src/core/auth.js +97 -0
- package/dist/esm/src/core/auth.js.map +1 -0
- package/dist/esm/src/core/dwn-constant.js +8 -0
- package/dist/esm/src/core/dwn-constant.js.map +1 -0
- package/dist/esm/src/core/dwn-error.js +138 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -0
- package/dist/esm/src/core/grant-authorization.js +108 -0
- package/dist/esm/src/core/grant-authorization.js.map +1 -0
- package/dist/esm/src/core/message-reply.js +5 -0
- package/dist/esm/src/core/message-reply.js.map +1 -0
- package/dist/esm/src/core/message.js +200 -0
- package/dist/esm/src/core/message.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +449 -0
- package/dist/esm/src/core/protocol-authorization.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +106 -0
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -0
- package/dist/esm/src/core/tenant-gate.js +20 -0
- package/dist/esm/src/core/tenant-gate.js.map +1 -0
- package/dist/esm/src/did/did-dht-resolver.js +241 -0
- package/dist/esm/src/did/did-dht-resolver.js.map +1 -0
- package/dist/esm/src/did/did-ion-resolver.js +53 -0
- package/dist/esm/src/did/did-ion-resolver.js.map +1 -0
- package/dist/esm/src/did/did-key-resolver.js +135 -0
- package/dist/esm/src/did/did-key-resolver.js.map +1 -0
- package/dist/esm/src/did/did-resolver.js +70 -0
- package/dist/esm/src/did/did-resolver.js.map +1 -0
- package/dist/esm/src/did/did.js +36 -0
- package/dist/esm/src/did/did.js.map +1 -0
- package/dist/esm/src/dwn.js +164 -0
- package/dist/esm/src/dwn.js.map +1 -0
- package/dist/esm/src/enums/dwn-interface-method.js +22 -0
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -0
- package/dist/esm/src/event-log/event-log-level.js +112 -0
- package/dist/esm/src/event-log/event-log-level.js.map +1 -0
- package/dist/esm/src/handlers/events-get.js +48 -0
- package/dist/esm/src/handlers/events-get.js.map +1 -0
- package/dist/esm/src/handlers/messages-get.js +76 -0
- package/dist/esm/src/handlers/messages-get.js.map +1 -0
- package/dist/esm/src/handlers/permissions-grant.js +62 -0
- package/dist/esm/src/handlers/permissions-grant.js.map +1 -0
- package/dist/esm/src/handlers/permissions-request.js +63 -0
- package/dist/esm/src/handlers/permissions-request.js.map +1 -0
- package/dist/esm/src/handlers/permissions-revoke.js +114 -0
- package/dist/esm/src/handlers/permissions-revoke.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +102 -0
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -0
- package/dist/esm/src/handlers/protocols-query.js +72 -0
- package/dist/esm/src/handlers/protocols-query.js.map +1 -0
- package/dist/esm/src/handlers/records-delete.js +119 -0
- package/dist/esm/src/handlers/records-delete.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +206 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -0
- package/dist/esm/src/handlers/records-read.js +118 -0
- package/dist/esm/src/handlers/records-read.js.map +1 -0
- package/dist/esm/src/handlers/records-write.js +252 -0
- package/dist/esm/src/handlers/records-write.js.map +1 -0
- package/dist/esm/src/index.js +43 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/interfaces/events-get.js +41 -0
- package/dist/esm/src/interfaces/events-get.js.map +1 -0
- package/dist/esm/src/interfaces/messages-get.js +58 -0
- package/dist/esm/src/interfaces/messages-get.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-grant.js +130 -0
- package/dist/esm/src/interfaces/permissions-grant.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-request.js +47 -0
- package/dist/esm/src/interfaces/permissions-request.js.map +1 -0
- package/dist/esm/src/interfaces/permissions-revoke.js +47 -0
- package/dist/esm/src/interfaces/permissions-revoke.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +149 -0
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-query.js +80 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-delete.js +56 -0
- package/dist/esm/src/interfaces/records-delete.js.map +1 -0
- package/dist/esm/src/interfaces/records-query.js +81 -0
- package/dist/esm/src/interfaces/records-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +65 -0
- package/dist/esm/src/interfaces/records-read.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +677 -0
- package/dist/esm/src/interfaces/records-write.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +54 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js +13 -0
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -0
- package/dist/esm/src/jose/jws/general/builder.js +47 -0
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -0
- package/dist/esm/src/jose/jws/general/signer.js +36 -0
- package/dist/esm/src/jose/jws/general/signer.js.map +1 -0
- package/dist/esm/src/jose/jws/general/verifier.js +97 -0
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -0
- package/dist/esm/src/schema-validator.js +28 -0
- package/dist/esm/src/schema-validator.js.map +1 -0
- package/dist/esm/src/store/blockstore-level.js +187 -0
- package/dist/esm/src/store/blockstore-level.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +192 -0
- package/dist/esm/src/store/data-store-level.js.map +1 -0
- package/dist/esm/src/store/index-level.js +302 -0
- package/dist/esm/src/store/index-level.js.map +1 -0
- package/dist/esm/src/store/level-wrapper.js +296 -0
- package/dist/esm/src/store/level-wrapper.js.map +1 -0
- package/dist/esm/src/store/message-store-level.js +236 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -0
- package/dist/esm/src/store/storage-controller.js +69 -0
- package/dist/esm/src/store/storage-controller.js.map +1 -0
- package/dist/esm/src/types/cache.js +2 -0
- package/dist/esm/src/types/cache.js.map +1 -0
- package/dist/esm/src/types/data-store.js +2 -0
- package/dist/esm/src/types/data-store.js.map +1 -0
- package/dist/esm/src/types/delegated-grant-message.js +2 -0
- package/dist/esm/src/types/delegated-grant-message.js.map +1 -0
- package/dist/esm/src/types/did-types.js +2 -0
- package/dist/esm/src/types/did-types.js.map +1 -0
- package/dist/esm/src/types/event-log.js +2 -0
- package/dist/esm/src/types/event-log.js.map +1 -0
- package/dist/esm/src/types/event-types.js +2 -0
- package/dist/esm/src/types/event-types.js.map +1 -0
- package/dist/esm/src/types/jose-types.js +2 -0
- package/dist/esm/src/types/jose-types.js.map +1 -0
- package/dist/esm/src/types/jws-types.js +2 -0
- package/dist/esm/src/types/jws-types.js.map +1 -0
- package/dist/esm/src/types/message-interface.js +2 -0
- package/dist/esm/src/types/message-interface.js.map +1 -0
- package/dist/esm/src/types/message-store.js +2 -0
- package/dist/esm/src/types/message-store.js.map +1 -0
- package/dist/esm/src/types/message-types.js +6 -0
- package/dist/esm/src/types/message-types.js.map +1 -0
- package/dist/esm/src/types/messages-types.js +2 -0
- package/dist/esm/src/types/messages-types.js.map +1 -0
- package/dist/esm/src/types/method-handler.js +2 -0
- package/dist/esm/src/types/method-handler.js.map +1 -0
- package/dist/esm/src/types/permissions-grant-descriptor.js +6 -0
- package/dist/esm/src/types/permissions-grant-descriptor.js.map +1 -0
- package/dist/esm/src/types/permissions-types.js +2 -0
- package/dist/esm/src/types/permissions-types.js.map +1 -0
- package/dist/esm/src/types/protocols-types.js +15 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -0
- package/dist/esm/src/types/records-types.js +8 -0
- package/dist/esm/src/types/records-types.js.map +1 -0
- package/dist/esm/src/types/signer.js +2 -0
- package/dist/esm/src/types/signer.js.map +1 -0
- package/dist/esm/src/utils/abort.js +40 -0
- package/dist/esm/src/utils/abort.js.map +1 -0
- package/dist/esm/src/utils/array.js +72 -0
- package/dist/esm/src/utils/array.js.map +1 -0
- package/dist/esm/src/utils/cid.js +130 -0
- package/dist/esm/src/utils/cid.js.map +1 -0
- package/dist/esm/src/utils/data-stream.js +88 -0
- package/dist/esm/src/utils/data-stream.js.map +1 -0
- package/dist/esm/src/utils/encoder.js +45 -0
- package/dist/esm/src/utils/encoder.js.map +1 -0
- package/dist/esm/src/utils/encryption.js +128 -0
- package/dist/esm/src/utils/encryption.js.map +1 -0
- package/dist/esm/src/utils/hd-key.js +60 -0
- package/dist/esm/src/utils/hd-key.js.map +1 -0
- package/dist/esm/src/utils/jws.js +89 -0
- package/dist/esm/src/utils/jws.js.map +1 -0
- package/dist/esm/src/utils/memory-cache.js +41 -0
- package/dist/esm/src/utils/memory-cache.js.map +1 -0
- package/dist/esm/src/utils/object.js +50 -0
- package/dist/esm/src/utils/object.js.map +1 -0
- package/dist/esm/src/utils/private-key-signer.js +43 -0
- package/dist/esm/src/utils/private-key-signer.js.map +1 -0
- package/dist/esm/src/utils/protocols.js +51 -0
- package/dist/esm/src/utils/protocols.js.map +1 -0
- package/dist/esm/src/utils/records.js +267 -0
- package/dist/esm/src/utils/records.js.map +1 -0
- package/dist/esm/src/utils/secp256k1.js +219 -0
- package/dist/esm/src/utils/secp256k1.js.map +1 -0
- package/dist/esm/src/utils/string.js +16 -0
- package/dist/esm/src/utils/string.js.map +1 -0
- package/dist/esm/src/utils/time.js +84 -0
- package/dist/esm/src/utils/time.js.map +1 -0
- package/dist/esm/src/utils/url.js +63 -0
- package/dist/esm/src/utils/url.js.map +1 -0
- package/dist/esm/tests/core/auth.spec.js +25 -0
- package/dist/esm/tests/core/auth.spec.js.map +1 -0
- package/dist/esm/tests/core/message-reply.spec.js +19 -0
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -0
- package/dist/esm/tests/core/message.spec.js +85 -0
- package/dist/esm/tests/core/message.spec.js.map +1 -0
- package/dist/esm/tests/did/did-ion-resolver.spec.js +82 -0
- package/dist/esm/tests/did/did-ion-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did-key-resolver.spec.js +74 -0
- package/dist/esm/tests/did/did-key-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did-resolver.spec.js +84 -0
- package/dist/esm/tests/did/did-resolver.spec.js.map +1 -0
- package/dist/esm/tests/did/did.spec.js +22 -0
- package/dist/esm/tests/did/did.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +252 -0
- package/dist/esm/tests/dwn.spec.js.map +1 -0
- package/dist/esm/tests/end-to-end-tests.spec.js +218 -0
- package/dist/esm/tests/end-to-end-tests.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js +137 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +1 -0
- package/dist/esm/tests/handlers/events-get.spec.js +108 -0
- package/dist/esm/tests/handlers/events-get.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-get.spec.js +209 -0
- package/dist/esm/tests/handlers/messages-get.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-grant.spec.js +249 -0
- package/dist/esm/tests/handlers/permissions-grant.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-request.spec.js +132 -0
- package/dist/esm/tests/handlers/permissions-request.spec.js.map +1 -0
- package/dist/esm/tests/handlers/permissions-revoke.spec.js +311 -0
- package/dist/esm/tests/handlers/permissions-revoke.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +254 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js +373 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +630 -0
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-query.spec.js +1937 -0
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-read.spec.js +1729 -0
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-write.spec.js +3381 -0
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/events-get.spec.js +73 -0
- package/dist/esm/tests/interfaces/events-get.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js +93 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/permissions-grant.spec.js +216 -0
- package/dist/esm/tests/interfaces/permissions-grant.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/permissions-request.spec.js +45 -0
- package/dist/esm/tests/interfaces/permissions-request.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +334 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js +49 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js +42 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-query.spec.js +75 -0
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-read.spec.js +65 -0
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-write.spec.js +369 -0
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -0
- package/dist/esm/tests/jose/jws/general.spec.js +185 -0
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/delegated-grant.spec.js +490 -0
- package/dist/esm/tests/scenarios/delegated-grant.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +218 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -0
- package/dist/esm/tests/store/data-store-level.spec.js +192 -0
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/index-level.spec.js +428 -0
- package/dist/esm/tests/store/index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store-level.spec.js +51 -0
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store.spec.js +395 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js +8 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -0
- package/dist/esm/tests/test-stores.js +40 -0
- package/dist/esm/tests/test-stores.js.map +1 -0
- package/dist/esm/tests/test-suite.js +51 -0
- package/dist/esm/tests/test-suite.js.map +1 -0
- package/dist/esm/tests/utils/cid.spec.js +83 -0
- package/dist/esm/tests/utils/cid.spec.js.map +1 -0
- package/dist/esm/tests/utils/data-stream.spec.js +30 -0
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +151 -0
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -0
- package/dist/esm/tests/utils/jws.spec.js +11 -0
- package/dist/esm/tests/utils/jws.spec.js.map +1 -0
- package/dist/esm/tests/utils/memory-cache.spec.js +38 -0
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -0
- package/dist/esm/tests/utils/object.spec.js +39 -0
- package/dist/esm/tests/utils/object.spec.js.map +1 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js +47 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -0
- package/dist/esm/tests/utils/records.spec.js +56 -0
- package/dist/esm/tests/utils/records.spec.js.map +1 -0
- package/dist/esm/tests/utils/secp256k1.spec.js +77 -0
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -0
- package/dist/esm/tests/utils/test-data-generator.js +570 -0
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -0
- package/dist/esm/tests/utils/test-stub-generator.js +39 -0
- package/dist/esm/tests/utils/test-stub-generator.js.map +1 -0
- package/dist/esm/tests/utils/time.spec.js +67 -0
- package/dist/esm/tests/utils/time.spec.js.map +1 -0
- package/dist/esm/tests/utils/url.spec.js +46 -0
- package/dist/esm/tests/utils/url.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +36 -0
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +53 -0
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +39 -0
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +76 -0
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +74 -0
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +151 -0
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +389 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -0
- package/dist/esm/tests/vectors/protocol-definitions/anyone-collaborate.json +25 -0
- package/dist/esm/tests/vectors/protocol-definitions/author-can.json +32 -0
- package/dist/esm/tests/vectors/protocol-definitions/chat.json +56 -0
- package/dist/esm/tests/vectors/protocol-definitions/credential-issuance.json +37 -0
- package/dist/esm/tests/vectors/protocol-definitions/dex.json +52 -0
- package/dist/esm/tests/vectors/protocol-definitions/email.json +50 -0
- package/dist/esm/tests/vectors/protocol-definitions/free-for-all.json +30 -0
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +48 -0
- package/dist/esm/tests/vectors/protocol-definitions/message.json +20 -0
- package/dist/esm/tests/vectors/protocol-definitions/minimal.json +10 -0
- package/dist/esm/tests/vectors/protocol-definitions/nested.json +31 -0
- package/dist/esm/tests/vectors/protocol-definitions/private-protocol.json +13 -0
- package/dist/esm/tests/vectors/protocol-definitions/recipient-can.json +36 -0
- package/dist/esm/tests/vectors/protocol-definitions/social-media.json +88 -0
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +68 -0
- package/dist/types/generated/precompiled-validators.d.ts +113 -0
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -0
- package/dist/types/src/core/abstract-message.d.ts +19 -0
- package/dist/types/src/core/abstract-message.d.ts.map +1 -0
- package/dist/types/src/core/auth.d.ts +30 -0
- package/dist/types/src/core/auth.d.ts.map +1 -0
- package/dist/types/src/core/dwn-constant.d.ts +8 -0
- package/dist/types/src/core/dwn-constant.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +133 -0
- package/dist/types/src/core/dwn-error.d.ts.map +1 -0
- package/dist/types/src/core/grant-authorization.d.ts +35 -0
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/message-reply.d.ts +33 -0
- package/dist/types/src/core/message-reply.d.ts.map +1 -0
- package/dist/types/src/core/message.d.ts +79 -0
- package/dist/types/src/core/message.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +85 -0
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts +38 -0
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/tenant-gate.d.ts +16 -0
- package/dist/types/src/core/tenant-gate.d.ts.map +1 -0
- package/dist/types/src/did/did-dht-resolver.d.ts +26 -0
- package/dist/types/src/did/did-dht-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-ion-resolver.d.ts +20 -0
- package/dist/types/src/did/did-ion-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-key-resolver.d.ts +32 -0
- package/dist/types/src/did/did-key-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did-resolver.d.ts +20 -0
- package/dist/types/src/did/did-resolver.d.ts.map +1 -0
- package/dist/types/src/did/did.d.ts +15 -0
- package/dist/types/src/did/did.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +74 -0
- package/dist/types/src/dwn.d.ts.map +1 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts +20 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -0
- package/dist/types/src/event-log/event-log-level.d.ts +26 -0
- package/dist/types/src/event-log/event-log-level.d.ts.map +1 -0
- package/dist/types/src/handlers/events-get.d.ts +16 -0
- package/dist/types/src/handlers/events-get.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-get.d.ts +18 -0
- package/dist/types/src/handlers/messages-get.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-grant.d.ts +17 -0
- package/dist/types/src/handlers/permissions-grant.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-request.d.ts +17 -0
- package/dist/types/src/handlers/permissions-request.d.ts.map +1 -0
- package/dist/types/src/handlers/permissions-revoke.d.ts +17 -0
- package/dist/types/src/handlers/permissions-revoke.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +21 -0
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-query.d.ts +20 -0
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -0
- package/dist/types/src/handlers/records-delete.d.ts +22 -0
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -0
- package/dist/types/src/handlers/records-query.d.ts +78 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -0
- package/dist/types/src/handlers/records-read.d.ts +17 -0
- package/dist/types/src/handlers/records-read.d.ts.map +1 -0
- package/dist/types/src/handlers/records-write.d.ts +61 -0
- package/dist/types/src/handlers/records-write.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +72 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/interfaces/events-get.d.ts +13 -0
- package/dist/types/src/interfaces/events-get.d.ts.map +1 -0
- package/dist/types/src/interfaces/messages-get.d.ts +19 -0
- package/dist/types/src/interfaces/messages-get.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-grant.d.ts +59 -0
- package/dist/types/src/interfaces/permissions-grant.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-request.d.ts +19 -0
- package/dist/types/src/interfaces/permissions-request.d.ts.map +1 -0
- package/dist/types/src/interfaces/permissions-revoke.d.ts +14 -0
- package/dist/types/src/interfaces/permissions-revoke.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +21 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-query.d.ts +17 -0
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-delete.d.ts +24 -0
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-query.d.ts +29 -0
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-read.d.ts +31 -0
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +259 -0
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -0
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts +3 -0
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -0
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +3 -0
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/builder.d.ts +10 -0
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/signer.d.ts +8 -0
- package/dist/types/src/jose/jws/general/signer.d.ts.map +1 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts +32 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -0
- package/dist/types/src/schema-validator.d.ts +8 -0
- package/dist/types/src/schema-validator.d.ts.map +1 -0
- package/dist/types/src/store/blockstore-level.d.ts +35 -0
- package/dist/types/src/store/blockstore-level.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +44 -0
- package/dist/types/src/store/data-store-level.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +69 -0
- package/dist/types/src/store/index-level.d.ts.map +1 -0
- package/dist/types/src/store/level-wrapper.d.ts +44 -0
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -0
- package/dist/types/src/store/message-store-level.d.ts +70 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -0
- package/dist/types/src/store/storage-controller.d.ts +19 -0
- package/dist/types/src/store/storage-controller.d.ts.map +1 -0
- package/dist/types/src/types/cache.d.ts +16 -0
- package/dist/types/src/types/cache.d.ts.map +1 -0
- package/dist/types/src/types/data-store.d.ts +69 -0
- package/dist/types/src/types/data-store.d.ts.map +1 -0
- package/dist/types/src/types/delegated-grant-message.d.ts +14 -0
- package/dist/types/src/types/delegated-grant-message.d.ts.map +1 -0
- package/dist/types/src/types/did-types.d.ts +68 -0
- package/dist/types/src/types/did-types.d.ts.map +1 -0
- package/dist/types/src/types/event-log.d.ts +39 -0
- package/dist/types/src/types/event-log.d.ts.map +1 -0
- package/dist/types/src/types/event-types.d.ts +18 -0
- package/dist/types/src/types/event-types.d.ts.map +1 -0
- package/dist/types/src/types/jose-types.d.ts +75 -0
- package/dist/types/src/types/jose-types.d.ts.map +1 -0
- package/dist/types/src/types/jws-types.d.ts +27 -0
- package/dist/types/src/types/jws-types.d.ts.map +1 -0
- package/dist/types/src/types/message-interface.d.ts +22 -0
- package/dist/types/src/types/message-interface.d.ts.map +1 -0
- package/dist/types/src/types/message-store.d.ts +43 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -0
- package/dist/types/src/types/message-types.d.ts +113 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -0
- package/dist/types/src/types/messages-types.d.ts +23 -0
- package/dist/types/src/types/messages-types.d.ts.map +1 -0
- package/dist/types/src/types/method-handler.d.ts +17 -0
- package/dist/types/src/types/method-handler.d.ts.map +1 -0
- package/dist/types/src/types/permissions-grant-descriptor.d.ts +65 -0
- package/dist/types/src/types/permissions-grant-descriptor.d.ts.map +1 -0
- package/dist/types/src/types/permissions-types.d.ts +33 -0
- package/dist/types/src/types/permissions-types.d.ts.map +1 -0
- package/dist/types/src/types/protocols-types.d.ts +138 -0
- package/dist/types/src/types/protocols-types.d.ts.map +1 -0
- package/dist/types/src/types/records-types.d.ts +164 -0
- package/dist/types/src/types/records-types.d.ts.map +1 -0
- package/dist/types/src/types/signer.d.ts +26 -0
- package/dist/types/src/types/signer.d.ts.map +1 -0
- package/dist/types/src/utils/abort.d.ts +5 -0
- package/dist/types/src/utils/abort.d.ts.map +1 -0
- package/dist/types/src/utils/array.d.ts +18 -0
- package/dist/types/src/utils/array.d.ts.map +1 -0
- package/dist/types/src/utils/cid.d.ts +30 -0
- package/dist/types/src/utils/cid.d.ts.map +1 -0
- package/dist/types/src/utils/data-stream.d.ts +27 -0
- package/dist/types/src/utils/data-stream.d.ts.map +1 -0
- package/dist/types/src/utils/encoder.d.ts +14 -0
- package/dist/types/src/utils/encoder.d.ts.map +1 -0
- package/dist/types/src/utils/encryption.d.ts +44 -0
- package/dist/types/src/utils/encryption.d.ts.map +1 -0
- package/dist/types/src/utils/hd-key.d.ts +35 -0
- package/dist/types/src/utils/hd-key.d.ts.map +1 -0
- package/dist/types/src/utils/jws.d.ts +39 -0
- package/dist/types/src/utils/jws.d.ts.map +1 -0
- package/dist/types/src/utils/memory-cache.d.ts +15 -0
- package/dist/types/src/utils/memory-cache.d.ts.map +1 -0
- package/dist/types/src/utils/object.d.ts +18 -0
- package/dist/types/src/utils/object.d.ts.map +1 -0
- package/dist/types/src/utils/private-key-signer.d.ts +34 -0
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -0
- package/dist/types/src/utils/protocols.d.ts +14 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -0
- package/dist/types/src/utils/records.d.ts +68 -0
- package/dist/types/src/utils/records.d.ts.map +1 -0
- package/dist/types/src/utils/secp256k1.d.ts +78 -0
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -0
- package/dist/types/src/utils/string.d.ts +6 -0
- package/dist/types/src/utils/string.d.ts.map +1 -0
- package/dist/types/src/utils/time.d.ts +49 -0
- package/dist/types/src/utils/time.d.ts.map +1 -0
- package/dist/types/src/utils/url.d.ts +5 -0
- package/dist/types/src/utils/url.d.ts.map +1 -0
- package/dist/types/tests/core/auth.spec.d.ts +2 -0
- package/dist/types/tests/core/auth.spec.d.ts.map +1 -0
- package/dist/types/tests/core/message-reply.spec.d.ts +2 -0
- package/dist/types/tests/core/message-reply.spec.d.ts.map +1 -0
- package/dist/types/tests/core/message.spec.d.ts +2 -0
- package/dist/types/tests/core/message.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-ion-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-ion-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-key-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-key-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did-resolver.spec.d.ts +2 -0
- package/dist/types/tests/did/did-resolver.spec.d.ts.map +1 -0
- package/dist/types/tests/did/did.spec.d.ts +2 -0
- package/dist/types/tests/did/did.spec.d.ts.map +1 -0
- package/dist/types/tests/dwn.spec.d.ts +2 -0
- package/dist/types/tests/dwn.spec.d.ts.map +1 -0
- package/dist/types/tests/end-to-end-tests.spec.d.ts +2 -0
- package/dist/types/tests/end-to-end-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/event-log/event-log-level.spec.d.ts +2 -0
- package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/events-get.spec.d.ts +2 -0
- package/dist/types/tests/handlers/events-get.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-get.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-get.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-grant.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-request.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-request.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/permissions-revoke.spec.d.ts +2 -0
- package/dist/types/tests/handlers/permissions-revoke.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-delete.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-read.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-write.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/events-get.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/events-get.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/messages-get.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/messages-get.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/permissions-grant.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/permissions-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/permissions-request.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/permissions-request.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/protocols-query.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/protocols-query.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-delete.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-delete.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-query.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-read.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-read.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/records-write.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-write.spec.d.ts.map +1 -0
- package/dist/types/tests/jose/jws/general.spec.d.ts +2 -0
- package/dist/types/tests/jose/jws/general.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/delegated-grant.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/delegated-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/store/data-store-level.spec.d.ts +2 -0
- package/dist/types/tests/store/data-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/index-level.spec.d.ts +2 -0
- package/dist/types/tests/store/index-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store-level.spec.d.ts +2 -0
- package/dist/types/tests/store/message-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store.spec.d.ts +2 -0
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -0
- package/dist/types/tests/store-dependent-tests.spec.d.ts +2 -0
- package/dist/types/tests/store-dependent-tests.spec.d.ts.map +1 -0
- package/dist/types/tests/test-stores.d.ts +30 -0
- package/dist/types/tests/test-stores.d.ts.map +1 -0
- package/dist/types/tests/test-suite.d.ts +16 -0
- package/dist/types/tests/test-suite.d.ts.map +1 -0
- package/dist/types/tests/utils/cid.spec.d.ts +2 -0
- package/dist/types/tests/utils/cid.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/data-stream.spec.d.ts +2 -0
- package/dist/types/tests/utils/data-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/encryption.spec.d.ts +2 -0
- package/dist/types/tests/utils/encryption.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/jws.spec.d.ts +2 -0
- package/dist/types/tests/utils/jws.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/memory-cache.spec.d.ts +2 -0
- package/dist/types/tests/utils/memory-cache.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/object.spec.d.ts +2 -0
- package/dist/types/tests/utils/object.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/private-key-signer.spec.d.ts +2 -0
- package/dist/types/tests/utils/private-key-signer.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/records.spec.d.ts +2 -0
- package/dist/types/tests/utils/records.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/secp256k1.spec.d.ts +2 -0
- package/dist/types/tests/utils/secp256k1.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +323 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -0
- package/dist/types/tests/utils/test-stub-generator.d.ts +16 -0
- package/dist/types/tests/utils/test-stub-generator.d.ts.map +1 -0
- package/dist/types/tests/utils/time.spec.d.ts +2 -0
- package/dist/types/tests/utils/time.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/url.spec.d.ts +2 -0
- package/dist/types/tests/utils/url.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts.map +1 -0
- package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts.map +1 -0
- package/package.json +156 -0
- package/src/core/abstract-message.ts +48 -0
- package/src/core/auth.ts +108 -0
- package/src/core/dwn-constant.ts +7 -0
- package/src/core/dwn-error.ts +136 -0
- package/src/core/grant-authorization.ts +163 -0
- package/src/core/message-reply.ts +42 -0
- package/src/core/message.ts +224 -0
- package/src/core/protocol-authorization.ts +691 -0
- package/src/core/records-grant-authorization.ts +167 -0
- package/src/core/tenant-gate.ts +18 -0
- package/src/did/did-dht-resolver.ts +241 -0
- package/src/did/did-ion-resolver.ts +52 -0
- package/src/did/did-key-resolver.ts +137 -0
- package/src/did/did-resolver.ts +77 -0
- package/src/did/did.ts +39 -0
- package/src/dwn.ts +213 -0
- package/src/enums/dwn-interface-method.ts +20 -0
- package/src/event-log/event-log-level.ts +116 -0
- package/src/handlers/events-get.ts +46 -0
- package/src/handlers/messages-get.ts +80 -0
- package/src/handlers/permissions-grant.ts +52 -0
- package/src/handlers/permissions-request.ts +54 -0
- package/src/handlers/permissions-revoke.ts +121 -0
- package/src/handlers/protocols-configure.ts +104 -0
- package/src/handlers/protocols-query.ts +81 -0
- package/src/handlers/records-delete.ts +139 -0
- package/src/handlers/records-query.ts +253 -0
- package/src/handlers/records-read.ts +127 -0
- package/src/handlers/records-write.ts +296 -0
- package/src/index.ts +81 -0
- package/src/interfaces/events-get.ts +43 -0
- package/src/interfaces/messages-get.ts +59 -0
- package/src/interfaces/permissions-grant.ts +175 -0
- package/src/interfaces/permissions-request.ts +55 -0
- package/src/interfaces/permissions-revoke.ts +46 -0
- package/src/interfaces/protocols-configure.ts +188 -0
- package/src/interfaces/protocols-query.ts +99 -0
- package/src/interfaces/records-delete.ts +67 -0
- package/src/interfaces/records-query.ts +100 -0
- package/src/interfaces/records-read.ts +82 -0
- package/src/interfaces/records-write.ts +924 -0
- package/src/jose/algorithms/signing/ed25519.ts +61 -0
- package/src/jose/algorithms/signing/signature-algorithms.ts +15 -0
- package/src/jose/jws/general/builder.ts +48 -0
- package/src/jose/jws/general/signer.ts +29 -0
- package/src/jose/jws/general/verifier.ts +113 -0
- package/src/schema-validator.ts +34 -0
- package/src/store/blockstore-level.ts +113 -0
- package/src/store/data-store-level.ts +188 -0
- package/src/store/index-level.ts +306 -0
- package/src/store/level-wrapper.ts +262 -0
- package/src/store/message-store-level.ts +284 -0
- package/src/store/storage-controller.ts +80 -0
- package/src/types/cache.ts +16 -0
- package/src/types/data-store.ts +78 -0
- package/src/types/delegated-grant-message.ts +15 -0
- package/src/types/did-types.ts +95 -0
- package/src/types/event-log.ts +46 -0
- package/src/types/event-types.ts +20 -0
- package/src/types/jose-types.ts +76 -0
- package/src/types/jws-types.ts +28 -0
- package/src/types/message-interface.ts +24 -0
- package/src/types/message-store.ts +56 -0
- package/src/types/message-types.ts +115 -0
- package/src/types/messages-types.ts +26 -0
- package/src/types/method-handler.ts +17 -0
- package/src/types/permissions-grant-descriptor.ts +79 -0
- package/src/types/permissions-types.ts +42 -0
- package/src/types/protocols-types.ts +154 -0
- package/src/types/records-types.ts +184 -0
- package/src/types/signer.ts +27 -0
- package/src/utils/abort.ts +31 -0
- package/src/utils/array.ts +39 -0
- package/src/utils/cid.ts +101 -0
- package/src/utils/data-stream.ts +85 -0
- package/src/utils/encoder.ts +54 -0
- package/src/utils/encryption.ts +145 -0
- package/src/utils/hd-key.ts +58 -0
- package/src/utils/jws.ts +95 -0
- package/src/utils/memory-cache.ts +31 -0
- package/src/utils/object.ts +55 -0
- package/src/utils/private-key-signer.ts +72 -0
- package/src/utils/protocols.ts +50 -0
- package/src/utils/records.ts +326 -0
- package/src/utils/secp256k1.ts +209 -0
- package/src/utils/string.ts +13 -0
- package/src/utils/time.ts +77 -0
- package/src/utils/url.ts +66 -0
|
@@ -0,0 +1,1937 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
11
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
12
|
+
var m = o[Symbol.asyncIterator], i;
|
|
13
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
14
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
15
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
16
|
+
};
|
|
17
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
18
|
+
import sinon from 'sinon';
|
|
19
|
+
import chai, { expect } from 'chai';
|
|
20
|
+
import freeForAll from '../vectors/protocol-definitions/free-for-all.json' with { type: 'json' };
|
|
21
|
+
import friendRoleProtocolDefinition from '../vectors/protocol-definitions/friend-role.json' with { type: 'json' };
|
|
22
|
+
import threadRoleProtocolDefinition from '../vectors/protocol-definitions/thread-role.json' with { type: 'json' };
|
|
23
|
+
import { ArrayUtility } from '../../src/utils/array.js';
|
|
24
|
+
import { DateSort } from '../../src/types/records-types.js';
|
|
25
|
+
import { DidKeyResolver } from '../../src/did/did-key-resolver.js';
|
|
26
|
+
import { DwnConstant } from '../../src/core/dwn-constant.js';
|
|
27
|
+
import { Encoder } from '../../src/utils/encoder.js';
|
|
28
|
+
import { Jws } from '../../src/utils/jws.js';
|
|
29
|
+
import { Message } from '../../src/core/message.js';
|
|
30
|
+
import { RecordsQuery } from '../../src/interfaces/records-query.js';
|
|
31
|
+
import { RecordsQueryHandler } from '../../src/handlers/records-query.js';
|
|
32
|
+
import { RecordsWriteHandler } from '../../src/handlers/records-write.js';
|
|
33
|
+
import { SortOrder } from '../../src/types/message-types.js';
|
|
34
|
+
import { stubInterface } from 'ts-sinon';
|
|
35
|
+
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
36
|
+
import { TestStores } from '../test-stores.js';
|
|
37
|
+
import { TestStubGenerator } from '../utils/test-stub-generator.js';
|
|
38
|
+
import { DidResolver, Dwn, RecordsWrite, Time } from '../../src/index.js';
|
|
39
|
+
import { DwnErrorCode, MessageStoreLevel } from '../../src/index.js';
|
|
40
|
+
chai.use(chaiAsPromised);
|
|
41
|
+
export function testRecordsQueryHandler() {
|
|
42
|
+
describe('RecordsQueryHandler.handle()', () => {
|
|
43
|
+
if (process.env.TESTSOFF === 'true') {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
describe('functional tests', () => {
|
|
47
|
+
let didResolver;
|
|
48
|
+
let messageStore;
|
|
49
|
+
let dataStore;
|
|
50
|
+
let eventLog;
|
|
51
|
+
let dwn;
|
|
52
|
+
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
53
|
+
// so that different test suites can reuse the same backend store for testing
|
|
54
|
+
before(() => __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
didResolver = new DidResolver([new DidKeyResolver()]);
|
|
56
|
+
const stores = TestStores.get();
|
|
57
|
+
messageStore = stores.messageStore;
|
|
58
|
+
dataStore = stores.dataStore;
|
|
59
|
+
eventLog = stores.eventLog;
|
|
60
|
+
dwn = yield Dwn.create({ didResolver, messageStore, dataStore, eventLog });
|
|
61
|
+
}));
|
|
62
|
+
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
64
|
+
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
65
|
+
yield messageStore.clear();
|
|
66
|
+
yield dataStore.clear();
|
|
67
|
+
yield eventLog.clear();
|
|
68
|
+
}));
|
|
69
|
+
after(() => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
yield dwn.close();
|
|
71
|
+
}));
|
|
72
|
+
it('should return recordId, descriptor, authorization and attestation', () => __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
var _a;
|
|
74
|
+
const alice = yield TestDataGenerator.generatePersona();
|
|
75
|
+
const bob = yield TestDataGenerator.generatePersona();
|
|
76
|
+
TestStubGenerator.stubDidResolver(didResolver, [alice, bob]);
|
|
77
|
+
const dataFormat = 'myAwesomeDataFormat';
|
|
78
|
+
const write = yield TestDataGenerator.generateRecordsWrite({ author: alice, attesters: [bob], dataFormat });
|
|
79
|
+
const writeReply = yield dwn.processMessage(alice.did, write.message, write.dataStream);
|
|
80
|
+
expect(writeReply.status.code).to.equal(202);
|
|
81
|
+
const query = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { dataFormat } });
|
|
82
|
+
const reply = yield dwn.processMessage(alice.did, query.message);
|
|
83
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
84
|
+
const entry = reply.entries[0];
|
|
85
|
+
expect(entry.authorization).to.deep.equal(write.message.authorization);
|
|
86
|
+
expect(entry.attestation).to.deep.equal(write.message.attestation);
|
|
87
|
+
expect(entry.descriptor).to.deep.equal(write.message.descriptor);
|
|
88
|
+
expect(entry.recordId).to.equal(write.message.recordId);
|
|
89
|
+
}));
|
|
90
|
+
it('should return records matching the query', () => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
var _a, _b;
|
|
92
|
+
// insert three messages into DB, two with matching protocol
|
|
93
|
+
const alice = yield TestDataGenerator.generatePersona();
|
|
94
|
+
const dataFormat = 'myAwesomeDataFormat';
|
|
95
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
96
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({ author: alice, dataFormat, schema: 'schema1' });
|
|
97
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({ author: alice, dataFormat, schema: 'schema2' });
|
|
98
|
+
// setting up a stub resolver
|
|
99
|
+
const mockResolution = TestDataGenerator.createDidResolutionResult(alice);
|
|
100
|
+
;
|
|
101
|
+
sinon.stub(didResolver, 'resolve').resolves(mockResolution);
|
|
102
|
+
// insert data
|
|
103
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
104
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
105
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
106
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
107
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
108
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
109
|
+
// testing singular conditional query
|
|
110
|
+
const messageData = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { dataFormat } });
|
|
111
|
+
const reply = yield dwn.processMessage(alice.did, messageData.message);
|
|
112
|
+
expect(reply.status.code).to.equal(200);
|
|
113
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2); // only 2 entries should match the query on protocol
|
|
114
|
+
// testing multi-conditional query, reuse data generated above for bob
|
|
115
|
+
const messageData2 = yield TestDataGenerator.generateRecordsQuery({
|
|
116
|
+
author: alice,
|
|
117
|
+
filter: {
|
|
118
|
+
dataFormat,
|
|
119
|
+
schema: 'schema1'
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
const reply2 = yield dwn.processMessage(alice.did, messageData2.message);
|
|
123
|
+
expect(reply2.status.code).to.equal(200);
|
|
124
|
+
expect((_b = reply2.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1); // only 1 entry should match the query
|
|
125
|
+
}));
|
|
126
|
+
it('should return `encodedData` if data size is within the spec threshold', () => __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
var _a;
|
|
128
|
+
const data = TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded); // within/on threshold
|
|
129
|
+
const alice = yield DidKeyResolver.generate();
|
|
130
|
+
const write = yield TestDataGenerator.generateRecordsWrite({ author: alice, data });
|
|
131
|
+
const writeReply = yield dwn.processMessage(alice.did, write.message, write.dataStream);
|
|
132
|
+
expect(writeReply.status.code).to.equal(202);
|
|
133
|
+
const messageData = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { recordId: write.message.recordId } });
|
|
134
|
+
const reply = yield dwn.processMessage(alice.did, messageData.message);
|
|
135
|
+
expect(reply.status.code).to.equal(200);
|
|
136
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
137
|
+
expect(reply.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(data));
|
|
138
|
+
}));
|
|
139
|
+
it('should not return `encodedData` if data size is greater then spec threshold', () => __awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
var _a;
|
|
141
|
+
const data = TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded + 1); // exceeding threshold
|
|
142
|
+
const alice = yield DidKeyResolver.generate();
|
|
143
|
+
const write = yield TestDataGenerator.generateRecordsWrite({ author: alice, data });
|
|
144
|
+
const writeReply = yield dwn.processMessage(alice.did, write.message, write.dataStream);
|
|
145
|
+
expect(writeReply.status.code).to.equal(202);
|
|
146
|
+
const messageData = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { recordId: write.message.recordId } });
|
|
147
|
+
const reply = yield dwn.processMessage(alice.did, messageData.message);
|
|
148
|
+
expect(reply.status.code).to.equal(200);
|
|
149
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
150
|
+
expect(reply.entries[0].encodedData).to.be.undefined;
|
|
151
|
+
}));
|
|
152
|
+
it('should be able to query by attester', () => __awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
var _a, _b, _c;
|
|
154
|
+
// scenario: 2 records authored by alice, 1st attested by alice, 2nd attested by bob
|
|
155
|
+
const alice = yield DidKeyResolver.generate();
|
|
156
|
+
const bob = yield DidKeyResolver.generate();
|
|
157
|
+
const recordsWrite1 = yield TestDataGenerator.generateRecordsWrite({ author: alice, attesters: [alice] });
|
|
158
|
+
const recordsWrite2 = yield TestDataGenerator.generateRecordsWrite({ author: alice, attesters: [bob] });
|
|
159
|
+
// insert data
|
|
160
|
+
const writeReply1 = yield dwn.processMessage(alice.did, recordsWrite1.message, recordsWrite1.dataStream);
|
|
161
|
+
const writeReply2 = yield dwn.processMessage(alice.did, recordsWrite2.message, recordsWrite2.dataStream);
|
|
162
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
163
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
164
|
+
// testing attester filter
|
|
165
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { attester: alice.did } });
|
|
166
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
167
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
168
|
+
const reply1Attester = Jws.getSignerDid(reply1.entries[0].attestation.signatures[0]);
|
|
169
|
+
expect(reply1Attester).to.equal(alice.did);
|
|
170
|
+
// testing attester + another filter
|
|
171
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
172
|
+
author: alice,
|
|
173
|
+
filter: { attester: bob.did, schema: recordsWrite2.message.descriptor.schema }
|
|
174
|
+
});
|
|
175
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
176
|
+
expect((_b = reply2.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
177
|
+
const reply2Attester = Jws.getSignerDid(reply2.entries[0].attestation.signatures[0]);
|
|
178
|
+
expect(reply2Attester).to.equal(bob.did);
|
|
179
|
+
// testing attester filter that yields no results
|
|
180
|
+
const carol = yield DidKeyResolver.generate();
|
|
181
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { attester: carol.did } });
|
|
182
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
183
|
+
expect((_c = reply3.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(0);
|
|
184
|
+
}));
|
|
185
|
+
// TESTING
|
|
186
|
+
it('should be able to query by author', () => __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
// scenario alice and bob both author records into alice's DWN.
|
|
189
|
+
// alice is able to filter for records authored by bob.
|
|
190
|
+
const alice = yield DidKeyResolver.generate();
|
|
191
|
+
const bob = yield DidKeyResolver.generate();
|
|
192
|
+
const protocolDefinition = freeForAll;
|
|
193
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
194
|
+
author: alice,
|
|
195
|
+
protocolDefinition
|
|
196
|
+
});
|
|
197
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
198
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
199
|
+
const aliceAuthorWrite = yield TestDataGenerator.generateRecordsWrite({
|
|
200
|
+
author: alice,
|
|
201
|
+
protocol: protocolDefinition.protocol,
|
|
202
|
+
schema: protocolDefinition.types.post.schema,
|
|
203
|
+
dataFormat: protocolDefinition.types.post.dataFormats[0],
|
|
204
|
+
protocolPath: 'post'
|
|
205
|
+
});
|
|
206
|
+
const aliceAuthorReply = yield dwn.processMessage(alice.did, aliceAuthorWrite.message, aliceAuthorWrite.dataStream);
|
|
207
|
+
expect(aliceAuthorReply.status.code).to.equal(202);
|
|
208
|
+
const bobAuthorWrite = yield TestDataGenerator.generateRecordsWrite({
|
|
209
|
+
author: bob,
|
|
210
|
+
protocol: protocolDefinition.protocol,
|
|
211
|
+
schema: protocolDefinition.types.post.schema,
|
|
212
|
+
dataFormat: protocolDefinition.types.post.dataFormats[0],
|
|
213
|
+
protocolPath: 'post'
|
|
214
|
+
});
|
|
215
|
+
const bobAuthorReply = yield dwn.processMessage(alice.did, bobAuthorWrite.message, bobAuthorWrite.dataStream);
|
|
216
|
+
expect(bobAuthorReply.status.code).to.equal(202);
|
|
217
|
+
// alice queries with an empty filter, gets both
|
|
218
|
+
let recordsQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
219
|
+
author: alice,
|
|
220
|
+
filter: {
|
|
221
|
+
protocol: protocolDefinition.protocol,
|
|
222
|
+
schema: protocolDefinition.types.post.schema,
|
|
223
|
+
dataFormat: protocolDefinition.types.post.dataFormats[0],
|
|
224
|
+
protocolPath: 'post'
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
let queryReply = yield dwn.processMessage(alice.did, recordsQuery.message);
|
|
228
|
+
expect(queryReply.status.code).to.equal(200);
|
|
229
|
+
expect((_a = queryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
230
|
+
// filter for bob as author
|
|
231
|
+
recordsQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
232
|
+
author: alice,
|
|
233
|
+
filter: {
|
|
234
|
+
author: bob.did,
|
|
235
|
+
protocol: protocolDefinition.protocol,
|
|
236
|
+
schema: protocolDefinition.types.post.schema,
|
|
237
|
+
dataFormat: protocolDefinition.types.post.dataFormats[0],
|
|
238
|
+
protocolPath: 'post'
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
queryReply = yield dwn.processMessage(alice.did, recordsQuery.message);
|
|
242
|
+
expect(queryReply.status.code).to.equal(200);
|
|
243
|
+
expect((_b = queryReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
244
|
+
expect(queryReply.entries[0].recordId).to.equal(bobAuthorWrite.message.recordId);
|
|
245
|
+
}));
|
|
246
|
+
it('should be able to query for published records', () => __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
248
|
+
const alice = yield DidKeyResolver.generate();
|
|
249
|
+
const bob = yield DidKeyResolver.generate();
|
|
250
|
+
// create a published record
|
|
251
|
+
const publishedWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, published: true, schema: 'post' });
|
|
252
|
+
const publishedWriteReply = yield dwn.processMessage(alice.did, publishedWrite.message, publishedWrite.dataStream);
|
|
253
|
+
expect(publishedWriteReply.status.code).to.equal(202);
|
|
254
|
+
// create an unpublished record
|
|
255
|
+
const draftWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'post' });
|
|
256
|
+
const draftWriteReply = yield dwn.processMessage(alice.did, draftWrite.message, draftWrite.dataStream);
|
|
257
|
+
expect(draftWriteReply.status.code).to.equal(202);
|
|
258
|
+
// query for only published records
|
|
259
|
+
const publishedPostQuery = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { schema: 'post', published: true } });
|
|
260
|
+
let publishedPostReply = yield dwn.processMessage(alice.did, publishedPostQuery.message);
|
|
261
|
+
expect(publishedPostReply.status.code).to.equal(200);
|
|
262
|
+
expect((_a = publishedPostReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
263
|
+
expect(publishedPostReply.entries[0].recordId).to.equal(publishedWrite.message.recordId);
|
|
264
|
+
// make an query for published records from non owner
|
|
265
|
+
const notOwnerPostQuery = yield TestDataGenerator.generateRecordsQuery({ author: bob, filter: { schema: 'post', published: true } });
|
|
266
|
+
let notOwnerPublishedPostReply = yield dwn.processMessage(alice.did, notOwnerPostQuery.message);
|
|
267
|
+
expect(notOwnerPublishedPostReply.status.code).to.equal(200);
|
|
268
|
+
expect((_b = notOwnerPublishedPostReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
269
|
+
expect(notOwnerPublishedPostReply.entries[0].recordId).to.equal(publishedWrite.message.recordId);
|
|
270
|
+
// anonymous query for published records
|
|
271
|
+
const anonymousPostQuery = yield RecordsQuery.create({ filter: { schema: 'post', published: true } });
|
|
272
|
+
let anonymousPublishedPostReply = yield dwn.processMessage(alice.did, anonymousPostQuery.message);
|
|
273
|
+
expect(anonymousPublishedPostReply.status.code).to.equal(200);
|
|
274
|
+
expect((_c = anonymousPublishedPostReply.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
275
|
+
expect(anonymousPublishedPostReply.entries[0].recordId).to.equal(publishedWrite.message.recordId);
|
|
276
|
+
// publish the unpublished record
|
|
277
|
+
const publishedDraftWrite = yield RecordsWrite.createFrom({
|
|
278
|
+
recordsWriteMessage: draftWrite.message,
|
|
279
|
+
published: true,
|
|
280
|
+
signer: Jws.createSigner(alice)
|
|
281
|
+
});
|
|
282
|
+
const publishedDraftReply = yield dwn.processMessage(alice.did, publishedDraftWrite.message);
|
|
283
|
+
expect(publishedDraftReply.status.code).to.equal(202);
|
|
284
|
+
// issue the same query for published records
|
|
285
|
+
publishedPostReply = yield dwn.processMessage(alice.did, publishedPostQuery.message);
|
|
286
|
+
expect(publishedPostReply.status.code).to.equal(200);
|
|
287
|
+
expect((_d = publishedPostReply.entries) === null || _d === void 0 ? void 0 : _d.length).to.equal(2);
|
|
288
|
+
const returnedRecordIds = (_e = publishedPostReply.entries) === null || _e === void 0 ? void 0 : _e.map(e => e.recordId);
|
|
289
|
+
// ensure that both records now exist in results
|
|
290
|
+
expect(returnedRecordIds).to.have.members([publishedWrite.message.recordId, draftWrite.message.recordId]);
|
|
291
|
+
// query after publishing from non owner
|
|
292
|
+
notOwnerPublishedPostReply = yield dwn.processMessage(alice.did, anonymousPostQuery.message);
|
|
293
|
+
expect(notOwnerPublishedPostReply.status.code).to.equal(200);
|
|
294
|
+
expect((_f = notOwnerPublishedPostReply.entries) === null || _f === void 0 ? void 0 : _f.length).to.equal(2);
|
|
295
|
+
const nonOwnerReturnedRecordIds = (_g = notOwnerPublishedPostReply.entries) === null || _g === void 0 ? void 0 : _g.map(e => e.recordId);
|
|
296
|
+
expect(nonOwnerReturnedRecordIds).to.have.members([publishedWrite.message.recordId, draftWrite.message.recordId]);
|
|
297
|
+
// anonymous query after publishing
|
|
298
|
+
anonymousPublishedPostReply = yield dwn.processMessage(alice.did, anonymousPostQuery.message);
|
|
299
|
+
expect(anonymousPublishedPostReply.status.code).to.equal(200);
|
|
300
|
+
expect((_h = anonymousPublishedPostReply.entries) === null || _h === void 0 ? void 0 : _h.length).to.equal(2);
|
|
301
|
+
const anonymousReturnedRecordIds = (_j = anonymousPublishedPostReply.entries) === null || _j === void 0 ? void 0 : _j.map(e => e.recordId);
|
|
302
|
+
expect(anonymousReturnedRecordIds).to.have.members([publishedWrite.message.recordId, draftWrite.message.recordId]);
|
|
303
|
+
}));
|
|
304
|
+
it('should be able to query for unpublished records', () => __awaiter(this, void 0, void 0, function* () {
|
|
305
|
+
var _a, _b;
|
|
306
|
+
const alice = yield DidKeyResolver.generate();
|
|
307
|
+
// create a published record
|
|
308
|
+
const publishedWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, published: true, schema: 'post' });
|
|
309
|
+
const publishedWriteReply = yield dwn.processMessage(alice.did, publishedWrite.message, publishedWrite.dataStream);
|
|
310
|
+
expect(publishedWriteReply.status.code).to.equal(202);
|
|
311
|
+
// create an unpublished record
|
|
312
|
+
const draftWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'post' });
|
|
313
|
+
const draftWriteReply = yield dwn.processMessage(alice.did, draftWrite.message, draftWrite.dataStream);
|
|
314
|
+
expect(draftWriteReply.status.code).to.equal(202);
|
|
315
|
+
// query for only unpublished records
|
|
316
|
+
const unpublishedPostQuery = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { schema: 'post', published: false } });
|
|
317
|
+
let unpublishedPostReply = yield dwn.processMessage(alice.did, unpublishedPostQuery.message);
|
|
318
|
+
expect(unpublishedPostReply.status.code).to.equal(200);
|
|
319
|
+
expect((_a = unpublishedPostReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
320
|
+
expect(unpublishedPostReply.entries[0].recordId).to.equal(draftWrite.message.recordId);
|
|
321
|
+
// publish the unpublished record
|
|
322
|
+
const publishedDraftWrite = yield RecordsWrite.createFrom({
|
|
323
|
+
recordsWriteMessage: draftWrite.message,
|
|
324
|
+
published: true,
|
|
325
|
+
signer: Jws.createSigner(alice)
|
|
326
|
+
});
|
|
327
|
+
const publishedDraftReply = yield dwn.processMessage(alice.did, publishedDraftWrite.message);
|
|
328
|
+
expect(publishedDraftReply.status.code).to.equal(202);
|
|
329
|
+
// issue the same query for unpublished records
|
|
330
|
+
unpublishedPostReply = yield dwn.processMessage(alice.did, unpublishedPostQuery.message);
|
|
331
|
+
expect(unpublishedPostReply.status.code).to.equal(200);
|
|
332
|
+
expect((_b = unpublishedPostReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(0);
|
|
333
|
+
}));
|
|
334
|
+
it('should not be able to query for unpublished records if unauthorized', () => __awaiter(this, void 0, void 0, function* () {
|
|
335
|
+
var _a, _b, _c, _d;
|
|
336
|
+
const alice = yield DidKeyResolver.generate();
|
|
337
|
+
const bob = yield DidKeyResolver.generate();
|
|
338
|
+
// create a published record
|
|
339
|
+
const publishedWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, published: true, schema: 'post' });
|
|
340
|
+
const publishedWriteReply = yield dwn.processMessage(alice.did, publishedWrite.message, publishedWrite.dataStream);
|
|
341
|
+
expect(publishedWriteReply.status.code).to.equal(202);
|
|
342
|
+
// create an unpublished record
|
|
343
|
+
const draftWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'post' });
|
|
344
|
+
const draftWriteReply = yield dwn.processMessage(alice.did, draftWrite.message, draftWrite.dataStream);
|
|
345
|
+
expect(draftWriteReply.status.code).to.equal(202);
|
|
346
|
+
// bob queries for unpublished records returns zero
|
|
347
|
+
const unpublishedNotOwner = yield TestDataGenerator.generateRecordsQuery({ author: bob, filter: { schema: 'post', published: false } });
|
|
348
|
+
let notOwnerPostReply = yield dwn.processMessage(alice.did, unpublishedNotOwner.message);
|
|
349
|
+
expect(notOwnerPostReply.status.code).to.equal(200);
|
|
350
|
+
expect((_a = notOwnerPostReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(0);
|
|
351
|
+
// publish the unpublished record
|
|
352
|
+
const publishedDraftWrite = yield RecordsWrite.createFrom({
|
|
353
|
+
recordsWriteMessage: draftWrite.message,
|
|
354
|
+
published: true,
|
|
355
|
+
signer: Jws.createSigner(alice)
|
|
356
|
+
});
|
|
357
|
+
const publishedDraftReply = yield dwn.processMessage(alice.did, publishedDraftWrite.message);
|
|
358
|
+
expect(publishedDraftReply.status.code).to.equal(202);
|
|
359
|
+
// without published filter
|
|
360
|
+
let publishedNotOwner = yield TestDataGenerator.generateRecordsQuery({ author: bob, filter: { schema: 'post' } });
|
|
361
|
+
let publishedNotOwnerReply = yield dwn.processMessage(alice.did, publishedNotOwner.message);
|
|
362
|
+
expect(publishedNotOwnerReply.status.code).to.equal(200);
|
|
363
|
+
expect((_b = publishedNotOwnerReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(2);
|
|
364
|
+
// with explicit published true
|
|
365
|
+
publishedNotOwner = yield TestDataGenerator.generateRecordsQuery({ author: bob, filter: { schema: 'post', published: true } });
|
|
366
|
+
publishedNotOwnerReply = yield dwn.processMessage(alice.did, publishedNotOwner.message);
|
|
367
|
+
expect(publishedNotOwnerReply.status.code).to.equal(200);
|
|
368
|
+
expect((_c = publishedNotOwnerReply.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
369
|
+
// with explicit published false after publishing should still return nothing
|
|
370
|
+
notOwnerPostReply = yield dwn.processMessage(alice.did, unpublishedNotOwner.message);
|
|
371
|
+
expect(notOwnerPostReply.status.code).to.equal(200);
|
|
372
|
+
expect((_d = notOwnerPostReply.entries) === null || _d === void 0 ? void 0 : _d.length).to.equal(0);
|
|
373
|
+
}));
|
|
374
|
+
it('should be able to query for a record by a dataCid', () => __awaiter(this, void 0, void 0, function* () {
|
|
375
|
+
var _a;
|
|
376
|
+
const alice = yield DidKeyResolver.generate();
|
|
377
|
+
// create a record
|
|
378
|
+
const writeRecord = yield TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
379
|
+
const writeRecordReply = yield dwn.processMessage(alice.did, writeRecord.message, writeRecord.dataStream);
|
|
380
|
+
expect(writeRecordReply.status.code).to.equal(202);
|
|
381
|
+
const recordDataCid = writeRecord.message.descriptor.dataCid;
|
|
382
|
+
// query for the record by it's dataCid
|
|
383
|
+
const dataCidQuery = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { dataCid: recordDataCid } });
|
|
384
|
+
const dataCidQueryReply = yield dwn.processMessage(alice.did, dataCidQuery.message);
|
|
385
|
+
expect(dataCidQueryReply.status.code).to.equal(200);
|
|
386
|
+
expect((_a = dataCidQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
387
|
+
expect(dataCidQueryReply.entries[0].recordId).to.equal(writeRecord.message.recordId);
|
|
388
|
+
}));
|
|
389
|
+
it('should be able to query with `dataSize` filter (half-open range)', () => __awaiter(this, void 0, void 0, function* () {
|
|
390
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
391
|
+
const alice = yield DidKeyResolver.generate();
|
|
392
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(10) });
|
|
393
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(50) });
|
|
394
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(100) });
|
|
395
|
+
// insert data
|
|
396
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
397
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
398
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
399
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
400
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
401
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
402
|
+
// testing gt
|
|
403
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({
|
|
404
|
+
author: alice,
|
|
405
|
+
filter: { dataSize: { gt: 10 } },
|
|
406
|
+
});
|
|
407
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
408
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
409
|
+
expect((_b = reply1.entries) === null || _b === void 0 ? void 0 : _b.map((entry) => entry.encodedData)).to.have.members([
|
|
410
|
+
Encoder.bytesToBase64Url(write2.dataBytes),
|
|
411
|
+
Encoder.bytesToBase64Url(write3.dataBytes)
|
|
412
|
+
]);
|
|
413
|
+
// testing lt
|
|
414
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
415
|
+
author: alice,
|
|
416
|
+
filter: { dataSize: { lt: 100 } },
|
|
417
|
+
});
|
|
418
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
419
|
+
expect((_c = reply2.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
420
|
+
expect((_d = reply2.entries) === null || _d === void 0 ? void 0 : _d.map((entry) => entry.encodedData)).to.have.members([
|
|
421
|
+
Encoder.bytesToBase64Url(write1.dataBytes),
|
|
422
|
+
Encoder.bytesToBase64Url(write2.dataBytes)
|
|
423
|
+
]);
|
|
424
|
+
// testing gte
|
|
425
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({
|
|
426
|
+
author: alice,
|
|
427
|
+
filter: { dataSize: { gte: 10 } },
|
|
428
|
+
});
|
|
429
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
430
|
+
expect((_e = reply3.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(3);
|
|
431
|
+
expect((_f = reply3.entries) === null || _f === void 0 ? void 0 : _f.map((entry) => entry.encodedData)).to.have.members([
|
|
432
|
+
Encoder.bytesToBase64Url(write1.dataBytes),
|
|
433
|
+
Encoder.bytesToBase64Url(write2.dataBytes),
|
|
434
|
+
Encoder.bytesToBase64Url(write3.dataBytes)
|
|
435
|
+
]);
|
|
436
|
+
// testing lte
|
|
437
|
+
const recordsQuery4 = yield TestDataGenerator.generateRecordsQuery({
|
|
438
|
+
author: alice,
|
|
439
|
+
filter: { dataSize: { lte: 100 } },
|
|
440
|
+
});
|
|
441
|
+
const reply4 = yield dwn.processMessage(alice.did, recordsQuery4.message);
|
|
442
|
+
expect((_g = reply4.entries) === null || _g === void 0 ? void 0 : _g.length).to.equal(3);
|
|
443
|
+
expect((_h = reply4.entries) === null || _h === void 0 ? void 0 : _h.map((entry) => entry.encodedData)).to.have.members([
|
|
444
|
+
Encoder.bytesToBase64Url(write1.dataBytes),
|
|
445
|
+
Encoder.bytesToBase64Url(write2.dataBytes),
|
|
446
|
+
Encoder.bytesToBase64Url(write3.dataBytes)
|
|
447
|
+
]);
|
|
448
|
+
}));
|
|
449
|
+
it('should be able to range query with `dataSize` filter (open & closed range)', () => __awaiter(this, void 0, void 0, function* () {
|
|
450
|
+
var _a, _b, _c, _d, _e, _f;
|
|
451
|
+
const alice = yield DidKeyResolver.generate();
|
|
452
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(10) });
|
|
453
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(50) });
|
|
454
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({ author: alice, data: TestDataGenerator.randomBytes(100) });
|
|
455
|
+
// insert data
|
|
456
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
457
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
458
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
459
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
460
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
461
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
462
|
+
// testing range using gt & lt
|
|
463
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({
|
|
464
|
+
author: alice,
|
|
465
|
+
filter: { dataSize: { gt: 10, lt: 60 } },
|
|
466
|
+
});
|
|
467
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
468
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
469
|
+
expect(reply1.entries[0].recordId).to.equal(write2.message.recordId);
|
|
470
|
+
// testing range using gte & lt
|
|
471
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
472
|
+
author: alice,
|
|
473
|
+
filter: { dataSize: { gte: 10, lt: 60 } },
|
|
474
|
+
});
|
|
475
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
476
|
+
expect((_b = reply2.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(2);
|
|
477
|
+
const reply2RecordIds = (_c = reply2.entries) === null || _c === void 0 ? void 0 : _c.map(e => e.recordId);
|
|
478
|
+
expect(reply2RecordIds).to.have.members([write1.message.recordId, write2.message.recordId]);
|
|
479
|
+
// testing range using gt & lte
|
|
480
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({
|
|
481
|
+
author: alice,
|
|
482
|
+
filter: { dataSize: { gt: 50, lte: 100 } },
|
|
483
|
+
});
|
|
484
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
485
|
+
expect((_d = reply3.entries) === null || _d === void 0 ? void 0 : _d.length).to.equal(1);
|
|
486
|
+
expect(reply3.entries[0].recordId).to.equal(write3.message.recordId);
|
|
487
|
+
// testing range using gte & lte
|
|
488
|
+
const recordsQuery4 = yield TestDataGenerator.generateRecordsQuery({
|
|
489
|
+
author: alice,
|
|
490
|
+
filter: { dataSize: { gte: 10, lte: 100 } },
|
|
491
|
+
});
|
|
492
|
+
const reply4 = yield dwn.processMessage(alice.did, recordsQuery4.message);
|
|
493
|
+
expect((_e = reply4.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(3);
|
|
494
|
+
const reply4RecordIds = (_f = reply4.entries) === null || _f === void 0 ? void 0 : _f.map(e => e.recordId);
|
|
495
|
+
expect(reply4RecordIds).to.have.members([write1.message.recordId, write2.message.recordId, write3.message.recordId]);
|
|
496
|
+
}));
|
|
497
|
+
it('should be able to range query by `dateCreated`', () => __awaiter(this, void 0, void 0, function* () {
|
|
498
|
+
var _a, _b, _c, _d;
|
|
499
|
+
// scenario: 3 records authored by alice, created on first of 2021, 2022, and 2023 respectively,
|
|
500
|
+
// only the first 2 records share the same schema
|
|
501
|
+
const firstDayOf2021 = Time.createTimestamp({ year: 2021, month: 1, day: 1 });
|
|
502
|
+
const firstDayOf2022 = Time.createTimestamp({ year: 2022, month: 1, day: 1 });
|
|
503
|
+
const firstDayOf2023 = Time.createTimestamp({ year: 2023, month: 1, day: 1 });
|
|
504
|
+
const alice = yield DidKeyResolver.generate();
|
|
505
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({ author: alice, dateCreated: firstDayOf2021, messageTimestamp: firstDayOf2021 });
|
|
506
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({ author: alice, dateCreated: firstDayOf2022, messageTimestamp: firstDayOf2022 });
|
|
507
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({ author: alice, dateCreated: firstDayOf2023, messageTimestamp: firstDayOf2023 });
|
|
508
|
+
// insert data
|
|
509
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
510
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
511
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
512
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
513
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
514
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
515
|
+
// testing `from` range
|
|
516
|
+
const lastDayOf2021 = Time.createTimestamp({ year: 2021, month: 12, day: 31 });
|
|
517
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({
|
|
518
|
+
author: alice,
|
|
519
|
+
filter: { dateCreated: { from: lastDayOf2021 } },
|
|
520
|
+
dateSort: DateSort.CreatedAscending
|
|
521
|
+
});
|
|
522
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
523
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
524
|
+
expect(reply1.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(write2.dataBytes));
|
|
525
|
+
expect(reply1.entries[1].encodedData).to.equal(Encoder.bytesToBase64Url(write3.dataBytes));
|
|
526
|
+
// testing `to` range
|
|
527
|
+
const lastDayOf2022 = Time.createTimestamp({ year: 2022, month: 12, day: 31 });
|
|
528
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
529
|
+
author: alice,
|
|
530
|
+
filter: { dateCreated: { to: lastDayOf2022 } },
|
|
531
|
+
dateSort: DateSort.CreatedAscending
|
|
532
|
+
});
|
|
533
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
534
|
+
expect((_b = reply2.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(2);
|
|
535
|
+
expect(reply2.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(write1.dataBytes));
|
|
536
|
+
expect(reply2.entries[1].encodedData).to.equal(Encoder.bytesToBase64Url(write2.dataBytes));
|
|
537
|
+
// testing `from` and `to` range
|
|
538
|
+
const lastDayOf2023 = Time.createTimestamp({ year: 2023, month: 12, day: 31 });
|
|
539
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({
|
|
540
|
+
author: alice,
|
|
541
|
+
filter: { dateCreated: { from: lastDayOf2022, to: lastDayOf2023 } },
|
|
542
|
+
dateSort: DateSort.CreatedAscending
|
|
543
|
+
});
|
|
544
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
545
|
+
expect((_c = reply3.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
546
|
+
expect(reply3.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(write3.dataBytes));
|
|
547
|
+
// testing edge case where value equals `from` and `to`
|
|
548
|
+
const recordsQuery4 = yield TestDataGenerator.generateRecordsQuery({
|
|
549
|
+
author: alice,
|
|
550
|
+
filter: { dateCreated: { from: firstDayOf2022, to: firstDayOf2023 } },
|
|
551
|
+
dateSort: DateSort.CreatedAscending
|
|
552
|
+
});
|
|
553
|
+
const reply4 = yield dwn.processMessage(alice.did, recordsQuery4.message);
|
|
554
|
+
expect((_d = reply4.entries) === null || _d === void 0 ? void 0 : _d.length).to.equal(1);
|
|
555
|
+
expect(reply4.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(write2.dataBytes));
|
|
556
|
+
}));
|
|
557
|
+
it('should not return records that were published and then unpublished ', () => __awaiter(this, void 0, void 0, function* () {
|
|
558
|
+
// scenario: 3 records authored by alice, published on first of 2021, 2022, and 2023 respectively
|
|
559
|
+
// then the records are unpublished and tested to not return when filtering for published records
|
|
560
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
561
|
+
const firstDayOf2020 = Time.createTimestamp({ year: 2020, month: 1, day: 1 });
|
|
562
|
+
const firstDayOf2021 = Time.createTimestamp({ year: 2021, month: 1, day: 1 });
|
|
563
|
+
const firstDayOf2022 = Time.createTimestamp({ year: 2022, month: 1, day: 1 });
|
|
564
|
+
const firstDayOf2023 = Time.createTimestamp({ year: 2023, month: 1, day: 1 });
|
|
565
|
+
const alice = yield DidKeyResolver.generate();
|
|
566
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({
|
|
567
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2021, messageTimestamp: firstDayOf2020
|
|
568
|
+
});
|
|
569
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({
|
|
570
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2022, messageTimestamp: firstDayOf2020
|
|
571
|
+
});
|
|
572
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({
|
|
573
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2023, messageTimestamp: firstDayOf2020
|
|
574
|
+
});
|
|
575
|
+
// insert data
|
|
576
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
577
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
578
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
579
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
580
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
581
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
582
|
+
// confirm range before un-publishing.
|
|
583
|
+
const lastDayOf2021 = Time.createTimestamp({ year: 2021, month: 12, day: 31 });
|
|
584
|
+
const ownerRangeQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
585
|
+
author: alice,
|
|
586
|
+
filter: { datePublished: { from: lastDayOf2021 } },
|
|
587
|
+
dateSort: DateSort.CreatedAscending
|
|
588
|
+
});
|
|
589
|
+
const reply1 = yield dwn.processMessage(alice.did, ownerRangeQuery.message);
|
|
590
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
591
|
+
const reply1RecordIds = (_b = reply1.entries) === null || _b === void 0 ? void 0 : _b.map(e => e.recordId);
|
|
592
|
+
expect(reply1RecordIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
593
|
+
// confirm published true filter before un-publishing
|
|
594
|
+
const ownerPublishedQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
595
|
+
author: alice,
|
|
596
|
+
filter: { published: true },
|
|
597
|
+
dateSort: DateSort.CreatedAscending
|
|
598
|
+
});
|
|
599
|
+
let ownerPublishedReply = yield dwn.processMessage(alice.did, ownerPublishedQuery.message);
|
|
600
|
+
expect(ownerPublishedReply.status.code).to.equal(200);
|
|
601
|
+
expect((_c = ownerPublishedReply.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(3);
|
|
602
|
+
const ownerPublishedIds = (_d = ownerPublishedReply.entries) === null || _d === void 0 ? void 0 : _d.map(e => e.recordId);
|
|
603
|
+
expect(ownerPublishedIds).to.have.members([write1.message.recordId, write2.message.recordId, write3.message.recordId]);
|
|
604
|
+
// confirm for anonymous query before un-publishing
|
|
605
|
+
const anonymousRangeQuery = yield RecordsQuery.create({
|
|
606
|
+
filter: { datePublished: { from: lastDayOf2021 } },
|
|
607
|
+
dateSort: DateSort.CreatedAscending
|
|
608
|
+
});
|
|
609
|
+
let anonymousRangeReply = yield dwn.processMessage(alice.did, anonymousRangeQuery.message);
|
|
610
|
+
expect(anonymousRangeReply.status.code).to.equal(200);
|
|
611
|
+
expect((_e = anonymousRangeReply.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(2);
|
|
612
|
+
const anonymousReplyIds = (_f = anonymousRangeReply.entries) === null || _f === void 0 ? void 0 : _f.map(e => e.recordId);
|
|
613
|
+
expect(anonymousReplyIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
614
|
+
// confirm anonymous published true filter before un-publishing
|
|
615
|
+
const anonymousPublishedQuery = yield RecordsQuery.create({
|
|
616
|
+
filter: { published: true },
|
|
617
|
+
dateSort: DateSort.CreatedAscending
|
|
618
|
+
});
|
|
619
|
+
let anonymousPublishedReply = yield dwn.processMessage(alice.did, anonymousPublishedQuery.message);
|
|
620
|
+
expect(anonymousPublishedReply.status.code).to.equal(200);
|
|
621
|
+
expect((_g = anonymousPublishedReply.entries) === null || _g === void 0 ? void 0 : _g.length).to.equal(3);
|
|
622
|
+
const anonymousPublishedIds = (_h = anonymousPublishedReply.entries) === null || _h === void 0 ? void 0 : _h.map(e => e.recordId);
|
|
623
|
+
expect(anonymousPublishedIds).to.have.members([write1.message.recordId, write2.message.recordId, write3.message.recordId]);
|
|
624
|
+
//unpublish records
|
|
625
|
+
const write1Unpublish = yield RecordsWrite.createFrom({
|
|
626
|
+
signer: Jws.createSigner(alice),
|
|
627
|
+
recordsWriteMessage: write1.message,
|
|
628
|
+
published: false
|
|
629
|
+
});
|
|
630
|
+
const write2Unpublish = yield RecordsWrite.createFrom({
|
|
631
|
+
signer: Jws.createSigner(alice),
|
|
632
|
+
recordsWriteMessage: write2.message,
|
|
633
|
+
published: false
|
|
634
|
+
});
|
|
635
|
+
const write3Unpublish = yield RecordsWrite.createFrom({
|
|
636
|
+
signer: Jws.createSigner(alice),
|
|
637
|
+
recordsWriteMessage: write3.message,
|
|
638
|
+
published: false
|
|
639
|
+
});
|
|
640
|
+
const unpublished1Response = yield dwn.processMessage(alice.did, write1Unpublish.message);
|
|
641
|
+
const unpublished2Response = yield dwn.processMessage(alice.did, write2Unpublish.message);
|
|
642
|
+
const unpublished3Response = yield dwn.processMessage(alice.did, write3Unpublish.message);
|
|
643
|
+
expect(unpublished1Response.status.code).to.equal(202);
|
|
644
|
+
expect(unpublished2Response.status.code).to.equal(202);
|
|
645
|
+
expect(unpublished3Response.status.code).to.equal(202);
|
|
646
|
+
// try datePublished range query as an anonymous user after unpublish
|
|
647
|
+
anonymousRangeReply = yield dwn.processMessage(alice.did, anonymousRangeQuery.message);
|
|
648
|
+
expect(anonymousRangeReply.status.code).to.equal(200);
|
|
649
|
+
expect((_j = anonymousRangeReply.entries) === null || _j === void 0 ? void 0 : _j.length).to.equal(0);
|
|
650
|
+
// try published:true filter as an anonymous user after unpublish
|
|
651
|
+
anonymousPublishedReply = yield dwn.processMessage(alice.did, anonymousPublishedQuery.message);
|
|
652
|
+
expect(anonymousPublishedReply.status.code).to.equal(200);
|
|
653
|
+
expect((_k = anonymousPublishedReply.entries) === null || _k === void 0 ? void 0 : _k.length).to.equal(0);
|
|
654
|
+
// try datePublished range query as owner after unpublish
|
|
655
|
+
const ownerRangeReply = yield dwn.processMessage(alice.did, ownerRangeQuery.message);
|
|
656
|
+
expect(ownerRangeReply.status.code).to.equal(200);
|
|
657
|
+
expect((_l = ownerRangeReply.entries) === null || _l === void 0 ? void 0 : _l.length).to.equal(0);
|
|
658
|
+
// try published:true filter as owner after unpublish
|
|
659
|
+
ownerPublishedReply = yield dwn.processMessage(alice.did, ownerPublishedQuery.message);
|
|
660
|
+
expect(ownerPublishedReply.status.code).to.equal(200);
|
|
661
|
+
expect((_m = ownerPublishedReply.entries) === null || _m === void 0 ? void 0 : _m.length).to.equal(0);
|
|
662
|
+
}));
|
|
663
|
+
it('should be able to range query by `datePublished`', () => __awaiter(this, void 0, void 0, function* () {
|
|
664
|
+
// scenario: 3 records authored by alice, published on first of 2021, 2022, and 2023 respectively
|
|
665
|
+
// all 3 records are created on first of 2020
|
|
666
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
667
|
+
const firstDayOf2020 = Time.createTimestamp({ year: 2020, month: 1, day: 1 });
|
|
668
|
+
const firstDayOf2021 = Time.createTimestamp({ year: 2021, month: 1, day: 1 });
|
|
669
|
+
const firstDayOf2022 = Time.createTimestamp({ year: 2022, month: 1, day: 1 });
|
|
670
|
+
const firstDayOf2023 = Time.createTimestamp({ year: 2023, month: 1, day: 1 });
|
|
671
|
+
const alice = yield DidKeyResolver.generate();
|
|
672
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({
|
|
673
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2021, messageTimestamp: firstDayOf2020
|
|
674
|
+
});
|
|
675
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({
|
|
676
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2022, messageTimestamp: firstDayOf2020
|
|
677
|
+
});
|
|
678
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({
|
|
679
|
+
author: alice, published: true, dateCreated: firstDayOf2020, datePublished: firstDayOf2023, messageTimestamp: firstDayOf2020
|
|
680
|
+
});
|
|
681
|
+
// insert data
|
|
682
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
683
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
684
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
685
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
686
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
687
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
688
|
+
// testing `from` range
|
|
689
|
+
const lastDayOf2021 = Time.createTimestamp({ year: 2021, month: 12, day: 31 });
|
|
690
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({
|
|
691
|
+
author: alice,
|
|
692
|
+
filter: { datePublished: { from: lastDayOf2021 } },
|
|
693
|
+
dateSort: DateSort.CreatedAscending
|
|
694
|
+
});
|
|
695
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
696
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
697
|
+
const reply1RecordIds = (_b = reply1.entries) === null || _b === void 0 ? void 0 : _b.map(e => e.recordId);
|
|
698
|
+
expect(reply1RecordIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
699
|
+
// testing `to` range
|
|
700
|
+
const lastDayOf2022 = Time.createTimestamp({ year: 2022, month: 12, day: 31 });
|
|
701
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
702
|
+
author: alice,
|
|
703
|
+
filter: { datePublished: { to: lastDayOf2022 } },
|
|
704
|
+
dateSort: DateSort.CreatedAscending
|
|
705
|
+
});
|
|
706
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
707
|
+
expect((_c = reply2.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
708
|
+
const reply2RecordIds = (_d = reply2.entries) === null || _d === void 0 ? void 0 : _d.map(e => e.recordId);
|
|
709
|
+
expect(reply2RecordIds).to.have.members([write1.message.recordId, write2.message.recordId]);
|
|
710
|
+
// testing `from` and `to` range
|
|
711
|
+
const lastDayOf2023 = Time.createTimestamp({ year: 2023, month: 12, day: 31 });
|
|
712
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({
|
|
713
|
+
author: alice,
|
|
714
|
+
filter: { datePublished: { from: lastDayOf2022, to: lastDayOf2023 } },
|
|
715
|
+
dateSort: DateSort.CreatedAscending
|
|
716
|
+
});
|
|
717
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
718
|
+
expect((_e = reply3.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(1);
|
|
719
|
+
expect(reply3.entries[0].recordId).to.equal(write3.message.recordId);
|
|
720
|
+
// testing edge case where value equals `from` and `to`
|
|
721
|
+
const recordsQuery4 = yield TestDataGenerator.generateRecordsQuery({
|
|
722
|
+
author: alice,
|
|
723
|
+
filter: { datePublished: { from: firstDayOf2022, to: firstDayOf2023 } },
|
|
724
|
+
dateSort: DateSort.CreatedAscending
|
|
725
|
+
});
|
|
726
|
+
const reply4 = yield dwn.processMessage(alice.did, recordsQuery4.message);
|
|
727
|
+
expect((_f = reply4.entries) === null || _f === void 0 ? void 0 : _f.length).to.equal(1);
|
|
728
|
+
expect(reply4.entries[0].recordId).to.equal(write2.message.recordId);
|
|
729
|
+
// check for anonymous range query
|
|
730
|
+
const anonymousRecordQuery = yield RecordsQuery.create({
|
|
731
|
+
filter: { datePublished: { from: lastDayOf2021 } },
|
|
732
|
+
dateSort: DateSort.CreatedAscending
|
|
733
|
+
});
|
|
734
|
+
const anonymousReply = yield dwn.processMessage(alice.did, anonymousRecordQuery.message);
|
|
735
|
+
expect(anonymousReply.status.code).to.equal(200);
|
|
736
|
+
expect((_g = anonymousReply.entries) === null || _g === void 0 ? void 0 : _g.length).to.equal(2);
|
|
737
|
+
const anonymousReplyIds = (_h = anonymousReply.entries) === null || _h === void 0 ? void 0 : _h.map(e => e.recordId);
|
|
738
|
+
expect(anonymousReplyIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
739
|
+
// check for non owner range query
|
|
740
|
+
const bob = yield DidKeyResolver.generate();
|
|
741
|
+
const nonOwnerRange = yield TestDataGenerator.generateRecordsQuery({
|
|
742
|
+
author: bob,
|
|
743
|
+
filter: { datePublished: { from: lastDayOf2021 } },
|
|
744
|
+
dateSort: DateSort.CreatedAscending
|
|
745
|
+
});
|
|
746
|
+
const nonOwnerReply = yield dwn.processMessage(alice.did, nonOwnerRange.message);
|
|
747
|
+
expect(nonOwnerReply.status.code).to.equal(200);
|
|
748
|
+
expect((_j = nonOwnerReply.entries) === null || _j === void 0 ? void 0 : _j.length).to.equal(2);
|
|
749
|
+
const nonOwnerReplyIds = (_k = nonOwnerReply.entries) === null || _k === void 0 ? void 0 : _k.map(e => e.recordId);
|
|
750
|
+
expect(nonOwnerReplyIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
751
|
+
}));
|
|
752
|
+
it('should be able to range query by `dateUpdated`', () => __awaiter(this, void 0, void 0, function* () {
|
|
753
|
+
// scenario: alice creates 3 records on the first day of 2020.
|
|
754
|
+
// alice then updates these records to published on first of 2021, 2022, and 2023 respectively
|
|
755
|
+
// this should update the messageTimestamp on the respective messages
|
|
756
|
+
var _a, _b, _c, _d, _e, _f;
|
|
757
|
+
const firstDayOf2020 = Time.createTimestamp({ year: 2020, month: 1, day: 1 });
|
|
758
|
+
const firstDayOf2021 = Time.createTimestamp({ year: 2021, month: 1, day: 1 });
|
|
759
|
+
const firstDayOf2022 = Time.createTimestamp({ year: 2022, month: 1, day: 1 });
|
|
760
|
+
const firstDayOf2023 = Time.createTimestamp({ year: 2023, month: 1, day: 1 });
|
|
761
|
+
const alice = yield DidKeyResolver.generate();
|
|
762
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({
|
|
763
|
+
author: alice, dateCreated: firstDayOf2020, messageTimestamp: firstDayOf2020
|
|
764
|
+
});
|
|
765
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({
|
|
766
|
+
author: alice, dateCreated: firstDayOf2020, messageTimestamp: firstDayOf2020
|
|
767
|
+
});
|
|
768
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({
|
|
769
|
+
author: alice, dateCreated: firstDayOf2020, messageTimestamp: firstDayOf2020
|
|
770
|
+
});
|
|
771
|
+
// insert data
|
|
772
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
773
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
774
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
775
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
776
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
777
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
778
|
+
// update to published
|
|
779
|
+
const write1Update = yield RecordsWrite.createFrom({
|
|
780
|
+
recordsWriteMessage: write1.message,
|
|
781
|
+
published: true,
|
|
782
|
+
messageTimestamp: firstDayOf2021,
|
|
783
|
+
datePublished: firstDayOf2021,
|
|
784
|
+
signer: Jws.createSigner(alice)
|
|
785
|
+
});
|
|
786
|
+
const write2Update = yield RecordsWrite.createFrom({
|
|
787
|
+
recordsWriteMessage: write2.message,
|
|
788
|
+
published: true,
|
|
789
|
+
messageTimestamp: firstDayOf2022,
|
|
790
|
+
datePublished: firstDayOf2022,
|
|
791
|
+
signer: Jws.createSigner(alice)
|
|
792
|
+
});
|
|
793
|
+
const write3Update = yield RecordsWrite.createFrom({
|
|
794
|
+
recordsWriteMessage: write3.message,
|
|
795
|
+
published: true,
|
|
796
|
+
messageTimestamp: firstDayOf2023,
|
|
797
|
+
datePublished: firstDayOf2023,
|
|
798
|
+
signer: Jws.createSigner(alice)
|
|
799
|
+
});
|
|
800
|
+
const writeReplyUpdate1 = yield dwn.processMessage(alice.did, write1Update.message);
|
|
801
|
+
const writeReplyUpdate2 = yield dwn.processMessage(alice.did, write2Update.message);
|
|
802
|
+
const writeReplyUpdate3 = yield dwn.processMessage(alice.did, write3Update.message);
|
|
803
|
+
expect(writeReplyUpdate1.status.code).to.equal(202);
|
|
804
|
+
expect(writeReplyUpdate2.status.code).to.equal(202);
|
|
805
|
+
expect(writeReplyUpdate3.status.code).to.equal(202);
|
|
806
|
+
// testing `from` range
|
|
807
|
+
const lastDayOf2021 = Time.createTimestamp({ year: 2021, month: 12, day: 31 });
|
|
808
|
+
const recordsQuery1 = yield TestDataGenerator.generateRecordsQuery({
|
|
809
|
+
author: alice,
|
|
810
|
+
filter: { dateUpdated: { from: lastDayOf2021 } },
|
|
811
|
+
dateSort: DateSort.CreatedAscending
|
|
812
|
+
});
|
|
813
|
+
const reply1 = yield dwn.processMessage(alice.did, recordsQuery1.message);
|
|
814
|
+
expect((_a = reply1.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(2);
|
|
815
|
+
const reply1RecordIds = (_b = reply1.entries) === null || _b === void 0 ? void 0 : _b.map(e => e.recordId);
|
|
816
|
+
expect(reply1RecordIds).to.have.members([write2.message.recordId, write3.message.recordId]);
|
|
817
|
+
// testing `to` range
|
|
818
|
+
const lastDayOf2022 = Time.createTimestamp({ year: 2022, month: 12, day: 31 });
|
|
819
|
+
const recordsQuery2 = yield TestDataGenerator.generateRecordsQuery({
|
|
820
|
+
author: alice,
|
|
821
|
+
filter: { dateUpdated: { to: lastDayOf2022 } },
|
|
822
|
+
dateSort: DateSort.CreatedAscending
|
|
823
|
+
});
|
|
824
|
+
const reply2 = yield dwn.processMessage(alice.did, recordsQuery2.message);
|
|
825
|
+
expect((_c = reply2.entries) === null || _c === void 0 ? void 0 : _c.length).to.equal(2);
|
|
826
|
+
const reply2RecordIds = (_d = reply2.entries) === null || _d === void 0 ? void 0 : _d.map(e => e.recordId);
|
|
827
|
+
expect(reply2RecordIds).to.have.members([write1.message.recordId, write2.message.recordId]);
|
|
828
|
+
// testing `from` and `to` range
|
|
829
|
+
const lastDayOf2023 = Time.createTimestamp({ year: 2023, month: 12, day: 31 });
|
|
830
|
+
const recordsQuery3 = yield TestDataGenerator.generateRecordsQuery({
|
|
831
|
+
author: alice,
|
|
832
|
+
filter: { dateUpdated: { from: lastDayOf2022, to: lastDayOf2023 } },
|
|
833
|
+
dateSort: DateSort.CreatedAscending
|
|
834
|
+
});
|
|
835
|
+
const reply3 = yield dwn.processMessage(alice.did, recordsQuery3.message);
|
|
836
|
+
expect((_e = reply3.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(1);
|
|
837
|
+
expect(reply3.entries[0].recordId).to.equal(write3.message.recordId);
|
|
838
|
+
// testing edge case where value equals `from` and `to`
|
|
839
|
+
const recordsQuery4 = yield TestDataGenerator.generateRecordsQuery({
|
|
840
|
+
author: alice,
|
|
841
|
+
filter: { dateUpdated: { from: firstDayOf2022, to: firstDayOf2023 } },
|
|
842
|
+
dateSort: DateSort.CreatedAscending
|
|
843
|
+
});
|
|
844
|
+
const reply4 = yield dwn.processMessage(alice.did, recordsQuery4.message);
|
|
845
|
+
expect((_f = reply4.entries) === null || _f === void 0 ? void 0 : _f.length).to.equal(1);
|
|
846
|
+
expect(reply4.entries[0].recordId).to.equal(write2.message.recordId);
|
|
847
|
+
}));
|
|
848
|
+
it('should be able use range and exact match queries at the same time', () => __awaiter(this, void 0, void 0, function* () {
|
|
849
|
+
// scenario: 3 records authored by alice, created on first of 2021, 2022, and 2023 respectively,
|
|
850
|
+
// only the first 2 records share the same schema
|
|
851
|
+
var _a;
|
|
852
|
+
const firstDayOf2021 = Time.createTimestamp({ year: 2021, month: 1, day: 1 });
|
|
853
|
+
const firstDayOf2022 = Time.createTimestamp({ year: 2022, month: 1, day: 1 });
|
|
854
|
+
const firstDayOf2023 = Time.createTimestamp({ year: 2023, month: 1, day: 1 });
|
|
855
|
+
const alice = yield DidKeyResolver.generate();
|
|
856
|
+
const schema = '2021And2022Schema';
|
|
857
|
+
const write1 = yield TestDataGenerator.generateRecordsWrite({
|
|
858
|
+
author: alice, dateCreated: firstDayOf2021, messageTimestamp: firstDayOf2021, schema
|
|
859
|
+
});
|
|
860
|
+
const write2 = yield TestDataGenerator.generateRecordsWrite({
|
|
861
|
+
author: alice, dateCreated: firstDayOf2022, messageTimestamp: firstDayOf2022, schema
|
|
862
|
+
});
|
|
863
|
+
const write3 = yield TestDataGenerator.generateRecordsWrite({
|
|
864
|
+
author: alice, dateCreated: firstDayOf2023, messageTimestamp: firstDayOf2023
|
|
865
|
+
});
|
|
866
|
+
// insert data
|
|
867
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1.message, write1.dataStream);
|
|
868
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2.message, write2.dataStream);
|
|
869
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3.message, write3.dataStream);
|
|
870
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
871
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
872
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
873
|
+
// testing range criterion with another exact match
|
|
874
|
+
const lastDayOf2021 = Time.createTimestamp({ year: 2021, month: 12, day: 31 });
|
|
875
|
+
const lastDayOf2023 = Time.createTimestamp({ year: 2023, month: 12, day: 31 });
|
|
876
|
+
const recordsQuery5 = yield TestDataGenerator.generateRecordsQuery({
|
|
877
|
+
author: alice,
|
|
878
|
+
filter: {
|
|
879
|
+
schema, // by itself selects the first 2 records
|
|
880
|
+
dateCreated: { from: lastDayOf2021, to: lastDayOf2023 } // by itself selects the last 2 records
|
|
881
|
+
},
|
|
882
|
+
dateSort: DateSort.CreatedAscending
|
|
883
|
+
});
|
|
884
|
+
const reply = yield dwn.processMessage(alice.did, recordsQuery5.message);
|
|
885
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
886
|
+
expect(reply.entries[0].encodedData).to.equal(Encoder.bytesToBase64Url(write2.dataBytes));
|
|
887
|
+
}));
|
|
888
|
+
it('should include `authorization` in returned records', () => __awaiter(this, void 0, void 0, function* () {
|
|
889
|
+
var _a;
|
|
890
|
+
const alice = yield TestDataGenerator.generatePersona();
|
|
891
|
+
const { message, dataStream } = yield TestDataGenerator.generateRecordsWrite({ author: alice });
|
|
892
|
+
// setting up a stub method resolver
|
|
893
|
+
const mockResolution = TestDataGenerator.createDidResolutionResult(alice);
|
|
894
|
+
sinon.stub(didResolver, 'resolve').resolves(mockResolution);
|
|
895
|
+
const writeReply = yield dwn.processMessage(alice.did, message, dataStream);
|
|
896
|
+
expect(writeReply.status.code).to.equal(202);
|
|
897
|
+
const queryData = yield TestDataGenerator.generateRecordsQuery({
|
|
898
|
+
author: alice,
|
|
899
|
+
filter: { schema: message.descriptor.schema }
|
|
900
|
+
});
|
|
901
|
+
const queryReply = yield dwn.processMessage(alice.did, queryData.message);
|
|
902
|
+
expect(queryReply.status.code).to.equal(200);
|
|
903
|
+
expect((_a = queryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
904
|
+
expect(queryReply.entries[0].authorization).to.deep.equal(message.authorization);
|
|
905
|
+
}));
|
|
906
|
+
it('should include `attestation` in returned records', () => __awaiter(this, void 0, void 0, function* () {
|
|
907
|
+
// scenario: alice and bob attest to a message alice authored
|
|
908
|
+
var _a, _b, _c;
|
|
909
|
+
const alice = yield DidKeyResolver.generate();
|
|
910
|
+
const { message, dataStream } = yield TestDataGenerator.generateRecordsWrite({ author: alice, attesters: [alice] });
|
|
911
|
+
const writeReply = yield dwn.processMessage(alice.did, message, dataStream);
|
|
912
|
+
expect(writeReply.status.code).to.equal(202);
|
|
913
|
+
const queryData = yield TestDataGenerator.generateRecordsQuery({
|
|
914
|
+
author: alice,
|
|
915
|
+
filter: { schema: message.descriptor.schema }
|
|
916
|
+
});
|
|
917
|
+
const queryReply = yield dwn.processMessage(alice.did, queryData.message);
|
|
918
|
+
expect(queryReply.status.code).to.equal(200);
|
|
919
|
+
expect((_a = queryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
920
|
+
const recordsWriteMessage = queryReply.entries[0];
|
|
921
|
+
expect((_c = (_b = recordsWriteMessage.attestation) === null || _b === void 0 ? void 0 : _b.signatures) === null || _c === void 0 ? void 0 : _c.length).to.equal(1);
|
|
922
|
+
}));
|
|
923
|
+
it('should omit records that are not published if `dateSort` sorts on `datePublished`', () => __awaiter(this, void 0, void 0, function* () {
|
|
924
|
+
var _a, _b;
|
|
925
|
+
// setup: 2 records in DWN: 1 published and 1 unpublished
|
|
926
|
+
const alice = yield TestDataGenerator.generatePersona();
|
|
927
|
+
const schema = 'aSchema';
|
|
928
|
+
const publishedWriteData = yield TestDataGenerator.generateRecordsWrite({
|
|
929
|
+
author: alice, schema, published: true
|
|
930
|
+
});
|
|
931
|
+
const unpublishedWriteData = yield TestDataGenerator.generateRecordsWrite({
|
|
932
|
+
author: alice, schema
|
|
933
|
+
});
|
|
934
|
+
// setting up a stub method resolver
|
|
935
|
+
const mockResolution = TestDataGenerator.createDidResolutionResult(alice);
|
|
936
|
+
;
|
|
937
|
+
sinon.stub(didResolver, 'resolve').resolves(mockResolution);
|
|
938
|
+
// insert data
|
|
939
|
+
const publishedWriteReply = yield dwn.processMessage(alice.did, publishedWriteData.message, publishedWriteData.dataStream);
|
|
940
|
+
const unpublishedWriteReply = yield dwn.processMessage(alice.did, unpublishedWriteData.message, unpublishedWriteData.dataStream);
|
|
941
|
+
expect(publishedWriteReply.status.code).to.equal(202);
|
|
942
|
+
expect(unpublishedWriteReply.status.code).to.equal(202);
|
|
943
|
+
// test published date ascending sort does not include any records that is not published
|
|
944
|
+
const publishedAscendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
945
|
+
author: alice,
|
|
946
|
+
dateSort: DateSort.PublishedAscending,
|
|
947
|
+
filter: { schema }
|
|
948
|
+
});
|
|
949
|
+
const publishedAscendingQueryReply = yield dwn.processMessage(alice.did, publishedAscendingQueryData.message);
|
|
950
|
+
expect((_a = publishedAscendingQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
951
|
+
expect(publishedAscendingQueryReply.entries[0].descriptor['datePublished']).to.equal(publishedWriteData.message.descriptor.datePublished);
|
|
952
|
+
// test published date scending sort does not include any records that is not published
|
|
953
|
+
const publishedDescendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
954
|
+
author: alice,
|
|
955
|
+
dateSort: DateSort.PublishedDescending,
|
|
956
|
+
filter: { schema }
|
|
957
|
+
});
|
|
958
|
+
const publishedDescendingQueryReply = yield dwn.processMessage(alice.did, publishedDescendingQueryData.message);
|
|
959
|
+
expect((_b = publishedDescendingQueryReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
960
|
+
expect(publishedDescendingQueryReply.entries[0].descriptor['datePublished']).to.equal(publishedWriteData.message.descriptor.datePublished);
|
|
961
|
+
}));
|
|
962
|
+
it('should sort records if `dateSort` is specified', () => __awaiter(this, void 0, void 0, function* () {
|
|
963
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
964
|
+
// insert three messages into DB
|
|
965
|
+
const alice = yield TestDataGenerator.generatePersona();
|
|
966
|
+
const schema = 'aSchema';
|
|
967
|
+
const published = true;
|
|
968
|
+
const write1Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, published });
|
|
969
|
+
const write2Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, published });
|
|
970
|
+
const write3Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, published });
|
|
971
|
+
// setting up a stub method resolver
|
|
972
|
+
const mockResolution = TestDataGenerator.createDidResolutionResult(alice);
|
|
973
|
+
;
|
|
974
|
+
sinon.stub(didResolver, 'resolve').resolves(mockResolution);
|
|
975
|
+
// insert data, intentionally out of order
|
|
976
|
+
const writeReply2 = yield dwn.processMessage(alice.did, write2Data.message, write2Data.dataStream);
|
|
977
|
+
const writeReply1 = yield dwn.processMessage(alice.did, write1Data.message, write1Data.dataStream);
|
|
978
|
+
const writeReply3 = yield dwn.processMessage(alice.did, write3Data.message, write3Data.dataStream);
|
|
979
|
+
expect(writeReply1.status.code).to.equal(202);
|
|
980
|
+
expect(writeReply2.status.code).to.equal(202);
|
|
981
|
+
expect(writeReply3.status.code).to.equal(202);
|
|
982
|
+
// createdAscending test
|
|
983
|
+
const createdAscendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
984
|
+
author: alice,
|
|
985
|
+
dateSort: DateSort.CreatedAscending,
|
|
986
|
+
filter: { schema }
|
|
987
|
+
});
|
|
988
|
+
const createdAscendingQueryReply = yield dwn.processMessage(alice.did, createdAscendingQueryData.message);
|
|
989
|
+
expect((_a = createdAscendingQueryReply.entries) === null || _a === void 0 ? void 0 : _a[0].descriptor['dateCreated']).to.equal(write1Data.message.descriptor.dateCreated);
|
|
990
|
+
expect((_b = createdAscendingQueryReply.entries) === null || _b === void 0 ? void 0 : _b[1].descriptor['dateCreated']).to.equal(write2Data.message.descriptor.dateCreated);
|
|
991
|
+
expect((_c = createdAscendingQueryReply.entries) === null || _c === void 0 ? void 0 : _c[2].descriptor['dateCreated']).to.equal(write3Data.message.descriptor.dateCreated);
|
|
992
|
+
// createdDescending test
|
|
993
|
+
const createdDescendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
994
|
+
author: alice,
|
|
995
|
+
dateSort: DateSort.CreatedDescending,
|
|
996
|
+
filter: { schema }
|
|
997
|
+
});
|
|
998
|
+
const createdDescendingQueryReply = yield dwn.processMessage(alice.did, createdDescendingQueryData.message);
|
|
999
|
+
expect((_d = createdDescendingQueryReply.entries) === null || _d === void 0 ? void 0 : _d[0].descriptor['dateCreated']).to.equal(write3Data.message.descriptor.dateCreated);
|
|
1000
|
+
expect((_e = createdDescendingQueryReply.entries) === null || _e === void 0 ? void 0 : _e[1].descriptor['dateCreated']).to.equal(write2Data.message.descriptor.dateCreated);
|
|
1001
|
+
expect((_f = createdDescendingQueryReply.entries) === null || _f === void 0 ? void 0 : _f[2].descriptor['dateCreated']).to.equal(write1Data.message.descriptor.dateCreated);
|
|
1002
|
+
// publishedAscending test
|
|
1003
|
+
const publishedAscendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
1004
|
+
author: alice,
|
|
1005
|
+
dateSort: DateSort.PublishedAscending,
|
|
1006
|
+
filter: { schema }
|
|
1007
|
+
});
|
|
1008
|
+
const publishedAscendingQueryReply = yield dwn.processMessage(alice.did, publishedAscendingQueryData.message);
|
|
1009
|
+
expect((_g = publishedAscendingQueryReply.entries) === null || _g === void 0 ? void 0 : _g[0].descriptor['datePublished']).to.equal(write1Data.message.descriptor.datePublished);
|
|
1010
|
+
expect((_h = publishedAscendingQueryReply.entries) === null || _h === void 0 ? void 0 : _h[1].descriptor['datePublished']).to.equal(write2Data.message.descriptor.datePublished);
|
|
1011
|
+
expect((_j = publishedAscendingQueryReply.entries) === null || _j === void 0 ? void 0 : _j[2].descriptor['datePublished']).to.equal(write3Data.message.descriptor.datePublished);
|
|
1012
|
+
// publishedDescending test
|
|
1013
|
+
const publishedDescendingQueryData = yield TestDataGenerator.generateRecordsQuery({
|
|
1014
|
+
author: alice,
|
|
1015
|
+
dateSort: DateSort.PublishedDescending,
|
|
1016
|
+
filter: { schema }
|
|
1017
|
+
});
|
|
1018
|
+
const publishedDescendingQueryReply = yield dwn.processMessage(alice.did, publishedDescendingQueryData.message);
|
|
1019
|
+
expect((_k = publishedDescendingQueryReply.entries) === null || _k === void 0 ? void 0 : _k[0].descriptor['datePublished']).to.equal(write3Data.message.descriptor.datePublished);
|
|
1020
|
+
expect((_l = publishedDescendingQueryReply.entries) === null || _l === void 0 ? void 0 : _l[1].descriptor['datePublished']).to.equal(write2Data.message.descriptor.datePublished);
|
|
1021
|
+
expect((_m = publishedDescendingQueryReply.entries) === null || _m === void 0 ? void 0 : _m[2].descriptor['datePublished']).to.equal(write1Data.message.descriptor.datePublished);
|
|
1022
|
+
}));
|
|
1023
|
+
it('should tiebreak using `messageCid` when sorting encounters identical values', () => __awaiter(this, void 0, void 0, function* () {
|
|
1024
|
+
var _a;
|
|
1025
|
+
// setup: 3 messages with the same `dateCreated` value
|
|
1026
|
+
const dateCreated = Time.getCurrentTimestamp();
|
|
1027
|
+
const messageTimestamp = dateCreated;
|
|
1028
|
+
const alice = yield DidKeyResolver.generate();
|
|
1029
|
+
const schema = 'aSchema';
|
|
1030
|
+
const published = true;
|
|
1031
|
+
const write1Data = yield TestDataGenerator.generateRecordsWrite({ messageTimestamp, dateCreated, author: alice, schema, published });
|
|
1032
|
+
const write2Data = yield TestDataGenerator.generateRecordsWrite({ messageTimestamp, dateCreated, author: alice, schema, published });
|
|
1033
|
+
const write3Data = yield TestDataGenerator.generateRecordsWrite({ messageTimestamp, dateCreated, author: alice, schema, published });
|
|
1034
|
+
// sort the messages in lexicographical order against `messageCid`
|
|
1035
|
+
const [oldestWrite, middleWrite, newestWrite] = yield ArrayUtility.asyncSort([write1Data, write2Data, write3Data], (messageDataA, messageDataB) => { return Message.compareCid(messageDataA.message, messageDataB.message); });
|
|
1036
|
+
// intentionally write the RecordsWrite of out lexicographical order to avoid the test query below accidentally having the correct order
|
|
1037
|
+
const reply2 = yield dwn.processMessage(alice.did, middleWrite.message, middleWrite.dataStream);
|
|
1038
|
+
expect(reply2.status.code).to.equal(202);
|
|
1039
|
+
const reply3 = yield dwn.processMessage(alice.did, newestWrite.message, newestWrite.dataStream);
|
|
1040
|
+
expect(reply3.status.code).to.equal(202);
|
|
1041
|
+
const reply1 = yield dwn.processMessage(alice.did, oldestWrite.message, oldestWrite.dataStream);
|
|
1042
|
+
expect(reply1.status.code).to.equal(202);
|
|
1043
|
+
const queryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1044
|
+
author: alice,
|
|
1045
|
+
filter: { schema },
|
|
1046
|
+
dateSort: DateSort.CreatedAscending
|
|
1047
|
+
});
|
|
1048
|
+
const queryReply = yield dwn.processMessage(alice.did, queryMessageData.message);
|
|
1049
|
+
// verify that messages returned are sorted/tiebreak by `messageCid`
|
|
1050
|
+
expect(queryReply.status.code).to.equal(200);
|
|
1051
|
+
expect((_a = queryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(3);
|
|
1052
|
+
expect(queryReply.entries[0].recordId).to.equal(oldestWrite.message.recordId);
|
|
1053
|
+
expect(queryReply.entries[1].recordId).to.equal(middleWrite.message.recordId);
|
|
1054
|
+
expect(queryReply.entries[2].recordId).to.equal(newestWrite.message.recordId);
|
|
1055
|
+
}));
|
|
1056
|
+
it('should paginate records if pagination is provided', () => __awaiter(this, void 0, void 0, function* () {
|
|
1057
|
+
var _a;
|
|
1058
|
+
const alice = yield DidKeyResolver.generate();
|
|
1059
|
+
const messages = yield Promise.all(Array(12).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1060
|
+
author: alice,
|
|
1061
|
+
schema: 'https://schema'
|
|
1062
|
+
})));
|
|
1063
|
+
for (const message of messages) {
|
|
1064
|
+
const result = yield dwn.processMessage(alice.did, message.message, message.dataStream);
|
|
1065
|
+
expect(result.status.code).to.equal(202);
|
|
1066
|
+
}
|
|
1067
|
+
const limit = 5;
|
|
1068
|
+
const results = [];
|
|
1069
|
+
let cursor;
|
|
1070
|
+
while (true) {
|
|
1071
|
+
const pageQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1072
|
+
author: alice,
|
|
1073
|
+
filter: {
|
|
1074
|
+
schema: 'https://schema'
|
|
1075
|
+
},
|
|
1076
|
+
pagination: {
|
|
1077
|
+
limit: limit,
|
|
1078
|
+
cursor,
|
|
1079
|
+
},
|
|
1080
|
+
});
|
|
1081
|
+
const pageReply = yield dwn.processMessage(alice.did, pageQuery.message);
|
|
1082
|
+
expect(pageReply.status.code).to.equal(200);
|
|
1083
|
+
cursor = pageReply.cursor;
|
|
1084
|
+
expect((_a = pageReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.be.lte(limit);
|
|
1085
|
+
results.push(...pageReply.entries);
|
|
1086
|
+
if (cursor === undefined) {
|
|
1087
|
+
break;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
expect(results.length).to.equal(messages.length);
|
|
1091
|
+
expect(messages.every(({ message }) => results.map(e => e.recordId).includes(message.recordId)));
|
|
1092
|
+
}));
|
|
1093
|
+
it('cursor should match the messageCid of the last entry in the returned query', () => __awaiter(this, void 0, void 0, function* () {
|
|
1094
|
+
var _a;
|
|
1095
|
+
const alice = yield DidKeyResolver.generate();
|
|
1096
|
+
const messages = yield Promise.all(Array(6).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1097
|
+
author: alice,
|
|
1098
|
+
schema: 'https://schema'
|
|
1099
|
+
})));
|
|
1100
|
+
for (const message of messages) {
|
|
1101
|
+
const result = yield dwn.processMessage(alice.did, message.message, message.dataStream);
|
|
1102
|
+
expect(result.status.code).to.equal(202);
|
|
1103
|
+
}
|
|
1104
|
+
const limit = 5;
|
|
1105
|
+
const pageQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1106
|
+
author: alice,
|
|
1107
|
+
filter: {
|
|
1108
|
+
schema: 'https://schema'
|
|
1109
|
+
},
|
|
1110
|
+
pagination: {
|
|
1111
|
+
limit: limit,
|
|
1112
|
+
},
|
|
1113
|
+
});
|
|
1114
|
+
const pageReply = yield dwn.processMessage(alice.did, pageQuery.message);
|
|
1115
|
+
expect(pageReply.status.code).to.equal(200);
|
|
1116
|
+
expect((_a = pageReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.be.lte(limit);
|
|
1117
|
+
expect(pageReply.cursor).to.exist;
|
|
1118
|
+
const lastMessageWithAuthorization = messages.find(m => { var _a; return m.message.recordId === ((_a = pageReply.entries) === null || _a === void 0 ? void 0 : _a.at(-1).recordId); });
|
|
1119
|
+
const messageCid = yield Message.getCid(lastMessageWithAuthorization.message);
|
|
1120
|
+
expect(pageReply.cursor).to.equal(messageCid);
|
|
1121
|
+
}));
|
|
1122
|
+
it('should allow an anonymous unauthenticated query to return published records', () => __awaiter(this, void 0, void 0, function* () {
|
|
1123
|
+
var _a, _b;
|
|
1124
|
+
// write 2 records into Alice's DB:
|
|
1125
|
+
// 1st is unpublished
|
|
1126
|
+
// 2nd is published
|
|
1127
|
+
const alice = yield DidKeyResolver.generate();
|
|
1128
|
+
const record1Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'https://schema1', published: false });
|
|
1129
|
+
const record2Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'https://schema2', published: true });
|
|
1130
|
+
const recordsWrite1Reply = yield dwn.processMessage(alice.did, record1Data.message, record1Data.dataStream);
|
|
1131
|
+
expect(recordsWrite1Reply.status.code).to.equal(202);
|
|
1132
|
+
const recordsWrite2Reply = yield dwn.processMessage(alice.did, record2Data.message, record2Data.dataStream);
|
|
1133
|
+
expect(recordsWrite2Reply.status.code).to.equal(202);
|
|
1134
|
+
// test correctness for anonymous query
|
|
1135
|
+
const anonymousQueryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1136
|
+
anonymous: true,
|
|
1137
|
+
filter: { dateCreated: { from: '2000-01-01T10:20:30.123456Z' } }
|
|
1138
|
+
});
|
|
1139
|
+
// sanity check
|
|
1140
|
+
expect(anonymousQueryMessageData.message.authorization).to.not.exist;
|
|
1141
|
+
const replyToQuery = yield dwn.processMessage(alice.did, anonymousQueryMessageData.message);
|
|
1142
|
+
expect(replyToQuery.status.code).to.equal(200);
|
|
1143
|
+
expect((_a = replyToQuery.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
1144
|
+
expect(replyToQuery.entries[0].descriptor.schema).to.equal('https://schema2');
|
|
1145
|
+
// explicitly for published records
|
|
1146
|
+
const anonymousQueryPublished = yield TestDataGenerator.generateRecordsQuery({
|
|
1147
|
+
anonymous: true,
|
|
1148
|
+
filter: { dateCreated: { from: '2000-01-01T10:20:30.123456Z' }, published: true }
|
|
1149
|
+
});
|
|
1150
|
+
// sanity check
|
|
1151
|
+
expect(anonymousQueryPublished.message.authorization).to.not.exist;
|
|
1152
|
+
// should return the published records
|
|
1153
|
+
const publishedReply = yield dwn.processMessage(alice.did, anonymousQueryPublished.message);
|
|
1154
|
+
expect(publishedReply.status.code).to.equal(200);
|
|
1155
|
+
expect((_b = publishedReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
1156
|
+
expect(publishedReply.entries[0].descriptor.schema).to.equal('https://schema2');
|
|
1157
|
+
}));
|
|
1158
|
+
it('should only return published records and unpublished records that is meant for author', () => __awaiter(this, void 0, void 0, function* () {
|
|
1159
|
+
// write 4 records into Alice's DB:
|
|
1160
|
+
// 1st is unpublished authored by Alice
|
|
1161
|
+
// 2nd is also unpublished authored by Alice, but is meant for (has recipient as) Bob
|
|
1162
|
+
// 3rd is also unpublished but is authored by Bob
|
|
1163
|
+
// 4th is published
|
|
1164
|
+
// 5th is published, authored by Alice and is meant for Carol as recipient;
|
|
1165
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1166
|
+
const alice = yield DidKeyResolver.generate();
|
|
1167
|
+
const bob = yield DidKeyResolver.generate();
|
|
1168
|
+
const carol = yield DidKeyResolver.generate();
|
|
1169
|
+
const schema = 'schema1';
|
|
1170
|
+
const record1Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, data: Encoder.stringToBytes('1') });
|
|
1171
|
+
const record2Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, protocol: 'protocol', protocolPath: 'path', recipient: bob.did, data: Encoder.stringToBytes('2') });
|
|
1172
|
+
const record3Data = yield TestDataGenerator.generateRecordsWrite({ author: bob, schema, protocol: 'protocol', protocolPath: 'path', recipient: alice.did, data: Encoder.stringToBytes('3') });
|
|
1173
|
+
const record4Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, data: Encoder.stringToBytes('4'), published: true });
|
|
1174
|
+
const record5Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, data: Encoder.stringToBytes('5'), published: true, recipient: carol.did });
|
|
1175
|
+
// directly inserting data to datastore so that we don't have to setup to grant Bob permission to write to Alice's DWN
|
|
1176
|
+
const recordsWriteHandler = new RecordsWriteHandler(didResolver, messageStore, dataStore, eventLog);
|
|
1177
|
+
const additionalIndexes1 = yield record1Data.recordsWrite.constructRecordsWriteIndexes(true);
|
|
1178
|
+
record1Data.message = yield recordsWriteHandler.processEncodedData(record1Data.message, record1Data.dataStream);
|
|
1179
|
+
yield messageStore.put(alice.did, record1Data.message, additionalIndexes1);
|
|
1180
|
+
yield eventLog.append(alice.did, yield Message.getCid(record1Data.message));
|
|
1181
|
+
const additionalIndexes2 = yield record2Data.recordsWrite.constructRecordsWriteIndexes(true);
|
|
1182
|
+
record2Data.message = yield recordsWriteHandler.processEncodedData(record2Data.message, record2Data.dataStream);
|
|
1183
|
+
yield messageStore.put(alice.did, record2Data.message, additionalIndexes2);
|
|
1184
|
+
yield eventLog.append(alice.did, yield Message.getCid(record2Data.message));
|
|
1185
|
+
const additionalIndexes3 = yield record3Data.recordsWrite.constructRecordsWriteIndexes(true);
|
|
1186
|
+
record3Data.message = yield recordsWriteHandler.processEncodedData(record3Data.message, record3Data.dataStream);
|
|
1187
|
+
yield messageStore.put(alice.did, record3Data.message, additionalIndexes3);
|
|
1188
|
+
yield eventLog.append(alice.did, yield Message.getCid(record3Data.message));
|
|
1189
|
+
const additionalIndexes4 = yield record4Data.recordsWrite.constructRecordsWriteIndexes(true);
|
|
1190
|
+
record4Data.message = yield recordsWriteHandler.processEncodedData(record4Data.message, record4Data.dataStream);
|
|
1191
|
+
yield messageStore.put(alice.did, record4Data.message, additionalIndexes4);
|
|
1192
|
+
yield eventLog.append(alice.did, yield Message.getCid(record4Data.message));
|
|
1193
|
+
const additionalIndexes5 = yield record5Data.recordsWrite.constructRecordsWriteIndexes(true);
|
|
1194
|
+
record5Data.message = yield recordsWriteHandler.processEncodedData(record5Data.message, record5Data.dataStream);
|
|
1195
|
+
yield messageStore.put(alice.did, record5Data.message, additionalIndexes5);
|
|
1196
|
+
yield eventLog.append(alice.did, yield Message.getCid(record5Data.message));
|
|
1197
|
+
// test correctness for Bob's query
|
|
1198
|
+
const bobQueryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1199
|
+
author: bob,
|
|
1200
|
+
filter: { schema }
|
|
1201
|
+
});
|
|
1202
|
+
const replyToBob = yield dwn.processMessage(alice.did, bobQueryMessageData.message);
|
|
1203
|
+
expect(replyToBob.status.code).to.equal(200);
|
|
1204
|
+
expect((_a = replyToBob.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(4); // expect 4 records
|
|
1205
|
+
const privateRecordsForBob = (_b = replyToBob.entries) === null || _b === void 0 ? void 0 : _b.filter(message => message.encodedData === Encoder.stringToBase64Url('2'));
|
|
1206
|
+
const privateRecordsFromBob = (_c = replyToBob.entries) === null || _c === void 0 ? void 0 : _c.filter(message => message.encodedData === Encoder.stringToBase64Url('3'));
|
|
1207
|
+
const publicRecords = (_d = replyToBob.entries) === null || _d === void 0 ? void 0 : _d.filter(message => message.encodedData === Encoder.stringToBase64Url('4') || message.encodedData === Encoder.stringToBase64Url('5'));
|
|
1208
|
+
expect(privateRecordsForBob.length).to.equal(1);
|
|
1209
|
+
expect(privateRecordsFromBob.length).to.equal(1);
|
|
1210
|
+
expect(publicRecords.length).to.equal(2);
|
|
1211
|
+
// check for explicitly published:false records for Bob
|
|
1212
|
+
const bobQueryPublishedFalse = yield TestDataGenerator.generateRecordsQuery({
|
|
1213
|
+
author: bob,
|
|
1214
|
+
filter: { schema, published: false }
|
|
1215
|
+
});
|
|
1216
|
+
const unpublishedBobReply = yield dwn.processMessage(alice.did, bobQueryPublishedFalse.message);
|
|
1217
|
+
expect(unpublishedBobReply.status.code).to.equal(200);
|
|
1218
|
+
expect((_e = unpublishedBobReply.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(2);
|
|
1219
|
+
const unpublishedBobRecordIds = (_f = unpublishedBobReply.entries) === null || _f === void 0 ? void 0 : _f.map(e => e.recordId);
|
|
1220
|
+
expect(unpublishedBobRecordIds).to.have.members([record2Data.message.recordId, record3Data.message.recordId]);
|
|
1221
|
+
// test correctness for Alice's query
|
|
1222
|
+
const aliceQueryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1223
|
+
author: alice,
|
|
1224
|
+
filter: { schema }
|
|
1225
|
+
});
|
|
1226
|
+
const replyToAliceQuery = yield dwn.processMessage(alice.did, aliceQueryMessageData.message);
|
|
1227
|
+
expect(replyToAliceQuery.status.code).to.equal(200);
|
|
1228
|
+
expect((_g = replyToAliceQuery.entries) === null || _g === void 0 ? void 0 : _g.length).to.equal(5); // expect all 5 records
|
|
1229
|
+
// filter for public records with carol as recipient
|
|
1230
|
+
const bobQueryCarolMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1231
|
+
author: bob,
|
|
1232
|
+
filter: { schema, recipient: carol.did }
|
|
1233
|
+
});
|
|
1234
|
+
const replyToBobCarolQuery = yield dwn.processMessage(alice.did, bobQueryCarolMessageData.message);
|
|
1235
|
+
expect(replyToBobCarolQuery.status.code).to.equal(200);
|
|
1236
|
+
expect((_h = replyToBobCarolQuery.entries) === null || _h === void 0 ? void 0 : _h.length).to.equal(1);
|
|
1237
|
+
expect(replyToBobCarolQuery.entries[0].encodedData).to.equal(Encoder.stringToBase64Url('5'));
|
|
1238
|
+
// filter for explicit unpublished public records with carol as recipient, should not return any.
|
|
1239
|
+
const bobQueryCarolMessageDataUnpublished = yield TestDataGenerator.generateRecordsQuery({
|
|
1240
|
+
author: bob,
|
|
1241
|
+
filter: { schema, recipient: carol.did, published: false }
|
|
1242
|
+
});
|
|
1243
|
+
const replyToBobCarolUnpublishedQuery = yield dwn.processMessage(alice.did, bobQueryCarolMessageDataUnpublished.message);
|
|
1244
|
+
expect(replyToBobCarolUnpublishedQuery.status.code).to.equal(200);
|
|
1245
|
+
expect((_j = replyToBobCarolUnpublishedQuery.entries) === null || _j === void 0 ? void 0 : _j.length).to.equal(0);
|
|
1246
|
+
}));
|
|
1247
|
+
it('should paginate correctly for fetchRecordsAsNonOwner()', () => __awaiter(this, void 0, void 0, function* () {
|
|
1248
|
+
var _a, e_1, _b, _c;
|
|
1249
|
+
var _d, _e, _f, _g, _h;
|
|
1250
|
+
const alice = yield DidKeyResolver.generate();
|
|
1251
|
+
const bob = yield DidKeyResolver.generate();
|
|
1252
|
+
const schema = 'schema1';
|
|
1253
|
+
// published messages bob
|
|
1254
|
+
const bobPublishedPromise = Array(5).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1255
|
+
author: bob, schema, data: TestDataGenerator.randomBytes(10), published: true,
|
|
1256
|
+
}));
|
|
1257
|
+
// published messages alice
|
|
1258
|
+
const alicePublishedPromise = Array(5).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1259
|
+
author: alice, schema, data: TestDataGenerator.randomBytes(10), published: true,
|
|
1260
|
+
}));
|
|
1261
|
+
// alice non public messages
|
|
1262
|
+
const aliceMessagesPromise = Array(5).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1263
|
+
author: alice, schema, data: TestDataGenerator.randomBytes(10)
|
|
1264
|
+
}));
|
|
1265
|
+
// bob non public messages
|
|
1266
|
+
const bobMessagesPromise = Array(5).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1267
|
+
author: bob, schema, data: TestDataGenerator.randomBytes(10)
|
|
1268
|
+
}));
|
|
1269
|
+
// non public messages intended for bob
|
|
1270
|
+
const aliceMessagesForBobPromise = Array(5).fill({}).map(_ => TestDataGenerator.generateRecordsWrite({
|
|
1271
|
+
author: alice, schema, data: TestDataGenerator.randomBytes(10), recipient: bob.did,
|
|
1272
|
+
}));
|
|
1273
|
+
const messagePromises = [
|
|
1274
|
+
...bobPublishedPromise,
|
|
1275
|
+
...aliceMessagesPromise,
|
|
1276
|
+
...bobMessagesPromise,
|
|
1277
|
+
...alicePublishedPromise,
|
|
1278
|
+
...aliceMessagesForBobPromise,
|
|
1279
|
+
];
|
|
1280
|
+
const recordsWriteHandler = new RecordsWriteHandler(didResolver, messageStore, dataStore, eventLog);
|
|
1281
|
+
const messages = [];
|
|
1282
|
+
try {
|
|
1283
|
+
for (var _j = true, messagePromises_1 = __asyncValues(messagePromises), messagePromises_1_1; messagePromises_1_1 = yield messagePromises_1.next(), _a = messagePromises_1_1.done, !_a; _j = true) {
|
|
1284
|
+
_c = messagePromises_1_1.value;
|
|
1285
|
+
_j = false;
|
|
1286
|
+
const { recordsWrite, message, dataStream } = _c;
|
|
1287
|
+
const indexes = yield recordsWrite.constructRecordsWriteIndexes(true);
|
|
1288
|
+
const processedMessage = yield recordsWriteHandler.processEncodedData(message, dataStream);
|
|
1289
|
+
yield messageStore.put(alice.did, processedMessage, indexes);
|
|
1290
|
+
yield eventLog.append(alice.did, yield Message.getCid(processedMessage));
|
|
1291
|
+
messages.push(processedMessage);
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
1295
|
+
finally {
|
|
1296
|
+
try {
|
|
1297
|
+
if (!_j && !_a && (_b = messagePromises_1.return)) yield _b.call(messagePromises_1);
|
|
1298
|
+
}
|
|
1299
|
+
finally { if (e_1) throw e_1.error; }
|
|
1300
|
+
}
|
|
1301
|
+
// fetch all from alice for sanity, alice should get all of the records
|
|
1302
|
+
// page1 alice
|
|
1303
|
+
const aliceQueryMessageDataPage1 = yield TestDataGenerator.generateRecordsQuery({
|
|
1304
|
+
author: alice,
|
|
1305
|
+
filter: { schema },
|
|
1306
|
+
dateSort: DateSort.CreatedAscending,
|
|
1307
|
+
pagination: { limit: 10 },
|
|
1308
|
+
});
|
|
1309
|
+
const sortedMessages = yield MessageStoreLevel.sortMessages(messages, { dateCreated: SortOrder.Ascending });
|
|
1310
|
+
let results = yield dwn.processMessage(alice.did, aliceQueryMessageDataPage1.message);
|
|
1311
|
+
expect(results.status.code).to.equal(200);
|
|
1312
|
+
expect((_d = results.entries) === null || _d === void 0 ? void 0 : _d.length).to.equal(10, 'alice page 1');
|
|
1313
|
+
const page1PaginationLastMessage = yield Message.getCid(sortedMessages.at(9)); // get messageCid from message with authorization.
|
|
1314
|
+
expect(results.cursor).to.equal(page1PaginationLastMessage, 'alice page 1');
|
|
1315
|
+
// page2 alice
|
|
1316
|
+
const aliceQueryMessageDataPage2 = yield TestDataGenerator.generateRecordsQuery({
|
|
1317
|
+
author: alice,
|
|
1318
|
+
filter: { schema },
|
|
1319
|
+
dateSort: DateSort.CreatedAscending,
|
|
1320
|
+
pagination: { limit: 10, cursor: results.cursor },
|
|
1321
|
+
});
|
|
1322
|
+
results = yield dwn.processMessage(alice.did, aliceQueryMessageDataPage2.message);
|
|
1323
|
+
expect(results.status.code).to.equal(200);
|
|
1324
|
+
expect((_e = results.entries) === null || _e === void 0 ? void 0 : _e.length).to.equal(10, 'alice page 2');
|
|
1325
|
+
const page2PaginationLastMessage = yield Message.getCid(sortedMessages.at(19)); // get messageCid from message with authorization.
|
|
1326
|
+
expect(results.cursor).to.equal(page2PaginationLastMessage, 'alice page 2');
|
|
1327
|
+
// page3 alice
|
|
1328
|
+
const aliceQueryMessageDataPage3 = yield TestDataGenerator.generateRecordsQuery({
|
|
1329
|
+
author: alice,
|
|
1330
|
+
filter: { schema },
|
|
1331
|
+
dateSort: DateSort.CreatedAscending,
|
|
1332
|
+
pagination: { limit: 10, cursor: results.cursor },
|
|
1333
|
+
});
|
|
1334
|
+
results = yield dwn.processMessage(alice.did, aliceQueryMessageDataPage3.message);
|
|
1335
|
+
expect(results.status.code).to.equal(200);
|
|
1336
|
+
expect((_f = results.entries) === null || _f === void 0 ? void 0 : _f.length).to.equal(5, 'alice page 3');
|
|
1337
|
+
expect(results.cursor).to.not.exist;
|
|
1338
|
+
const bobs = (m) => {
|
|
1339
|
+
return m.descriptor.recipient === bob.did || m.descriptor.published === true || Message.getSigner(m) === bob.did;
|
|
1340
|
+
};
|
|
1341
|
+
// all records from alice have been validated
|
|
1342
|
+
// now we prepare to test records that only bob should get
|
|
1343
|
+
const bobSorted = sortedMessages.filter(m => bobs(m));
|
|
1344
|
+
const bobRetrieved = [];
|
|
1345
|
+
const bobQueryMessagePage1 = yield TestDataGenerator.generateRecordsQuery({
|
|
1346
|
+
author: bob,
|
|
1347
|
+
filter: { schema },
|
|
1348
|
+
dateSort: DateSort.CreatedAscending,
|
|
1349
|
+
pagination: { limit: 10 },
|
|
1350
|
+
});
|
|
1351
|
+
results = yield dwn.processMessage(alice.did, bobQueryMessagePage1.message);
|
|
1352
|
+
expect(results.status.code).to.equal(200);
|
|
1353
|
+
expect((_g = results.entries) === null || _g === void 0 ? void 0 : _g.length).to.equal(10, 'bob page 1');
|
|
1354
|
+
const page1BobPaginationLastMessage = yield Message.getCid(bobSorted.at(9));
|
|
1355
|
+
expect(results.cursor).to.equal(page1BobPaginationLastMessage, 'bob page 1');
|
|
1356
|
+
bobRetrieved.push(...results.entries);
|
|
1357
|
+
const bobQueryMessagePage2 = yield TestDataGenerator.generateRecordsQuery({
|
|
1358
|
+
author: bob,
|
|
1359
|
+
filter: { schema },
|
|
1360
|
+
dateSort: DateSort.CreatedAscending,
|
|
1361
|
+
pagination: { limit: 10, cursor: results.cursor },
|
|
1362
|
+
});
|
|
1363
|
+
results = yield dwn.processMessage(alice.did, bobQueryMessagePage2.message);
|
|
1364
|
+
expect(results.status.code).to.equal(200);
|
|
1365
|
+
expect((_h = results.entries) === null || _h === void 0 ? void 0 : _h.length).to.equal(10, 'bob page 2');
|
|
1366
|
+
expect(results.cursor).to.not.exist;
|
|
1367
|
+
bobRetrieved.push(...results.entries);
|
|
1368
|
+
const compareRecordId = (a, b) => {
|
|
1369
|
+
return a.recordId === b.recordId;
|
|
1370
|
+
};
|
|
1371
|
+
expect(bobSorted.every((m, i) => compareRecordId(bobRetrieved.at(i), m)));
|
|
1372
|
+
}));
|
|
1373
|
+
it('should treat records with `published` explicitly set to `false` as unpublished', () => __awaiter(this, void 0, void 0, function* () {
|
|
1374
|
+
var _a, _b;
|
|
1375
|
+
const alice = yield DidKeyResolver.generate();
|
|
1376
|
+
const bob = yield DidKeyResolver.generate();
|
|
1377
|
+
const schema = 'schema1';
|
|
1378
|
+
const unpublishedRecordsWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema, data: Encoder.stringToBytes('1'), published: false } // explicitly setting `published` to `false`
|
|
1379
|
+
);
|
|
1380
|
+
const result1 = yield dwn.processMessage(alice.did, unpublishedRecordsWrite.message, unpublishedRecordsWrite.dataStream);
|
|
1381
|
+
expect(result1.status.code).to.equal(202);
|
|
1382
|
+
// alice should be able to see the unpublished record
|
|
1383
|
+
const queryByAlice = yield TestDataGenerator.generateRecordsQuery({
|
|
1384
|
+
author: alice,
|
|
1385
|
+
filter: { schema }
|
|
1386
|
+
});
|
|
1387
|
+
const replyToAliceQuery = yield dwn.processMessage(alice.did, queryByAlice.message);
|
|
1388
|
+
expect(replyToAliceQuery.status.code).to.equal(200);
|
|
1389
|
+
expect((_a = replyToAliceQuery.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
1390
|
+
// actual test: bob should not be able to see unpublished record
|
|
1391
|
+
const queryByBob = yield TestDataGenerator.generateRecordsQuery({
|
|
1392
|
+
author: bob,
|
|
1393
|
+
filter: { schema }
|
|
1394
|
+
});
|
|
1395
|
+
const replyToBobQuery = yield dwn.processMessage(alice.did, queryByBob.message);
|
|
1396
|
+
expect(replyToBobQuery.status.code).to.equal(200);
|
|
1397
|
+
expect((_b = replyToBobQuery.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(0);
|
|
1398
|
+
}));
|
|
1399
|
+
it('should allow DWN owner to use `recipient` as a filter in queries', () => __awaiter(this, void 0, void 0, function* () {
|
|
1400
|
+
const alice = yield DidKeyResolver.generate();
|
|
1401
|
+
const bob = yield DidKeyResolver.generate();
|
|
1402
|
+
const bobQueryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1403
|
+
author: alice,
|
|
1404
|
+
filter: { recipient: bob.did } // alice as the DWN owner querying bob's records
|
|
1405
|
+
});
|
|
1406
|
+
const replyToBobQuery = yield dwn.processMessage(alice.did, bobQueryMessageData.message);
|
|
1407
|
+
expect(replyToBobQuery.status.code).to.equal(200);
|
|
1408
|
+
}));
|
|
1409
|
+
it('should not fetch entries across tenants', () => __awaiter(this, void 0, void 0, function* () {
|
|
1410
|
+
var _a;
|
|
1411
|
+
// insert three messages into DB, two with matching schema
|
|
1412
|
+
const alice = yield DidKeyResolver.generate();
|
|
1413
|
+
const bob = yield DidKeyResolver.generate();
|
|
1414
|
+
const schema = 'myAwesomeSchema';
|
|
1415
|
+
const recordsWriteMessage1Data = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema });
|
|
1416
|
+
const recordsWriteMessage2Data = yield TestDataGenerator.generateRecordsWrite({ author: bob, schema });
|
|
1417
|
+
const aliceQueryMessageData = yield TestDataGenerator.generateRecordsQuery({
|
|
1418
|
+
author: alice,
|
|
1419
|
+
filter: { schema }
|
|
1420
|
+
});
|
|
1421
|
+
// insert data into 2 different tenants
|
|
1422
|
+
yield dwn.processMessage(alice.did, recordsWriteMessage1Data.message, recordsWriteMessage1Data.dataStream);
|
|
1423
|
+
yield dwn.processMessage(bob.did, recordsWriteMessage2Data.message, recordsWriteMessage2Data.dataStream);
|
|
1424
|
+
const reply = yield dwn.processMessage(alice.did, aliceQueryMessageData.message);
|
|
1425
|
+
expect(reply.status.code).to.equal(200);
|
|
1426
|
+
expect((_a = reply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
1427
|
+
}));
|
|
1428
|
+
it('should return 400 if protocol is not normalized', () => __awaiter(this, void 0, void 0, function* () {
|
|
1429
|
+
const alice = yield DidKeyResolver.generate();
|
|
1430
|
+
// query for non-normalized protocol
|
|
1431
|
+
const recordsQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1432
|
+
author: alice,
|
|
1433
|
+
filter: { protocol: 'example.com/' },
|
|
1434
|
+
});
|
|
1435
|
+
// overwrite protocol because #create auto-normalizes protocol
|
|
1436
|
+
recordsQuery.message.descriptor.filter.protocol = 'example.com/';
|
|
1437
|
+
// Re-create auth because we altered the descriptor after signing
|
|
1438
|
+
recordsQuery.message.authorization = yield Message.createAuthorization({
|
|
1439
|
+
descriptor: recordsQuery.message.descriptor,
|
|
1440
|
+
signer: Jws.createSigner(alice)
|
|
1441
|
+
});
|
|
1442
|
+
// Send records write message
|
|
1443
|
+
const reply = yield dwn.processMessage(alice.did, recordsQuery.message);
|
|
1444
|
+
expect(reply.status.code).to.equal(400);
|
|
1445
|
+
expect(reply.status.detail).to.contain(DwnErrorCode.UrlProtocolNotNormalized);
|
|
1446
|
+
}));
|
|
1447
|
+
it('should return 400 if schema is not normalized', () => __awaiter(this, void 0, void 0, function* () {
|
|
1448
|
+
const alice = yield DidKeyResolver.generate();
|
|
1449
|
+
// query for non-normalized schema
|
|
1450
|
+
const recordsQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1451
|
+
author: alice,
|
|
1452
|
+
filter: { schema: 'example.com/' },
|
|
1453
|
+
});
|
|
1454
|
+
// overwrite schema because #create auto-normalizes schema
|
|
1455
|
+
recordsQuery.message.descriptor.filter.schema = 'example.com/';
|
|
1456
|
+
// Re-create auth because we altered the descriptor after signing
|
|
1457
|
+
recordsQuery.message.authorization = yield Message.createAuthorization({
|
|
1458
|
+
descriptor: recordsQuery.message.descriptor,
|
|
1459
|
+
signer: Jws.createSigner(alice)
|
|
1460
|
+
});
|
|
1461
|
+
// Send records write message
|
|
1462
|
+
const reply = yield dwn.processMessage(alice.did, recordsQuery.message);
|
|
1463
|
+
expect(reply.status.code).to.equal(400);
|
|
1464
|
+
expect(reply.status.detail).to.contain(DwnErrorCode.UrlSchemaNotNormalized);
|
|
1465
|
+
}));
|
|
1466
|
+
it('should return 400 if published is set to false and a datePublished range is provided', () => __awaiter(this, void 0, void 0, function* () {
|
|
1467
|
+
const fromDatePublished = Time.getCurrentTimestamp();
|
|
1468
|
+
const alice = yield DidKeyResolver.generate();
|
|
1469
|
+
// set to true so create does not fail
|
|
1470
|
+
const recordQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1471
|
+
author: alice,
|
|
1472
|
+
filter: { datePublished: { from: fromDatePublished }, published: true }
|
|
1473
|
+
});
|
|
1474
|
+
// set to false
|
|
1475
|
+
recordQuery.message.descriptor.filter.published = false;
|
|
1476
|
+
const queryResponse = yield dwn.processMessage(alice.did, recordQuery.message);
|
|
1477
|
+
expect(queryResponse.status.code).to.equal(400);
|
|
1478
|
+
expect(queryResponse.status.detail).to.contain('descriptor/filter/published: must be equal to one of the allowed values');
|
|
1479
|
+
}));
|
|
1480
|
+
it('should return 401 for anonymous queries that filter explicitly for unpublished records', () => __awaiter(this, void 0, void 0, function* () {
|
|
1481
|
+
var _a;
|
|
1482
|
+
const alice = yield DidKeyResolver.generate();
|
|
1483
|
+
// create an unpublished record
|
|
1484
|
+
const draftWrite = yield TestDataGenerator.generateRecordsWrite({ author: alice, schema: 'post' });
|
|
1485
|
+
const draftWriteReply = yield dwn.processMessage(alice.did, draftWrite.message, draftWrite.dataStream);
|
|
1486
|
+
expect(draftWriteReply.status.code).to.equal(202);
|
|
1487
|
+
// validate that alice can query
|
|
1488
|
+
const unpublishedPostQuery = yield TestDataGenerator.generateRecordsQuery({ author: alice, filter: { schema: 'post', published: false } });
|
|
1489
|
+
const unpublishedPostReply = yield dwn.processMessage(alice.did, unpublishedPostQuery.message);
|
|
1490
|
+
expect(unpublishedPostReply.status.code).to.equal(200);
|
|
1491
|
+
expect((_a = unpublishedPostReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
1492
|
+
expect(unpublishedPostReply.entries[0].recordId).to.equal(draftWrite.message.recordId);
|
|
1493
|
+
// anonymous query for unpublished records
|
|
1494
|
+
const unpublishedAnonymous = yield RecordsQuery.create({ filter: { schema: 'post', published: false } });
|
|
1495
|
+
const anonymousPostReply = yield dwn.processMessage(alice.did, unpublishedAnonymous.message);
|
|
1496
|
+
expect(anonymousPostReply.status.code).to.equal(401);
|
|
1497
|
+
expect(anonymousPostReply.status.detail).contains('Missing JWS');
|
|
1498
|
+
}));
|
|
1499
|
+
describe('protocol based queries', () => {
|
|
1500
|
+
it('does not try protocol authorization if protocolRole is not invoked', () => __awaiter(this, void 0, void 0, function* () {
|
|
1501
|
+
// scenario: Alice creates a thread and writes some chat messages. Alice addresses
|
|
1502
|
+
// only one chat message to Bob. Bob queries by protocol URI without invoking a protocolRole,
|
|
1503
|
+
// and he is able to receive the message addressed to him.
|
|
1504
|
+
var _a, _b;
|
|
1505
|
+
const alice = yield DidKeyResolver.generate();
|
|
1506
|
+
const bob = yield DidKeyResolver.generate();
|
|
1507
|
+
const protocolDefinition = threadRoleProtocolDefinition;
|
|
1508
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1509
|
+
author: alice,
|
|
1510
|
+
protocolDefinition
|
|
1511
|
+
});
|
|
1512
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1513
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1514
|
+
// Alice writes a 'thread' record
|
|
1515
|
+
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1516
|
+
author: alice,
|
|
1517
|
+
protocol: protocolDefinition.protocol,
|
|
1518
|
+
protocolPath: 'thread',
|
|
1519
|
+
});
|
|
1520
|
+
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, threadRecord.dataStream);
|
|
1521
|
+
expect(threadRoleReply.status.code).to.equal(202);
|
|
1522
|
+
// Alice writes one 'chat' record addressed to Bob
|
|
1523
|
+
const chatRecordForBob = yield TestDataGenerator.generateRecordsWrite({
|
|
1524
|
+
author: alice,
|
|
1525
|
+
recipient: bob.did,
|
|
1526
|
+
protocol: protocolDefinition.protocol,
|
|
1527
|
+
protocolPath: 'thread/chat',
|
|
1528
|
+
published: false,
|
|
1529
|
+
contextId: threadRecord.message.contextId,
|
|
1530
|
+
parentId: threadRecord.message.recordId,
|
|
1531
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1532
|
+
});
|
|
1533
|
+
const chatRecordForBobReply = yield dwn.processMessage(alice.did, chatRecordForBob.message, chatRecordForBob.dataStream);
|
|
1534
|
+
expect(chatRecordForBobReply.status.code).to.equal(202);
|
|
1535
|
+
// Alice writes two 'chat' records NOT addressed to Bob
|
|
1536
|
+
for (let i = 0; i < 2; i++) {
|
|
1537
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1538
|
+
author: alice,
|
|
1539
|
+
recipient: alice.did,
|
|
1540
|
+
protocol: protocolDefinition.protocol,
|
|
1541
|
+
protocolPath: 'thread/chat',
|
|
1542
|
+
published: false,
|
|
1543
|
+
contextId: threadRecord.message.contextId,
|
|
1544
|
+
parentId: threadRecord.message.recordId,
|
|
1545
|
+
data: new TextEncoder().encode('Bob cannot read this'),
|
|
1546
|
+
});
|
|
1547
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1548
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1549
|
+
}
|
|
1550
|
+
// Bob queries without invoking any protocolRole
|
|
1551
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1552
|
+
author: bob,
|
|
1553
|
+
filter: {
|
|
1554
|
+
protocol: protocolDefinition.protocol,
|
|
1555
|
+
},
|
|
1556
|
+
});
|
|
1557
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1558
|
+
expect(chatQueryReply.status.code).to.equal(200);
|
|
1559
|
+
expect((_a = chatQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(1);
|
|
1560
|
+
expect(chatQueryReply.entries[0].recordId).to.eq(chatRecordForBob.message.recordId);
|
|
1561
|
+
// bob queries without invoking any protocolRole and filters for unpublished records
|
|
1562
|
+
const unpublishedChatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1563
|
+
author: bob,
|
|
1564
|
+
filter: {
|
|
1565
|
+
published: false,
|
|
1566
|
+
protocol: protocolDefinition.protocol,
|
|
1567
|
+
},
|
|
1568
|
+
});
|
|
1569
|
+
const unpublishedChatReply = yield dwn.processMessage(alice.did, unpublishedChatQuery.message);
|
|
1570
|
+
expect(unpublishedChatReply.status.code).to.equal(200);
|
|
1571
|
+
expect((_b = unpublishedChatReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(1);
|
|
1572
|
+
expect(unpublishedChatReply.entries[0].recordId).to.equal(chatRecordForBob.message.recordId);
|
|
1573
|
+
}));
|
|
1574
|
+
it('allows $globalRole authorized queries', () => __awaiter(this, void 0, void 0, function* () {
|
|
1575
|
+
// scenario: Alice creates a thread and writes some chat messages writes a chat message. Bob invokes his
|
|
1576
|
+
// thread member role in order to query the chat messages.
|
|
1577
|
+
var _a, _b;
|
|
1578
|
+
const alice = yield DidKeyResolver.generate();
|
|
1579
|
+
const bob = yield DidKeyResolver.generate();
|
|
1580
|
+
const protocolDefinition = friendRoleProtocolDefinition;
|
|
1581
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1582
|
+
author: alice,
|
|
1583
|
+
protocolDefinition
|
|
1584
|
+
});
|
|
1585
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1586
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1587
|
+
// Alice writes a 'friend' $globalRole record with Bob as recipient
|
|
1588
|
+
const friendRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1589
|
+
author: alice,
|
|
1590
|
+
recipient: bob.did,
|
|
1591
|
+
protocol: protocolDefinition.protocol,
|
|
1592
|
+
protocolPath: 'friend',
|
|
1593
|
+
data: new TextEncoder().encode('Bob is my friend'),
|
|
1594
|
+
});
|
|
1595
|
+
const friendRoleReply = yield dwn.processMessage(alice.did, friendRoleRecord.message, friendRoleRecord.dataStream);
|
|
1596
|
+
expect(friendRoleReply.status.code).to.equal(202);
|
|
1597
|
+
// Alice writes three 'chat' records
|
|
1598
|
+
const chatRecordIds = [];
|
|
1599
|
+
for (let i = 0; i < 3; i++) {
|
|
1600
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1601
|
+
author: alice,
|
|
1602
|
+
recipient: alice.did,
|
|
1603
|
+
protocol: protocolDefinition.protocol,
|
|
1604
|
+
protocolPath: 'chat',
|
|
1605
|
+
published: false,
|
|
1606
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1607
|
+
});
|
|
1608
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1609
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1610
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1611
|
+
}
|
|
1612
|
+
// Bob invokes his friendRole to query that records
|
|
1613
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1614
|
+
author: bob,
|
|
1615
|
+
filter: {
|
|
1616
|
+
protocol: protocolDefinition.protocol,
|
|
1617
|
+
protocolPath: 'chat',
|
|
1618
|
+
},
|
|
1619
|
+
protocolRole: 'friend',
|
|
1620
|
+
});
|
|
1621
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1622
|
+
expect(chatQueryReply.status.code).to.equal(200);
|
|
1623
|
+
expect((_a = chatQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(3);
|
|
1624
|
+
expect(chatQueryReply.entries.map((record) => record.recordId)).to.have.all.members(chatRecordIds);
|
|
1625
|
+
// Bob invokes his friendRole along with an explicit filter for unpublished records
|
|
1626
|
+
const unpublishedChatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1627
|
+
author: bob,
|
|
1628
|
+
filter: {
|
|
1629
|
+
published: false,
|
|
1630
|
+
protocol: protocolDefinition.protocol,
|
|
1631
|
+
protocolPath: 'chat',
|
|
1632
|
+
},
|
|
1633
|
+
protocolRole: 'friend',
|
|
1634
|
+
});
|
|
1635
|
+
const unpublishedChatReply = yield dwn.processMessage(alice.did, unpublishedChatQuery.message);
|
|
1636
|
+
expect(unpublishedChatReply.status.code).to.equal(200);
|
|
1637
|
+
expect((_b = unpublishedChatReply.entries) === null || _b === void 0 ? void 0 : _b.length).to.equal(3);
|
|
1638
|
+
expect(unpublishedChatReply.entries.map((record) => record.recordId)).to.have.all.members(chatRecordIds);
|
|
1639
|
+
}));
|
|
1640
|
+
it('allows $contextRole authorized queries', () => __awaiter(this, void 0, void 0, function* () {
|
|
1641
|
+
// scenario: Alice writes some chat messages writes a chat message. Bob invokes his
|
|
1642
|
+
// friend role in order to query the chat message.
|
|
1643
|
+
var _a;
|
|
1644
|
+
const alice = yield DidKeyResolver.generate();
|
|
1645
|
+
const bob = yield DidKeyResolver.generate();
|
|
1646
|
+
const protocolDefinition = threadRoleProtocolDefinition;
|
|
1647
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1648
|
+
author: alice,
|
|
1649
|
+
protocolDefinition
|
|
1650
|
+
});
|
|
1651
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1652
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1653
|
+
// Alice writes a 'thread' record
|
|
1654
|
+
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1655
|
+
author: alice,
|
|
1656
|
+
protocol: protocolDefinition.protocol,
|
|
1657
|
+
protocolPath: 'thread',
|
|
1658
|
+
});
|
|
1659
|
+
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, threadRecord.dataStream);
|
|
1660
|
+
expect(threadRoleReply.status.code).to.equal(202);
|
|
1661
|
+
// Alice writes a 'participant' $contextRole record with Bob as recipient
|
|
1662
|
+
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1663
|
+
author: alice,
|
|
1664
|
+
recipient: bob.did,
|
|
1665
|
+
protocol: protocolDefinition.protocol,
|
|
1666
|
+
protocolPath: 'thread/participant',
|
|
1667
|
+
contextId: threadRecord.message.contextId,
|
|
1668
|
+
parentId: threadRecord.message.recordId,
|
|
1669
|
+
data: new TextEncoder().encode('Bob is my friend'),
|
|
1670
|
+
});
|
|
1671
|
+
const participantRoleReply = yield dwn.processMessage(alice.did, participantRoleRecord.message, participantRoleRecord.dataStream);
|
|
1672
|
+
expect(participantRoleReply.status.code).to.equal(202);
|
|
1673
|
+
// Alice writes three 'chat' records
|
|
1674
|
+
const chatRecordIds = [];
|
|
1675
|
+
for (let i = 0; i < 3; i++) {
|
|
1676
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1677
|
+
author: alice,
|
|
1678
|
+
recipient: alice.did,
|
|
1679
|
+
protocol: protocolDefinition.protocol,
|
|
1680
|
+
protocolPath: 'thread/chat',
|
|
1681
|
+
published: false,
|
|
1682
|
+
contextId: threadRecord.message.contextId,
|
|
1683
|
+
parentId: threadRecord.message.recordId,
|
|
1684
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1685
|
+
});
|
|
1686
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1687
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1688
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1689
|
+
}
|
|
1690
|
+
// Bob invokes his friendRole to query that records
|
|
1691
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1692
|
+
author: bob,
|
|
1693
|
+
filter: {
|
|
1694
|
+
protocol: protocolDefinition.protocol,
|
|
1695
|
+
protocolPath: 'thread/chat',
|
|
1696
|
+
contextId: threadRecord.message.contextId,
|
|
1697
|
+
},
|
|
1698
|
+
protocolRole: 'thread/participant',
|
|
1699
|
+
});
|
|
1700
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1701
|
+
expect(chatQueryReply.status.code).to.equal(200);
|
|
1702
|
+
expect((_a = chatQueryReply.entries) === null || _a === void 0 ? void 0 : _a.length).to.equal(3);
|
|
1703
|
+
expect(chatQueryReply.entries.map((record) => record.recordId)).to.have.all.members(chatRecordIds);
|
|
1704
|
+
}));
|
|
1705
|
+
it('does not execute protocol queries where protocolPath is missing from the filter', () => __awaiter(this, void 0, void 0, function* () {
|
|
1706
|
+
// scenario: Alice writes some chat messages. Bob invokes his $globalRole to query those messages,
|
|
1707
|
+
// but his query filter does not include protocolPath.
|
|
1708
|
+
const alice = yield DidKeyResolver.generate();
|
|
1709
|
+
const bob = yield DidKeyResolver.generate();
|
|
1710
|
+
const protocolDefinition = friendRoleProtocolDefinition;
|
|
1711
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1712
|
+
author: alice,
|
|
1713
|
+
protocolDefinition
|
|
1714
|
+
});
|
|
1715
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1716
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1717
|
+
// Alice writes a 'friend' $globalRole record with Bob as recipient
|
|
1718
|
+
const friendRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1719
|
+
author: alice,
|
|
1720
|
+
recipient: bob.did,
|
|
1721
|
+
protocol: protocolDefinition.protocol,
|
|
1722
|
+
protocolPath: 'friend',
|
|
1723
|
+
data: new TextEncoder().encode('Bob is my friend'),
|
|
1724
|
+
});
|
|
1725
|
+
const friendRoleReply = yield dwn.processMessage(alice.did, friendRoleRecord.message, friendRoleRecord.dataStream);
|
|
1726
|
+
expect(friendRoleReply.status.code).to.equal(202);
|
|
1727
|
+
// Alice writes three 'chat' records
|
|
1728
|
+
const chatRecordIds = [];
|
|
1729
|
+
for (let i = 0; i < 3; i++) {
|
|
1730
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1731
|
+
author: alice,
|
|
1732
|
+
recipient: alice.did,
|
|
1733
|
+
protocol: protocolDefinition.protocol,
|
|
1734
|
+
protocolPath: 'chat',
|
|
1735
|
+
published: false,
|
|
1736
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1737
|
+
});
|
|
1738
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1739
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1740
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1741
|
+
}
|
|
1742
|
+
// Bob invokes his friendRole to query but does not have `protocolPath` in the filter
|
|
1743
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1744
|
+
author: bob,
|
|
1745
|
+
filter: {
|
|
1746
|
+
protocol: protocolDefinition.protocol,
|
|
1747
|
+
// protocolPath deliberately omitted
|
|
1748
|
+
},
|
|
1749
|
+
protocolRole: 'friend',
|
|
1750
|
+
});
|
|
1751
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1752
|
+
expect(chatQueryReply.status.code).to.equal(400);
|
|
1753
|
+
expect(chatQueryReply.status.detail).to.contain(DwnErrorCode.RecordsQueryFilterMissingRequiredProperties);
|
|
1754
|
+
}));
|
|
1755
|
+
it('does not execute $contextRole authorized queries where contextId is missing from the filter', () => __awaiter(this, void 0, void 0, function* () {
|
|
1756
|
+
// scenario: Alice writes some chat messages and gives Bob a role allowing him to access them. But Bob's filter
|
|
1757
|
+
// does not contain a contextId so the query fails.
|
|
1758
|
+
const alice = yield DidKeyResolver.generate();
|
|
1759
|
+
const bob = yield DidKeyResolver.generate();
|
|
1760
|
+
const protocolDefinition = threadRoleProtocolDefinition;
|
|
1761
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1762
|
+
author: alice,
|
|
1763
|
+
protocolDefinition
|
|
1764
|
+
});
|
|
1765
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1766
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1767
|
+
// Alice writes a 'thread' record
|
|
1768
|
+
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1769
|
+
author: alice,
|
|
1770
|
+
protocol: protocolDefinition.protocol,
|
|
1771
|
+
protocolPath: 'thread',
|
|
1772
|
+
});
|
|
1773
|
+
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, threadRecord.dataStream);
|
|
1774
|
+
expect(threadRoleReply.status.code).to.equal(202);
|
|
1775
|
+
// Alice writes a 'friend' $globalRole record with Bob as recipient
|
|
1776
|
+
const participantRoleRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1777
|
+
author: alice,
|
|
1778
|
+
recipient: bob.did,
|
|
1779
|
+
protocol: protocolDefinition.protocol,
|
|
1780
|
+
protocolPath: 'thread/participant',
|
|
1781
|
+
contextId: threadRecord.message.contextId,
|
|
1782
|
+
parentId: threadRecord.message.recordId,
|
|
1783
|
+
data: new TextEncoder().encode('Bob is my friend'),
|
|
1784
|
+
});
|
|
1785
|
+
const participantRoleReply = yield dwn.processMessage(alice.did, participantRoleRecord.message, participantRoleRecord.dataStream);
|
|
1786
|
+
expect(participantRoleReply.status.code).to.equal(202);
|
|
1787
|
+
// Alice writes three 'chat' records
|
|
1788
|
+
const chatRecordIds = [];
|
|
1789
|
+
for (let i = 0; i < 3; i++) {
|
|
1790
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1791
|
+
author: alice,
|
|
1792
|
+
recipient: alice.did,
|
|
1793
|
+
protocol: protocolDefinition.protocol,
|
|
1794
|
+
protocolPath: 'thread/chat',
|
|
1795
|
+
published: false,
|
|
1796
|
+
contextId: threadRecord.message.contextId,
|
|
1797
|
+
parentId: threadRecord.message.recordId,
|
|
1798
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1799
|
+
});
|
|
1800
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1801
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1802
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1803
|
+
}
|
|
1804
|
+
// Bob invokes his thread participant role to query
|
|
1805
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1806
|
+
author: bob,
|
|
1807
|
+
filter: {
|
|
1808
|
+
protocol: protocolDefinition.protocol,
|
|
1809
|
+
protocolPath: 'thread/chat',
|
|
1810
|
+
// contextId deliberately omitted
|
|
1811
|
+
},
|
|
1812
|
+
protocolRole: 'thread/participant',
|
|
1813
|
+
});
|
|
1814
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1815
|
+
expect(chatQueryReply.status.code).to.eq(401);
|
|
1816
|
+
expect(chatQueryReply.status.detail).to.contain(DwnErrorCode.ProtocolAuthorizationMissingContextId);
|
|
1817
|
+
}));
|
|
1818
|
+
it('rejects $globalRole authorized queries if the query author does not have a matching $globalRole', () => __awaiter(this, void 0, void 0, function* () {
|
|
1819
|
+
// scenario: Alice creates a thread and writes some chat messages writes a chat message. Bob invokes a
|
|
1820
|
+
// $globalRole but fails because he does not actually have a role.
|
|
1821
|
+
const alice = yield DidKeyResolver.generate();
|
|
1822
|
+
const bob = yield DidKeyResolver.generate();
|
|
1823
|
+
const protocolDefinition = friendRoleProtocolDefinition;
|
|
1824
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1825
|
+
author: alice,
|
|
1826
|
+
protocolDefinition
|
|
1827
|
+
});
|
|
1828
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1829
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1830
|
+
// Alice writes three 'chat' records
|
|
1831
|
+
const chatRecordIds = [];
|
|
1832
|
+
for (let i = 0; i < 3; i++) {
|
|
1833
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1834
|
+
author: alice,
|
|
1835
|
+
recipient: alice.did,
|
|
1836
|
+
protocol: protocolDefinition.protocol,
|
|
1837
|
+
protocolPath: 'chat',
|
|
1838
|
+
published: false,
|
|
1839
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1840
|
+
});
|
|
1841
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1842
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1843
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1844
|
+
}
|
|
1845
|
+
// Bob invokes his friendRole to query that records
|
|
1846
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1847
|
+
author: bob,
|
|
1848
|
+
filter: {
|
|
1849
|
+
protocol: protocolDefinition.protocol,
|
|
1850
|
+
protocolPath: 'chat',
|
|
1851
|
+
},
|
|
1852
|
+
protocolRole: 'friend',
|
|
1853
|
+
});
|
|
1854
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1855
|
+
expect(chatQueryReply.status.code).to.eq(401);
|
|
1856
|
+
expect(chatQueryReply.status.detail).to.contain(DwnErrorCode.ProtocolAuthorizationMissingRole);
|
|
1857
|
+
}));
|
|
1858
|
+
it('rejects $contextRole authorized queries where the query author does not have a matching $contextRole', () => __awaiter(this, void 0, void 0, function* () {
|
|
1859
|
+
const alice = yield DidKeyResolver.generate();
|
|
1860
|
+
const bob = yield DidKeyResolver.generate();
|
|
1861
|
+
const protocolDefinition = threadRoleProtocolDefinition;
|
|
1862
|
+
const protocolsConfig = yield TestDataGenerator.generateProtocolsConfigure({
|
|
1863
|
+
author: alice,
|
|
1864
|
+
protocolDefinition
|
|
1865
|
+
});
|
|
1866
|
+
const protocolsConfigureReply = yield dwn.processMessage(alice.did, protocolsConfig.message);
|
|
1867
|
+
expect(protocolsConfigureReply.status.code).to.equal(202);
|
|
1868
|
+
// Alice writes a 'thread' record
|
|
1869
|
+
const threadRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1870
|
+
author: alice,
|
|
1871
|
+
protocol: protocolDefinition.protocol,
|
|
1872
|
+
protocolPath: 'thread',
|
|
1873
|
+
});
|
|
1874
|
+
const threadRoleReply = yield dwn.processMessage(alice.did, threadRecord.message, threadRecord.dataStream);
|
|
1875
|
+
expect(threadRoleReply.status.code).to.equal(202);
|
|
1876
|
+
// Alice writes three 'chat' records
|
|
1877
|
+
const chatRecordIds = [];
|
|
1878
|
+
for (let i = 0; i < 3; i++) {
|
|
1879
|
+
const chatRecord = yield TestDataGenerator.generateRecordsWrite({
|
|
1880
|
+
author: alice,
|
|
1881
|
+
recipient: alice.did,
|
|
1882
|
+
protocol: protocolDefinition.protocol,
|
|
1883
|
+
protocolPath: 'thread/chat',
|
|
1884
|
+
published: false,
|
|
1885
|
+
contextId: threadRecord.message.contextId,
|
|
1886
|
+
parentId: threadRecord.message.recordId,
|
|
1887
|
+
data: new TextEncoder().encode('Bob can read this cuz he is my friend'),
|
|
1888
|
+
});
|
|
1889
|
+
const chatReply = yield dwn.processMessage(alice.did, chatRecord.message, chatRecord.dataStream);
|
|
1890
|
+
expect(chatReply.status.code).to.equal(202);
|
|
1891
|
+
chatRecordIds.push(chatRecord.message.recordId);
|
|
1892
|
+
}
|
|
1893
|
+
// Bob invokes his friendRole to query that records
|
|
1894
|
+
const chatQuery = yield TestDataGenerator.generateRecordsQuery({
|
|
1895
|
+
author: bob,
|
|
1896
|
+
filter: {
|
|
1897
|
+
protocol: protocolDefinition.protocol,
|
|
1898
|
+
protocolPath: 'thread/chat',
|
|
1899
|
+
contextId: threadRecord.message.contextId,
|
|
1900
|
+
},
|
|
1901
|
+
protocolRole: 'thread/participant',
|
|
1902
|
+
});
|
|
1903
|
+
const chatQueryReply = yield dwn.processMessage(alice.did, chatQuery.message);
|
|
1904
|
+
expect(chatQueryReply.status.code).to.eq(401);
|
|
1905
|
+
expect(chatQueryReply.status.detail).to.contain(DwnErrorCode.ProtocolAuthorizationMissingRole);
|
|
1906
|
+
}));
|
|
1907
|
+
});
|
|
1908
|
+
});
|
|
1909
|
+
it('should return 401 if signature check fails', () => __awaiter(this, void 0, void 0, function* () {
|
|
1910
|
+
const { author, message } = yield TestDataGenerator.generateRecordsQuery();
|
|
1911
|
+
const tenant = author.did;
|
|
1912
|
+
// setting up a stub did resolver & message store
|
|
1913
|
+
// intentionally not supplying the public key so a different public key is generated to simulate invalid signature
|
|
1914
|
+
const mismatchingPersona = yield TestDataGenerator.generatePersona({ did: author.did, keyId: author.keyId });
|
|
1915
|
+
const didResolver = TestStubGenerator.createDidResolverStub(mismatchingPersona);
|
|
1916
|
+
const messageStore = stubInterface();
|
|
1917
|
+
const dataStore = stubInterface();
|
|
1918
|
+
const recordsQueryHandler = new RecordsQueryHandler(didResolver, messageStore, dataStore);
|
|
1919
|
+
const reply = yield recordsQueryHandler.handle({ tenant, message });
|
|
1920
|
+
expect(reply.status.code).to.equal(401);
|
|
1921
|
+
}));
|
|
1922
|
+
it('should return 400 if fail parsing the message', () => __awaiter(this, void 0, void 0, function* () {
|
|
1923
|
+
const { author, message } = yield TestDataGenerator.generateRecordsQuery();
|
|
1924
|
+
const tenant = author.did;
|
|
1925
|
+
// setting up a stub method resolver & message store
|
|
1926
|
+
const didResolver = TestStubGenerator.createDidResolverStub(author);
|
|
1927
|
+
const messageStore = stubInterface();
|
|
1928
|
+
const dataStore = stubInterface();
|
|
1929
|
+
const recordsQueryHandler = new RecordsQueryHandler(didResolver, messageStore, dataStore);
|
|
1930
|
+
// stub the `parse()` function to throw an error
|
|
1931
|
+
sinon.stub(RecordsQuery, 'parse').throws('anyError');
|
|
1932
|
+
const reply = yield recordsQueryHandler.handle({ tenant, message });
|
|
1933
|
+
expect(reply.status.code).to.equal(400);
|
|
1934
|
+
}));
|
|
1935
|
+
});
|
|
1936
|
+
}
|
|
1937
|
+
//# sourceMappingURL=records-query.spec.js.map
|