@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.
Files changed (810) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +352 -0
  3. package/dist/bundles/dwn.js +153 -0
  4. package/dist/cjs/index.js +36749 -0
  5. package/dist/cjs/package.json +1 -0
  6. package/dist/esm/generated/precompiled-validators.js +11973 -0
  7. package/dist/esm/generated/precompiled-validators.js.map +1 -0
  8. package/dist/esm/json-schemas/definitions.json +23 -0
  9. package/dist/esm/src/core/abstract-message.js +47 -0
  10. package/dist/esm/src/core/abstract-message.js.map +1 -0
  11. package/dist/esm/src/core/auth.js +39 -0
  12. package/dist/esm/src/core/auth.js.map +1 -0
  13. package/dist/esm/src/core/dwn-constant.js +10 -0
  14. package/dist/esm/src/core/dwn-constant.js.map +1 -0
  15. package/dist/esm/src/core/dwn-error.js +169 -0
  16. package/dist/esm/src/core/dwn-error.js.map +1 -0
  17. package/dist/esm/src/core/grant-authorization.js +97 -0
  18. package/dist/esm/src/core/grant-authorization.js.map +1 -0
  19. package/dist/esm/src/core/message-reply.js +5 -0
  20. package/dist/esm/src/core/message-reply.js.map +1 -0
  21. package/dist/esm/src/core/message.js +233 -0
  22. package/dist/esm/src/core/message.js.map +1 -0
  23. package/dist/esm/src/core/messages-grant-authorization.js +101 -0
  24. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -0
  25. package/dist/esm/src/core/protocol-authorization.js +608 -0
  26. package/dist/esm/src/core/protocol-authorization.js.map +1 -0
  27. package/dist/esm/src/core/protocols-grant-authorization.js +66 -0
  28. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -0
  29. package/dist/esm/src/core/records-grant-authorization.js +132 -0
  30. package/dist/esm/src/core/records-grant-authorization.js.map +1 -0
  31. package/dist/esm/src/core/resumable-task-manager.js +109 -0
  32. package/dist/esm/src/core/resumable-task-manager.js.map +1 -0
  33. package/dist/esm/src/core/tenant-gate.js +20 -0
  34. package/dist/esm/src/core/tenant-gate.js.map +1 -0
  35. package/dist/esm/src/dwn.js +164 -0
  36. package/dist/esm/src/dwn.js.map +1 -0
  37. package/dist/esm/src/enums/dwn-interface-method.js +16 -0
  38. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -0
  39. package/dist/esm/src/event-log/event-emitter-stream.js +60 -0
  40. package/dist/esm/src/event-log/event-emitter-stream.js.map +1 -0
  41. package/dist/esm/src/event-log/event-log-level.js +63 -0
  42. package/dist/esm/src/event-log/event-log-level.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-query.js +71 -0
  44. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  45. package/dist/esm/src/handlers/messages-read.js +102 -0
  46. package/dist/esm/src/handlers/messages-read.js.map +1 -0
  47. package/dist/esm/src/handlers/messages-subscribe.js +81 -0
  48. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -0
  49. package/dist/esm/src/handlers/protocols-configure.js +133 -0
  50. package/dist/esm/src/handlers/protocols-configure.js.map +1 -0
  51. package/dist/esm/src/handlers/protocols-query.js +73 -0
  52. package/dist/esm/src/handlers/protocols-query.js.map +1 -0
  53. package/dist/esm/src/handlers/records-delete.js +107 -0
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -0
  55. package/dist/esm/src/handlers/records-query.js +210 -0
  56. package/dist/esm/src/handlers/records-query.js.map +1 -0
  57. package/dist/esm/src/handlers/records-read.js +169 -0
  58. package/dist/esm/src/handlers/records-read.js.map +1 -0
  59. package/dist/esm/src/handlers/records-subscribe.js +172 -0
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -0
  61. package/dist/esm/src/handlers/records-write.js +344 -0
  62. package/dist/esm/src/handlers/records-write.js.map +1 -0
  63. package/dist/esm/src/index.js +49 -0
  64. package/dist/esm/src/index.js.map +1 -0
  65. package/dist/esm/src/interfaces/messages-query.js +53 -0
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/messages-read.js +61 -0
  68. package/dist/esm/src/interfaces/messages-read.js.map +1 -0
  69. package/dist/esm/src/interfaces/messages-subscribe.js +58 -0
  70. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -0
  71. package/dist/esm/src/interfaces/protocols-configure.js +271 -0
  72. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -0
  73. package/dist/esm/src/interfaces/protocols-query.js +84 -0
  74. package/dist/esm/src/interfaces/protocols-query.js.map +1 -0
  75. package/dist/esm/src/interfaces/records-delete.js +89 -0
  76. package/dist/esm/src/interfaces/records-delete.js.map +1 -0
  77. package/dist/esm/src/interfaces/records-query.js +104 -0
  78. package/dist/esm/src/interfaces/records-query.js.map +1 -0
  79. package/dist/esm/src/interfaces/records-read.js +84 -0
  80. package/dist/esm/src/interfaces/records-read.js.map +1 -0
  81. package/dist/esm/src/interfaces/records-subscribe.js +91 -0
  82. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -0
  83. package/dist/esm/src/interfaces/records-write.js +795 -0
  84. package/dist/esm/src/interfaces/records-write.js.map +1 -0
  85. package/dist/esm/src/jose/algorithms/signing/ed25519.js +51 -0
  86. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -0
  87. package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js +20 -0
  88. package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -0
  89. package/dist/esm/src/jose/jws/general/builder.js +47 -0
  90. package/dist/esm/src/jose/jws/general/builder.js.map +1 -0
  91. package/dist/esm/src/jose/jws/general/verifier.js +97 -0
  92. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -0
  93. package/dist/esm/src/protocols/permission-grant.js +39 -0
  94. package/dist/esm/src/protocols/permission-grant.js.map +1 -0
  95. package/dist/esm/src/protocols/permission-request.js +35 -0
  96. package/dist/esm/src/protocols/permission-request.js.map +1 -0
  97. package/dist/esm/src/protocols/permissions.js +357 -0
  98. package/dist/esm/src/protocols/permissions.js.map +1 -0
  99. package/dist/esm/src/schema-validator.js +37 -0
  100. package/dist/esm/src/schema-validator.js.map +1 -0
  101. package/dist/esm/src/store/blockstore-level.js +187 -0
  102. package/dist/esm/src/store/blockstore-level.js.map +1 -0
  103. package/dist/esm/src/store/blockstore-mock.js +168 -0
  104. package/dist/esm/src/store/blockstore-mock.js.map +1 -0
  105. package/dist/esm/src/store/data-store-level.js +136 -0
  106. package/dist/esm/src/store/data-store-level.js.map +1 -0
  107. package/dist/esm/src/store/index-level.js +660 -0
  108. package/dist/esm/src/store/index-level.js.map +1 -0
  109. package/dist/esm/src/store/level-wrapper.js +305 -0
  110. package/dist/esm/src/store/level-wrapper.js.map +1 -0
  111. package/dist/esm/src/store/message-store-level.js +159 -0
  112. package/dist/esm/src/store/message-store-level.js.map +1 -0
  113. package/dist/esm/src/store/resumable-task-store-level.js +131 -0
  114. package/dist/esm/src/store/resumable-task-store-level.js.map +1 -0
  115. package/dist/esm/src/store/storage-controller.js +184 -0
  116. package/dist/esm/src/store/storage-controller.js.map +1 -0
  117. package/dist/esm/src/types/cache.js +2 -0
  118. package/dist/esm/src/types/cache.js.map +1 -0
  119. package/dist/esm/src/types/data-store.js +2 -0
  120. package/dist/esm/src/types/data-store.js.map +1 -0
  121. package/dist/esm/src/types/event-log.js +2 -0
  122. package/dist/esm/src/types/event-log.js.map +1 -0
  123. package/dist/esm/src/types/jose-types.js +2 -0
  124. package/dist/esm/src/types/jose-types.js.map +1 -0
  125. package/dist/esm/src/types/jws-types.js +2 -0
  126. package/dist/esm/src/types/jws-types.js.map +1 -0
  127. package/dist/esm/src/types/message-interface.js +2 -0
  128. package/dist/esm/src/types/message-interface.js.map +1 -0
  129. package/dist/esm/src/types/message-store.js +2 -0
  130. package/dist/esm/src/types/message-store.js.map +1 -0
  131. package/dist/esm/src/types/message-types.js +3 -0
  132. package/dist/esm/src/types/message-types.js.map +1 -0
  133. package/dist/esm/src/types/messages-types.js +2 -0
  134. package/dist/esm/src/types/messages-types.js.map +1 -0
  135. package/dist/esm/src/types/method-handler.js +2 -0
  136. package/dist/esm/src/types/method-handler.js.map +1 -0
  137. package/dist/esm/src/types/permission-types.js +6 -0
  138. package/dist/esm/src/types/permission-types.js.map +1 -0
  139. package/dist/esm/src/types/protocols-types.js +20 -0
  140. package/dist/esm/src/types/protocols-types.js.map +1 -0
  141. package/dist/esm/src/types/query-types.js +6 -0
  142. package/dist/esm/src/types/query-types.js.map +1 -0
  143. package/dist/esm/src/types/records-types.js +8 -0
  144. package/dist/esm/src/types/records-types.js.map +1 -0
  145. package/dist/esm/src/types/resumable-task-store.js +2 -0
  146. package/dist/esm/src/types/resumable-task-store.js.map +1 -0
  147. package/dist/esm/src/types/signer.js +2 -0
  148. package/dist/esm/src/types/signer.js.map +1 -0
  149. package/dist/esm/src/types/subscriptions.js +2 -0
  150. package/dist/esm/src/types/subscriptions.js.map +1 -0
  151. package/dist/esm/src/utils/abort.js +40 -0
  152. package/dist/esm/src/utils/abort.js.map +1 -0
  153. package/dist/esm/src/utils/array.js +72 -0
  154. package/dist/esm/src/utils/array.js.map +1 -0
  155. package/dist/esm/src/utils/cid.js +130 -0
  156. package/dist/esm/src/utils/cid.js.map +1 -0
  157. package/dist/esm/src/utils/data-stream.js +100 -0
  158. package/dist/esm/src/utils/data-stream.js.map +1 -0
  159. package/dist/esm/src/utils/encoder.js +45 -0
  160. package/dist/esm/src/utils/encoder.js.map +1 -0
  161. package/dist/esm/src/utils/encryption.js +128 -0
  162. package/dist/esm/src/utils/encryption.js.map +1 -0
  163. package/dist/esm/src/utils/filter.js +229 -0
  164. package/dist/esm/src/utils/filter.js.map +1 -0
  165. package/dist/esm/src/utils/hd-key.js +114 -0
  166. package/dist/esm/src/utils/hd-key.js.map +1 -0
  167. package/dist/esm/src/utils/jws.js +89 -0
  168. package/dist/esm/src/utils/jws.js.map +1 -0
  169. package/dist/esm/src/utils/memory-cache.js +41 -0
  170. package/dist/esm/src/utils/memory-cache.js.map +1 -0
  171. package/dist/esm/src/utils/messages.js +84 -0
  172. package/dist/esm/src/utils/messages.js.map +1 -0
  173. package/dist/esm/src/utils/object.js +40 -0
  174. package/dist/esm/src/utils/object.js.map +1 -0
  175. package/dist/esm/src/utils/private-key-signer.js +43 -0
  176. package/dist/esm/src/utils/private-key-signer.js.map +1 -0
  177. package/dist/esm/src/utils/protocols.js +51 -0
  178. package/dist/esm/src/utils/protocols.js.map +1 -0
  179. package/dist/esm/src/utils/records.js +454 -0
  180. package/dist/esm/src/utils/records.js.map +1 -0
  181. package/dist/esm/src/utils/secp256k1.js +166 -0
  182. package/dist/esm/src/utils/secp256k1.js.map +1 -0
  183. package/dist/esm/src/utils/secp256r1.js +120 -0
  184. package/dist/esm/src/utils/secp256r1.js.map +1 -0
  185. package/dist/esm/src/utils/string.js +16 -0
  186. package/dist/esm/src/utils/string.js.map +1 -0
  187. package/dist/esm/src/utils/time.js +85 -0
  188. package/dist/esm/src/utils/time.js.map +1 -0
  189. package/dist/esm/src/utils/url.js +62 -0
  190. package/dist/esm/src/utils/url.js.map +1 -0
  191. package/dist/esm/tests/core/auth.spec.js +22 -0
  192. package/dist/esm/tests/core/auth.spec.js.map +1 -0
  193. package/dist/esm/tests/core/message-reply.spec.js +16 -0
  194. package/dist/esm/tests/core/message-reply.spec.js.map +1 -0
  195. package/dist/esm/tests/core/message.spec.js +146 -0
  196. package/dist/esm/tests/core/message.spec.js.map +1 -0
  197. package/dist/esm/tests/core/protocol-authorization.spec.js +48 -0
  198. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -0
  199. package/dist/esm/tests/dwn.spec.js +166 -0
  200. package/dist/esm/tests/dwn.spec.js.map +1 -0
  201. package/dist/esm/tests/event-log/event-emitter-stream.spec.js +78 -0
  202. package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +1 -0
  203. package/dist/esm/tests/event-log/event-log-level.spec.js +44 -0
  204. package/dist/esm/tests/event-log/event-log-level.spec.js.map +1 -0
  205. package/dist/esm/tests/event-log/event-log.spec.js +236 -0
  206. package/dist/esm/tests/event-log/event-log.spec.js.map +1 -0
  207. package/dist/esm/tests/event-log/event-stream.spec.js +125 -0
  208. package/dist/esm/tests/event-log/event-stream.spec.js.map +1 -0
  209. package/dist/esm/tests/features/author-delegated-grant.spec.js +1273 -0
  210. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -0
  211. package/dist/esm/tests/features/owner-delegated-grant.spec.js +584 -0
  212. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -0
  213. package/dist/esm/tests/features/owner-signature.spec.js +192 -0
  214. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -0
  215. package/dist/esm/tests/features/permissions.spec.js +815 -0
  216. package/dist/esm/tests/features/permissions.spec.js.map +1 -0
  217. package/dist/esm/tests/features/protocol-create-action.spec.js +248 -0
  218. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -0
  219. package/dist/esm/tests/features/protocol-delete-action.spec.js +492 -0
  220. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -0
  221. package/dist/esm/tests/features/protocol-update-action.spec.js +572 -0
  222. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -0
  223. package/dist/esm/tests/features/records-prune.spec.js +812 -0
  224. package/dist/esm/tests/features/records-prune.spec.js.map +1 -0
  225. package/dist/esm/tests/features/records-tags.spec.js +2516 -0
  226. package/dist/esm/tests/features/records-tags.spec.js.map +1 -0
  227. package/dist/esm/tests/features/resumable-tasks.spec.js +349 -0
  228. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -0
  229. package/dist/esm/tests/handlers/messages-query.spec.js +349 -0
  230. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  231. package/dist/esm/tests/handlers/messages-read.spec.js +647 -0
  232. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -0
  233. package/dist/esm/tests/handlers/messages-subscribe.spec.js +432 -0
  234. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -0
  235. package/dist/esm/tests/handlers/protocols-configure.spec.js +608 -0
  236. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -0
  237. package/dist/esm/tests/handlers/protocols-query.spec.js +454 -0
  238. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -0
  239. package/dist/esm/tests/handlers/records-delete.spec.js +662 -0
  240. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -0
  241. package/dist/esm/tests/handlers/records-query.spec.js +2695 -0
  242. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -0
  243. package/dist/esm/tests/handlers/records-read.spec.js +1724 -0
  244. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -0
  245. package/dist/esm/tests/handlers/records-subscribe.spec.js +684 -0
  246. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -0
  247. package/dist/esm/tests/handlers/records-write.spec.js +3637 -0
  248. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -0
  249. package/dist/esm/tests/interfaces/messages-get.spec.js +78 -0
  250. package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -0
  251. package/dist/esm/tests/interfaces/messages-subscribe.spec.js +30 -0
  252. package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -0
  253. package/dist/esm/tests/interfaces/messagess-query.spec.js +127 -0
  254. package/dist/esm/tests/interfaces/messagess-query.spec.js.map +1 -0
  255. package/dist/esm/tests/interfaces/protocols-configure.spec.js +489 -0
  256. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -0
  257. package/dist/esm/tests/interfaces/protocols-query.spec.js +46 -0
  258. package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -0
  259. package/dist/esm/tests/interfaces/records-delete.spec.js +39 -0
  260. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -0
  261. package/dist/esm/tests/interfaces/records-query.spec.js +85 -0
  262. package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -0
  263. package/dist/esm/tests/interfaces/records-read.spec.js +62 -0
  264. package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -0
  265. package/dist/esm/tests/interfaces/records-subscribe.spec.js +72 -0
  266. package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -0
  267. package/dist/esm/tests/interfaces/records-write.spec.js +423 -0
  268. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -0
  269. package/dist/esm/tests/jose/jws/general.spec.js +243 -0
  270. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -0
  271. package/dist/esm/tests/protocols/permission-request.spec.js +40 -0
  272. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -0
  273. package/dist/esm/tests/protocols/permissions.spec.js +123 -0
  274. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -0
  275. package/dist/esm/tests/scenarios/aggregator.spec.js +670 -0
  276. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -0
  277. package/dist/esm/tests/scenarios/deleted-record.spec.js +102 -0
  278. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -0
  279. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +220 -0
  280. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -0
  281. package/dist/esm/tests/scenarios/messages-query.spec.js +395 -0
  282. package/dist/esm/tests/scenarios/messages-query.spec.js.map +1 -0
  283. package/dist/esm/tests/scenarios/nested-roles.spec.js +300 -0
  284. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -0
  285. package/dist/esm/tests/scenarios/subscriptions.spec.js +886 -0
  286. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -0
  287. package/dist/esm/tests/store/blockstore-mock.spec.js +192 -0
  288. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -0
  289. package/dist/esm/tests/store/data-store-level.spec.js +146 -0
  290. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -0
  291. package/dist/esm/tests/store/index-level.spec.js +1208 -0
  292. package/dist/esm/tests/store/index-level.spec.js.map +1 -0
  293. package/dist/esm/tests/store/message-store-level.spec.js +48 -0
  294. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -0
  295. package/dist/esm/tests/store/message-store.spec.js +404 -0
  296. package/dist/esm/tests/store/message-store.spec.js.map +1 -0
  297. package/dist/esm/tests/store-dependent-tests.spec.js +5 -0
  298. package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -0
  299. package/dist/esm/tests/test-event-stream.js +25 -0
  300. package/dist/esm/tests/test-event-stream.js.map +1 -0
  301. package/dist/esm/tests/test-stores.js +45 -0
  302. package/dist/esm/tests/test-stores.js.map +1 -0
  303. package/dist/esm/tests/test-suite.js +88 -0
  304. package/dist/esm/tests/test-suite.js.map +1 -0
  305. package/dist/esm/tests/utils/cid.spec.js +80 -0
  306. package/dist/esm/tests/utils/cid.spec.js.map +1 -0
  307. package/dist/esm/tests/utils/data-stream.spec.js +27 -0
  308. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -0
  309. package/dist/esm/tests/utils/encryption.spec.js +148 -0
  310. package/dist/esm/tests/utils/encryption.spec.js.map +1 -0
  311. package/dist/esm/tests/utils/filters.spec.js +295 -0
  312. package/dist/esm/tests/utils/filters.spec.js.map +1 -0
  313. package/dist/esm/tests/utils/hd-key.spec.js +35 -0
  314. package/dist/esm/tests/utils/hd-key.spec.js.map +1 -0
  315. package/dist/esm/tests/utils/jws.spec.js +8 -0
  316. package/dist/esm/tests/utils/jws.spec.js.map +1 -0
  317. package/dist/esm/tests/utils/memory-cache.spec.js +35 -0
  318. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -0
  319. package/dist/esm/tests/utils/messages.spec.js +101 -0
  320. package/dist/esm/tests/utils/messages.spec.js.map +1 -0
  321. package/dist/esm/tests/utils/object.spec.js +36 -0
  322. package/dist/esm/tests/utils/object.spec.js.map +1 -0
  323. package/dist/esm/tests/utils/poller.js +49 -0
  324. package/dist/esm/tests/utils/poller.js.map +1 -0
  325. package/dist/esm/tests/utils/private-key-signer.spec.js +44 -0
  326. package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -0
  327. package/dist/esm/tests/utils/records.spec.js +53 -0
  328. package/dist/esm/tests/utils/records.spec.js.map +1 -0
  329. package/dist/esm/tests/utils/secp256k1.spec.js +50 -0
  330. package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -0
  331. package/dist/esm/tests/utils/secp256r1.spec.js +56 -0
  332. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -0
  333. package/dist/esm/tests/utils/test-data-generator.js +643 -0
  334. package/dist/esm/tests/utils/test-data-generator.js.map +1 -0
  335. package/dist/esm/tests/utils/test-stub-generator.js +39 -0
  336. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -0
  337. package/dist/esm/tests/utils/time.spec.js +64 -0
  338. package/dist/esm/tests/utils/time.spec.js.map +1 -0
  339. package/dist/esm/tests/utils/url.spec.js +43 -0
  340. package/dist/esm/tests/utils/url.spec.js.map +1 -0
  341. package/dist/esm/tests/validation/json-schemas/definitions.spec.js +33 -0
  342. package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -0
  343. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +50 -0
  344. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -0
  345. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +36 -0
  346. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -0
  347. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +82 -0
  348. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -0
  349. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +75 -0
  350. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -0
  351. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +148 -0
  352. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -0
  353. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +421 -0
  354. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -0
  355. package/dist/esm/tests/vectors/protocol-definitions/anyone-collaborate.json +21 -0
  356. package/dist/esm/tests/vectors/protocol-definitions/author-can.json +33 -0
  357. package/dist/esm/tests/vectors/protocol-definitions/chat.json +70 -0
  358. package/dist/esm/tests/vectors/protocol-definitions/credential-issuance.json +41 -0
  359. package/dist/esm/tests/vectors/protocol-definitions/dex.json +58 -0
  360. package/dist/esm/tests/vectors/protocol-definitions/email.json +62 -0
  361. package/dist/esm/tests/vectors/protocol-definitions/free-for-all.json +45 -0
  362. package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +48 -0
  363. package/dist/esm/tests/vectors/protocol-definitions/message.json +37 -0
  364. package/dist/esm/tests/vectors/protocol-definitions/minimal.json +10 -0
  365. package/dist/esm/tests/vectors/protocol-definitions/nested.json +31 -0
  366. package/dist/esm/tests/vectors/protocol-definitions/private-protocol.json +15 -0
  367. package/dist/esm/tests/vectors/protocol-definitions/recipient-can.json +33 -0
  368. package/dist/esm/tests/vectors/protocol-definitions/slack.json +242 -0
  369. package/dist/esm/tests/vectors/protocol-definitions/social-media.json +106 -0
  370. package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +70 -0
  371. package/dist/types/generated/precompiled-validators.d.ts +597 -0
  372. package/dist/types/generated/precompiled-validators.d.ts.map +1 -0
  373. package/dist/types/src/core/abstract-message.d.ts +25 -0
  374. package/dist/types/src/core/abstract-message.d.ts.map +1 -0
  375. package/dist/types/src/core/auth.d.ts +9 -0
  376. package/dist/types/src/core/auth.d.ts.map +1 -0
  377. package/dist/types/src/core/dwn-constant.d.ts +10 -0
  378. package/dist/types/src/core/dwn-constant.d.ts.map +1 -0
  379. package/dist/types/src/core/dwn-error.d.ts +164 -0
  380. package/dist/types/src/core/dwn-error.d.ts.map +1 -0
  381. package/dist/types/src/core/grant-authorization.d.ts +43 -0
  382. package/dist/types/src/core/grant-authorization.d.ts.map +1 -0
  383. package/dist/types/src/core/message-reply.d.ts +32 -0
  384. package/dist/types/src/core/message-reply.d.ts.map +1 -0
  385. package/dist/types/src/core/message.d.ts +94 -0
  386. package/dist/types/src/core/message.d.ts.map +1 -0
  387. package/dist/types/src/core/messages-grant-authorization.d.ts +34 -0
  388. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -0
  389. package/dist/types/src/core/protocol-authorization.d.ts +103 -0
  390. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -0
  391. package/dist/types/src/core/protocols-grant-authorization.d.ts +31 -0
  392. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -0
  393. package/dist/types/src/core/records-grant-authorization.d.ts +60 -0
  394. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -0
  395. package/dist/types/src/core/resumable-task-manager.d.ts +43 -0
  396. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -0
  397. package/dist/types/src/core/tenant-gate.d.ts +29 -0
  398. package/dist/types/src/core/tenant-gate.d.ts.map +1 -0
  399. package/dist/types/src/dwn.d.ts +85 -0
  400. package/dist/types/src/dwn.d.ts.map +1 -0
  401. package/dist/types/src/enums/dwn-interface-method.d.ts +14 -0
  402. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -0
  403. package/dist/types/src/event-log/event-emitter-stream.d.ts +23 -0
  404. package/dist/types/src/event-log/event-emitter-stream.d.ts.map +1 -0
  405. package/dist/types/src/event-log/event-log-level.d.ts +35 -0
  406. package/dist/types/src/event-log/event-log-level.d.ts.map +1 -0
  407. package/dist/types/src/handlers/messages-query.d.ts +17 -0
  408. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  409. package/dist/types/src/handlers/messages-read.d.ts +22 -0
  410. package/dist/types/src/handlers/messages-read.d.ts.map +1 -0
  411. package/dist/types/src/handlers/messages-subscribe.d.ts +18 -0
  412. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -0
  413. package/dist/types/src/handlers/protocols-configure.d.ts +24 -0
  414. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -0
  415. package/dist/types/src/handlers/protocols-query.d.ts +20 -0
  416. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -0
  417. package/dist/types/src/handlers/records-delete.d.ts +23 -0
  418. package/dist/types/src/handlers/records-delete.d.ts.map +1 -0
  419. package/dist/types/src/handlers/records-query.d.ts +70 -0
  420. package/dist/types/src/handlers/records-query.d.ts.map +1 -0
  421. package/dist/types/src/handlers/records-read.d.ts +20 -0
  422. package/dist/types/src/handlers/records-read.d.ts.map +1 -0
  423. package/dist/types/src/handlers/records-subscribe.d.ts +62 -0
  424. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -0
  425. package/dist/types/src/handlers/records-write.d.ts +51 -0
  426. package/dist/types/src/handlers/records-write.d.ts.map +1 -0
  427. package/dist/types/src/index.d.ts +63 -0
  428. package/dist/types/src/index.d.ts.map +1 -0
  429. package/dist/types/src/interfaces/messages-query.d.ts +16 -0
  430. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  431. package/dist/types/src/interfaces/messages-read.d.ts +20 -0
  432. package/dist/types/src/interfaces/messages-read.d.ts.map +1 -0
  433. package/dist/types/src/interfaces/messages-subscribe.d.ts +20 -0
  434. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -0
  435. package/dist/types/src/interfaces/protocols-configure.d.ts +40 -0
  436. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -0
  437. package/dist/types/src/interfaces/protocols-query.d.ts +17 -0
  438. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -0
  439. package/dist/types/src/interfaces/records-delete.d.ts +34 -0
  440. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -0
  441. package/dist/types/src/interfaces/records-query.d.ts +31 -0
  442. package/dist/types/src/interfaces/records-query.d.ts.map +1 -0
  443. package/dist/types/src/interfaces/records-read.d.ts +36 -0
  444. package/dist/types/src/interfaces/records-read.d.ts.map +1 -0
  445. package/dist/types/src/interfaces/records-subscribe.d.ts +27 -0
  446. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -0
  447. package/dist/types/src/interfaces/records-write.d.ts +309 -0
  448. package/dist/types/src/interfaces/records-write.d.ts.map +1 -0
  449. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts +3 -0
  450. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -0
  451. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +3 -0
  452. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -0
  453. package/dist/types/src/jose/jws/general/builder.d.ts +10 -0
  454. package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -0
  455. package/dist/types/src/jose/jws/general/verifier.d.ts +32 -0
  456. package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -0
  457. package/dist/types/src/protocols/permission-grant.d.ts +50 -0
  458. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -0
  459. package/dist/types/src/protocols/permission-request.d.ts +35 -0
  460. package/dist/types/src/protocols/permission-request.d.ts.map +1 -0
  461. package/dist/types/src/protocols/permissions.d.ts +150 -0
  462. package/dist/types/src/protocols/permissions.d.ts.map +1 -0
  463. package/dist/types/src/schema-validator.d.ts +8 -0
  464. package/dist/types/src/schema-validator.d.ts.map +1 -0
  465. package/dist/types/src/store/blockstore-level.d.ts +34 -0
  466. package/dist/types/src/store/blockstore-level.d.ts.map +1 -0
  467. package/dist/types/src/store/blockstore-mock.d.ts +27 -0
  468. package/dist/types/src/store/blockstore-mock.d.ts.map +1 -0
  469. package/dist/types/src/store/data-store-level.d.ts +34 -0
  470. package/dist/types/src/store/data-store-level.d.ts.map +1 -0
  471. package/dist/types/src/store/index-level.d.ts +171 -0
  472. package/dist/types/src/store/index-level.d.ts.map +1 -0
  473. package/dist/types/src/store/level-wrapper.d.ts +48 -0
  474. package/dist/types/src/store/level-wrapper.d.ts.map +1 -0
  475. package/dist/types/src/store/message-store-level.d.ts +46 -0
  476. package/dist/types/src/store/message-store-level.d.ts.map +1 -0
  477. package/dist/types/src/store/resumable-task-store-level.d.ts +28 -0
  478. package/dist/types/src/store/resumable-task-store-level.d.ts.map +1 -0
  479. package/dist/types/src/store/storage-controller.d.ts +46 -0
  480. package/dist/types/src/store/storage-controller.d.ts.map +1 -0
  481. package/dist/types/src/types/cache.d.ts +16 -0
  482. package/dist/types/src/types/cache.d.ts.map +1 -0
  483. package/dist/types/src/types/data-store.d.ts +57 -0
  484. package/dist/types/src/types/data-store.d.ts.map +1 -0
  485. package/dist/types/src/types/event-log.d.ts +52 -0
  486. package/dist/types/src/types/event-log.d.ts.map +1 -0
  487. package/dist/types/src/types/jose-types.d.ts +75 -0
  488. package/dist/types/src/types/jose-types.d.ts.map +1 -0
  489. package/dist/types/src/types/jws-types.d.ts +27 -0
  490. package/dist/types/src/types/jws-types.d.ts.map +1 -0
  491. package/dist/types/src/types/message-interface.d.ts +27 -0
  492. package/dist/types/src/types/message-interface.d.ts.map +1 -0
  493. package/dist/types/src/types/message-store.d.ts +42 -0
  494. package/dist/types/src/types/message-store.d.ts.map +1 -0
  495. package/dist/types/src/types/message-types.d.ts +116 -0
  496. package/dist/types/src/types/message-types.d.ts.map +1 -0
  497. package/dist/types/src/types/messages-types.d.ts +65 -0
  498. package/dist/types/src/types/messages-types.d.ts.map +1 -0
  499. package/dist/types/src/types/method-handler.d.ts +19 -0
  500. package/dist/types/src/types/method-handler.d.ts.map +1 -0
  501. package/dist/types/src/types/permission-types.d.ts +93 -0
  502. package/dist/types/src/types/permission-types.d.ts.map +1 -0
  503. package/dist/types/src/types/protocols-types.d.ts +154 -0
  504. package/dist/types/src/types/protocols-types.d.ts.map +1 -0
  505. package/dist/types/src/types/query-types.d.ts +66 -0
  506. package/dist/types/src/types/query-types.d.ts.map +1 -0
  507. package/dist/types/src/types/records-types.d.ts +230 -0
  508. package/dist/types/src/types/records-types.d.ts.map +1 -0
  509. package/dist/types/src/types/resumable-task-store.d.ts +89 -0
  510. package/dist/types/src/types/resumable-task-store.d.ts.map +1 -0
  511. package/dist/types/src/types/signer.d.ts +26 -0
  512. package/dist/types/src/types/signer.d.ts.map +1 -0
  513. package/dist/types/src/types/subscriptions.d.ts +30 -0
  514. package/dist/types/src/types/subscriptions.d.ts.map +1 -0
  515. package/dist/types/src/utils/abort.d.ts +5 -0
  516. package/dist/types/src/utils/abort.d.ts.map +1 -0
  517. package/dist/types/src/utils/array.d.ts +18 -0
  518. package/dist/types/src/utils/array.d.ts.map +1 -0
  519. package/dist/types/src/utils/cid.d.ts +30 -0
  520. package/dist/types/src/utils/cid.d.ts.map +1 -0
  521. package/dist/types/src/utils/data-stream.d.ts +31 -0
  522. package/dist/types/src/utils/data-stream.d.ts.map +1 -0
  523. package/dist/types/src/utils/encoder.d.ts +14 -0
  524. package/dist/types/src/utils/encoder.d.ts.map +1 -0
  525. package/dist/types/src/utils/encryption.d.ts +44 -0
  526. package/dist/types/src/utils/encryption.d.ts.map +1 -0
  527. package/dist/types/src/utils/filter.d.ts +60 -0
  528. package/dist/types/src/utils/filter.d.ts.map +1 -0
  529. package/dist/types/src/utils/hd-key.d.ts +54 -0
  530. package/dist/types/src/utils/hd-key.d.ts.map +1 -0
  531. package/dist/types/src/utils/jws.d.ts +39 -0
  532. package/dist/types/src/utils/jws.d.ts.map +1 -0
  533. package/dist/types/src/utils/memory-cache.d.ts +15 -0
  534. package/dist/types/src/utils/memory-cache.d.ts.map +1 -0
  535. package/dist/types/src/utils/messages.d.ts +27 -0
  536. package/dist/types/src/utils/messages.d.ts.map +1 -0
  537. package/dist/types/src/utils/object.d.ts +13 -0
  538. package/dist/types/src/utils/object.d.ts.map +1 -0
  539. package/dist/types/src/utils/private-key-signer.d.ts +34 -0
  540. package/dist/types/src/utils/private-key-signer.d.ts.map +1 -0
  541. package/dist/types/src/utils/protocols.d.ts +14 -0
  542. package/dist/types/src/utils/protocols.d.ts.map +1 -0
  543. package/dist/types/src/utils/records.d.ts +122 -0
  544. package/dist/types/src/utils/records.d.ts.map +1 -0
  545. package/dist/types/src/utils/secp256k1.d.ts +59 -0
  546. package/dist/types/src/utils/secp256k1.d.ts.map +1 -0
  547. package/dist/types/src/utils/secp256r1.d.ts +39 -0
  548. package/dist/types/src/utils/secp256r1.d.ts.map +1 -0
  549. package/dist/types/src/utils/string.d.ts +6 -0
  550. package/dist/types/src/utils/string.d.ts.map +1 -0
  551. package/dist/types/src/utils/time.d.ts +50 -0
  552. package/dist/types/src/utils/time.d.ts.map +1 -0
  553. package/dist/types/src/utils/url.d.ts +5 -0
  554. package/dist/types/src/utils/url.d.ts.map +1 -0
  555. package/dist/types/tests/core/auth.spec.d.ts +2 -0
  556. package/dist/types/tests/core/auth.spec.d.ts.map +1 -0
  557. package/dist/types/tests/core/message-reply.spec.d.ts +2 -0
  558. package/dist/types/tests/core/message-reply.spec.d.ts.map +1 -0
  559. package/dist/types/tests/core/message.spec.d.ts +2 -0
  560. package/dist/types/tests/core/message.spec.d.ts.map +1 -0
  561. package/dist/types/tests/core/protocol-authorization.spec.d.ts +2 -0
  562. package/dist/types/tests/core/protocol-authorization.spec.d.ts.map +1 -0
  563. package/dist/types/tests/dwn.spec.d.ts +2 -0
  564. package/dist/types/tests/dwn.spec.d.ts.map +1 -0
  565. package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts +2 -0
  566. package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +1 -0
  567. package/dist/types/tests/event-log/event-log-level.spec.d.ts +2 -0
  568. package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +1 -0
  569. package/dist/types/tests/event-log/event-log.spec.d.ts +2 -0
  570. package/dist/types/tests/event-log/event-log.spec.d.ts.map +1 -0
  571. package/dist/types/tests/event-log/event-stream.spec.d.ts +2 -0
  572. package/dist/types/tests/event-log/event-stream.spec.d.ts.map +1 -0
  573. package/dist/types/tests/features/author-delegated-grant.spec.d.ts +2 -0
  574. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -0
  575. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts +2 -0
  576. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -0
  577. package/dist/types/tests/features/owner-signature.spec.d.ts +2 -0
  578. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -0
  579. package/dist/types/tests/features/permissions.spec.d.ts +2 -0
  580. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -0
  581. package/dist/types/tests/features/protocol-create-action.spec.d.ts +2 -0
  582. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -0
  583. package/dist/types/tests/features/protocol-delete-action.spec.d.ts +2 -0
  584. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -0
  585. package/dist/types/tests/features/protocol-update-action.spec.d.ts +2 -0
  586. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -0
  587. package/dist/types/tests/features/records-prune.spec.d.ts +2 -0
  588. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -0
  589. package/dist/types/tests/features/records-tags.spec.d.ts +2 -0
  590. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -0
  591. package/dist/types/tests/features/resumable-tasks.spec.d.ts +2 -0
  592. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -0
  593. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  594. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  595. package/dist/types/tests/handlers/messages-read.spec.d.ts +2 -0
  596. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -0
  597. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts +2 -0
  598. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -0
  599. package/dist/types/tests/handlers/protocols-configure.spec.d.ts +2 -0
  600. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -0
  601. package/dist/types/tests/handlers/protocols-query.spec.d.ts +2 -0
  602. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -0
  603. package/dist/types/tests/handlers/records-delete.spec.d.ts +2 -0
  604. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -0
  605. package/dist/types/tests/handlers/records-query.spec.d.ts +2 -0
  606. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -0
  607. package/dist/types/tests/handlers/records-read.spec.d.ts +2 -0
  608. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -0
  609. package/dist/types/tests/handlers/records-subscribe.spec.d.ts +2 -0
  610. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -0
  611. package/dist/types/tests/handlers/records-write.spec.d.ts +2 -0
  612. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -0
  613. package/dist/types/tests/interfaces/messages-get.spec.d.ts +2 -0
  614. package/dist/types/tests/interfaces/messages-get.spec.d.ts.map +1 -0
  615. package/dist/types/tests/interfaces/messages-subscribe.spec.d.ts +2 -0
  616. package/dist/types/tests/interfaces/messages-subscribe.spec.d.ts.map +1 -0
  617. package/dist/types/tests/interfaces/messagess-query.spec.d.ts +2 -0
  618. package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +1 -0
  619. package/dist/types/tests/interfaces/protocols-configure.spec.d.ts +2 -0
  620. package/dist/types/tests/interfaces/protocols-configure.spec.d.ts.map +1 -0
  621. package/dist/types/tests/interfaces/protocols-query.spec.d.ts +2 -0
  622. package/dist/types/tests/interfaces/protocols-query.spec.d.ts.map +1 -0
  623. package/dist/types/tests/interfaces/records-delete.spec.d.ts +2 -0
  624. package/dist/types/tests/interfaces/records-delete.spec.d.ts.map +1 -0
  625. package/dist/types/tests/interfaces/records-query.spec.d.ts +2 -0
  626. package/dist/types/tests/interfaces/records-query.spec.d.ts.map +1 -0
  627. package/dist/types/tests/interfaces/records-read.spec.d.ts +2 -0
  628. package/dist/types/tests/interfaces/records-read.spec.d.ts.map +1 -0
  629. package/dist/types/tests/interfaces/records-subscribe.spec.d.ts +2 -0
  630. package/dist/types/tests/interfaces/records-subscribe.spec.d.ts.map +1 -0
  631. package/dist/types/tests/interfaces/records-write.spec.d.ts +2 -0
  632. package/dist/types/tests/interfaces/records-write.spec.d.ts.map +1 -0
  633. package/dist/types/tests/jose/jws/general.spec.d.ts +2 -0
  634. package/dist/types/tests/jose/jws/general.spec.d.ts.map +1 -0
  635. package/dist/types/tests/protocols/permission-request.spec.d.ts +2 -0
  636. package/dist/types/tests/protocols/permission-request.spec.d.ts.map +1 -0
  637. package/dist/types/tests/protocols/permissions.spec.d.ts +2 -0
  638. package/dist/types/tests/protocols/permissions.spec.d.ts.map +1 -0
  639. package/dist/types/tests/scenarios/aggregator.spec.d.ts +2 -0
  640. package/dist/types/tests/scenarios/aggregator.spec.d.ts.map +1 -0
  641. package/dist/types/tests/scenarios/deleted-record.spec.d.ts +2 -0
  642. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -0
  643. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts +2 -0
  644. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -0
  645. package/dist/types/tests/scenarios/messages-query.spec.d.ts +2 -0
  646. package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +1 -0
  647. package/dist/types/tests/scenarios/nested-roles.spec.d.ts +2 -0
  648. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -0
  649. package/dist/types/tests/scenarios/subscriptions.spec.d.ts +2 -0
  650. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -0
  651. package/dist/types/tests/store/blockstore-mock.spec.d.ts +2 -0
  652. package/dist/types/tests/store/blockstore-mock.spec.d.ts.map +1 -0
  653. package/dist/types/tests/store/data-store-level.spec.d.ts +2 -0
  654. package/dist/types/tests/store/data-store-level.spec.d.ts.map +1 -0
  655. package/dist/types/tests/store/index-level.spec.d.ts +2 -0
  656. package/dist/types/tests/store/index-level.spec.d.ts.map +1 -0
  657. package/dist/types/tests/store/message-store-level.spec.d.ts +2 -0
  658. package/dist/types/tests/store/message-store-level.spec.d.ts.map +1 -0
  659. package/dist/types/tests/store/message-store.spec.d.ts +2 -0
  660. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -0
  661. package/dist/types/tests/store-dependent-tests.spec.d.ts +2 -0
  662. package/dist/types/tests/store-dependent-tests.spec.d.ts.map +1 -0
  663. package/dist/types/tests/test-event-stream.d.ts +22 -0
  664. package/dist/types/tests/test-event-stream.d.ts.map +1 -0
  665. package/dist/types/tests/test-stores.d.ts +33 -0
  666. package/dist/types/tests/test-stores.d.ts.map +1 -0
  667. package/dist/types/tests/test-suite.d.ts +18 -0
  668. package/dist/types/tests/test-suite.d.ts.map +1 -0
  669. package/dist/types/tests/utils/cid.spec.d.ts +2 -0
  670. package/dist/types/tests/utils/cid.spec.d.ts.map +1 -0
  671. package/dist/types/tests/utils/data-stream.spec.d.ts +2 -0
  672. package/dist/types/tests/utils/data-stream.spec.d.ts.map +1 -0
  673. package/dist/types/tests/utils/encryption.spec.d.ts +2 -0
  674. package/dist/types/tests/utils/encryption.spec.d.ts.map +1 -0
  675. package/dist/types/tests/utils/filters.spec.d.ts +2 -0
  676. package/dist/types/tests/utils/filters.spec.d.ts.map +1 -0
  677. package/dist/types/tests/utils/hd-key.spec.d.ts +2 -0
  678. package/dist/types/tests/utils/hd-key.spec.d.ts.map +1 -0
  679. package/dist/types/tests/utils/jws.spec.d.ts +2 -0
  680. package/dist/types/tests/utils/jws.spec.d.ts.map +1 -0
  681. package/dist/types/tests/utils/memory-cache.spec.d.ts +2 -0
  682. package/dist/types/tests/utils/memory-cache.spec.d.ts.map +1 -0
  683. package/dist/types/tests/utils/messages.spec.d.ts +2 -0
  684. package/dist/types/tests/utils/messages.spec.d.ts.map +1 -0
  685. package/dist/types/tests/utils/object.spec.d.ts +2 -0
  686. package/dist/types/tests/utils/object.spec.d.ts.map +1 -0
  687. package/dist/types/tests/utils/poller.d.ts +21 -0
  688. package/dist/types/tests/utils/poller.d.ts.map +1 -0
  689. package/dist/types/tests/utils/private-key-signer.spec.d.ts +2 -0
  690. package/dist/types/tests/utils/private-key-signer.spec.d.ts.map +1 -0
  691. package/dist/types/tests/utils/records.spec.d.ts +2 -0
  692. package/dist/types/tests/utils/records.spec.d.ts.map +1 -0
  693. package/dist/types/tests/utils/secp256k1.spec.d.ts +2 -0
  694. package/dist/types/tests/utils/secp256k1.spec.d.ts.map +1 -0
  695. package/dist/types/tests/utils/secp256r1.spec.d.ts +2 -0
  696. package/dist/types/tests/utils/secp256r1.spec.d.ts.map +1 -0
  697. package/dist/types/tests/utils/test-data-generator.d.ts +342 -0
  698. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -0
  699. package/dist/types/tests/utils/test-stub-generator.d.ts +16 -0
  700. package/dist/types/tests/utils/test-stub-generator.d.ts.map +1 -0
  701. package/dist/types/tests/utils/time.spec.d.ts +2 -0
  702. package/dist/types/tests/utils/time.spec.d.ts.map +1 -0
  703. package/dist/types/tests/utils/url.spec.d.ts +2 -0
  704. package/dist/types/tests/utils/url.spec.d.ts.map +1 -0
  705. package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts +2 -0
  706. package/dist/types/tests/validation/json-schemas/definitions.spec.d.ts.map +1 -0
  707. package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts +2 -0
  708. package/dist/types/tests/validation/json-schemas/jwk/general-jwk.spec.d.ts.map +1 -0
  709. package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts +2 -0
  710. package/dist/types/tests/validation/json-schemas/jwk/public-jwk.spec.d.ts.map +1 -0
  711. package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts +2 -0
  712. package/dist/types/tests/validation/json-schemas/jwk-verification-method.spec.d.ts.map +1 -0
  713. package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts +2 -0
  714. package/dist/types/tests/validation/json-schemas/protocols/protocols-configure.spec.d.ts.map +1 -0
  715. package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts +2 -0
  716. package/dist/types/tests/validation/json-schemas/records/records-query.spec.d.ts.map +1 -0
  717. package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts +2 -0
  718. package/dist/types/tests/validation/json-schemas/records/records-write.spec.d.ts.map +1 -0
  719. package/package.json +167 -0
  720. package/src/core/abstract-message.ts +62 -0
  721. package/src/core/auth.ts +36 -0
  722. package/src/core/dwn-constant.ts +9 -0
  723. package/src/core/dwn-error.ts +167 -0
  724. package/src/core/grant-authorization.ts +148 -0
  725. package/src/core/message-reply.ts +41 -0
  726. package/src/core/message.ts +259 -0
  727. package/src/core/messages-grant-authorization.ts +134 -0
  728. package/src/core/protocol-authorization.ts +903 -0
  729. package/src/core/protocols-grant-authorization.ts +88 -0
  730. package/src/core/records-grant-authorization.ts +197 -0
  731. package/src/core/resumable-task-manager.ts +114 -0
  732. package/src/core/tenant-gate.ts +33 -0
  733. package/src/dwn.ts +264 -0
  734. package/src/enums/dwn-interface-method.ts +14 -0
  735. package/src/event-log/event-emitter-stream.ts +69 -0
  736. package/src/event-log/event-log-level.ts +72 -0
  737. package/src/handlers/messages-query.ts +67 -0
  738. package/src/handlers/messages-read.ts +103 -0
  739. package/src/handlers/messages-subscribe.ts +89 -0
  740. package/src/handlers/protocols-configure.ts +137 -0
  741. package/src/handlers/protocols-query.ts +82 -0
  742. package/src/handlers/records-delete.ts +124 -0
  743. package/src/handlers/records-query.ts +262 -0
  744. package/src/handlers/records-read.ts +187 -0
  745. package/src/handlers/records-subscribe.ts +218 -0
  746. package/src/handlers/records-write.ts +404 -0
  747. package/src/index.ts +67 -0
  748. package/src/interfaces/messages-query.ts +60 -0
  749. package/src/interfaces/messages-read.ts +63 -0
  750. package/src/interfaces/messages-subscribe.ts +64 -0
  751. package/src/interfaces/protocols-configure.ts +340 -0
  752. package/src/interfaces/protocols-query.ts +96 -0
  753. package/src/interfaces/records-delete.ts +117 -0
  754. package/src/interfaces/records-query.ts +131 -0
  755. package/src/interfaces/records-read.ts +100 -0
  756. package/src/interfaces/records-subscribe.ts +104 -0
  757. package/src/interfaces/records-write.ts +1072 -0
  758. package/src/jose/algorithms/signing/ed25519.ts +58 -0
  759. package/src/jose/algorithms/signing/signature-algorithms.ts +22 -0
  760. package/src/jose/jws/general/builder.ts +48 -0
  761. package/src/jose/jws/general/verifier.ts +112 -0
  762. package/src/protocols/permission-grant.ts +86 -0
  763. package/src/protocols/permission-request.ts +63 -0
  764. package/src/protocols/permissions.ts +508 -0
  765. package/src/schema-validator.ts +46 -0
  766. package/src/store/blockstore-level.ts +113 -0
  767. package/src/store/blockstore-mock.ts +80 -0
  768. package/src/store/data-store-level.ts +120 -0
  769. package/src/store/index-level.ts +691 -0
  770. package/src/store/level-wrapper.ts +272 -0
  771. package/src/store/message-store-level.ts +195 -0
  772. package/src/store/resumable-task-store-level.ts +120 -0
  773. package/src/store/storage-controller.ts +240 -0
  774. package/src/types/cache.ts +16 -0
  775. package/src/types/data-store.ts +64 -0
  776. package/src/types/event-log.ts +52 -0
  777. package/src/types/jose-types.ts +76 -0
  778. package/src/types/jws-types.ts +28 -0
  779. package/src/types/message-interface.ts +30 -0
  780. package/src/types/message-store.ts +57 -0
  781. package/src/types/message-types.ts +132 -0
  782. package/src/types/messages-types.ts +77 -0
  783. package/src/types/method-handler.ts +19 -0
  784. package/src/types/permission-types.ts +110 -0
  785. package/src/types/protocols-types.ts +177 -0
  786. package/src/types/query-types.ts +61 -0
  787. package/src/types/records-types.ts +263 -0
  788. package/src/types/resumable-task-store.ts +96 -0
  789. package/src/types/signer.ts +27 -0
  790. package/src/types/subscriptions.ts +34 -0
  791. package/src/utils/abort.ts +31 -0
  792. package/src/utils/array.ts +39 -0
  793. package/src/utils/cid.ts +101 -0
  794. package/src/utils/data-stream.ts +99 -0
  795. package/src/utils/encoder.ts +54 -0
  796. package/src/utils/encryption.ts +145 -0
  797. package/src/utils/filter.ts +245 -0
  798. package/src/utils/hd-key.ts +126 -0
  799. package/src/utils/jws.ts +95 -0
  800. package/src/utils/memory-cache.ts +31 -0
  801. package/src/utils/messages.ts +109 -0
  802. package/src/utils/object.ts +43 -0
  803. package/src/utils/private-key-signer.ts +72 -0
  804. package/src/utils/protocols.ts +50 -0
  805. package/src/utils/records.ts +559 -0
  806. package/src/utils/secp256k1.ts +157 -0
  807. package/src/utils/secp256r1.ts +142 -0
  808. package/src/utils/string.ts +13 -0
  809. package/src/utils/time.ts +78 -0
  810. 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