@abaxxtech/id 0.0.0

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