@enbox/dwn-sdk-js 0.0.1
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 +352 -0
- package/dist/bundles/dwn.js +153 -0
- package/dist/cjs/index.js +36749 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/generated/precompiled-validators.js +11973 -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 +47 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -0
- package/dist/esm/src/core/auth.js +39 -0
- package/dist/esm/src/core/auth.js.map +1 -0
- package/dist/esm/src/core/dwn-constant.js +10 -0
- package/dist/esm/src/core/dwn-constant.js.map +1 -0
- package/dist/esm/src/core/dwn-error.js +169 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -0
- package/dist/esm/src/core/grant-authorization.js +97 -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 +233 -0
- package/dist/esm/src/core/message.js.map +1 -0
- package/dist/esm/src/core/messages-grant-authorization.js +101 -0
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +608 -0
- package/dist/esm/src/core/protocol-authorization.js.map +1 -0
- package/dist/esm/src/core/protocols-grant-authorization.js +66 -0
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +132 -0
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -0
- package/dist/esm/src/core/resumable-task-manager.js +109 -0
- package/dist/esm/src/core/resumable-task-manager.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/dwn.js +164 -0
- package/dist/esm/src/dwn.js.map +1 -0
- package/dist/esm/src/enums/dwn-interface-method.js +16 -0
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -0
- package/dist/esm/src/event-log/event-emitter-stream.js +60 -0
- package/dist/esm/src/event-log/event-emitter-stream.js.map +1 -0
- package/dist/esm/src/event-log/event-log-level.js +63 -0
- package/dist/esm/src/event-log/event-log-level.js.map +1 -0
- package/dist/esm/src/handlers/messages-query.js +71 -0
- package/dist/esm/src/handlers/messages-query.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +102 -0
- package/dist/esm/src/handlers/messages-read.js.map +1 -0
- package/dist/esm/src/handlers/messages-subscribe.js +81 -0
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +133 -0
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -0
- package/dist/esm/src/handlers/protocols-query.js +73 -0
- package/dist/esm/src/handlers/protocols-query.js.map +1 -0
- package/dist/esm/src/handlers/records-delete.js +107 -0
- package/dist/esm/src/handlers/records-delete.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +210 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -0
- package/dist/esm/src/handlers/records-read.js +169 -0
- package/dist/esm/src/handlers/records-read.js.map +1 -0
- package/dist/esm/src/handlers/records-subscribe.js +172 -0
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -0
- package/dist/esm/src/handlers/records-write.js +344 -0
- package/dist/esm/src/handlers/records-write.js.map +1 -0
- package/dist/esm/src/index.js +49 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/interfaces/messages-query.js +53 -0
- package/dist/esm/src/interfaces/messages-query.js.map +1 -0
- package/dist/esm/src/interfaces/messages-read.js +61 -0
- package/dist/esm/src/interfaces/messages-read.js.map +1 -0
- package/dist/esm/src/interfaces/messages-subscribe.js +58 -0
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +271 -0
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-query.js +84 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-delete.js +89 -0
- package/dist/esm/src/interfaces/records-delete.js.map +1 -0
- package/dist/esm/src/interfaces/records-query.js +104 -0
- package/dist/esm/src/interfaces/records-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +84 -0
- package/dist/esm/src/interfaces/records-read.js.map +1 -0
- package/dist/esm/src/interfaces/records-subscribe.js +91 -0
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +795 -0
- package/dist/esm/src/interfaces/records-write.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +51 -0
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -0
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js +20 -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/verifier.js +97 -0
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -0
- package/dist/esm/src/protocols/permission-grant.js +39 -0
- package/dist/esm/src/protocols/permission-grant.js.map +1 -0
- package/dist/esm/src/protocols/permission-request.js +35 -0
- package/dist/esm/src/protocols/permission-request.js.map +1 -0
- package/dist/esm/src/protocols/permissions.js +357 -0
- package/dist/esm/src/protocols/permissions.js.map +1 -0
- package/dist/esm/src/schema-validator.js +37 -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/blockstore-mock.js +168 -0
- package/dist/esm/src/store/blockstore-mock.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +136 -0
- package/dist/esm/src/store/data-store-level.js.map +1 -0
- package/dist/esm/src/store/index-level.js +660 -0
- package/dist/esm/src/store/index-level.js.map +1 -0
- package/dist/esm/src/store/level-wrapper.js +305 -0
- package/dist/esm/src/store/level-wrapper.js.map +1 -0
- package/dist/esm/src/store/message-store-level.js +159 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -0
- package/dist/esm/src/store/resumable-task-store-level.js +131 -0
- package/dist/esm/src/store/resumable-task-store-level.js.map +1 -0
- package/dist/esm/src/store/storage-controller.js +184 -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/event-log.js +2 -0
- package/dist/esm/src/types/event-log.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 +3 -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/permission-types.js +6 -0
- package/dist/esm/src/types/permission-types.js.map +1 -0
- package/dist/esm/src/types/protocols-types.js +20 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -0
- package/dist/esm/src/types/query-types.js +6 -0
- package/dist/esm/src/types/query-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/resumable-task-store.js +2 -0
- package/dist/esm/src/types/resumable-task-store.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/types/subscriptions.js +2 -0
- package/dist/esm/src/types/subscriptions.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 +100 -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/filter.js +229 -0
- package/dist/esm/src/utils/filter.js.map +1 -0
- package/dist/esm/src/utils/hd-key.js +114 -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/messages.js +84 -0
- package/dist/esm/src/utils/messages.js.map +1 -0
- package/dist/esm/src/utils/object.js +40 -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 +454 -0
- package/dist/esm/src/utils/records.js.map +1 -0
- package/dist/esm/src/utils/secp256k1.js +166 -0
- package/dist/esm/src/utils/secp256k1.js.map +1 -0
- package/dist/esm/src/utils/secp256r1.js +120 -0
- package/dist/esm/src/utils/secp256r1.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 +85 -0
- package/dist/esm/src/utils/time.js.map +1 -0
- package/dist/esm/src/utils/url.js +62 -0
- package/dist/esm/src/utils/url.js.map +1 -0
- package/dist/esm/tests/core/auth.spec.js +22 -0
- package/dist/esm/tests/core/auth.spec.js.map +1 -0
- package/dist/esm/tests/core/message-reply.spec.js +16 -0
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -0
- package/dist/esm/tests/core/message.spec.js +146 -0
- package/dist/esm/tests/core/message.spec.js.map +1 -0
- package/dist/esm/tests/core/protocol-authorization.spec.js +48 -0
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -0
- package/dist/esm/tests/dwn.spec.js +166 -0
- package/dist/esm/tests/dwn.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-emitter-stream.spec.js +78 -0
- package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js +44 -0
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-log.spec.js +236 -0
- package/dist/esm/tests/event-log/event-log.spec.js.map +1 -0
- package/dist/esm/tests/event-log/event-stream.spec.js +125 -0
- package/dist/esm/tests/event-log/event-stream.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +1273 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -0
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +584 -0
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -0
- package/dist/esm/tests/features/owner-signature.spec.js +192 -0
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -0
- package/dist/esm/tests/features/permissions.spec.js +815 -0
- package/dist/esm/tests/features/permissions.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-create-action.spec.js +248 -0
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-delete-action.spec.js +492 -0
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-update-action.spec.js +572 -0
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune.spec.js +812 -0
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -0
- package/dist/esm/tests/features/records-tags.spec.js +2516 -0
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -0
- package/dist/esm/tests/features/resumable-tasks.spec.js +349 -0
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-query.spec.js +349 -0
- package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-read.spec.js +647 -0
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -0
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +432 -0
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +608 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js +454 -0
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +662 -0
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-query.spec.js +2695 -0
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-read.spec.js +1724 -0
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-subscribe.spec.js +684 -0
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-write.spec.js +3637 -0
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js +78 -0
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +30 -0
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/messagess-query.spec.js +127 -0
- package/dist/esm/tests/interfaces/messagess-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +489 -0
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js +46 -0
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js +39 -0
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-query.spec.js +85 -0
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-read.spec.js +62 -0
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +72 -0
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -0
- package/dist/esm/tests/interfaces/records-write.spec.js +423 -0
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -0
- package/dist/esm/tests/jose/jws/general.spec.js +243 -0
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -0
- package/dist/esm/tests/protocols/permission-request.spec.js +40 -0
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -0
- package/dist/esm/tests/protocols/permissions.spec.js +123 -0
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/aggregator.spec.js +670 -0
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/deleted-record.spec.js +102 -0
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +220 -0
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/messages-query.spec.js +395 -0
- package/dist/esm/tests/scenarios/messages-query.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/nested-roles.spec.js +300 -0
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/subscriptions.spec.js +886 -0
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-mock.spec.js +192 -0
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -0
- package/dist/esm/tests/store/data-store-level.spec.js +146 -0
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/index-level.spec.js +1208 -0
- package/dist/esm/tests/store/index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store-level.spec.js +48 -0
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -0
- package/dist/esm/tests/store/message-store.spec.js +404 -0
- package/dist/esm/tests/store/message-store.spec.js.map +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js +5 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -0
- package/dist/esm/tests/test-event-stream.js +25 -0
- package/dist/esm/tests/test-event-stream.js.map +1 -0
- package/dist/esm/tests/test-stores.js +45 -0
- package/dist/esm/tests/test-stores.js.map +1 -0
- package/dist/esm/tests/test-suite.js +88 -0
- package/dist/esm/tests/test-suite.js.map +1 -0
- package/dist/esm/tests/utils/cid.spec.js +80 -0
- package/dist/esm/tests/utils/cid.spec.js.map +1 -0
- package/dist/esm/tests/utils/data-stream.spec.js +27 -0
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +148 -0
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -0
- package/dist/esm/tests/utils/filters.spec.js +295 -0
- package/dist/esm/tests/utils/filters.spec.js.map +1 -0
- package/dist/esm/tests/utils/hd-key.spec.js +35 -0
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -0
- package/dist/esm/tests/utils/jws.spec.js +8 -0
- package/dist/esm/tests/utils/jws.spec.js.map +1 -0
- package/dist/esm/tests/utils/memory-cache.spec.js +35 -0
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -0
- package/dist/esm/tests/utils/messages.spec.js +101 -0
- package/dist/esm/tests/utils/messages.spec.js.map +1 -0
- package/dist/esm/tests/utils/object.spec.js +36 -0
- package/dist/esm/tests/utils/object.spec.js.map +1 -0
- package/dist/esm/tests/utils/poller.js +49 -0
- package/dist/esm/tests/utils/poller.js.map +1 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js +44 -0
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -0
- package/dist/esm/tests/utils/records.spec.js +53 -0
- package/dist/esm/tests/utils/records.spec.js.map +1 -0
- package/dist/esm/tests/utils/secp256k1.spec.js +50 -0
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -0
- package/dist/esm/tests/utils/secp256r1.spec.js +56 -0
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -0
- package/dist/esm/tests/utils/test-data-generator.js +643 -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 +64 -0
- package/dist/esm/tests/utils/time.spec.js.map +1 -0
- package/dist/esm/tests/utils/url.spec.js +43 -0
- package/dist/esm/tests/utils/url.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +33 -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 +50 -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 +36 -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 +82 -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 +75 -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 +148 -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 +421 -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 +21 -0
- package/dist/esm/tests/vectors/protocol-definitions/author-can.json +33 -0
- package/dist/esm/tests/vectors/protocol-definitions/chat.json +70 -0
- package/dist/esm/tests/vectors/protocol-definitions/credential-issuance.json +41 -0
- package/dist/esm/tests/vectors/protocol-definitions/dex.json +58 -0
- package/dist/esm/tests/vectors/protocol-definitions/email.json +62 -0
- package/dist/esm/tests/vectors/protocol-definitions/free-for-all.json +45 -0
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +48 -0
- package/dist/esm/tests/vectors/protocol-definitions/message.json +37 -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 +15 -0
- package/dist/esm/tests/vectors/protocol-definitions/recipient-can.json +33 -0
- package/dist/esm/tests/vectors/protocol-definitions/slack.json +242 -0
- package/dist/esm/tests/vectors/protocol-definitions/social-media.json +106 -0
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +70 -0
- package/dist/types/generated/precompiled-validators.d.ts +597 -0
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -0
- package/dist/types/src/core/abstract-message.d.ts +25 -0
- package/dist/types/src/core/abstract-message.d.ts.map +1 -0
- package/dist/types/src/core/auth.d.ts +9 -0
- package/dist/types/src/core/auth.d.ts.map +1 -0
- package/dist/types/src/core/dwn-constant.d.ts +10 -0
- package/dist/types/src/core/dwn-constant.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +164 -0
- package/dist/types/src/core/dwn-error.d.ts.map +1 -0
- package/dist/types/src/core/grant-authorization.d.ts +43 -0
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/message-reply.d.ts +32 -0
- package/dist/types/src/core/message-reply.d.ts.map +1 -0
- package/dist/types/src/core/message.d.ts +94 -0
- package/dist/types/src/core/message.d.ts.map +1 -0
- package/dist/types/src/core/messages-grant-authorization.d.ts +34 -0
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +103 -0
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -0
- package/dist/types/src/core/protocols-grant-authorization.d.ts +31 -0
- package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts +60 -0
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts +43 -0
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -0
- package/dist/types/src/core/tenant-gate.d.ts +29 -0
- package/dist/types/src/core/tenant-gate.d.ts.map +1 -0
- package/dist/types/src/dwn.d.ts +85 -0
- package/dist/types/src/dwn.d.ts.map +1 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts +14 -0
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -0
- package/dist/types/src/event-log/event-emitter-stream.d.ts +23 -0
- package/dist/types/src/event-log/event-emitter-stream.d.ts.map +1 -0
- package/dist/types/src/event-log/event-log-level.d.ts +35 -0
- package/dist/types/src/event-log/event-log-level.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-query.d.ts +17 -0
- package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-read.d.ts +22 -0
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-subscribe.d.ts +18 -0
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +24 -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 +23 -0
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -0
- package/dist/types/src/handlers/records-query.d.ts +70 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -0
- package/dist/types/src/handlers/records-read.d.ts +20 -0
- package/dist/types/src/handlers/records-read.d.ts.map +1 -0
- package/dist/types/src/handlers/records-subscribe.d.ts +62 -0
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -0
- package/dist/types/src/handlers/records-write.d.ts +51 -0
- package/dist/types/src/handlers/records-write.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +63 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/interfaces/messages-query.d.ts +16 -0
- package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/messages-read.d.ts +20 -0
- package/dist/types/src/interfaces/messages-read.d.ts.map +1 -0
- package/dist/types/src/interfaces/messages-subscribe.d.ts +20 -0
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +40 -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 +34 -0
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-query.d.ts +31 -0
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-read.d.ts +36 -0
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-subscribe.d.ts +27 -0
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +309 -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/verifier.d.ts +32 -0
- package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -0
- package/dist/types/src/protocols/permission-grant.d.ts +50 -0
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -0
- package/dist/types/src/protocols/permission-request.d.ts +35 -0
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -0
- package/dist/types/src/protocols/permissions.d.ts +150 -0
- package/dist/types/src/protocols/permissions.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 +34 -0
- package/dist/types/src/store/blockstore-level.d.ts.map +1 -0
- package/dist/types/src/store/blockstore-mock.d.ts +27 -0
- package/dist/types/src/store/blockstore-mock.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +34 -0
- package/dist/types/src/store/data-store-level.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +171 -0
- package/dist/types/src/store/index-level.d.ts.map +1 -0
- package/dist/types/src/store/level-wrapper.d.ts +48 -0
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -0
- package/dist/types/src/store/message-store-level.d.ts +46 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -0
- package/dist/types/src/store/resumable-task-store-level.d.ts +28 -0
- package/dist/types/src/store/resumable-task-store-level.d.ts.map +1 -0
- package/dist/types/src/store/storage-controller.d.ts +46 -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 +57 -0
- package/dist/types/src/types/data-store.d.ts.map +1 -0
- package/dist/types/src/types/event-log.d.ts +52 -0
- package/dist/types/src/types/event-log.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 +27 -0
- package/dist/types/src/types/message-interface.d.ts.map +1 -0
- package/dist/types/src/types/message-store.d.ts +42 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -0
- package/dist/types/src/types/message-types.d.ts +116 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -0
- package/dist/types/src/types/messages-types.d.ts +65 -0
- package/dist/types/src/types/messages-types.d.ts.map +1 -0
- package/dist/types/src/types/method-handler.d.ts +19 -0
- package/dist/types/src/types/method-handler.d.ts.map +1 -0
- package/dist/types/src/types/permission-types.d.ts +93 -0
- package/dist/types/src/types/permission-types.d.ts.map +1 -0
- package/dist/types/src/types/protocols-types.d.ts +154 -0
- package/dist/types/src/types/protocols-types.d.ts.map +1 -0
- package/dist/types/src/types/query-types.d.ts +66 -0
- package/dist/types/src/types/query-types.d.ts.map +1 -0
- package/dist/types/src/types/records-types.d.ts +230 -0
- package/dist/types/src/types/records-types.d.ts.map +1 -0
- package/dist/types/src/types/resumable-task-store.d.ts +89 -0
- package/dist/types/src/types/resumable-task-store.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/types/subscriptions.d.ts +30 -0
- package/dist/types/src/types/subscriptions.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 +31 -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/filter.d.ts +60 -0
- package/dist/types/src/utils/filter.d.ts.map +1 -0
- package/dist/types/src/utils/hd-key.d.ts +54 -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/messages.d.ts +27 -0
- package/dist/types/src/utils/messages.d.ts.map +1 -0
- package/dist/types/src/utils/object.d.ts +13 -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 +122 -0
- package/dist/types/src/utils/records.d.ts.map +1 -0
- package/dist/types/src/utils/secp256k1.d.ts +59 -0
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -0
- package/dist/types/src/utils/secp256r1.d.ts +39 -0
- package/dist/types/src/utils/secp256r1.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 +50 -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/core/protocol-authorization.spec.d.ts +2 -0
- package/dist/types/tests/core/protocol-authorization.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/event-log/event-emitter-stream.spec.d.ts +2 -0
- package/dist/types/tests/event-log/event-emitter-stream.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/event-log/event-log.spec.d.ts +2 -0
- package/dist/types/tests/event-log/event-log.spec.d.ts.map +1 -0
- package/dist/types/tests/event-log/event-stream.spec.d.ts +2 -0
- package/dist/types/tests/event-log/event-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts +2 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts +2 -0
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/features/owner-signature.spec.d.ts +2 -0
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -0
- package/dist/types/tests/features/permissions.spec.d.ts +2 -0
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-create-action.spec.d.ts +2 -0
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts +2 -0
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-update-action.spec.d.ts +2 -0
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-prune.spec.d.ts +2 -0
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-tags.spec.d.ts +2 -0
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -0
- package/dist/types/tests/features/resumable-tasks.spec.d.ts +2 -0
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-read.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-subscribe.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-subscribe.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-subscribe.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/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/messages-subscribe.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/messages-subscribe.spec.d.ts.map +1 -0
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/messagess-query.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-subscribe.spec.d.ts +2 -0
- package/dist/types/tests/interfaces/records-subscribe.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/protocols/permission-request.spec.d.ts +2 -0
- package/dist/types/tests/protocols/permission-request.spec.d.ts.map +1 -0
- package/dist/types/tests/protocols/permissions.spec.d.ts +2 -0
- package/dist/types/tests/protocols/permissions.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/aggregator.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/aggregator.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/deleted-record.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/scenarios/messages-query.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts +2 -0
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -0
- package/dist/types/tests/store/blockstore-mock.spec.d.ts +2 -0
- package/dist/types/tests/store/blockstore-mock.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-event-stream.d.ts +22 -0
- package/dist/types/tests/test-event-stream.d.ts.map +1 -0
- package/dist/types/tests/test-stores.d.ts +33 -0
- package/dist/types/tests/test-stores.d.ts.map +1 -0
- package/dist/types/tests/test-suite.d.ts +18 -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/filters.spec.d.ts +2 -0
- package/dist/types/tests/utils/filters.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/hd-key.spec.d.ts +2 -0
- package/dist/types/tests/utils/hd-key.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/messages.spec.d.ts +2 -0
- package/dist/types/tests/utils/messages.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/poller.d.ts +21 -0
- package/dist/types/tests/utils/poller.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/secp256r1.spec.d.ts +2 -0
- package/dist/types/tests/utils/secp256r1.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +342 -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 +167 -0
- package/src/core/abstract-message.ts +62 -0
- package/src/core/auth.ts +36 -0
- package/src/core/dwn-constant.ts +9 -0
- package/src/core/dwn-error.ts +167 -0
- package/src/core/grant-authorization.ts +148 -0
- package/src/core/message-reply.ts +41 -0
- package/src/core/message.ts +259 -0
- package/src/core/messages-grant-authorization.ts +134 -0
- package/src/core/protocol-authorization.ts +903 -0
- package/src/core/protocols-grant-authorization.ts +88 -0
- package/src/core/records-grant-authorization.ts +197 -0
- package/src/core/resumable-task-manager.ts +114 -0
- package/src/core/tenant-gate.ts +33 -0
- package/src/dwn.ts +264 -0
- package/src/enums/dwn-interface-method.ts +14 -0
- package/src/event-log/event-emitter-stream.ts +69 -0
- package/src/event-log/event-log-level.ts +72 -0
- package/src/handlers/messages-query.ts +67 -0
- package/src/handlers/messages-read.ts +103 -0
- package/src/handlers/messages-subscribe.ts +89 -0
- package/src/handlers/protocols-configure.ts +137 -0
- package/src/handlers/protocols-query.ts +82 -0
- package/src/handlers/records-delete.ts +124 -0
- package/src/handlers/records-query.ts +262 -0
- package/src/handlers/records-read.ts +187 -0
- package/src/handlers/records-subscribe.ts +218 -0
- package/src/handlers/records-write.ts +404 -0
- package/src/index.ts +67 -0
- package/src/interfaces/messages-query.ts +60 -0
- package/src/interfaces/messages-read.ts +63 -0
- package/src/interfaces/messages-subscribe.ts +64 -0
- package/src/interfaces/protocols-configure.ts +340 -0
- package/src/interfaces/protocols-query.ts +96 -0
- package/src/interfaces/records-delete.ts +117 -0
- package/src/interfaces/records-query.ts +131 -0
- package/src/interfaces/records-read.ts +100 -0
- package/src/interfaces/records-subscribe.ts +104 -0
- package/src/interfaces/records-write.ts +1072 -0
- package/src/jose/algorithms/signing/ed25519.ts +58 -0
- package/src/jose/algorithms/signing/signature-algorithms.ts +22 -0
- package/src/jose/jws/general/builder.ts +48 -0
- package/src/jose/jws/general/verifier.ts +112 -0
- package/src/protocols/permission-grant.ts +86 -0
- package/src/protocols/permission-request.ts +63 -0
- package/src/protocols/permissions.ts +508 -0
- package/src/schema-validator.ts +46 -0
- package/src/store/blockstore-level.ts +113 -0
- package/src/store/blockstore-mock.ts +80 -0
- package/src/store/data-store-level.ts +120 -0
- package/src/store/index-level.ts +691 -0
- package/src/store/level-wrapper.ts +272 -0
- package/src/store/message-store-level.ts +195 -0
- package/src/store/resumable-task-store-level.ts +120 -0
- package/src/store/storage-controller.ts +240 -0
- package/src/types/cache.ts +16 -0
- package/src/types/data-store.ts +64 -0
- package/src/types/event-log.ts +52 -0
- package/src/types/jose-types.ts +76 -0
- package/src/types/jws-types.ts +28 -0
- package/src/types/message-interface.ts +30 -0
- package/src/types/message-store.ts +57 -0
- package/src/types/message-types.ts +132 -0
- package/src/types/messages-types.ts +77 -0
- package/src/types/method-handler.ts +19 -0
- package/src/types/permission-types.ts +110 -0
- package/src/types/protocols-types.ts +177 -0
- package/src/types/query-types.ts +61 -0
- package/src/types/records-types.ts +263 -0
- package/src/types/resumable-task-store.ts +96 -0
- package/src/types/signer.ts +27 -0
- package/src/types/subscriptions.ts +34 -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 +99 -0
- package/src/utils/encoder.ts +54 -0
- package/src/utils/encryption.ts +145 -0
- package/src/utils/filter.ts +245 -0
- package/src/utils/hd-key.ts +126 -0
- package/src/utils/jws.ts +95 -0
- package/src/utils/memory-cache.ts +31 -0
- package/src/utils/messages.ts +109 -0
- package/src/utils/object.ts +43 -0
- package/src/utils/private-key-signer.ts +72 -0
- package/src/utils/protocols.ts +50 -0
- package/src/utils/records.ts +559 -0
- package/src/utils/secp256k1.ts +157 -0
- package/src/utils/secp256r1.ts +142 -0
- package/src/utils/string.ts +13 -0
- package/src/utils/time.ts +78 -0
- package/src/utils/url.ts +65 -0
|
@@ -0,0 +1,1208 @@
|
|
|
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
|
+
import { ArrayUtility } from '../../src/utils/array.js';
|
|
11
|
+
import { createLevelDatabase } from '../../src/store/level-wrapper.js';
|
|
12
|
+
import { DwnErrorCode } from '../../src/index.js';
|
|
13
|
+
import { IndexLevel } from '../../src/store/index-level.js';
|
|
14
|
+
import { lexicographicalCompare } from '../../src/utils/string.js';
|
|
15
|
+
import { SortDirection } from '../../src/types/query-types.js';
|
|
16
|
+
import { Temporal } from '@js-temporal/polyfill';
|
|
17
|
+
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
18
|
+
import { v4 as uuid } from 'uuid';
|
|
19
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
20
|
+
import chai, { expect } from 'chai';
|
|
21
|
+
chai.use(chaiAsPromised);
|
|
22
|
+
describe('IndexLevel', () => {
|
|
23
|
+
let testIndex;
|
|
24
|
+
const tenant = 'did:alice:index-test';
|
|
25
|
+
describe('put', () => {
|
|
26
|
+
before(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
testIndex = new IndexLevel({
|
|
28
|
+
createLevelDatabase,
|
|
29
|
+
location: 'TEST-INDEX',
|
|
30
|
+
});
|
|
31
|
+
yield testIndex.open();
|
|
32
|
+
}));
|
|
33
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
yield testIndex.clear();
|
|
35
|
+
}));
|
|
36
|
+
after(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
yield testIndex.close();
|
|
38
|
+
}));
|
|
39
|
+
describe('fails to index with no indexable properties', () => {
|
|
40
|
+
it('fails on empty indexes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
41
|
+
const id = uuid();
|
|
42
|
+
const failedIndexPromise = testIndex.put(tenant, id, {});
|
|
43
|
+
yield expect(failedIndexPromise).to.eventually.be.rejectedWith(DwnErrorCode.IndexMissingIndexableProperty);
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
it('successfully indexes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
+
const id = uuid();
|
|
48
|
+
const successfulIndex = testIndex.put(tenant, id, {
|
|
49
|
+
id,
|
|
50
|
+
foo: 'foo',
|
|
51
|
+
digit: 12,
|
|
52
|
+
toggle: false,
|
|
53
|
+
tag: ['bar', 'baz']
|
|
54
|
+
});
|
|
55
|
+
yield expect(successfulIndex).to.eventually.not.be.rejected;
|
|
56
|
+
const results = yield testIndex.query(tenant, [{ id: id }], { sortProperty: 'id' });
|
|
57
|
+
expect(results[0].messageCid).to.equal(id);
|
|
58
|
+
}));
|
|
59
|
+
it('adds one index key per property value, aside from id', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
const id = uuid(); // 1 key for reverse lookup
|
|
61
|
+
const dateCreated = new Date().toISOString();
|
|
62
|
+
yield testIndex.put(tenant, id, {
|
|
63
|
+
'a': 'b', // 1 key
|
|
64
|
+
'c': ['d', 'e'], // 2 key
|
|
65
|
+
dateCreated, // 1 key
|
|
66
|
+
});
|
|
67
|
+
let keys = yield ArrayUtility.fromAsyncGenerator(testIndex.db.keys());
|
|
68
|
+
expect(keys.length).to.equal(5);
|
|
69
|
+
yield testIndex.clear();
|
|
70
|
+
yield testIndex.put(tenant, id, {
|
|
71
|
+
'a': 'b', // 1 key
|
|
72
|
+
'c': ['d', 'e'], // 2 keys
|
|
73
|
+
'f': 'g', // 1 key
|
|
74
|
+
dateCreated, // 1 key
|
|
75
|
+
});
|
|
76
|
+
keys = yield ArrayUtility.fromAsyncGenerator(testIndex.db.keys());
|
|
77
|
+
expect(keys.length).to.equal(6);
|
|
78
|
+
}));
|
|
79
|
+
it('should not put anything if aborted beforehand', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
80
|
+
const controller = new AbortController();
|
|
81
|
+
controller.abort('reason');
|
|
82
|
+
const id = uuid();
|
|
83
|
+
const index = {
|
|
84
|
+
id,
|
|
85
|
+
foo: 'bar'
|
|
86
|
+
};
|
|
87
|
+
const indexPromise = testIndex.put(tenant, id, index, { signal: controller.signal });
|
|
88
|
+
yield expect(indexPromise).to.eventually.rejectedWith('reason');
|
|
89
|
+
const entries = yield testIndex.query(tenant, [{ foo: 'bar' }], { sortProperty: 'id' });
|
|
90
|
+
expect(entries.length).to.equal(0);
|
|
91
|
+
}));
|
|
92
|
+
});
|
|
93
|
+
describe('query', () => {
|
|
94
|
+
before(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
testIndex = new IndexLevel({
|
|
96
|
+
createLevelDatabase,
|
|
97
|
+
location: 'TEST-INDEX',
|
|
98
|
+
});
|
|
99
|
+
yield testIndex.open();
|
|
100
|
+
}));
|
|
101
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
102
|
+
yield testIndex.clear();
|
|
103
|
+
}));
|
|
104
|
+
after(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
105
|
+
yield testIndex.close();
|
|
106
|
+
}));
|
|
107
|
+
it('works', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
108
|
+
const id1 = uuid();
|
|
109
|
+
const doc1 = {
|
|
110
|
+
id: id1,
|
|
111
|
+
'a': 'b',
|
|
112
|
+
'c': 'd'
|
|
113
|
+
};
|
|
114
|
+
const id2 = uuid();
|
|
115
|
+
const doc2 = {
|
|
116
|
+
id: id2,
|
|
117
|
+
'a': 'c',
|
|
118
|
+
'c': 'd'
|
|
119
|
+
};
|
|
120
|
+
const id3 = uuid();
|
|
121
|
+
const doc3 = {
|
|
122
|
+
id: id3,
|
|
123
|
+
'a': 'b',
|
|
124
|
+
'c': 'e'
|
|
125
|
+
};
|
|
126
|
+
yield testIndex.put(tenant, id1, doc1);
|
|
127
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
128
|
+
yield testIndex.put(tenant, id3, doc3);
|
|
129
|
+
const entries = yield testIndex.query(tenant, [{
|
|
130
|
+
'a': 'b',
|
|
131
|
+
'c': 'e'
|
|
132
|
+
}], { sortProperty: 'id' });
|
|
133
|
+
expect(entries.length).to.equal(1);
|
|
134
|
+
expect(entries[0].messageCid).to.equal(id3);
|
|
135
|
+
}));
|
|
136
|
+
it('should return all records if an empty filter array is passed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
137
|
+
const items = ['b', 'a', 'd', 'c'];
|
|
138
|
+
for (const item of items) {
|
|
139
|
+
yield testIndex.put(tenant, item, { letter: item, index: items.indexOf(item) });
|
|
140
|
+
}
|
|
141
|
+
// empty array
|
|
142
|
+
let allResults = yield testIndex.query(tenant, [], { sortProperty: 'letter' });
|
|
143
|
+
expect(allResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
144
|
+
// empty filter
|
|
145
|
+
allResults = yield testIndex.query(tenant, [{}], { sortProperty: 'letter' });
|
|
146
|
+
expect(allResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
147
|
+
}));
|
|
148
|
+
describe('queryWithIteratorPaging()', () => {
|
|
149
|
+
it('paginates using cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
150
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
151
|
+
for (const val of testVals) {
|
|
152
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', published: true });
|
|
153
|
+
}
|
|
154
|
+
// insert other records to be filtered out
|
|
155
|
+
for (const val of testVals) {
|
|
156
|
+
const otherVal = val + val;
|
|
157
|
+
yield testIndex.put(tenant, otherVal, { val: otherVal, schema: 'schema', published: false });
|
|
158
|
+
}
|
|
159
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
160
|
+
// query with limit, default (ascending)
|
|
161
|
+
const results = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', limit: 2 });
|
|
162
|
+
expect(results.length).to.equal(2);
|
|
163
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['a', 'b']);
|
|
164
|
+
// query with cursor, default (ascending)
|
|
165
|
+
const resultsAfterCursor = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(results, 'val') });
|
|
166
|
+
expect(resultsAfterCursor.length).to.equal(2);
|
|
167
|
+
expect(resultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['c', 'd']);
|
|
168
|
+
// query with limit, explicit ascending
|
|
169
|
+
const ascResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', limit: 2 });
|
|
170
|
+
expect(ascResults.length).to.equal(2);
|
|
171
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b']);
|
|
172
|
+
// query with cursor, explicit ascending
|
|
173
|
+
const ascResultsAfterCursor = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(ascResults, 'val') });
|
|
174
|
+
expect(ascResultsAfterCursor.length).to.equal(2);
|
|
175
|
+
expect(ascResultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['c', 'd']);
|
|
176
|
+
// query with limit, descending
|
|
177
|
+
const descResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortDirection: SortDirection.Descending, sortProperty: 'val', limit: 2 });
|
|
178
|
+
expect(descResults.length).to.equal(2);
|
|
179
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql(['d', 'c']);
|
|
180
|
+
// query with cursor, descending
|
|
181
|
+
const descResultsAfterCursor = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortDirection: SortDirection.Descending, sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(descResults, 'val') });
|
|
182
|
+
expect(descResultsAfterCursor.length).to.equal(2);
|
|
183
|
+
expect(descResultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['b', 'a']);
|
|
184
|
+
}));
|
|
185
|
+
it('returns empty array if sort property is invalid', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
186
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
187
|
+
for (const val of testVals) {
|
|
188
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', published: true });
|
|
189
|
+
}
|
|
190
|
+
// insert other records to be filtered out
|
|
191
|
+
for (const val of testVals) {
|
|
192
|
+
const otherVal = val + val;
|
|
193
|
+
yield testIndex.put(tenant, otherVal, { val: otherVal, schema: 'schema', published: false });
|
|
194
|
+
}
|
|
195
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
196
|
+
// control test: return all results
|
|
197
|
+
const validResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val' });
|
|
198
|
+
expect(validResults.length).to.equal(4);
|
|
199
|
+
// sort by invalid property returns no results
|
|
200
|
+
const invalidResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'invalid' });
|
|
201
|
+
expect(invalidResults.length).to.equal(0);
|
|
202
|
+
}));
|
|
203
|
+
it('cursor is valid but out of range of matched results', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
204
|
+
const testVals = ['b', 'd', 'c']; // a is missing
|
|
205
|
+
for (const val of testVals) {
|
|
206
|
+
yield testIndex.put(tenant, `${val}-id`, { val, schema: 'schema', published: true });
|
|
207
|
+
}
|
|
208
|
+
// insert other records to be filtered out
|
|
209
|
+
for (const val of testVals) {
|
|
210
|
+
const otherVal = val + val;
|
|
211
|
+
yield testIndex.put(tenant, `${val}-id`, { val: otherVal, schema: 'schema', published: false });
|
|
212
|
+
}
|
|
213
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
214
|
+
// cursor `a-id` doesn't actually exist, but the value `a` is sorted prior to the result set.
|
|
215
|
+
const cursorA = { messageCid: 'a-id', value: 'a' };
|
|
216
|
+
const allResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', cursor: cursorA });
|
|
217
|
+
expect(allResults.map(({ messageCid }) => messageCid)).to.eql(['b-id', 'c-id', 'd-id']);
|
|
218
|
+
// cursor `e-id` doesn't actually exist, but the value `e` is sorted after to the result set.
|
|
219
|
+
const cursorE = { messageCid: 'e-id', value: 'e' };
|
|
220
|
+
const noResults = yield testIndex.queryWithIteratorPaging(tenant, filters, { sortProperty: 'val', cursor: cursorE });
|
|
221
|
+
expect(noResults.length).to.eql(0);
|
|
222
|
+
}));
|
|
223
|
+
});
|
|
224
|
+
describe('array values', () => {
|
|
225
|
+
it('query items with string array values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
226
|
+
const items = [{
|
|
227
|
+
id: uuid(),
|
|
228
|
+
tag: ['item1', 'item']
|
|
229
|
+
}, {
|
|
230
|
+
id: uuid(),
|
|
231
|
+
tag: ['item2', 'item']
|
|
232
|
+
}, {
|
|
233
|
+
id: uuid(),
|
|
234
|
+
tag: ['item3', 'item']
|
|
235
|
+
}, {
|
|
236
|
+
id: uuid(),
|
|
237
|
+
tag: ['item4', 'item']
|
|
238
|
+
}];
|
|
239
|
+
for (const item of items) {
|
|
240
|
+
yield testIndex.put(tenant, item.id, item);
|
|
241
|
+
}
|
|
242
|
+
const filterForItemTag = [{ tag: 'item' }];
|
|
243
|
+
const allResults = yield testIndex.queryWithIteratorPaging(tenant, filterForItemTag, { sortProperty: 'id' });
|
|
244
|
+
expect(allResults.length).to.equal(4);
|
|
245
|
+
expect(allResults.map(item => item.messageCid)).to.have.members(items.map(item => item.id));
|
|
246
|
+
const filterForItem3 = [{ tag: 'item3' }];
|
|
247
|
+
const item3Results = yield testIndex.queryWithIteratorPaging(tenant, filterForItem3, { sortProperty: 'id' });
|
|
248
|
+
expect(item3Results.length).to.equal(1);
|
|
249
|
+
expect(item3Results.map(item => item.messageCid)).to.has.members([items[2].id]);
|
|
250
|
+
}));
|
|
251
|
+
it('query items with number array values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
252
|
+
const items = [{
|
|
253
|
+
id: uuid(),
|
|
254
|
+
tag: [1]
|
|
255
|
+
}, {
|
|
256
|
+
id: uuid(),
|
|
257
|
+
tag: [1, 2]
|
|
258
|
+
}, {
|
|
259
|
+
id: uuid(),
|
|
260
|
+
tag: [1, 3]
|
|
261
|
+
}, {
|
|
262
|
+
id: uuid(),
|
|
263
|
+
tag: [1, 4]
|
|
264
|
+
}];
|
|
265
|
+
for (const item of items) {
|
|
266
|
+
yield testIndex.put(tenant, item.id, item);
|
|
267
|
+
}
|
|
268
|
+
const filterForItemTag = [{ tag: 1 }];
|
|
269
|
+
const allResults = yield testIndex.queryWithIteratorPaging(tenant, filterForItemTag, { sortProperty: 'id' });
|
|
270
|
+
expect(allResults.length).to.equal(4);
|
|
271
|
+
expect(allResults.map(item => item.messageCid)).to.have.members(items.map(item => item.id));
|
|
272
|
+
const filterForItem3 = [{ tag: 3 }];
|
|
273
|
+
const item3Results = yield testIndex.queryWithIteratorPaging(tenant, filterForItem3, { sortProperty: 'id' });
|
|
274
|
+
expect(item3Results.length).to.equal(1);
|
|
275
|
+
expect(item3Results.map(item => item.messageCid)).to.have.members([items[2].id]);
|
|
276
|
+
const filterForRange = [{ tag: { gt: 1, lt: 4 } }];
|
|
277
|
+
const rangeItems = yield testIndex.queryWithIteratorPaging(tenant, filterForRange, { sortProperty: 'id' });
|
|
278
|
+
expect(rangeItems.length).to.equal(2);
|
|
279
|
+
expect(rangeItems.map(item => item.messageCid)).to.have.members([items[1].id, items[2].id]);
|
|
280
|
+
}));
|
|
281
|
+
});
|
|
282
|
+
describe('queryWithInMemoryPaging()', () => {
|
|
283
|
+
it('paginates using cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
284
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
285
|
+
for (const val of testVals) {
|
|
286
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', published: true });
|
|
287
|
+
}
|
|
288
|
+
// insert other records to be filtered out
|
|
289
|
+
for (const val of testVals) {
|
|
290
|
+
const otherVal = val + val;
|
|
291
|
+
yield testIndex.put(tenant, otherVal, { val: otherVal, schema: 'schema', published: false });
|
|
292
|
+
}
|
|
293
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
294
|
+
// query with limit, default (ascending)
|
|
295
|
+
const results = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', limit: 2 });
|
|
296
|
+
expect(results.length).to.equal(2);
|
|
297
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['a', 'b']);
|
|
298
|
+
// query with cursor, default (ascending)
|
|
299
|
+
const resultsAfterCursor = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(results, 'val') });
|
|
300
|
+
expect(resultsAfterCursor.length).to.equal(2);
|
|
301
|
+
expect(resultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['c', 'd']);
|
|
302
|
+
// query with limit, explicit ascending
|
|
303
|
+
const ascResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', limit: 2 });
|
|
304
|
+
expect(ascResults.length).to.equal(2);
|
|
305
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b']);
|
|
306
|
+
// query with cursor, explicit ascending
|
|
307
|
+
const ascResultsAfterCursor = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(ascResults, 'val') });
|
|
308
|
+
expect(ascResultsAfterCursor.length).to.equal(2);
|
|
309
|
+
expect(ascResultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['c', 'd']);
|
|
310
|
+
// query with limit, descending
|
|
311
|
+
const descResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortDirection: SortDirection.Descending, sortProperty: 'val', limit: 2 });
|
|
312
|
+
expect(descResults.length).to.equal(2);
|
|
313
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql(['d', 'c']);
|
|
314
|
+
// query with cursor, descending
|
|
315
|
+
const descResultsAfterCursor = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortDirection: SortDirection.Descending, sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(descResults, 'val') });
|
|
316
|
+
expect(descResultsAfterCursor.length).to.equal(2);
|
|
317
|
+
expect(descResultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql(['b', 'a']);
|
|
318
|
+
}));
|
|
319
|
+
it('returns empty array if sort property is invalid', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
320
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
321
|
+
for (const val of testVals) {
|
|
322
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', published: true });
|
|
323
|
+
}
|
|
324
|
+
// insert other records to be filtered out
|
|
325
|
+
for (const val of testVals) {
|
|
326
|
+
const otherVal = val + val;
|
|
327
|
+
yield testIndex.put(tenant, otherVal, { val: otherVal, schema: 'schema', published: false });
|
|
328
|
+
}
|
|
329
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
330
|
+
// control test: return all results
|
|
331
|
+
const validResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', limit: 3 });
|
|
332
|
+
expect(validResults.length).to.equal(3);
|
|
333
|
+
// sort by invalid property returns no results
|
|
334
|
+
const invalidResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'invalid' });
|
|
335
|
+
expect(invalidResults.length).to.equal(0);
|
|
336
|
+
}));
|
|
337
|
+
it('cursor is valid but out of range of matched results', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
338
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
339
|
+
for (const val of testVals) {
|
|
340
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', published: true });
|
|
341
|
+
}
|
|
342
|
+
// insert other records to be filtered out
|
|
343
|
+
for (const val of testVals) {
|
|
344
|
+
const otherVal = val + val;
|
|
345
|
+
yield testIndex.put(tenant, otherVal, { val: otherVal, schema: 'schema', published: false });
|
|
346
|
+
}
|
|
347
|
+
const filters = [{ schema: 'schema', published: true }];
|
|
348
|
+
const cursorA = { messageCid: 'a', value: 'a' }; // before results
|
|
349
|
+
const allResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', cursor: cursorA });
|
|
350
|
+
expect(allResults.map(({ messageCid }) => messageCid)).to.eql(['b', 'c', 'd']);
|
|
351
|
+
const cursorE = { messageCid: 'e', value: 'e' }; // after results
|
|
352
|
+
const noResults = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'val', cursor: cursorE });
|
|
353
|
+
expect(noResults.length).to.eql(0);
|
|
354
|
+
}));
|
|
355
|
+
it('supports range queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
356
|
+
const id = uuid();
|
|
357
|
+
const doc1 = {
|
|
358
|
+
id,
|
|
359
|
+
value: 'foo'
|
|
360
|
+
};
|
|
361
|
+
yield testIndex.put(tenant, id, doc1);
|
|
362
|
+
const id2 = uuid();
|
|
363
|
+
const doc2 = {
|
|
364
|
+
id: id2,
|
|
365
|
+
value: 'foobar'
|
|
366
|
+
};
|
|
367
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
368
|
+
const id3 = uuid();
|
|
369
|
+
const doc3 = {
|
|
370
|
+
id: id3,
|
|
371
|
+
value: 'foobaz'
|
|
372
|
+
};
|
|
373
|
+
yield testIndex.put(tenant, id3, doc3);
|
|
374
|
+
const filters = [{
|
|
375
|
+
value: {
|
|
376
|
+
gt: 'foo',
|
|
377
|
+
lte: 'foobaz'
|
|
378
|
+
}
|
|
379
|
+
}];
|
|
380
|
+
const entries = yield testIndex.queryWithInMemoryPaging(tenant, filters, { sortProperty: 'id' });
|
|
381
|
+
expect(entries.length).to.equal(2);
|
|
382
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.have.members([id2, id3]);
|
|
383
|
+
// only upper bounds
|
|
384
|
+
const lteFilter = [{
|
|
385
|
+
value: {
|
|
386
|
+
lte: 'foobaz'
|
|
387
|
+
}
|
|
388
|
+
}];
|
|
389
|
+
const lteReply = yield testIndex.queryWithInMemoryPaging(tenant, lteFilter, { sortProperty: 'id' });
|
|
390
|
+
expect(lteReply.length).to.equal(3);
|
|
391
|
+
expect(lteReply.map(({ messageCid }) => messageCid)).to.have.members([id, id2, id3]);
|
|
392
|
+
}));
|
|
393
|
+
describe('array values', () => {
|
|
394
|
+
it('query items with string array values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
395
|
+
const items = [{
|
|
396
|
+
id: uuid(),
|
|
397
|
+
tag: ['item1', 'item']
|
|
398
|
+
}, {
|
|
399
|
+
id: uuid(),
|
|
400
|
+
tag: ['item2', 'item']
|
|
401
|
+
}, {
|
|
402
|
+
id: uuid(),
|
|
403
|
+
tag: ['item3', 'item']
|
|
404
|
+
}, {
|
|
405
|
+
id: uuid(),
|
|
406
|
+
tag: ['item4', 'item']
|
|
407
|
+
}];
|
|
408
|
+
for (const item of items) {
|
|
409
|
+
yield testIndex.put(tenant, item.id, item);
|
|
410
|
+
}
|
|
411
|
+
const filterForItemTag = [{ tag: 'item' }];
|
|
412
|
+
const allResults = yield testIndex.queryWithInMemoryPaging(tenant, filterForItemTag, { sortProperty: 'id' });
|
|
413
|
+
expect(allResults.length).to.equal(4);
|
|
414
|
+
expect(allResults.map(item => item.messageCid)).to.have.members(items.map(item => item.id));
|
|
415
|
+
const filterForItem3 = [{ tag: 'item3' }];
|
|
416
|
+
const item3Results = yield testIndex.queryWithInMemoryPaging(tenant, filterForItem3, { sortProperty: 'id' });
|
|
417
|
+
expect(item3Results.length).to.equal(1);
|
|
418
|
+
expect(item3Results.map(item => item.messageCid)).to.has.members([items[2].id]);
|
|
419
|
+
}));
|
|
420
|
+
it('query items with number array values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
421
|
+
const items = [{
|
|
422
|
+
id: uuid(),
|
|
423
|
+
tag: [1]
|
|
424
|
+
}, {
|
|
425
|
+
id: uuid(),
|
|
426
|
+
tag: [1, 2]
|
|
427
|
+
}, {
|
|
428
|
+
id: uuid(),
|
|
429
|
+
tag: [1, 3]
|
|
430
|
+
}, {
|
|
431
|
+
id: uuid(),
|
|
432
|
+
tag: [1, 4]
|
|
433
|
+
}];
|
|
434
|
+
for (const item of items) {
|
|
435
|
+
yield testIndex.put(tenant, item.id, item);
|
|
436
|
+
}
|
|
437
|
+
const filterForItemTag = [{ tag: 1 }];
|
|
438
|
+
const allResults = yield testIndex.queryWithInMemoryPaging(tenant, filterForItemTag, { sortProperty: 'id' });
|
|
439
|
+
expect(allResults.length).to.equal(4);
|
|
440
|
+
expect(allResults.map(item => item.messageCid)).to.have.members(items.map(item => item.id));
|
|
441
|
+
const filterForItem3 = [{ tag: 3 }];
|
|
442
|
+
const item3Results = yield testIndex.queryWithInMemoryPaging(tenant, filterForItem3, { sortProperty: 'id' });
|
|
443
|
+
expect(item3Results.length).to.equal(1);
|
|
444
|
+
expect(item3Results.map(item => item.messageCid)).to.have.members([items[2].id]);
|
|
445
|
+
const filterForRange = [{ tag: { gt: 1, lt: 4 } }];
|
|
446
|
+
const rangeItems = yield testIndex.queryWithInMemoryPaging(tenant, filterForRange, { sortProperty: 'id' });
|
|
447
|
+
expect(rangeItems.length).to.equal(2);
|
|
448
|
+
expect(rangeItems.map(item => item.messageCid)).to.have.members([items[1].id, items[2].id]);
|
|
449
|
+
}));
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
describe('query()', () => {
|
|
453
|
+
it('should not match values prefixed with the query', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
454
|
+
const id = uuid();
|
|
455
|
+
const doc = {
|
|
456
|
+
id,
|
|
457
|
+
value: 'foobar'
|
|
458
|
+
};
|
|
459
|
+
yield testIndex.put(tenant, id, doc);
|
|
460
|
+
const filters = [{ value: 'foo' }];
|
|
461
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
462
|
+
expect(entries.length).to.equal(0);
|
|
463
|
+
}));
|
|
464
|
+
it('supports OR queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
465
|
+
const id1 = uuid();
|
|
466
|
+
const doc1 = {
|
|
467
|
+
id: id1,
|
|
468
|
+
'a': 'a'
|
|
469
|
+
};
|
|
470
|
+
const id2 = uuid();
|
|
471
|
+
const doc2 = {
|
|
472
|
+
id: id2,
|
|
473
|
+
'a': 'b'
|
|
474
|
+
};
|
|
475
|
+
const id3 = uuid();
|
|
476
|
+
const doc3 = {
|
|
477
|
+
id: id3,
|
|
478
|
+
'a': 'c'
|
|
479
|
+
};
|
|
480
|
+
yield testIndex.put(tenant, id1, doc1);
|
|
481
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
482
|
+
yield testIndex.put(tenant, id3, doc3);
|
|
483
|
+
const filters = [{
|
|
484
|
+
a: ['a', 'b']
|
|
485
|
+
}];
|
|
486
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
487
|
+
expect(entries.length).to.equal(2);
|
|
488
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.include(id1);
|
|
489
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.include(id2);
|
|
490
|
+
}));
|
|
491
|
+
it('supports range queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
492
|
+
for (let i = -5; i < 5; ++i) {
|
|
493
|
+
const id = uuid();
|
|
494
|
+
const doc = {
|
|
495
|
+
id,
|
|
496
|
+
dateCreated: Temporal.PlainDateTime.from({ year: 2023, month: 1, day: 15 + i }).toString({ smallestUnit: 'microseconds' })
|
|
497
|
+
};
|
|
498
|
+
yield testIndex.put(tenant, id, doc);
|
|
499
|
+
}
|
|
500
|
+
const filters = [{
|
|
501
|
+
dateCreated: {
|
|
502
|
+
gte: Temporal.PlainDateTime.from({ year: 2023, month: 1, day: 15 }).toString({ smallestUnit: 'microseconds' })
|
|
503
|
+
}
|
|
504
|
+
}];
|
|
505
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
506
|
+
expect(entries.length).to.equal(5);
|
|
507
|
+
}));
|
|
508
|
+
it('supports prefixed range queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
509
|
+
const id = uuid();
|
|
510
|
+
const doc = {
|
|
511
|
+
id,
|
|
512
|
+
value: 'foobar'
|
|
513
|
+
};
|
|
514
|
+
yield testIndex.put(tenant, id, doc);
|
|
515
|
+
const filters = [{
|
|
516
|
+
value: {
|
|
517
|
+
gte: 'foo'
|
|
518
|
+
}
|
|
519
|
+
}];
|
|
520
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
521
|
+
expect(entries.length).to.equal(1);
|
|
522
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.include(id);
|
|
523
|
+
}));
|
|
524
|
+
it('supports suffixed range queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
525
|
+
const id1 = uuid();
|
|
526
|
+
const doc1 = {
|
|
527
|
+
id: id1,
|
|
528
|
+
foo: 'bar'
|
|
529
|
+
};
|
|
530
|
+
const id2 = uuid();
|
|
531
|
+
const doc2 = {
|
|
532
|
+
id: id2,
|
|
533
|
+
foo: 'barbaz'
|
|
534
|
+
};
|
|
535
|
+
yield testIndex.put(tenant, id1, doc1);
|
|
536
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
537
|
+
const filters = [{
|
|
538
|
+
foo: {
|
|
539
|
+
lte: 'bar'
|
|
540
|
+
}
|
|
541
|
+
}];
|
|
542
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
543
|
+
expect(entries.length).to.equal(1);
|
|
544
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.include(id1);
|
|
545
|
+
}));
|
|
546
|
+
it('treats strings differently', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
547
|
+
const id1 = uuid();
|
|
548
|
+
const doc1 = {
|
|
549
|
+
id: id1,
|
|
550
|
+
foo: true
|
|
551
|
+
};
|
|
552
|
+
const id2 = uuid();
|
|
553
|
+
const doc2 = {
|
|
554
|
+
id: id2,
|
|
555
|
+
foo: 'true'
|
|
556
|
+
};
|
|
557
|
+
yield testIndex.put(tenant, id1, doc1);
|
|
558
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
559
|
+
const filters = [{
|
|
560
|
+
foo: true
|
|
561
|
+
}];
|
|
562
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'id' });
|
|
563
|
+
expect(entries.length).to.equal(1);
|
|
564
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.include(id1);
|
|
565
|
+
}));
|
|
566
|
+
describe('numbers', () => {
|
|
567
|
+
const positiveDigits = Array(10).fill({}).map(_ => TestDataGenerator.randomInt(0, Number.MAX_SAFE_INTEGER)).sort((a, b) => a - b);
|
|
568
|
+
const negativeDigits = Array(10).fill({}).map(_ => TestDataGenerator.randomInt(0, Number.MAX_SAFE_INTEGER) * -1).sort((a, b) => a - b);
|
|
569
|
+
const testNumbers = Array.from(new Set([...negativeDigits, ...positiveDigits])); // unique numbers
|
|
570
|
+
it('should return records that match provided number equality filter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
571
|
+
var _a;
|
|
572
|
+
const index = Math.floor(Math.random() * testNumbers.length);
|
|
573
|
+
for (const digit of testNumbers) {
|
|
574
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
575
|
+
}
|
|
576
|
+
const filters = [{
|
|
577
|
+
digit: testNumbers.at(index)
|
|
578
|
+
}];
|
|
579
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
580
|
+
expect(entries.length).to.equal(1);
|
|
581
|
+
expect((_a = entries.at(0)) === null || _a === void 0 ? void 0 : _a.messageCid).to.equal(testNumbers.at(index).toString());
|
|
582
|
+
}));
|
|
583
|
+
it('should not return records that do not match provided number equality filter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
584
|
+
// remove the potential (but unlikely) negative test result
|
|
585
|
+
for (const digit of testNumbers.filter(n => n !== 1)) {
|
|
586
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
587
|
+
}
|
|
588
|
+
const filters = [{ digit: 1 }];
|
|
589
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
590
|
+
expect(entries.length).to.equal(0);
|
|
591
|
+
}));
|
|
592
|
+
it('supports range queries with positive numbers inclusive', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
593
|
+
for (const digit of testNumbers) {
|
|
594
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
595
|
+
}
|
|
596
|
+
const upperBound = positiveDigits.at(positiveDigits.length - 3);
|
|
597
|
+
const lowerBound = positiveDigits.at(2);
|
|
598
|
+
const filters = [{
|
|
599
|
+
digit: {
|
|
600
|
+
gte: lowerBound,
|
|
601
|
+
lte: upperBound
|
|
602
|
+
}
|
|
603
|
+
}];
|
|
604
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
605
|
+
const testResults = testNumbers.filter(n => n >= lowerBound && n <= upperBound).map(n => n.toString());
|
|
606
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
607
|
+
}));
|
|
608
|
+
it('supports range queries with negative numbers inclusive', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
609
|
+
for (const digit of testNumbers) {
|
|
610
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
611
|
+
}
|
|
612
|
+
const upperBound = negativeDigits.at(negativeDigits.length - 2);
|
|
613
|
+
const lowerBound = negativeDigits.at(2);
|
|
614
|
+
const filters = [{
|
|
615
|
+
digit: {
|
|
616
|
+
gte: lowerBound,
|
|
617
|
+
lte: upperBound
|
|
618
|
+
}
|
|
619
|
+
}];
|
|
620
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
621
|
+
const testResults = testNumbers.filter(n => n >= lowerBound && n <= upperBound).map(n => n.toString());
|
|
622
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
623
|
+
}));
|
|
624
|
+
it('should return numbers gt a negative digit', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
625
|
+
for (const digit of testNumbers) {
|
|
626
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
627
|
+
}
|
|
628
|
+
const lowerBound = negativeDigits.at(4);
|
|
629
|
+
const filters = [{
|
|
630
|
+
digit: {
|
|
631
|
+
gt: lowerBound,
|
|
632
|
+
}
|
|
633
|
+
}];
|
|
634
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
635
|
+
const testResults = testNumbers.filter(n => n > lowerBound).map(n => n.toString());
|
|
636
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
637
|
+
}));
|
|
638
|
+
it('should return numbers gt a digit', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
639
|
+
for (const digit of testNumbers) {
|
|
640
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
641
|
+
}
|
|
642
|
+
const lowerBound = positiveDigits.at(4);
|
|
643
|
+
const filters = [{
|
|
644
|
+
digit: {
|
|
645
|
+
gt: lowerBound,
|
|
646
|
+
}
|
|
647
|
+
}];
|
|
648
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
649
|
+
const testResults = testNumbers.filter(n => n > lowerBound).map(n => n.toString());
|
|
650
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
651
|
+
}));
|
|
652
|
+
it('should return numbers lt a negative digit', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
653
|
+
for (const digit of testNumbers) {
|
|
654
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
655
|
+
}
|
|
656
|
+
const upperBound = negativeDigits.at(4);
|
|
657
|
+
const filters = [{
|
|
658
|
+
digit: {
|
|
659
|
+
lt: upperBound,
|
|
660
|
+
}
|
|
661
|
+
}];
|
|
662
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
663
|
+
const testResults = testNumbers.filter(n => n < upperBound).map(n => n.toString());
|
|
664
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
665
|
+
}));
|
|
666
|
+
it('should return numbers lt a digit', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
667
|
+
for (const digit of testNumbers) {
|
|
668
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
669
|
+
}
|
|
670
|
+
const upperBound = positiveDigits.at(4);
|
|
671
|
+
const filters = [{
|
|
672
|
+
digit: {
|
|
673
|
+
lt: upperBound,
|
|
674
|
+
}
|
|
675
|
+
}];
|
|
676
|
+
const entries = yield testIndex.query(tenant, filters, { sortProperty: 'digit' });
|
|
677
|
+
const testResults = testNumbers.filter(n => n < upperBound).map(n => n.toString());
|
|
678
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.eql(testResults);
|
|
679
|
+
}));
|
|
680
|
+
});
|
|
681
|
+
describe('booleans', () => {
|
|
682
|
+
it('should return records that match provided boolean equality filter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
683
|
+
const itemTrueId = uuid();
|
|
684
|
+
const boolTrueItem = {
|
|
685
|
+
id: itemTrueId,
|
|
686
|
+
schema: 'schema',
|
|
687
|
+
published: true,
|
|
688
|
+
};
|
|
689
|
+
yield testIndex.put(tenant, itemTrueId, boolTrueItem);
|
|
690
|
+
const itemFalseId = uuid();
|
|
691
|
+
const boolFalseItem = {
|
|
692
|
+
id: itemFalseId,
|
|
693
|
+
schema: 'schema',
|
|
694
|
+
published: false,
|
|
695
|
+
};
|
|
696
|
+
yield testIndex.put(tenant, itemFalseId, boolFalseItem);
|
|
697
|
+
const bothFilter = [{ schema: 'schema' }];
|
|
698
|
+
// control
|
|
699
|
+
const entries = yield testIndex.query(tenant, bothFilter, { sortProperty: 'id' });
|
|
700
|
+
expect(entries.length).to.equal(2);
|
|
701
|
+
expect(entries.map(({ messageCid }) => messageCid)).to.have.members([itemTrueId, itemFalseId]);
|
|
702
|
+
const trueFilter = [{ published: true, schema: 'schema' }];
|
|
703
|
+
// equality true
|
|
704
|
+
const respTrue = yield testIndex.query(tenant, trueFilter, { sortProperty: 'id' });
|
|
705
|
+
expect(respTrue.length).to.equal(1);
|
|
706
|
+
expect(respTrue.map(({ messageCid }) => messageCid)).to.have.members([itemTrueId]);
|
|
707
|
+
const falseFilter = [{ published: false, schema: 'schema' }];
|
|
708
|
+
// equality false
|
|
709
|
+
const respFalse = yield testIndex.query(tenant, falseFilter, { sortProperty: 'id' });
|
|
710
|
+
expect(respFalse.length).to.equal(1);
|
|
711
|
+
expect(respFalse.map(({ messageCid }) => messageCid)).to.have.members([itemFalseId]);
|
|
712
|
+
}));
|
|
713
|
+
});
|
|
714
|
+
describe('sort, limit and cursor', () => {
|
|
715
|
+
it('only returns the number of results specified by the limit property', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
716
|
+
const testVals = ['b', 'a', 'd', 'c'];
|
|
717
|
+
for (const val of testVals) {
|
|
718
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema' });
|
|
719
|
+
}
|
|
720
|
+
const filters = [{ schema: 'schema' }];
|
|
721
|
+
// limit results without cursor
|
|
722
|
+
let ascResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', limit: 2 });
|
|
723
|
+
expect(ascResults.length).to.equal(2);
|
|
724
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b']);
|
|
725
|
+
// limit results with a cursor
|
|
726
|
+
ascResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', limit: 2, cursor: IndexLevel.createCursorFromLastArrayItem(ascResults, 'val') });
|
|
727
|
+
expect(ascResults.length).to.equal(2);
|
|
728
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['c', 'd']);
|
|
729
|
+
}));
|
|
730
|
+
it('can sort by any indexed property', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
731
|
+
const testVals = ['b', 'd', 'c', 'a'];
|
|
732
|
+
for (const val of testVals) {
|
|
733
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema', index: testVals.indexOf(val) });
|
|
734
|
+
}
|
|
735
|
+
const filters = [{ schema: 'schema' }];
|
|
736
|
+
// sort by value ascending
|
|
737
|
+
const ascResults = yield testIndex.query(tenant, filters, { sortProperty: 'val' });
|
|
738
|
+
expect(ascResults.length).to.equal(testVals.length);
|
|
739
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
740
|
+
// sort by index ascending
|
|
741
|
+
const ascIndexResults = yield testIndex.query(tenant, filters, { sortProperty: 'index' });
|
|
742
|
+
expect(ascIndexResults.length).to.equal(testVals.length);
|
|
743
|
+
expect(ascIndexResults.map(({ messageCid }) => messageCid)).eql(testVals);
|
|
744
|
+
// sort by value descending
|
|
745
|
+
const descResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', sortDirection: SortDirection.Descending });
|
|
746
|
+
expect(descResults.length).to.equal(testVals.length);
|
|
747
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql(['d', 'c', 'b', 'a']);
|
|
748
|
+
// sort by index descending
|
|
749
|
+
const descIndexResults = yield testIndex.query(tenant, filters, { sortProperty: 'index', sortDirection: SortDirection.Descending });
|
|
750
|
+
expect(descIndexResults.length).to.equal(testVals.length);
|
|
751
|
+
expect(descIndexResults.map(({ messageCid }) => messageCid)).eql([...testVals].reverse());
|
|
752
|
+
}));
|
|
753
|
+
it('sorts lexicographic', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
754
|
+
const testVals = ['b', 'a', 'd', 'c'];
|
|
755
|
+
for (const val of testVals) {
|
|
756
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema' });
|
|
757
|
+
}
|
|
758
|
+
const filters = [{ schema: 'schema' }];
|
|
759
|
+
// sort ascending
|
|
760
|
+
const ascResults = yield testIndex.query(tenant, filters, { sortProperty: 'val' });
|
|
761
|
+
expect(ascResults.length).to.equal(4);
|
|
762
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
763
|
+
// sort descending
|
|
764
|
+
const descResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', sortDirection: SortDirection.Descending });
|
|
765
|
+
expect(descResults.length).to.equal(4);
|
|
766
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql(['d', 'c', 'b', 'a']);
|
|
767
|
+
}));
|
|
768
|
+
it('sorts numeric with and without a cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
769
|
+
const testVals = [-2, -1, 0, 1, 2, 3, 4];
|
|
770
|
+
for (const val of testVals) {
|
|
771
|
+
yield testIndex.put(tenant, val.toString(), { val, schema: 'schema' });
|
|
772
|
+
}
|
|
773
|
+
const filters = [{ schema: 'schema' }];
|
|
774
|
+
// sort ascending
|
|
775
|
+
const ascResults = yield testIndex.query(tenant, filters, { sortProperty: 'val' });
|
|
776
|
+
expect(ascResults.length).to.equal(testVals.length);
|
|
777
|
+
expect(ascResults.map(({ messageCid }) => messageCid)).to.eql(['-2', '-1', '0', '1', '2', '3', '4']);
|
|
778
|
+
// sort descending
|
|
779
|
+
const descResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', sortDirection: SortDirection.Descending });
|
|
780
|
+
expect(descResults.length).to.eql(testVals.length);
|
|
781
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql(['4', '3', '2', '1', '0', '-1', '-2']);
|
|
782
|
+
}));
|
|
783
|
+
it('sorts range queries with or without a cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
784
|
+
const testItems = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
|
|
785
|
+
for (const item of testItems) {
|
|
786
|
+
yield testIndex.put(tenant, item, { letter: item });
|
|
787
|
+
}
|
|
788
|
+
// test both upper and lower bounds
|
|
789
|
+
const lowerBound = 'b';
|
|
790
|
+
const upperBound = 'g';
|
|
791
|
+
const bothBoundsFilters = [{
|
|
792
|
+
letter: {
|
|
793
|
+
gte: lowerBound,
|
|
794
|
+
lte: upperBound
|
|
795
|
+
},
|
|
796
|
+
}];
|
|
797
|
+
// ascending without a cursor
|
|
798
|
+
let response = yield testIndex.query(tenant, bothBoundsFilters, { sortProperty: 'letter', limit: 4 });
|
|
799
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['b', 'c', 'd', 'e']);
|
|
800
|
+
// ascending with a cursor
|
|
801
|
+
response = yield testIndex.query(tenant, bothBoundsFilters, { sortProperty: 'letter', cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
802
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['f', 'g']); // should only return greater than e
|
|
803
|
+
// descending without a cursor
|
|
804
|
+
response = yield testIndex.query(tenant, bothBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, limit: 4 });
|
|
805
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['g', 'f', 'e', 'd']);
|
|
806
|
+
// descending with a cursor
|
|
807
|
+
response = yield testIndex.query(tenant, bothBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
808
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['c', 'b']); // should only return less than d
|
|
809
|
+
// test only upper bounds
|
|
810
|
+
const upperBoundsFilters = [{
|
|
811
|
+
letter: {
|
|
812
|
+
lte: upperBound
|
|
813
|
+
},
|
|
814
|
+
}];
|
|
815
|
+
// ascending without a cursor
|
|
816
|
+
response = yield testIndex.query(tenant, upperBoundsFilters, { sortProperty: 'letter', limit: 4 });
|
|
817
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
818
|
+
// ascending with a cursor
|
|
819
|
+
response = yield testIndex.query(tenant, upperBoundsFilters, { sortProperty: 'letter', cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
820
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['e', 'f', 'g']); // should only return items greater than d
|
|
821
|
+
// descending without a cursor
|
|
822
|
+
response = yield testIndex.query(tenant, upperBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, limit: 4 });
|
|
823
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['g', 'f', 'e', 'd']);
|
|
824
|
+
// descending with a cursor
|
|
825
|
+
response = yield testIndex.query(tenant, upperBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
826
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['c', 'b', 'a']); // should only return items less than c
|
|
827
|
+
// test only lower bounds
|
|
828
|
+
const lowerBoundsFilters = [{
|
|
829
|
+
letter: {
|
|
830
|
+
gte: lowerBound
|
|
831
|
+
},
|
|
832
|
+
}];
|
|
833
|
+
// ascending without a cursor
|
|
834
|
+
response = yield testIndex.query(tenant, lowerBoundsFilters, { sortProperty: 'letter', limit: 4 });
|
|
835
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['b', 'c', 'd', 'e']);
|
|
836
|
+
// ascending with a cursor
|
|
837
|
+
response = yield testIndex.query(tenant, lowerBoundsFilters, { sortProperty: 'letter', cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
838
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['f', 'g', 'h']); // should only return items greater than e
|
|
839
|
+
// descending without a cursor
|
|
840
|
+
response = yield testIndex.query(tenant, lowerBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, limit: 4 });
|
|
841
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['h', 'g', 'f', 'e']);
|
|
842
|
+
// descending with a cursor
|
|
843
|
+
response = yield testIndex.query(tenant, lowerBoundsFilters, { sortProperty: 'letter', sortDirection: SortDirection.Descending, cursor: IndexLevel.createCursorFromLastArrayItem(response, 'letter') });
|
|
844
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['d', 'c', 'b']); // should only return items less than e
|
|
845
|
+
}));
|
|
846
|
+
it('sorts range queries negative integers with or without a cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
847
|
+
const testNumbers = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5];
|
|
848
|
+
for (const digit of testNumbers) {
|
|
849
|
+
yield testIndex.put(tenant, digit.toString(), { digit });
|
|
850
|
+
}
|
|
851
|
+
const upperBound = 3;
|
|
852
|
+
const lowerBound = -2;
|
|
853
|
+
const filters = [{
|
|
854
|
+
digit: {
|
|
855
|
+
gte: lowerBound,
|
|
856
|
+
lte: upperBound
|
|
857
|
+
}
|
|
858
|
+
}];
|
|
859
|
+
let results = yield testIndex.query(tenant, filters, { sortProperty: 'digit', limit: 4 });
|
|
860
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['-2', '-1', '0', '1']);
|
|
861
|
+
const cursor = IndexLevel.createCursorFromLastArrayItem(results, 'digit');
|
|
862
|
+
expect(typeof (cursor === null || cursor === void 0 ? void 0 : cursor.value)).to.equal('number'); // the cursor value is a number, as it was indexed
|
|
863
|
+
results = yield testIndex.query(tenant, filters, { sortProperty: 'digit', cursor });
|
|
864
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['2', '3']);
|
|
865
|
+
}));
|
|
866
|
+
it('sorts range queries with remaining results in lte after cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
867
|
+
// create an array with unique IDs but multiple items representing the same digit.
|
|
868
|
+
const testItems = [{
|
|
869
|
+
id: 'a',
|
|
870
|
+
digit: 1,
|
|
871
|
+
}, {
|
|
872
|
+
id: 'b',
|
|
873
|
+
digit: 2,
|
|
874
|
+
}, {
|
|
875
|
+
id: 'c',
|
|
876
|
+
digit: 3,
|
|
877
|
+
}, {
|
|
878
|
+
id: 'd',
|
|
879
|
+
digit: 4,
|
|
880
|
+
}, {
|
|
881
|
+
id: 'e',
|
|
882
|
+
digit: 4,
|
|
883
|
+
}, {
|
|
884
|
+
id: 'f',
|
|
885
|
+
digit: 4,
|
|
886
|
+
}, {
|
|
887
|
+
id: 'g',
|
|
888
|
+
digit: 4,
|
|
889
|
+
}, {
|
|
890
|
+
id: 'h',
|
|
891
|
+
digit: 5,
|
|
892
|
+
}];
|
|
893
|
+
for (const item of testItems) {
|
|
894
|
+
yield testIndex.put(tenant, item.id, item);
|
|
895
|
+
}
|
|
896
|
+
const lowerBound = 2;
|
|
897
|
+
const upperBound = 4;
|
|
898
|
+
// with both lower and upper bounds
|
|
899
|
+
// first issue with a limit
|
|
900
|
+
let response = yield testIndex.query(tenant, [{
|
|
901
|
+
digit: {
|
|
902
|
+
gte: lowerBound,
|
|
903
|
+
lte: upperBound
|
|
904
|
+
},
|
|
905
|
+
}], { sortProperty: 'id', limit: 3 });
|
|
906
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['b', 'c', 'd']);
|
|
907
|
+
// this cursor should ony return results from the 'lte' part of the filter
|
|
908
|
+
response = yield testIndex.query(tenant, [{
|
|
909
|
+
digit: {
|
|
910
|
+
gte: lowerBound,
|
|
911
|
+
lte: upperBound
|
|
912
|
+
},
|
|
913
|
+
}], { sortProperty: 'id', cursor: IndexLevel.createCursorFromLastArrayItem(response, 'id') });
|
|
914
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['e', 'f', 'g']);
|
|
915
|
+
// issue a range with no lower bounds but a limit
|
|
916
|
+
response = yield testIndex.query(tenant, [{
|
|
917
|
+
digit: {
|
|
918
|
+
lte: upperBound
|
|
919
|
+
},
|
|
920
|
+
}], { sortProperty: 'id', limit: 4 });
|
|
921
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['a', 'b', 'c', 'd']);
|
|
922
|
+
// with no lower bounds
|
|
923
|
+
// ascending with a cursor
|
|
924
|
+
// this cursor should ony return results from the 'lte' part of the filter
|
|
925
|
+
response = yield testIndex.query(tenant, [{
|
|
926
|
+
digit: {
|
|
927
|
+
lte: upperBound
|
|
928
|
+
},
|
|
929
|
+
}], { sortProperty: 'id', cursor: IndexLevel.createCursorFromLastArrayItem(response, 'id') });
|
|
930
|
+
expect(response.map(({ messageCid }) => messageCid)).to.eql(['e', 'f', 'g']); // should only return three matching items
|
|
931
|
+
}));
|
|
932
|
+
it('sorts OR queries with or without a cursor', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
933
|
+
const testValsSchema1 = ['a1', 'b1', 'c1', 'd1'];
|
|
934
|
+
for (const val of testValsSchema1) {
|
|
935
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema1' });
|
|
936
|
+
}
|
|
937
|
+
const testValsSchema2 = ['a2', 'b2', 'c2', 'd2'];
|
|
938
|
+
for (const val of testValsSchema2) {
|
|
939
|
+
yield testIndex.put(tenant, val, { val, schema: 'schema2' });
|
|
940
|
+
}
|
|
941
|
+
const filters = [{
|
|
942
|
+
schema: ['schema1', 'schema2']
|
|
943
|
+
}];
|
|
944
|
+
// sort ascending without cursor
|
|
945
|
+
let results = yield testIndex.query(tenant, filters, { sortProperty: 'val', limit: 4 });
|
|
946
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['a1', 'a2', 'b1', 'b2']);
|
|
947
|
+
// sort ascending from b2 onwards
|
|
948
|
+
results = yield testIndex.query(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(results, 'val') });
|
|
949
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql(['c1', 'c2', 'd1', 'd2']);
|
|
950
|
+
}));
|
|
951
|
+
it('supports multiple filtered queries', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
952
|
+
const items = [];
|
|
953
|
+
const lowerBounds = -2;
|
|
954
|
+
const upperBounds = 3;
|
|
955
|
+
// create 30 records with random digits between 1-9
|
|
956
|
+
// every 3rd record should be a negative number
|
|
957
|
+
// every 5th record a property should be set to true
|
|
958
|
+
// every property not set to true should be set to false
|
|
959
|
+
// we artificially use index #4 to be within the bounds of our query to be used as a cursor point.
|
|
960
|
+
for (let i = 0; i < 30; i++) {
|
|
961
|
+
const digit = i === 4 ? TestDataGenerator.randomInt(lowerBounds, upperBounds) :
|
|
962
|
+
i % 3 === 0 ?
|
|
963
|
+
TestDataGenerator.randomInt(1, 9) * -1 :
|
|
964
|
+
TestDataGenerator.randomInt(1, 9);
|
|
965
|
+
const property = i % 5 === 0 ? true : false;
|
|
966
|
+
const item = { val: IndexLevel.encodeNumberValue(i), digit, property };
|
|
967
|
+
yield testIndex.put(tenant, item.val, item);
|
|
968
|
+
items.push(item);
|
|
969
|
+
}
|
|
970
|
+
// create the expected results;
|
|
971
|
+
const compareResults = new Set([
|
|
972
|
+
...items.filter(i => i.digit >= lowerBounds && i.digit <= upperBounds),
|
|
973
|
+
...items.filter(i => i.property === true),
|
|
974
|
+
].sort((a, b) => lexicographicalCompare(a.val, b.val)).map(i => i.val));
|
|
975
|
+
const filters = [
|
|
976
|
+
{ digit: { gte: lowerBounds, lte: upperBounds } },
|
|
977
|
+
{ property: true }
|
|
978
|
+
];
|
|
979
|
+
// query in ascending order.
|
|
980
|
+
const results = yield testIndex.query(tenant, filters, { sortProperty: 'val', limit: 10 });
|
|
981
|
+
expect(results.length).to.be.lte(10);
|
|
982
|
+
expect(results.map(({ messageCid }) => messageCid)).to.eql([...compareResults].slice(0, 10), 'results ascending');
|
|
983
|
+
// query in ascending order with cursor.
|
|
984
|
+
const resultsWithCursor = yield testIndex.query(tenant, filters, { sortProperty: 'val', cursor: IndexLevel.createCursorFromLastArrayItem(results, 'val') });
|
|
985
|
+
expect(resultsWithCursor.map(({ messageCid }) => messageCid)).to.eql([...compareResults].slice(10), 'results after cursor ascending');
|
|
986
|
+
const descResults = yield testIndex.query(tenant, filters, { sortProperty: 'val', sortDirection: SortDirection.Descending, limit: 10 });
|
|
987
|
+
expect(descResults.length).to.be.lte(10);
|
|
988
|
+
expect(descResults.map(({ messageCid }) => messageCid)).to.eql([...compareResults].reverse().slice(0, 10), 'results descending');
|
|
989
|
+
const descResultsAfterCursor = yield testIndex.query(tenant, filters, { sortProperty: 'val', sortDirection: SortDirection.Descending, cursor: IndexLevel.createCursorFromLastArrayItem(descResults, 'val') });
|
|
990
|
+
expect(descResultsAfterCursor.map(({ messageCid }) => messageCid)).to.eql([...compareResults].reverse().slice(10), 'results after cursor descending');
|
|
991
|
+
}));
|
|
992
|
+
});
|
|
993
|
+
});
|
|
994
|
+
});
|
|
995
|
+
describe('delete', () => {
|
|
996
|
+
before(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
997
|
+
testIndex = new IndexLevel({
|
|
998
|
+
createLevelDatabase,
|
|
999
|
+
location: 'TEST-INDEX',
|
|
1000
|
+
});
|
|
1001
|
+
yield testIndex.open();
|
|
1002
|
+
}));
|
|
1003
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
1004
|
+
yield testIndex.clear();
|
|
1005
|
+
}));
|
|
1006
|
+
after(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
1007
|
+
yield testIndex.close();
|
|
1008
|
+
}));
|
|
1009
|
+
it('purges indexes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1010
|
+
const id1 = uuid();
|
|
1011
|
+
const doc1 = {
|
|
1012
|
+
id: id1,
|
|
1013
|
+
'a': 'b',
|
|
1014
|
+
'c': ['d', 'e']
|
|
1015
|
+
};
|
|
1016
|
+
const id2 = uuid();
|
|
1017
|
+
const doc2 = {
|
|
1018
|
+
id: id2,
|
|
1019
|
+
'a': 'b',
|
|
1020
|
+
'c': ['d', 'e']
|
|
1021
|
+
};
|
|
1022
|
+
yield testIndex.put(tenant, id1, doc1);
|
|
1023
|
+
yield testIndex.put(tenant, id2, doc2);
|
|
1024
|
+
let result = yield testIndex.query(tenant, [{ 'a': 'b', 'c': 'e' }], { sortProperty: 'id' });
|
|
1025
|
+
expect(result.length).to.equal(2);
|
|
1026
|
+
expect(result.map(({ messageCid }) => messageCid)).to.contain(id1);
|
|
1027
|
+
yield testIndex.delete(tenant, id1);
|
|
1028
|
+
result = yield testIndex.query(tenant, [{ 'a': 'b', 'c': 'e' }], { sortProperty: 'id' });
|
|
1029
|
+
expect(result.length).to.equal(1);
|
|
1030
|
+
yield testIndex.delete(tenant, id2);
|
|
1031
|
+
const allKeys = yield ArrayUtility.fromAsyncGenerator(testIndex.db.keys());
|
|
1032
|
+
expect(allKeys.length).to.equal(0);
|
|
1033
|
+
}));
|
|
1034
|
+
it('should not delete anything if aborted beforehand', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1035
|
+
const controller = new AbortController();
|
|
1036
|
+
controller.abort('reason');
|
|
1037
|
+
const id = uuid();
|
|
1038
|
+
const doc = {
|
|
1039
|
+
id: id,
|
|
1040
|
+
foo: 'bar'
|
|
1041
|
+
};
|
|
1042
|
+
yield testIndex.put(tenant, id, doc);
|
|
1043
|
+
try {
|
|
1044
|
+
yield testIndex.delete(tenant, id, { signal: controller.signal });
|
|
1045
|
+
}
|
|
1046
|
+
catch (e) {
|
|
1047
|
+
expect(e).to.equal('reason');
|
|
1048
|
+
}
|
|
1049
|
+
const result = yield testIndex.query(tenant, [{ foo: 'bar' }], { sortProperty: 'id' });
|
|
1050
|
+
expect(result.length).to.equal(1);
|
|
1051
|
+
expect(result.map(({ messageCid }) => messageCid)).to.contain(id);
|
|
1052
|
+
}));
|
|
1053
|
+
it('does nothing when attempting to purge key that does not exist', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1054
|
+
const controller = new AbortController();
|
|
1055
|
+
controller.abort('reason');
|
|
1056
|
+
const id = uuid();
|
|
1057
|
+
const doc = {
|
|
1058
|
+
id: id,
|
|
1059
|
+
foo: 'bar'
|
|
1060
|
+
};
|
|
1061
|
+
yield testIndex.put(tenant, id, doc);
|
|
1062
|
+
// attempt purge an invalid id
|
|
1063
|
+
yield testIndex.delete(tenant, 'invalidCid');
|
|
1064
|
+
const result = yield testIndex.query(tenant, [{ foo: 'bar' }], { sortProperty: 'id' });
|
|
1065
|
+
expect(result.length).to.equal(1);
|
|
1066
|
+
expect(result.map(({ messageCid }) => messageCid)).to.contain(id);
|
|
1067
|
+
}));
|
|
1068
|
+
});
|
|
1069
|
+
describe('createCursorFromItem', () => {
|
|
1070
|
+
it('throws if cursor value is a boolean or an array', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1071
|
+
// we can only sort by strings or numbers, so arrays or booleans should throw.
|
|
1072
|
+
const item = {
|
|
1073
|
+
messageCid: 'message-cid',
|
|
1074
|
+
indexes: {
|
|
1075
|
+
sortPropertyBool: true,
|
|
1076
|
+
sortPropertyArray: [1, 2, 3],
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
expect(() => IndexLevel.createCursorFromItem(item, 'sortPropertyBool')).to.throw(DwnErrorCode.IndexInvalidCursorValueType);
|
|
1080
|
+
expect(() => IndexLevel.createCursorFromItem(item, 'sortPropertyArray')).to.throw(DwnErrorCode.IndexInvalidCursorValueType);
|
|
1081
|
+
}));
|
|
1082
|
+
it('throws if sort property is not defined within the IndexedItem', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1083
|
+
const item = {
|
|
1084
|
+
messageCid: 'message-cid',
|
|
1085
|
+
indexes: {
|
|
1086
|
+
sortProperty: 1234,
|
|
1087
|
+
}
|
|
1088
|
+
};
|
|
1089
|
+
expect(() => IndexLevel.createCursorFromItem(item, 'unknownProperty')).to.throw(DwnErrorCode.IndexInvalidCursorSortProperty);
|
|
1090
|
+
}));
|
|
1091
|
+
it('returns numeric type cursor value', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1092
|
+
const item = {
|
|
1093
|
+
messageCid: 'message-cid',
|
|
1094
|
+
indexes: {
|
|
1095
|
+
sortProperty: 1234,
|
|
1096
|
+
}
|
|
1097
|
+
};
|
|
1098
|
+
const cursor = IndexLevel.createCursorFromItem(item, 'sortProperty');
|
|
1099
|
+
expect(cursor.value).to.equal(1234);
|
|
1100
|
+
}));
|
|
1101
|
+
it('returns string type cursor value', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1102
|
+
const item = {
|
|
1103
|
+
messageCid: 'message-cid',
|
|
1104
|
+
indexes: {
|
|
1105
|
+
sortProperty: '1234',
|
|
1106
|
+
}
|
|
1107
|
+
};
|
|
1108
|
+
const cursor = IndexLevel.createCursorFromItem(item, 'sortProperty');
|
|
1109
|
+
expect(cursor.value).to.equal('1234');
|
|
1110
|
+
}));
|
|
1111
|
+
});
|
|
1112
|
+
describe('createCursorFromLastArrayItem', () => {
|
|
1113
|
+
it('returns undefined if an empty array is provided', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1114
|
+
const cursor = IndexLevel.createCursorFromLastArrayItem([], 'someProperty');
|
|
1115
|
+
expect(cursor).to.equal(undefined);
|
|
1116
|
+
}));
|
|
1117
|
+
it('returns a PaginationCursor for the last item given a valid sort property', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1118
|
+
const items = [{
|
|
1119
|
+
messageCid: 'cid-1',
|
|
1120
|
+
indexes: {
|
|
1121
|
+
prop1: true,
|
|
1122
|
+
prop2: 'prop-2',
|
|
1123
|
+
date: '2023-12-13T11:22:33.000000Z'
|
|
1124
|
+
}
|
|
1125
|
+
}, {
|
|
1126
|
+
messageCid: 'cid-2',
|
|
1127
|
+
indexes: {
|
|
1128
|
+
prop1: true,
|
|
1129
|
+
prop2: 'prop-2',
|
|
1130
|
+
date: '2023-12-14T11:22:33.000000Z'
|
|
1131
|
+
}
|
|
1132
|
+
}];
|
|
1133
|
+
const cursor = IndexLevel.createCursorFromLastArrayItem(items, 'date');
|
|
1134
|
+
expect(cursor === null || cursor === void 0 ? void 0 : cursor.messageCid).to.equal('cid-2'); // expect the cursor to equal the messageCid
|
|
1135
|
+
expect(cursor === null || cursor === void 0 ? void 0 : cursor.value).to.equal('2023-12-14T11:22:33.000000Z');
|
|
1136
|
+
}));
|
|
1137
|
+
});
|
|
1138
|
+
describe('encodeValue', () => {
|
|
1139
|
+
it('should wrap string in quotes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1140
|
+
expect(IndexLevel.encodeValue('test')).to.equal(`"test"`);
|
|
1141
|
+
}));
|
|
1142
|
+
it('should return string encoded number using encodeNumberValue()', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1143
|
+
expect(IndexLevel.encodeValue(10)).to.equal(IndexLevel.encodeNumberValue(10));
|
|
1144
|
+
}));
|
|
1145
|
+
it('should return stringified boolean', () => {
|
|
1146
|
+
expect(IndexLevel.encodeValue(true)).to.equal('true');
|
|
1147
|
+
expect(IndexLevel.encodeValue(false)).to.equal('false');
|
|
1148
|
+
});
|
|
1149
|
+
});
|
|
1150
|
+
describe('encodeNumberValue', () => {
|
|
1151
|
+
it('should encode positive digits and pad with leading zeros', () => {
|
|
1152
|
+
const expectedLength = String(Number.MAX_SAFE_INTEGER).length; //16
|
|
1153
|
+
const encoded = IndexLevel.encodeNumberValue(100);
|
|
1154
|
+
expect(encoded.length).to.equal(expectedLength);
|
|
1155
|
+
expect(encoded).to.equal('0000000000000100');
|
|
1156
|
+
});
|
|
1157
|
+
it('should encode negative digits as an offset with a prefix', () => {
|
|
1158
|
+
const expectedPrefix = '!';
|
|
1159
|
+
// expected length is maximum padding + the prefix.
|
|
1160
|
+
const expectedLength = (expectedPrefix + String(Number.MAX_SAFE_INTEGER)).length; //17
|
|
1161
|
+
const encoded = IndexLevel.encodeNumberValue(-100);
|
|
1162
|
+
expect(encoded.length).to.equal(String(Number.MIN_SAFE_INTEGER).length);
|
|
1163
|
+
expect(encoded.length).to.equal(expectedLength);
|
|
1164
|
+
expect(encoded).to.equal('!9007199254740891');
|
|
1165
|
+
});
|
|
1166
|
+
it('should encode digits to sort using lexicographical comparison', () => {
|
|
1167
|
+
const digits = [-1000, -100, -10, 10, 100, 1000].sort((a, b) => a - b);
|
|
1168
|
+
const encodedDigits = digits.map(d => IndexLevel.encodeNumberValue(d))
|
|
1169
|
+
.sort((a, b) => lexicographicalCompare(a, b));
|
|
1170
|
+
digits.forEach((n, i) => expect(encodedDigits.at(i)).to.equal(IndexLevel.encodeNumberValue(n)));
|
|
1171
|
+
});
|
|
1172
|
+
});
|
|
1173
|
+
describe('isFilterConcise', () => {
|
|
1174
|
+
const queryOptionsWithCursor = { sortProperty: 'sort', cursor: { messageCid: 'messageCid', value: 'value' } };
|
|
1175
|
+
const queryOptionsWithoutCursor = { sortProperty: 'sort' };
|
|
1176
|
+
it('recordId is always concise', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1177
|
+
expect(IndexLevel.isFilterConcise({ recordId: 'record-id' }, queryOptionsWithCursor)).to.equal(true);
|
|
1178
|
+
expect(IndexLevel.isFilterConcise({ recordId: 'record-id' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1179
|
+
}));
|
|
1180
|
+
it('other than if `recordId` exists, if a cursor exists it is never concise', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1181
|
+
expect(IndexLevel.isFilterConcise({ schema: 'schema', contextId: 'contextId', parentId: 'parentId' }, queryOptionsWithCursor)).to.equal(false);
|
|
1182
|
+
// control
|
|
1183
|
+
expect(IndexLevel.isFilterConcise({ schema: 'schema', contextId: 'contextId', parentId: 'parentId' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1184
|
+
expect(IndexLevel.isFilterConcise({ recordId: 'record-id' }, queryOptionsWithCursor)).to.equal(true);
|
|
1185
|
+
}));
|
|
1186
|
+
it('if there is no cursor - protocolPath, contextId, parentId, or schema return a concise filter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1187
|
+
expect(IndexLevel.isFilterConcise({ protocolPath: 'protocolPath' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1188
|
+
expect(IndexLevel.isFilterConcise({ protocolPath: 'protocolPath' }, queryOptionsWithCursor)).to.equal(false); // control
|
|
1189
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'contextId' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1190
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'contextId' }, queryOptionsWithCursor)).to.equal(false); // control
|
|
1191
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'parentId' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1192
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'parentId' }, queryOptionsWithCursor)).to.equal(false); // control
|
|
1193
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'schema' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1194
|
+
expect(IndexLevel.isFilterConcise({ contextId: 'schema' }, queryOptionsWithCursor)).to.equal(false); // control
|
|
1195
|
+
}));
|
|
1196
|
+
it('if there is no cursor, and it is not one of the conditions, return not concise', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1197
|
+
expect(IndexLevel.isFilterConcise({ dataSize: { gt: 123 } }, queryOptionsWithoutCursor)).to.equal(false);
|
|
1198
|
+
// control
|
|
1199
|
+
expect(IndexLevel.isFilterConcise({ schema: 'schema', contextId: 'contextId', parentId: 'parentId' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1200
|
+
}));
|
|
1201
|
+
it('if protocol filter exists by itself it is not a concise filter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1202
|
+
expect(IndexLevel.isFilterConcise({ protocol: 'protocol' }, queryOptionsWithoutCursor)).to.equal(false);
|
|
1203
|
+
// control
|
|
1204
|
+
expect(IndexLevel.isFilterConcise({ protocol: 'protocol', protocolPath: 'path/to' }, queryOptionsWithoutCursor)).to.equal(true);
|
|
1205
|
+
}));
|
|
1206
|
+
});
|
|
1207
|
+
});
|
|
1208
|
+
//# sourceMappingURL=index-level.spec.js.map
|