@icure/api 8.6.19 → 8.7.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 (326) hide show
  1. package/icc-api/api/IccDocumentApi.d.ts +10 -2
  2. package/icc-api/api/IccDocumentApi.js +22 -4
  3. package/icc-api/api/IccDocumentApi.js.map +1 -1
  4. package/icc-api/api/IccReceiptApi.d.ts +17 -0
  5. package/icc-api/api/IccReceiptApi.js +52 -0
  6. package/icc-api/api/IccReceiptApi.js.map +1 -1
  7. package/icc-api/model/DataAttachment.d.ts +22 -0
  8. package/icc-api/model/DataAttachment.js.map +1 -1
  9. package/icc-api/model/Document.d.ts +6 -0
  10. package/icc-api/model/Document.js.map +1 -1
  11. package/icc-api/model/Receipt.d.ts +6 -0
  12. package/icc-api/model/Receipt.js.map +1 -1
  13. package/icc-x-api/crypto/BaseExchangeDataManager.js +2 -2
  14. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  15. package/icc-x-api/crypto/ExchangeDataManager.js +3 -3
  16. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  17. package/icc-x-api/crypto/ExtendedApisUtils.d.ts +1 -1
  18. package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
  19. package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
  20. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +8 -2
  21. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  22. package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
  23. package/icc-x-api/icc-accesslog-x-api.js +7 -7
  24. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  25. package/icc-x-api/icc-calendar-item-x-api.js +7 -7
  26. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  27. package/icc-x-api/icc-classification-x-api.js +4 -5
  28. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  29. package/icc-x-api/icc-code-x-api.d.ts +2 -2
  30. package/icc-x-api/icc-code-x-api.js +3 -33
  31. package/icc-x-api/icc-code-x-api.js.map +1 -1
  32. package/icc-x-api/icc-contact-x-api.js +20 -33
  33. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  34. package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
  35. package/icc-x-api/icc-document-x-api.d.ts +8 -7
  36. package/icc-x-api/icc-document-x-api.js +64 -22
  37. package/icc-x-api/icc-document-x-api.js.map +1 -1
  38. package/icc-x-api/icc-form-x-api.js +3 -4
  39. package/icc-x-api/icc-form-x-api.js.map +1 -1
  40. package/icc-x-api/icc-helement-x-api.js +11 -11
  41. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  42. package/icc-x-api/icc-invoice-x-api.js +3 -4
  43. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  44. package/icc-x-api/icc-maintenance-task-x-api.js +3 -3
  45. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  46. package/icc-x-api/icc-patient-x-api.js +29 -29
  47. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  48. package/icc-x-api/icc-receipt-x-api.d.ts +40 -0
  49. package/icc-x-api/icc-receipt-x-api.js +79 -1
  50. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  51. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  52. package/icc-x-api/utils/code-util.d.ts +23 -0
  53. package/icc-x-api/utils/code-util.js +39 -2
  54. package/icc-x-api/utils/code-util.js.map +1 -1
  55. package/icc-x-api/utils/collection-utils.d.ts +13 -0
  56. package/icc-x-api/utils/collection-utils.js +69 -0
  57. package/icc-x-api/utils/collection-utils.js.map +1 -1
  58. package/icc-x-api/utils/compression-utils.d.ts +28 -0
  59. package/icc-x-api/utils/compression-utils.js +106 -0
  60. package/icc-x-api/utils/compression-utils.js.map +1 -0
  61. package/icc-x-api/utils/crypto-utils.js +7 -7
  62. package/icc-x-api/utils/crypto-utils.js.map +1 -1
  63. package/icc-x-api/utils/formatting-util.d.ts +1 -3
  64. package/icc-x-api/utils/formatting-util.js +15 -17
  65. package/icc-x-api/utils/formatting-util.js.map +1 -1
  66. package/icc-x-api/utils/hcp-util.js +2 -3
  67. package/icc-x-api/utils/hcp-util.js.map +1 -1
  68. package/icc-x-api/utils/insurability-util.js +10 -8
  69. package/icc-x-api/utils/insurability-util.js.map +1 -1
  70. package/icc-x-api/utils/lzma-wasm.d.ts +6 -0
  71. package/icc-x-api/utils/lzma-wasm.js +81 -0
  72. package/icc-x-api/utils/lzma-wasm.js.map +1 -0
  73. package/icc-x-api/utils/mutex.d.ts +12 -0
  74. package/icc-x-api/utils/mutex.js +26 -0
  75. package/icc-x-api/utils/mutex.js.map +1 -0
  76. package/icc-x-api/utils/websocket.js +7 -7
  77. package/icc-x-api/utils/websocket.js.map +1 -1
  78. package/icc-x-api/wasm/lzma/lzma.js +2 -0
  79. package/icc-x-api/wasm/lzma/lzma.wasm +0 -0
  80. package/package.json +2 -11
  81. package/icc-x-api/utils/uuid-encoder.d.ts +0 -44
  82. package/icc-x-api/utils/uuid-encoder.js +0 -114
  83. package/icc-x-api/utils/uuid-encoder.js.map +0 -1
  84. package/test/icc-api/api/IccAgendaApi.d.ts +0 -1
  85. package/test/icc-api/api/IccAgendaApi.js +0 -64
  86. package/test/icc-api/api/IccAgendaApi.js.map +0 -1
  87. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +0 -1
  88. package/test/icc-api/api/IccAnonymousAccessApi.js +0 -58
  89. package/test/icc-api/api/IccAnonymousAccessApi.js.map +0 -1
  90. package/test/icc-api/api/IccCalendarItemApi.d.ts +0 -1
  91. package/test/icc-api/api/IccCalendarItemApi.js +0 -67
  92. package/test/icc-api/api/IccCalendarItemApi.js.map +0 -1
  93. package/test/icc-api/api/IccCalendarItemTypeApi.d.ts +0 -1
  94. package/test/icc-api/api/IccCalendarItemTypeApi.js +0 -96
  95. package/test/icc-api/api/IccCalendarItemTypeApi.js.map +0 -1
  96. package/test/icc-api/api/IccCodeApi.d.ts +0 -1
  97. package/test/icc-api/api/IccCodeApi.js +0 -38
  98. package/test/icc-api/api/IccCodeApi.js.map +0 -1
  99. package/test/icc-api/api/IccDocumentApi.d.ts +0 -1
  100. package/test/icc-api/api/IccDocumentApi.js +0 -199
  101. package/test/icc-api/api/IccDocumentApi.js.map +0 -1
  102. package/test/icc-api/api/IccGroupApi.d.ts +0 -1
  103. package/test/icc-api/api/IccGroupApi.js +0 -50
  104. package/test/icc-api/api/IccGroupApi.js.map +0 -1
  105. package/test/icc-api/api/IccKeywordApi.d.ts +0 -1
  106. package/test/icc-api/api/IccKeywordApi.js +0 -64
  107. package/test/icc-api/api/IccKeywordApi.js.map +0 -1
  108. package/test/icc-api/api/IccMedicalLocationApi.d.ts +0 -1
  109. package/test/icc-api/api/IccMedicalLocationApi.js +0 -64
  110. package/test/icc-api/api/IccMedicalLocationApi.js.map +0 -1
  111. package/test/icc-api/api/IccPlaceApi.d.ts +0 -1
  112. package/test/icc-api/api/IccPlaceApi.js +0 -64
  113. package/test/icc-api/api/IccPlaceApi.js.map +0 -1
  114. package/test/icc-api/api/IccRecoveryDataApi.d.ts +0 -1
  115. package/test/icc-api/api/IccRecoveryDataApi.js +0 -95
  116. package/test/icc-api/api/IccRecoveryDataApi.js.map +0 -1
  117. package/test/icc-api/api/IccRoleApi.d.ts +0 -1
  118. package/test/icc-api/api/IccRoleApi.js +0 -34
  119. package/test/icc-api/api/IccRoleApi.js.map +0 -1
  120. package/test/icc-api/api/IccUserApi.d.ts +0 -1
  121. package/test/icc-api/api/IccUserApi.js +0 -96
  122. package/test/icc-api/api/IccUserApi.js.map +0 -1
  123. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +0 -1
  124. package/test/icc-api/e2e/IccCalendarItemApi.js +0 -46
  125. package/test/icc-api/e2e/IccCalendarItemApi.js.map +0 -1
  126. package/test/icc-api/model/modelHelpersTest.d.ts +0 -1
  127. package/test/icc-api/model/modelHelpersTest.js +0 -45
  128. package/test/icc-api/model/modelHelpersTest.js.map +0 -1
  129. package/test/icc-x-api/auth/group-switch-test.d.ts +0 -1
  130. package/test/icc-x-api/auth/group-switch-test.js +0 -81
  131. package/test/icc-x-api/auth/group-switch-test.js.map +0 -1
  132. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +0 -2
  133. package/test/icc-x-api/auth/jwt-concurrency-test.js +0 -112
  134. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +0 -1
  135. package/test/icc-x-api/auth/jwt-provider-test.d.ts +0 -1
  136. package/test/icc-x-api/auth/jwt-provider-test.js +0 -197
  137. package/test/icc-x-api/auth/jwt-provider-test.js.map +0 -1
  138. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +0 -1
  139. package/test/icc-x-api/auth/smart-auth-provider-test.js +0 -224
  140. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +0 -1
  141. package/test/icc-x-api/autofix-anonymity-test.d.ts +0 -1
  142. package/test/icc-x-api/autofix-anonymity-test.js +0 -122
  143. package/test/icc-x-api/autofix-anonymity-test.js.map +0 -1
  144. package/test/icc-x-api/confidential-entities-test.d.ts +0 -1
  145. package/test/icc-x-api/confidential-entities-test.js +0 -168
  146. package/test/icc-x-api/confidential-entities-test.js.map +0 -1
  147. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +0 -1
  148. package/test/icc-x-api/crud/comprehensive-crud-test.js +0 -276
  149. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +0 -1
  150. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +0 -16
  151. package/test/icc-x-api/crud/entities-crud-test-interface.js +0 -408
  152. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +0 -1
  153. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +0 -1
  154. package/test/icc-x-api/crypto/anonymous-delegations-test.js +0 -587
  155. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +0 -1
  156. package/test/icc-x-api/crypto/concurrency.d.ts +0 -1
  157. package/test/icc-x-api/crypto/concurrency.js +0 -35
  158. package/test/icc-x-api/crypto/concurrency.js.map +0 -1
  159. package/test/icc-x-api/crypto/crypto-utils.d.ts +0 -1
  160. package/test/icc-x-api/crypto/crypto-utils.js +0 -79
  161. package/test/icc-x-api/crypto/crypto-utils.js.map +0 -1
  162. package/test/icc-x-api/crypto/cryptoTest.d.ts +0 -2
  163. package/test/icc-x-api/crypto/cryptoTest.js +0 -402
  164. package/test/icc-x-api/crypto/cryptoTest.js.map +0 -1
  165. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +0 -1
  166. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +0 -166
  167. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +0 -1
  168. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +0 -1
  169. package/test/icc-x-api/crypto/exchange-data-manager-test.js +0 -674
  170. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +0 -1
  171. package/test/icc-x-api/crypto/full-crypto-test.d.ts +0 -1
  172. package/test/icc-x-api/crypto/full-crypto-test.js +0 -454
  173. package/test/icc-x-api/crypto/full-crypto-test.js.map +0 -1
  174. package/test/icc-x-api/crypto/legacy-metadata-migration-test.d.ts +0 -1
  175. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +0 -379
  176. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +0 -1
  177. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +0 -1
  178. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +0 -278
  179. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +0 -1
  180. package/test/icc-x-api/crypto/shamir.d.ts +0 -2
  181. package/test/icc-x-api/crypto/shamir.js +0 -167
  182. package/test/icc-x-api/crypto/shamir.js.map +0 -1
  183. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +0 -1
  184. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +0 -71
  185. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +0 -1
  186. package/test/icc-x-api/crypto/soft-deleted-data-owners.d.ts +0 -2
  187. package/test/icc-x-api/crypto/soft-deleted-data-owners.js +0 -113
  188. package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +0 -1
  189. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +0 -1
  190. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +0 -246
  191. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +0 -1
  192. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +0 -1
  193. package/test/icc-x-api/entity-with-attachments-api-test.js +0 -142
  194. package/test/icc-x-api/entity-with-attachments-api-test.js.map +0 -1
  195. package/test/icc-x-api/filters/filters.d.ts +0 -1
  196. package/test/icc-x-api/filters/filters.js +0 -49
  197. package/test/icc-x-api/filters/filters.js.map +0 -1
  198. package/test/icc-x-api/filters/healthelement.d.ts +0 -1
  199. package/test/icc-x-api/filters/healthelement.js +0 -333
  200. package/test/icc-x-api/filters/healthelement.js.map +0 -1
  201. package/test/icc-x-api/icc-accesslog-x-api.d.ts +0 -1
  202. package/test/icc-x-api/icc-accesslog-x-api.js +0 -106
  203. package/test/icc-x-api/icc-accesslog-x-api.js.map +0 -1
  204. package/test/icc-x-api/icc-application-settings-x-api.d.ts +0 -1
  205. package/test/icc-x-api/icc-application-settings-x-api.js +0 -91
  206. package/test/icc-x-api/icc-application-settings-x-api.js.map +0 -1
  207. package/test/icc-x-api/icc-auth-api.d.ts +0 -1
  208. package/test/icc-x-api/icc-auth-api.js +0 -47
  209. package/test/icc-x-api/icc-auth-api.js.map +0 -1
  210. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +0 -1
  211. package/test/icc-x-api/icc-calendar-item-x-api.js +0 -150
  212. package/test/icc-x-api/icc-calendar-item-x-api.js.map +0 -1
  213. package/test/icc-x-api/icc-contact-x-api.d.ts +0 -1
  214. package/test/icc-x-api/icc-contact-x-api.js +0 -355
  215. package/test/icc-x-api/icc-contact-x-api.js.map +0 -1
  216. package/test/icc-x-api/icc-document-x-api.d.ts +0 -1
  217. package/test/icc-x-api/icc-document-x-api.js +0 -76
  218. package/test/icc-x-api/icc-document-x-api.js.map +0 -1
  219. package/test/icc-x-api/icc-form-x-api.d.ts +0 -1
  220. package/test/icc-x-api/icc-form-x-api.js +0 -413
  221. package/test/icc-x-api/icc-form-x-api.js.map +0 -1
  222. package/test/icc-x-api/icc-hcparty-x-api-test.d.ts +0 -1
  223. package/test/icc-x-api/icc-hcparty-x-api-test.js +0 -43
  224. package/test/icc-x-api/icc-hcparty-x-api-test.js.map +0 -1
  225. package/test/icc-x-api/icc-helement-x-api-test.d.ts +0 -1
  226. package/test/icc-x-api/icc-helement-x-api-test.js +0 -155
  227. package/test/icc-x-api/icc-helement-x-api-test.js.map +0 -1
  228. package/test/icc-x-api/icc-invoice-x-api.d.ts +0 -1
  229. package/test/icc-x-api/icc-invoice-x-api.js +0 -99
  230. package/test/icc-x-api/icc-invoice-x-api.js.map +0 -1
  231. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +0 -1
  232. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +0 -222
  233. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +0 -1
  234. package/test/icc-x-api/icc-message-x-api.d.ts +0 -1
  235. package/test/icc-x-api/icc-message-x-api.js +0 -54
  236. package/test/icc-x-api/icc-message-x-api.js.map +0 -1
  237. package/test/icc-x-api/icc-patient-x-api-test.d.ts +0 -1
  238. package/test/icc-x-api/icc-patient-x-api-test.js +0 -165
  239. package/test/icc-x-api/icc-patient-x-api-test.js.map +0 -1
  240. package/test/icc-x-api/icc-recovery-x-api.d.ts +0 -1
  241. package/test/icc-x-api/icc-recovery-x-api.js +0 -175
  242. package/test/icc-x-api/icc-recovery-x-api.js.map +0 -1
  243. package/test/icc-x-api/icc-topic-x-api.d.ts +0 -1
  244. package/test/icc-x-api/icc-topic-x-api.js +0 -269
  245. package/test/icc-x-api/icc-topic-x-api.js.map +0 -1
  246. package/test/icc-x-api/icc-user-x-api-test.d.ts +0 -1
  247. package/test/icc-x-api/icc-user-x-api-test.js +0 -99
  248. package/test/icc-x-api/icc-user-x-api-test.js.map +0 -1
  249. package/test/icc-x-api/keyless-api.d.ts +0 -1
  250. package/test/icc-x-api/keyless-api.js +0 -125
  251. package/test/icc-x-api/keyless-api.js.map +0 -1
  252. package/test/icc-x-api/patient-user.d.ts +0 -2
  253. package/test/icc-x-api/patient-user.js +0 -103
  254. package/test/icc-x-api/patient-user.js.map +0 -1
  255. package/test/icc-x-api/storage/storage.d.ts +0 -1
  256. package/test/icc-x-api/storage/storage.js +0 -48
  257. package/test/icc-x-api/storage/storage.js.map +0 -1
  258. package/test/icc-x-api/test-api-no-parent.d.ts +0 -1
  259. package/test/icc-x-api/test-api-no-parent.js +0 -79
  260. package/test/icc-x-api/test-api-no-parent.js.map +0 -1
  261. package/test/icc-x-api/test-legacy-data-support.d.ts +0 -1
  262. package/test/icc-x-api/test-legacy-data-support.js +0 -375
  263. package/test/icc-x-api/test-legacy-data-support.js.map +0 -1
  264. package/test/icc-x-api/utils/graph-test.d.ts +0 -1
  265. package/test/icc-x-api/utils/graph-test.js +0 -54
  266. package/test/icc-x-api/utils/graph-test.js.map +0 -1
  267. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +0 -1
  268. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +0 -364
  269. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +0 -1
  270. package/test/support/CSM-185.d.ts +0 -1
  271. package/test/support/CSM-185.js +0 -124
  272. package/test/support/CSM-185.js.map +0 -1
  273. package/test/support/CSM-243.d.ts +0 -1
  274. package/test/support/CSM-243.js +0 -120
  275. package/test/support/CSM-243.js.map +0 -1
  276. package/test/support/CSM-543.d.ts +0 -1
  277. package/test/support/CSM-543.js +0 -164
  278. package/test/support/CSM-543.js.map +0 -1
  279. package/test/support/CSM-729.d.ts +0 -1
  280. package/test/support/CSM-729.js +0 -225
  281. package/test/support/CSM-729.js.map +0 -1
  282. package/test/support/CSM-87.d.ts +0 -0
  283. package/test/support/CSM-87.js +0 -21
  284. package/test/support/CSM-87.js.map +0 -1
  285. package/test/support/CSM-93.d.ts +0 -1
  286. package/test/support/CSM-93.js +0 -112
  287. package/test/support/CSM-93.js.map +0 -1
  288. package/test/utils/FakeDataOwnerApi.d.ts +0 -32
  289. package/test/utils/FakeDataOwnerApi.js +0 -136
  290. package/test/utils/FakeDataOwnerApi.js.map +0 -1
  291. package/test/utils/FakeEncryptionKeysManager.d.ts +0 -36
  292. package/test/utils/FakeEncryptionKeysManager.js +0 -98
  293. package/test/utils/FakeEncryptionKeysManager.js.map +0 -1
  294. package/test/utils/FakeExchangeDataApi.d.ts +0 -32
  295. package/test/utils/FakeExchangeDataApi.js +0 -92
  296. package/test/utils/FakeExchangeDataApi.js.map +0 -1
  297. package/test/utils/FakeExchangeDataManager.d.ts +0 -48
  298. package/test/utils/FakeExchangeDataManager.js +0 -82
  299. package/test/utils/FakeExchangeDataManager.js.map +0 -1
  300. package/test/utils/FakeExchangeDataMapManager.d.ts +0 -12
  301. package/test/utils/FakeExchangeDataMapManager.js +0 -38
  302. package/test/utils/FakeExchangeDataMapManager.js.map +0 -1
  303. package/test/utils/FakeGenericApi.d.ts +0 -16
  304. package/test/utils/FakeGenericApi.js +0 -65
  305. package/test/utils/FakeGenericApi.js.map +0 -1
  306. package/test/utils/KeylessCryptoStrategies.d.ts +0 -23
  307. package/test/utils/KeylessCryptoStrategies.js +0 -26
  308. package/test/utils/KeylessCryptoStrategies.js.map +0 -1
  309. package/test/utils/TestApi.d.ts +0 -3
  310. package/test/utils/TestApi.js +0 -30
  311. package/test/utils/TestApi.js.map +0 -1
  312. package/test/utils/TestCollectionUtils.d.ts +0 -1
  313. package/test/utils/TestCollectionUtils.js +0 -109
  314. package/test/utils/TestCollectionUtils.js.map +0 -1
  315. package/test/utils/TestCryptoStrategies.d.ts +0 -42
  316. package/test/utils/TestCryptoStrategies.js +0 -80
  317. package/test/utils/TestCryptoStrategies.js.map +0 -1
  318. package/test/utils/TestStorage.d.ts +0 -23
  319. package/test/utils/TestStorage.js +0 -61
  320. package/test/utils/TestStorage.js.map +0 -1
  321. package/test/utils/roles.d.ts +0 -14
  322. package/test/utils/roles.js +0 -345
  323. package/test/utils/roles.js.map +0 -1
  324. package/test/utils/test_utils.d.ts +0 -87
  325. package/test/utils/test_utils.js +0 -452
  326. package/test/utils/test_utils.js.map +0 -1
@@ -1,269 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- require("isomorphic-fetch");
13
- const test_utils_1 = require("../utils/test_utils");
14
- const mocha_1 = require("mocha");
15
- const icc_x_api_1 = require("../../icc-x-api");
16
- const Patient_1 = require("../../icc-api/model/Patient");
17
- const crypto_1 = require("crypto");
18
- const chai_1 = require("chai");
19
- const types_1 = require("@icure/test-setup/types");
20
- const Topic_1 = require("../../icc-api/model/Topic");
21
- const SecureDelegation_1 = require("../../icc-api/model/SecureDelegation");
22
- var initApi = test_utils_1.TestUtils.initApi;
23
- const FilterChainTopic_1 = require("../../icc-api/model/FilterChainTopic");
24
- const TopicByHcPartyFilter_1 = require("../../icc-x-api/filters/TopicByHcPartyFilter");
25
- const TopicByParticipantFilter_1 = require("../../icc-x-api/filters/TopicByParticipantFilter");
26
- const icc_api_1 = require("../../icc-api");
27
- (0, test_utils_1.setLocalStorage)(fetch);
28
- let env;
29
- (0, test_utils_1.describeNoLite)('icc-topic-x-api Tests', () => {
30
- (0, mocha_1.before)(function () {
31
- return __awaiter(this, void 0, void 0, function* () {
32
- this.timeout(600000);
33
- const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
34
- env = yield initializer.execute((0, types_1.getEnvVariables)());
35
- });
36
- });
37
- function createTopic(topicApi, hcpUser, patient, ...additionalUser) {
38
- return __awaiter(this, void 0, void 0, function* () {
39
- return topicApi.createTopic(yield topicApi.newInstance(hcpUser, patient, new Topic_1.Topic({
40
- id: (0, crypto_1.randomUUID)(),
41
- description: 'Topic description',
42
- activeParticipants: Object.assign(Object.assign({}, Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId, u.role]))), { [hcpUser.healthcarePartyId]: Topic_1.TopicRole.OWNER }),
43
- }), {
44
- additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId, SecureDelegation_1.SecureDelegation.AccessLevelEnum.WRITE])),
45
- }));
46
- });
47
- }
48
- function createPatient(patientApiForHcp, hcpUser) {
49
- return __awaiter(this, void 0, void 0, function* () {
50
- return patientApiForHcp.createPatientWithUser(hcpUser, yield patientApiForHcp.newInstance(hcpUser, new Patient_1.Patient({
51
- id: (0, crypto_1.randomUUID)(),
52
- firstName: 'John',
53
- lastName: 'Snow',
54
- note: 'Winter is coming',
55
- })));
56
- });
57
- }
58
- (0, mocha_1.it)('An HCP should be able to create a topic with participants', () => __awaiter(void 0, void 0, void 0, function* () {
59
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
60
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
61
- const hcpUser = yield userApiForHcp.getCurrentUser();
62
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
63
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
64
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
65
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
66
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
67
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
68
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
69
- })).timeout(10000);
70
- (0, mocha_1.it)('An HCP should be able to create an encrypted topic', () => __awaiter(void 0, void 0, void 0, function* () {
71
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
72
- const baseTopicApi = new icc_api_1.IccTopicApi(env.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl);
73
- const hcpUser = yield userApiForHcp.getCurrentUser();
74
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
75
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient);
76
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
77
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
78
- (0, chai_1.expect)(retrievedByHcp.description).to.not.be.undefined;
79
- const notDecryptedTopic = yield baseTopicApi.getTopic(createdTopic.id);
80
- (0, chai_1.expect)(notDecryptedTopic).to.not.deep.equal(createdTopic);
81
- (0, chai_1.expect)(notDecryptedTopic.description).to.be.undefined;
82
- (0, chai_1.expect)(notDecryptedTopic.encryptedSelf).to.not.be.undefined;
83
- })).timeout(10000);
84
- (0, mocha_1.it)('An HCP should be able to create a topic with no participants and add participants later', () => __awaiter(void 0, void 0, void 0, function* () {
85
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
86
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
87
- const hcpUser = yield userApiForHcp.getCurrentUser();
88
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
89
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
90
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient);
91
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
92
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
93
- try {
94
- yield topicApiForHcp2.getTopic(createdTopic.id);
95
- chai_1.expect.fail('Should not be able to get topic');
96
- }
97
- catch (e) {
98
- (0, chai_1.expect)(e.statusCode).to.equal(403);
99
- }
100
- yield topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId, topicRole: Topic_1.TopicRole.PARTICIPANT }, createdTopic);
101
- const retrievedByHcpAfterAddParticipant = yield topicApiForHcp.getTopic(createdTopic.id);
102
- const retrievedByHcp2AfterAddParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
103
- (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant);
104
- (0, chai_1.expect)(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id);
105
- (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId, hcpUser2.healthcarePartyId);
106
- (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants[hcpUser2.healthcarePartyId]).to.equal(Topic_1.TopicRole.PARTICIPANT);
107
- (0, chai_1.expect)(retrievedByHcp2AfterAddParticipant.activeParticipants[hcpUser.healthcarePartyId]).to.equal(Topic_1.TopicRole.OWNER);
108
- })).timeout(10000);
109
- (0, mocha_1.it)('A participant should not be able to remove another participant', () => __awaiter(void 0, void 0, void 0, function* () {
110
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
111
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
112
- const hcpUser = yield userApiForHcp.getCurrentUser();
113
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
114
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
115
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
116
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
117
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
118
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
119
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
120
- try {
121
- yield topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId }, createdTopic.id);
122
- chai_1.expect.fail('Should not be able to remove participant');
123
- }
124
- catch (e) {
125
- (0, chai_1.expect)(e.statusCode).to.equal(403);
126
- }
127
- })).timeout(10000);
128
- (0, mocha_1.it)('A participant should be able to remove himself but still able to get topic', () => __awaiter(void 0, void 0, void 0, function* () {
129
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
130
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
131
- const hcpUser = yield userApiForHcp.getCurrentUser();
132
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
133
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
134
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
135
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
136
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
137
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
138
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
139
- yield topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId }, createdTopic.id);
140
- const retrievedByHcpAfterRemoveParticipant = yield topicApiForHcp.getTopic(createdTopic.id);
141
- const retrievedByHcp2AfterRemoveParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
142
- (0, chai_1.expect)(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant);
143
- })).timeout(10000);
144
- (0, mocha_1.it)('An owner should be able to remove a participant', () => __awaiter(void 0, void 0, void 0, function* () {
145
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
146
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
147
- const hcpUser = yield userApiForHcp.getCurrentUser();
148
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
149
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
150
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
151
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
152
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
153
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
154
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
155
- const topicWithRemovedParticipant = yield topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId }, createdTopic.id);
156
- (0, chai_1.expect)(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId);
157
- const retrievedByHcp2AfterRemoveParticipant = yield topicApiForHcp2.getTopic(createdTopic.id);
158
- (0, chai_1.expect)(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant);
159
- })).timeout(10000);
160
- (0, mocha_1.it)('A participant should be able to filter topics using TopicByHcPartyFilter', () => __awaiter(void 0, void 0, void 0, function* () {
161
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
162
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
163
- const hcpUser = yield userApiForHcp.getCurrentUser();
164
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
165
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
166
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
167
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
168
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
169
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
170
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
171
- const filterChain = (hcpId) => new FilterChainTopic_1.FilterChainTopic({
172
- filter: new TopicByHcPartyFilter_1.TopicByHcPartyFilter({
173
- hcpId,
174
- }),
175
- });
176
- const filterResultForHcp = yield topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId));
177
- (0, chai_1.expect)(filterResultForHcp.rows.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic);
178
- const filterResultForHcp2 = yield topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId));
179
- (0, chai_1.expect)(filterResultForHcp2.rows.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic);
180
- })).timeout(60000);
181
- (0, mocha_1.it)('A participant should be able to filter topics using TopicByParticipantFilter', () => __awaiter(void 0, void 0, void 0, function* () {
182
- var _a, _b;
183
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
184
- const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = yield initApi(env, test_utils_1.hcp2Username);
185
- const hcpUser = yield userApiForHcp.getCurrentUser();
186
- const hcpUser2 = yield userApiForHcp2.getCurrentUser();
187
- const samplePatient = yield createPatient(patientApiForHcp, hcpUser);
188
- const createdTopic = yield createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: Topic_1.TopicRole.PARTICIPANT });
189
- const retrievedByHcp = yield topicApiForHcp.getTopic(createdTopic.id);
190
- (0, chai_1.expect)(retrievedByHcp).to.deep.equal(createdTopic);
191
- const retrievedByHcp2 = yield topicApiForHcp2.getTopic(createdTopic.id);
192
- (0, chai_1.expect)(retrievedByHcp2).to.deep.equal(createdTopic);
193
- const filterChain = (hcpId) => new FilterChainTopic_1.FilterChainTopic({
194
- filter: new TopicByParticipantFilter_1.TopicByParticipantFilter({
195
- participantId: hcpId,
196
- }),
197
- });
198
- const filterResultForHcp = yield topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId));
199
- (0, chai_1.expect)((_a = filterResultForHcp.rows) === null || _a === void 0 ? void 0 : _a.map((t) => t.id)).to.includes(createdTopic.id);
200
- const filterResultForHcp2 = yield topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId));
201
- (0, chai_1.expect)((_b = filterResultForHcp2.rows) === null || _b === void 0 ? void 0 : _b.map((t) => t.id)).to.includes(createdTopic.id);
202
- })).timeout(10000);
203
- function doXOnYAndSubscribe(connectionPromise, x, statusListener, eventReceivedPromiseReject, eventReceivedPromise) {
204
- return __awaiter(this, void 0, void 0, function* () {
205
- const connection = (yield connectionPromise)
206
- .onClosed(() => __awaiter(this, void 0, void 0, function* () {
207
- statusListener('CLOSED');
208
- yield (0, icc_x_api_1.sleep)(3000);
209
- }))
210
- .onConnected(() => __awaiter(this, void 0, void 0, function* () {
211
- statusListener('CONNECTED');
212
- yield (0, icc_x_api_1.sleep)(2000);
213
- yield x();
214
- }));
215
- const timeout = setTimeout(eventReceivedPromiseReject, 20000);
216
- yield eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => { });
217
- connection.close();
218
- yield (0, icc_x_api_1.sleep)(3000);
219
- });
220
- }
221
- const subscribeAndCreateTopic = (options, eventTypes) => __awaiter(void 0, void 0, void 0, function* () {
222
- const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = yield initApi(env, test_utils_1.hcp1Username);
223
- const loggedUser = yield userApiForHcp.getCurrentUser();
224
- const connectionPromise = (options, eventListener) => __awaiter(void 0, void 0, void 0, function* () {
225
- return topicApiForHcp.subscribeToTopicEvents(eventTypes, new TopicByHcPartyFilter_1.TopicByHcPartyFilter({
226
- hcpId: loggedUser.healthcarePartyId,
227
- }), eventListener, options);
228
- });
229
- const events = [];
230
- const statuses = [];
231
- let eventReceivedPromiseResolve;
232
- let eventReceivedPromiseReject;
233
- const eventReceivedPromise = new Promise((res, rej) => {
234
- eventReceivedPromiseResolve = res;
235
- eventReceivedPromiseReject = rej;
236
- });
237
- yield doXOnYAndSubscribe(connectionPromise(options, (healthcareElement) => __awaiter(void 0, void 0, void 0, function* () {
238
- events.push(healthcareElement);
239
- eventReceivedPromiseResolve();
240
- })), () => __awaiter(void 0, void 0, void 0, function* () {
241
- const user = yield userApiForHcp.getCurrentUser();
242
- const patient = yield patientApiForHcp.createPatientWithUser(user, yield patientApiForHcp.newInstance(user, new Patient_1.Patient({
243
- firstName: 'John',
244
- lastName: 'Snow',
245
- note: 'Winter is coming',
246
- })));
247
- const topic = yield topicApiForHcp.createTopic(yield topicApiForHcp.newInstance(loggedUser, patient, new Topic_1.Topic({
248
- description: 'Topic description',
249
- })));
250
- }), (status) => {
251
- statuses.push(status);
252
- }, eventReceivedPromiseReject, eventReceivedPromise);
253
- events === null || events === void 0 ? void 0 : events.forEach((event) => console.log(`Event : ${event}`));
254
- statuses === null || statuses === void 0 ? void 0 : statuses.forEach((status) => console.log(`Status : ${status}`));
255
- (0, chai_1.expect)(statuses).to.have.length(2);
256
- (0, chai_1.expect)(events).to.have.length(1);
257
- (0, chai_1.expect)(events.every((event) => event instanceof Topic_1.Topic)).to.be.true;
258
- });
259
- (0, mocha_1.it)('CREATE Topic without options', () => __awaiter(void 0, void 0, void 0, function* () {
260
- yield subscribeAndCreateTopic({}, ['CREATE']);
261
- })).timeout(60000);
262
- (0, mocha_1.it)('CREATE Topic with options', () => __awaiter(void 0, void 0, void 0, function* () {
263
- yield subscribeAndCreateTopic({
264
- connectionRetryIntervalMs: 10000,
265
- connectionMaxRetry: 5,
266
- }, ['CREATE']);
267
- })).timeout(60000);
268
- });
269
- //# sourceMappingURL=icc-topic-x-api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icc-topic-x-api.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-topic-x-api.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAAyB;AACzB,oDAAuI;AACvI,iCAA4C;AAC5C,+CAA4E;AAC5E,yDAAqD;AAErD,mCAAmC;AACnC,+BAA6B;AAC7B,mDAAmE;AAEnE,qDAA4D;AAC5D,2EAAuE;AACvE,IAAO,OAAO,GAAG,sBAAS,CAAC,OAAO,CAAA;AAGlC,2EAAuE;AACvE,uFAAmF;AACnF,+FAA2F;AAG3F,2CAA2C;AAE3C,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AACtB,IAAI,GAAa,CAAA;AAEjB,IAAA,2BAAc,EAAC,uBAAuB,EAAE,GAAG,EAAE;IAC3C,IAAA,cAAM,EAAC;;YACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACpB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;YACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;QACpD,CAAC;KAAA,CAAC,CAAA;IAEF,SAAe,WAAW,CAAC,QAAsB,EAAE,OAAa,EAAE,OAAgB,EAAE,GAAG,cAAiD;;YACtI,OAAO,QAAQ,CAAC,WAAW,CACzB,MAAM,QAAQ,CAAC,WAAW,CACxB,OAAO,EACP,OAAO,EACP,IAAI,aAAK,CAAC;gBACR,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,WAAW,EAAE,mBAAmB;gBAChC,kBAAkB,kCACb,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KACrF,CAAC,OAAO,CAAC,iBAAkB,CAAC,EAAE,iBAAS,CAAC,KAAK,GAC9C;aACF,CAAC,EACF;gBACE,mBAAmB,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAkB,EAAE,mCAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;aACxI,CACF,CACF,CAAA;QACH,CAAC;KAAA;IAED,SAAe,aAAa,CAAC,gBAAgC,EAAE,OAAa;;YAC1E,OAAO,gBAAgB,CAAC,qBAAqB,CAC3C,OAAO,EACP,MAAM,gBAAgB,CAAC,WAAW,CAChC,OAAO,EACP,IAAI,iBAAO,CAAC;gBACV,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,SAAS,EAAE,MAAM;gBACjB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,kBAAkB;aACzB,CAAC,CACH,CACF,CAAA;QACH,CAAC;KAAA;IAED,IAAA,UAAE,EAAC,2DAA2D,EAAE,GAAS,EAAE;QACzE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACrD,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,oDAAoD,EAAE,GAAS,EAAE;QAClE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,YAAY,GAAG,IAAI,qBAAW,CAAC,GAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,sBAAsB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;QAE7I,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QAEpD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QAE9E,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAClD,IAAA,aAAM,EAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAEtD,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACvE,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QACzD,IAAA,aAAM,EAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;QACrD,IAAA,aAAM,EAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;IAC7D,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,yFAAyF,EAAE,GAAS,EAAE;QACvG,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QAE9E,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;YAChD,aAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,aAAM,EAAE,CAAc,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,cAAc,CAAC,uBAAuB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,iBAAkB,EAAE,SAAS,EAAE,iBAAS,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAA;QAE1I,MAAM,iCAAiC,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACzF,MAAM,kCAAkC,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QAE3F,IAAA,aAAM,EAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAC3F,IAAA,aAAM,EAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,kCAAkC,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAkB,EAAE,QAAQ,CAAC,iBAAkB,CAAC,CAAA;QAC/H,IAAA,aAAM,EAAC,kCAAkC,CAAC,kBAAmB,CAAC,QAAQ,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAS,CAAC,WAAW,CAAC,CAAA;QAC3H,IAAA,aAAM,EAAC,kCAAkC,CAAC,kBAAmB,CAAC,OAAO,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAS,CAAC,KAAK,CAAC,CAAA;IACtH,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,gEAAgE,EAAE,GAAS,EAAE;QAC9E,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,iBAAkB,EAAE,EAAE,YAAY,CAAC,EAAG,CAAC,CAAA;YACtG,aAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QACzD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,aAAM,EAAE,CAAc,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,4EAA4E,EAAE,GAAS,EAAE;QAC1F,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnD,MAAM,eAAe,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,iBAAkB,EAAE,EAAE,YAAY,CAAC,EAAG,CAAC,CAAA;QAEvG,MAAM,oCAAoC,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QAC5F,MAAM,qCAAqC,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QAE9F,IAAA,aAAM,EAAC,oCAAoC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACnG,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,iDAAiD,EAAE,GAAS,EAAE;QAC/D,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnD,MAAM,2BAA2B,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,iBAAkB,EAAE,EAAE,YAAY,CAAC,EAAG,CAAC,CAAA;QAC1I,IAAA,aAAM,EAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAkB,CAAC,CAAA;QAE3F,MAAM,qCAAqC,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QAC9F,IAAA,aAAM,EAAC,qCAAqC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAC1F,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,0EAA0E,EAAE,GAAS,EAAE;QACxF,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnD,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CACpC,IAAI,mCAAgB,CAAC;YACnB,MAAM,EAAE,IAAI,2CAAoB,CAAC;gBAC/B,KAAK;aACN,CAAC;SACH,CAAC,CAAA;QAEJ,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAkB,CAAC,CAAC,CAAA;QACvG,IAAA,aAAM,EAAC,kBAAkB,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElG,MAAM,mBAAmB,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAkB,CAAC,CAAC,CAAA;QAC1G,IAAA,aAAM,EAAC,mBAAmB,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACrG,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,IAAA,UAAE,EAAC,8EAA8E,EAAE,GAAS,EAAE;;QAC5F,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAEhG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/H,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACtE,IAAA,aAAM,EAAC,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAG,CAAC,CAAA;QACxE,IAAA,aAAM,EAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAEnD,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CACpC,IAAI,mCAAgB,CAAC;YACnB,MAAM,EAAE,IAAI,mDAAwB,CAAC;gBACnC,aAAa,EAAE,KAAK;aACrB,CAAC;SACH,CAAC,CAAA;QAEJ,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAkB,CAAC,CAAC,CAAA;QACvG,IAAA,aAAM,EAAC,MAAA,kBAAkB,CAAC,IAAI,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAE9E,MAAM,mBAAmB,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAkB,CAAC,CAAC,CAAA;QAC1G,IAAA,aAAM,EAAC,MAAA,mBAAmB,CAAC,IAAI,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IACjF,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAA;IAElB,SAAe,kBAAkB,CAC/B,iBAAsC,EACtC,CAAmB,EACnB,cAAwC,EACxC,0BAAkD,EAClD,oBAAmC;;YAEnC,MAAM,UAAU,GAAG,CAAC,MAAM,iBAAiB,CAAC;iBACzC,QAAQ,CAAC,GAAS,EAAE;gBACnB,cAAc,CAAC,QAAQ,CAAC,CAAA;gBACxB,MAAM,IAAA,iBAAK,EAAC,IAAK,CAAC,CAAA;YACpB,CAAC,CAAA,CAAC;iBACD,WAAW,CAAC,GAAS,EAAE;gBACtB,cAAc,CAAC,WAAW,CAAC,CAAA;gBAC3B,MAAM,IAAA,iBAAK,EAAC,IAAK,CAAC,CAAA;gBAClB,MAAM,CAAC,EAAE,CAAA;YACX,CAAC,CAAA,CAAC,CAAA;YAEJ,MAAM,OAAO,GAAG,UAAU,CAAC,0BAA0B,EAAE,KAAM,CAAC,CAAA;YAC9D,MAAM,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE5E,UAAU,CAAC,KAAK,EAAE,CAAA;YAElB,MAAM,IAAA,iBAAK,EAAC,IAAK,CAAC,CAAA;QACpB,CAAC;KAAA;IAED,MAAM,uBAAuB,GAAG,CAAO,OAA4B,EAAE,UAA8C,EAAE,EAAE;QACrH,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAI,EAAE,yBAAY,CAAC,CAAA;QAE5H,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;QACvD,MAAM,iBAAiB,GAAG,CAAO,OAA4B,EAAE,aAA4D,EAAE,EAAE;YAC7H,OAAA,cAAc,CAAC,sBAAsB,CACnC,UAAU,EACV,IAAI,2CAAoB,CAAC;gBACvB,KAAK,EAAE,UAAW,CAAC,iBAAkB;aACtC,CAAC,EACF,aAAa,EACb,OAAO,CACR,CAAA;UAAA,CAAA;QAEH,MAAM,MAAM,GAAc,EAAE,CAAA;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAA;QAE7B,IAAI,2BAAuE,CAAA;QAC3E,IAAI,0BAAmD,CAAA;QACvD,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1D,2BAA2B,GAAG,GAAG,CAAA;YACjC,0BAA0B,GAAG,GAAG,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,MAAM,kBAAkB,CACtB,iBAAiB,CAAC,OAAO,EAAE,CAAO,iBAAiB,EAAE,EAAE;YACrD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC9B,2BAA2B,EAAE,CAAA;QAC/B,CAAC,CAAA,CAAC,EACF,GAAS,EAAE;YACT,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,cAAc,EAAE,CAAA;YAEjD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,qBAAqB,CAC1D,IAAI,EACJ,MAAM,gBAAgB,CAAC,WAAW,CAChC,IAAI,EACJ,IAAI,iBAAO,CAAC;gBACV,SAAS,EAAE,MAAM;gBACjB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,kBAAkB;aACzB,CAAC,CACH,CACF,CAAA;YAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,WAAW,CAC5C,MAAM,cAAc,CAAC,WAAW,CAC9B,UAAU,EACV,OAAO,EACP,IAAI,aAAK,CAAC;gBACR,WAAW,EAAE,mBAAmB;aACjC,CAAC,CACH,CACF,CAAA;QACH,CAAC,CAAA,EACD,CAAC,MAAM,EAAE,EAAE;YACT,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC,EACD,0BAA0B,EAC1B,oBAAoB,CACrB,CAAA;QAED,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAA;QAC3D,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAA;QAEhE,IAAA,aAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAClC,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAChC,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,aAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;IACpE,CAAC,CAAA,CAAA;IAED,IAAA,UAAE,EAAC,8BAA8B,EAAE,GAAS,EAAE;QAC5C,MAAM,uBAAuB,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAEjB,IAAA,UAAE,EAAC,2BAA2B,EAAE,GAAS,EAAE;QACzC,MAAM,uBAAuB,CAC3B;YACE,yBAAyB,EAAE,KAAM;YACjC,kBAAkB,EAAE,CAAC;SACtB,EACD,CAAC,QAAQ,CAAC,CACX,CAAA;IACH,CAAC,CAAA,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA","sourcesContent":["import 'isomorphic-fetch'\nimport { describeNoLite, getEnvironmentInitializer, hcp1Username, hcp2Username, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before, it, describe } from 'mocha'\nimport { IccPatientXApi, sleep, SubscriptionOptions } from '../../icc-x-api'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { User } from '../../icc-api/model/User'\nimport { randomUUID } from 'crypto'\nimport { expect } from 'chai'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { IccTopicXApi } from '../../icc-x-api/icc-topic-x-api'\nimport { Topic, TopicRole } from '../../icc-api/model/Topic'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport initApi = TestUtils.initApi\nimport { XHR } from '../../icc-api/api/XHR'\nimport XHRError = XHR.XHRError\nimport { FilterChainTopic } from '../../icc-api/model/FilterChainTopic'\nimport { TopicByHcPartyFilter } from '../../icc-x-api/filters/TopicByHcPartyFilter'\nimport { TopicByParticipantFilter } from '../../icc-x-api/filters/TopicByParticipantFilter'\nimport { Connection } from '../../icc-api/model/Connection'\nimport { Message } from '../../icc-api/model/Message'\nimport { IccTopicApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\n\ndescribeNoLite('icc-topic-x-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function createTopic(topicApi: IccTopicXApi, hcpUser: User, patient: Patient, ...additionalUser: { user: User; role: TopicRole }[]) {\n return topicApi.createTopic(\n await topicApi.newInstance(\n hcpUser,\n patient,\n new Topic({\n id: randomUUID(),\n description: 'Topic description',\n activeParticipants: {\n ...Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, u.role])),\n [hcpUser.healthcarePartyId!]: TopicRole.OWNER,\n },\n }),\n {\n additionalDelegates: Object.fromEntries(additionalUser.map((u) => [u.user.healthcarePartyId!, SecureDelegation.AccessLevelEnum.WRITE])),\n }\n )\n )\n }\n\n async function createPatient(patientApiForHcp: IccPatientXApi, hcpUser: User) {\n return patientApiForHcp.createPatientWithUser(\n hcpUser,\n await patientApiForHcp.newInstance(\n hcpUser,\n new Patient({\n id: randomUUID(),\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n }\n\n it('An HCP should be able to create a topic with participants', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n }).timeout(10_000)\n\n it('An HCP should be able to create an encrypted topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const baseTopicApi = new IccTopicApi(env!.iCureUrl, topicApiForHcp._headers, topicApiForHcp.authenticationProvider, topicApiForHcp.fetchImpl)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n expect(retrievedByHcp.description).to.not.be.undefined\n\n const notDecryptedTopic = await baseTopicApi.getTopic(createdTopic.id!)\n expect(notDecryptedTopic).to.not.deep.equal(createdTopic)\n expect(notDecryptedTopic.description).to.be.undefined\n expect(notDecryptedTopic.encryptedSelf).to.not.be.undefined\n }).timeout(10_000)\n\n it('An HCP should be able to create a topic with no participants and add participants later', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient)\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.getTopic(createdTopic.id!)\n expect.fail('Should not be able to get topic')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n\n await topicApiForHcp.addParticipantWithTopic({ dataOwnerId: hcpUser2.healthcarePartyId!, topicRole: TopicRole.PARTICIPANT }, createdTopic)\n\n const retrievedByHcpAfterAddParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterAddParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcp2AfterAddParticipant).to.deep.equal(retrievedByHcpAfterAddParticipant)\n expect(retrievedByHcpAfterAddParticipant.id).to.equal(createdTopic.id)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!, hcpUser2.healthcarePartyId!)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser2.healthcarePartyId!]).to.equal(TopicRole.PARTICIPANT)\n expect(retrievedByHcp2AfterAddParticipant.activeParticipants![hcpUser.healthcarePartyId!]).to.equal(TopicRole.OWNER)\n }).timeout(10_000)\n\n it('A participant should not be able to remove another participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n try {\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser.healthcarePartyId! }, createdTopic.id!)\n expect.fail('Should not be able to remove participant')\n } catch (e) {\n expect((e as XHRError).statusCode).to.equal(403)\n }\n }).timeout(10_000)\n\n it('A participant should be able to remove himself but still able to get topic', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n await topicApiForHcp2.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n\n const retrievedByHcpAfterRemoveParticipant = await topicApiForHcp.getTopic(createdTopic.id!)\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n\n expect(retrievedByHcpAfterRemoveParticipant).to.deep.equal(retrievedByHcp2AfterRemoveParticipant)\n }).timeout(10_000)\n\n it('An owner should be able to remove a participant', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const topicWithRemovedParticipant = await topicApiForHcp.removeParticipant({ dataOwnerId: hcpUser2.healthcarePartyId! }, createdTopic.id!)\n expect(topicWithRemovedParticipant.activeParticipants).all.keys(hcpUser.healthcarePartyId!)\n\n const retrievedByHcp2AfterRemoveParticipant = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2AfterRemoveParticipant).to.deep.equal(topicWithRemovedParticipant)\n }).timeout(10_000)\n\n it('A participant should be able to filter topics using TopicByHcPartyFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByHcPartyFilter({\n hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows!.find((v) => v.id === createdTopic.id)).to.deep.equal(createdTopic)\n }).timeout(60_000)\n\n it('A participant should be able to filter topics using TopicByParticipantFilter', async () => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const { userApi: userApiForHcp2, topicApi: topicApiForHcp2 } = await initApi(env!, hcp2Username)\n\n const hcpUser = await userApiForHcp.getCurrentUser()\n const hcpUser2 = await userApiForHcp2.getCurrentUser()\n\n const samplePatient = await createPatient(patientApiForHcp, hcpUser)\n const createdTopic = await createTopic(topicApiForHcp, hcpUser, samplePatient, { user: hcpUser2, role: TopicRole.PARTICIPANT })\n\n const retrievedByHcp = await topicApiForHcp.getTopic(createdTopic.id!)\n expect(retrievedByHcp).to.deep.equal(createdTopic)\n\n const retrievedByHcp2 = await topicApiForHcp2.getTopic(createdTopic.id!)\n expect(retrievedByHcp2).to.deep.equal(createdTopic)\n\n const filterChain = (hcpId: string) =>\n new FilterChainTopic({\n filter: new TopicByParticipantFilter({\n participantId: hcpId,\n }),\n })\n\n const filterResultForHcp = await topicApiForHcp.filterTopicsBy(filterChain(hcpUser.healthcarePartyId!))\n expect(filterResultForHcp.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n\n const filterResultForHcp2 = await topicApiForHcp2.filterTopicsBy(filterChain(hcpUser2.healthcarePartyId!))\n expect(filterResultForHcp2.rows?.map((t) => t.id)).to.includes(createdTopic.id)\n }).timeout(10_000)\n\n async function doXOnYAndSubscribe<Y>(\n connectionPromise: Promise<Connection>,\n x: () => Promise<Y>,\n statusListener: (status: string) => void,\n eventReceivedPromiseReject: (reason?: any) => void,\n eventReceivedPromise: Promise<void>\n ) {\n const connection = (await connectionPromise)\n .onClosed(async () => {\n statusListener('CLOSED')\n await sleep(3_000)\n })\n .onConnected(async () => {\n statusListener('CONNECTED')\n await sleep(2_000)\n await x()\n })\n\n const timeout = setTimeout(eventReceivedPromiseReject, 20_000)\n await eventReceivedPromise.then(() => clearTimeout(timeout)).catch(() => {})\n\n connection.close()\n\n await sleep(3_000)\n }\n\n const subscribeAndCreateTopic = async (options: SubscriptionOptions, eventTypes: ('CREATE' | 'DELETE' | 'UPDATE')[]) => {\n const { userApi: userApiForHcp, topicApi: topicApiForHcp, patientApi: patientApiForHcp } = await initApi(env!, hcp1Username)\n\n const loggedUser = await userApiForHcp.getCurrentUser()\n const connectionPromise = async (options: SubscriptionOptions, eventListener: (healthcareElement: Message) => Promise<void>) =>\n topicApiForHcp.subscribeToTopicEvents(\n eventTypes,\n new TopicByHcPartyFilter({\n hcpId: loggedUser!.healthcarePartyId!,\n }),\n eventListener,\n options\n )\n\n const events: Message[] = []\n const statuses: string[] = []\n\n let eventReceivedPromiseResolve!: (value: void | PromiseLike<void>) => void\n let eventReceivedPromiseReject!: (reason?: any) => void\n const eventReceivedPromise = new Promise<void>((res, rej) => {\n eventReceivedPromiseResolve = res\n eventReceivedPromiseReject = rej\n })\n\n await doXOnYAndSubscribe(\n connectionPromise(options, async (healthcareElement) => {\n events.push(healthcareElement)\n eventReceivedPromiseResolve()\n }),\n async () => {\n const user = await userApiForHcp.getCurrentUser()\n\n const patient = await patientApiForHcp.createPatientWithUser(\n user,\n await patientApiForHcp.newInstance(\n user,\n new Patient({\n firstName: 'John',\n lastName: 'Snow',\n note: 'Winter is coming',\n })\n )\n )\n\n const topic = await topicApiForHcp.createTopic(\n await topicApiForHcp.newInstance(\n loggedUser,\n patient,\n new Topic({\n description: 'Topic description',\n })\n )\n )\n },\n (status) => {\n statuses.push(status)\n },\n eventReceivedPromiseReject,\n eventReceivedPromise\n )\n\n events?.forEach((event) => console.log(`Event : ${event}`))\n statuses?.forEach((status) => console.log(`Status : ${status}`))\n\n expect(statuses).to.have.length(2)\n expect(events).to.have.length(1)\n expect(events.every((event) => event instanceof Topic)).to.be.true\n }\n\n it('CREATE Topic without options', async () => {\n await subscribeAndCreateTopic({}, ['CREATE'])\n }).timeout(60000)\n\n it('CREATE Topic with options', async () => {\n await subscribeAndCreateTopic(\n {\n connectionRetryIntervalMs: 10_000,\n connectionMaxRetry: 5,\n },\n ['CREATE']\n )\n }).timeout(60000)\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,99 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const test_utils_1 = require("../utils/test_utils");
13
- const mocha_1 = require("mocha");
14
- const node_compat_1 = require("../../node-compat");
15
- const TestApi_1 = require("../utils/TestApi");
16
- const types_1 = require("@icure/test-setup/types");
17
- const icc_x_api_1 = require("../../icc-x-api");
18
- const crypto_1 = require("crypto");
19
- const chai_1 = require("chai");
20
- const User_1 = require("../../icc-api/model/User");
21
- const uuid_1 = require("uuid");
22
- var initMasterApi = test_utils_1.TestUtils.initMasterApi;
23
- const SmartAuthProvider_1 = require("../../icc-x-api/auth/SmartAuthProvider");
24
- const crypto_2 = require("crypto");
25
- const icc_api_1 = require("../../icc-api");
26
- (0, test_utils_1.setLocalStorage)(fetch);
27
- let env;
28
- let authApi;
29
- describe('icc-x-user-api Tests', () => {
30
- (0, mocha_1.before)(function () {
31
- return __awaiter(this, void 0, void 0, function* () {
32
- this.timeout(600000);
33
- const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
34
- env = yield initializer.execute((0, types_1.getEnvVariables)());
35
- authApi = new icc_api_1.IccAuthApi(env.iCureUrl, {}, new icc_x_api_1.NoAuthenticationProvider(), fetch);
36
- });
37
- });
38
- function userApiWithProvider(authProvider) {
39
- return new icc_x_api_1.IccUserXApi(env.iCureUrl, {}, authProvider, new icc_api_1.IccAuthApi(env.iCureUrl, {}, new icc_x_api_1.NoAuthenticationProvider(), fetch));
40
- }
41
- it('Can instantiate an API and get the current user', () => __awaiter(void 0, void 0, void 0, function* () {
42
- // Given
43
- const api = yield (0, TestApi_1.TestApi)(env.iCureUrl, env.dataOwnerDetails[test_utils_1.hcp1Username].user, env.dataOwnerDetails[test_utils_1.hcp1Username].password, node_compat_1.crypto);
44
- yield api.userApi.getCurrentUser();
45
- }));
46
- it('Can get an user by its phoneNumber', () => __awaiter(void 0, void 0, void 0, function* () {
47
- const primitives = new icc_x_api_1.WebCryptoPrimitives(crypto_1.webcrypto);
48
- const phoneNumber = `+32${Math.floor(Math.random() * 900000000) + 100000000}`;
49
- const api = yield initMasterApi(env);
50
- const createdUser = yield api.userApi.createUser(new User_1.User({
51
- id: (0, uuid_1.v4)(),
52
- name: `user-${primitives.randomUuid()}`,
53
- login: `user-${primitives.randomUuid()}`,
54
- email: `user-${primitives.randomUuid()}@icure.com`,
55
- mobilePhone: phoneNumber,
56
- }));
57
- const user = yield api.userApi.getUserByPhoneNumber(phoneNumber);
58
- (0, chai_1.expect)(user).to.be.deep.equal(createdUser);
59
- }));
60
- (0, test_utils_1.itNoLite)('Should automatically ask for a more powerful secret to perform elevated-security operations if the available secret/token is not good enough. When a new token is created during this process, the modifyUser does not fail with a 409', () => __awaiter(void 0, void 0, void 0, function* () {
61
- const { credentials, api } = yield (0, test_utils_1.createNewHcpApi)(env);
62
- const initialUser = yield api.userApi.getCurrentUser();
63
- const masterApi = yield initMasterApi(env);
64
- const userToken = (0, crypto_2.randomUUID)();
65
- const userWithLongToken = yield masterApi.userApi.modifyUser(Object.assign(Object.assign({}, initialUser), { authenticationTokens: {
66
- 'test-long-lived-token': {
67
- token: userToken,
68
- creationTime: Date.now(),
69
- validity: 60 * 60 * 24 * 7,
70
- },
71
- } }));
72
- let longLivedTokenRequested = false;
73
- let shortLivedTokenRequested = false;
74
- const authProvider = yield SmartAuthProvider_1.SmartAuthProvider.initialise(authApi, credentials.user, {
75
- getSecret: (acceptedSecrets, previousAttempts) => __awaiter(void 0, void 0, void 0, function* () {
76
- if (acceptedSecrets.includes(SmartAuthProvider_1.AuthSecretType.LONG_LIVED_TOKEN)) {
77
- longLivedTokenRequested = true;
78
- return { value: userToken, secretType: SmartAuthProvider_1.AuthSecretType.LONG_LIVED_TOKEN };
79
- }
80
- else if (acceptedSecrets.includes(SmartAuthProvider_1.AuthSecretType.SHORT_LIVED_TOKEN)) {
81
- shortLivedTokenRequested = true;
82
- yield masterApi.userApi.getToken(userWithLongToken.id, 'tmp', 300, '123456');
83
- return { value: '123456', secretType: SmartAuthProvider_1.AuthSecretType.SHORT_LIVED_TOKEN };
84
- }
85
- else
86
- chai_1.assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN');
87
- }),
88
- });
89
- const userApi = userApiWithProvider(authProvider);
90
- (0, chai_1.expect)((yield userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev);
91
- (0, chai_1.expect)(longLivedTokenRequested).to.be.true;
92
- (0, chai_1.expect)(shortLivedTokenRequested).to.be.false;
93
- const newPw = (0, crypto_2.randomUUID)();
94
- const userWithNewPw = yield userApi.modifyUser(Object.assign(Object.assign({}, userWithLongToken), { passwordHash: newPw }));
95
- (0, chai_1.expect)(userWithNewPw.rev).to.not.equal(userWithLongToken.rev);
96
- (0, chai_1.expect)(shortLivedTokenRequested).to.be.true;
97
- }));
98
- });
99
- //# sourceMappingURL=icc-user-x-api-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icc-user-x-api-test.js","sourceRoot":"","sources":["../../../test/icc-x-api/icc-user-x-api-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, hcp1Username, itNoLite, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { before } from 'mocha'\nimport { crypto } from '../../node-compat'\nimport { TestApi } from '../utils/TestApi'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { AuthenticationProvider, CryptoPrimitives, WebCryptoPrimitives, IccUserXApi, NoAuthenticationProvider } from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { assert, expect } from 'chai'\nimport { User } from '../../icc-api/model/User'\nimport { v4 as uuid } from 'uuid'\nimport initMasterApi = TestUtils.initMasterApi\nimport { AuthSecretDetails, AuthSecretType, SmartAuthProvider } from '../../icc-x-api/auth/SmartAuthProvider'\nimport { randomUUID } from 'crypto'\nimport { IccAuthApi, IccUserApi } from '../../icc-api'\n\nsetLocalStorage(fetch)\nlet env: TestVars\nlet authApi: IccAuthApi\n\ndescribe('icc-x-user-api Tests', () => {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n authApi = new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch)\n })\n\n function userApiWithProvider(authProvider: AuthenticationProvider): IccUserApi {\n return new IccUserXApi(env.iCureUrl, {}, authProvider, new IccAuthApi(env.iCureUrl, {}, new NoAuthenticationProvider(), fetch))\n }\n\n it('Can instantiate an API and get the current user', async () => {\n // Given\n const api = await TestApi(env.iCureUrl, env.dataOwnerDetails[hcp1Username].user, env.dataOwnerDetails[hcp1Username].password, crypto)\n await api.userApi.getCurrentUser()\n })\n\n it('Can get an user by its phoneNumber', async () => {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const phoneNumber = `+32${Math.floor(Math.random() * 900000000) + 100000000}`\n\n const api = await initMasterApi(env)\n\n const createdUser = await api.userApi.createUser(\n new User({\n id: uuid(),\n name: `user-${primitives.randomUuid()}`,\n login: `user-${primitives.randomUuid()}`,\n email: `user-${primitives.randomUuid()}@icure.com`,\n mobilePhone: phoneNumber,\n })\n )\n\n const user = await api.userApi.getUserByPhoneNumber(phoneNumber)\n\n expect(user).to.be.deep.equal(createdUser)\n })\n\n itNoLite(\n 'Should automatically ask for a more powerful secret to perform elevated-security operations if the available secret/token is not good enough. When a new token is created during this process, the modifyUser does not fail with a 409',\n async () => {\n const { credentials, api } = await createNewHcpApi(env)\n const initialUser = await api.userApi.getCurrentUser()\n const masterApi = await initMasterApi(env)\n const userToken = randomUUID()\n const userWithLongToken = await masterApi.userApi.modifyUser({\n ...initialUser,\n authenticationTokens: {\n 'test-long-lived-token': {\n token: userToken,\n creationTime: Date.now(),\n validity: 60 * 60 * 24 * 7,\n },\n },\n })\n let longLivedTokenRequested = false\n let shortLivedTokenRequested = false\n const authProvider = await SmartAuthProvider.initialise(authApi, credentials.user, {\n getSecret: async (acceptedSecrets: AuthSecretType[], previousAttempts: AuthSecretDetails[]) => {\n if (acceptedSecrets.includes(AuthSecretType.LONG_LIVED_TOKEN)) {\n longLivedTokenRequested = true\n return { value: userToken, secretType: AuthSecretType.LONG_LIVED_TOKEN }\n } else if (acceptedSecrets.includes(AuthSecretType.SHORT_LIVED_TOKEN)) {\n shortLivedTokenRequested = true\n await masterApi.userApi.getToken(userWithLongToken.id!, 'tmp', 300, '123456')\n return { value: '123456', secretType: AuthSecretType.SHORT_LIVED_TOKEN }\n } else assert.fail('Should request LONG_LIVED_TOKEN or SHORT_LIVED_TOKEN')\n },\n })\n const userApi = userApiWithProvider(authProvider)\n expect((await userApi.getCurrentUser()).rev).to.equal(userWithLongToken.rev)\n expect(longLivedTokenRequested).to.be.true\n expect(shortLivedTokenRequested).to.be.false\n\n const newPw = randomUUID()\n const userWithNewPw = await userApi.modifyUser({ ...userWithLongToken, passwordHash: newPw })\n\n expect(userWithNewPw.rev).to.not.equal(userWithLongToken.rev)\n expect(shortLivedTokenRequested).to.be.true\n }\n )\n})\n"]}
@@ -1 +0,0 @@
1
- import 'isomorphic-fetch';
@@ -1,125 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- require("isomorphic-fetch");
13
- const mocha_1 = require("mocha");
14
- const test_utils_1 = require("../utils/test_utils");
15
- const icc_x_api_1 = require("../../icc-x-api");
16
- const crypto_1 = require("crypto");
17
- const chai_1 = require("chai");
18
- const types_1 = require("@icure/test-setup/types");
19
- const TestStorage_1 = require("../utils/TestStorage");
20
- const TestCryptoStrategies_1 = require("../utils/TestCryptoStrategies");
21
- const KeylessCryptoStrategies_1 = require("../utils/KeylessCryptoStrategies");
22
- (0, test_utils_1.setLocalStorage)(fetch);
23
- let env;
24
- describe('Keyless api Tests', () => {
25
- (0, mocha_1.before)(function () {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- this.timeout(600000);
28
- const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
29
- env = yield initializer.execute((0, types_1.getEnvVariables)());
30
- });
31
- });
32
- const calendarItemTitle = 'Encrypted title';
33
- function initializeTestData() {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- const { api: patientApi, credentials: patientCredentials } = yield (0, test_utils_1.createNewKeylessApi)(env);
36
- const patientUser = yield patientApi.userApi.getCurrentUser();
37
- const patient = (yield patientApi.dataOwnerApi.getCurrentDataOwner()).dataOwner;
38
- const { api: hcpApi, credentials: hcpDetails, user: hcpUser } = yield (0, test_utils_1.createNewHcpApi)(env);
39
- const exchangeData = yield patientApi.cryptoApi.keylessCreateExchangeDataTo(hcpDetails.dataOwnerId);
40
- const createdCalendarItem = yield patientApi.calendarItemApi.createCalendarItemWithHcParty(patientUser, yield patientApi.calendarItemApi.newInstancePatient(patientUser, patient, { title: calendarItemTitle }, {
41
- sfkOption: icc_x_api_1.SecretIdUseOption.UseNone,
42
- alternateRootDelegation: hcpDetails.dataOwnerId,
43
- }));
44
- (0, chai_1.expect)(createdCalendarItem.title).to.equal(calendarItemTitle);
45
- return {
46
- patientApi,
47
- patientCredentials,
48
- patientUser,
49
- patient,
50
- hcpApi,
51
- hcpDetails,
52
- hcpUser,
53
- exchangeData,
54
- createdCalendarItem,
55
- };
56
- });
57
- }
58
- it('Keyless api should allow creation of data and retrieval by delegator and delegate', () => __awaiter(void 0, void 0, void 0, function* () {
59
- const { patientApi, patientUser, patient, hcpApi, hcpUser, createdCalendarItem } = yield initializeTestData();
60
- const retrievedByPatient = yield patientApi.calendarItemApi.getCalendarItemWithUser(patientUser, createdCalendarItem.id);
61
- (0, chai_1.expect)(retrievedByPatient.title).to.equal(calendarItemTitle);
62
- (0, chai_1.expect)(yield patientApi.calendarItemApi.decryptPatientIdOf(retrievedByPatient)).to.have.members([patient.id]);
63
- const retrievedByHcp = yield hcpApi.calendarItemApi.getCalendarItemWithUser(hcpUser, createdCalendarItem.id);
64
- (0, chai_1.expect)(retrievedByHcp.title).to.equal(calendarItemTitle);
65
- (0, chai_1.expect)(yield hcpApi.calendarItemApi.decryptPatientIdOf(retrievedByHcp)).to.have.members([patient.id]);
66
- }));
67
- it('Keyless api should allow retrieval in new instance after exchange data injection', () => __awaiter(void 0, void 0, void 0, function* () {
68
- const { patientCredentials, patientUser, patient, exchangeData, createdCalendarItem } = yield initializeTestData();
69
- const newPatientApi = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, patientCredentials, new KeylessCryptoStrategies_1.KeylessCryptoStrategies(), crypto_1.webcrypto, fetch, {});
70
- yield newPatientApi.calendarItemApi.getCalendarItemWithUser(patientUser, createdCalendarItem.id).then(() => {
71
- throw new Error('Get before injection for anonymous user should not work');
72
- }, () => {
73
- /* ok, expected */
74
- });
75
- yield newPatientApi.cryptoApi.injectExchangeData([Object.assign(Object.assign({}, exchangeData), { verified: false })], false);
76
- const retrievedByNewApi = yield newPatientApi.calendarItemApi.getCalendarItemWithUser(patientUser, createdCalendarItem.id);
77
- (0, chai_1.expect)(retrievedByNewApi.title).to.equal(calendarItemTitle);
78
- (0, chai_1.expect)(yield newPatientApi.calendarItemApi.decryptPatientIdOf(retrievedByNewApi)).to.have.members([patient.id]);
79
- }));
80
- it('Should allow re-encryption of exchange data as unverified on injection', () => __awaiter(void 0, void 0, void 0, function* () {
81
- const { patientApi, patientCredentials, patientUser, patient, hcpDetails, exchangeData, createdCalendarItem } = yield initializeTestData();
82
- const keyStorage = new TestStorage_1.TestKeyStorage();
83
- const newKey = yield patientApi.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
84
- const newPatientApiWithKeyAndInjected = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, patientCredentials, new TestCryptoStrategies_1.TestCryptoStrategies(newKey), crypto_1.webcrypto, fetch, {
85
- keyStorage,
86
- injectExchangeData: {
87
- details: [Object.assign(Object.assign({}, exchangeData), { verified: false })],
88
- reEncryptWithOwnKeys: true,
89
- },
90
- });
91
- (0, chai_1.expect)((yield newPatientApiWithKeyAndInjected.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcpDetails.dataOwnerId)).exchangeData.id ==
92
- exchangeData.exchangeDataId).to.be.false;
93
- const newPatientApiWithKey = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, patientCredentials, new TestCryptoStrategies_1.TestCryptoStrategies(), crypto_1.webcrypto, fetch, {
94
- keyStorage,
95
- });
96
- const retrievedByNewApi = yield newPatientApiWithKey.calendarItemApi.getCalendarItemWithUser(patientUser, createdCalendarItem.id);
97
- (0, chai_1.expect)(retrievedByNewApi.title).to.equal(calendarItemTitle);
98
- (0, chai_1.expect)(yield newPatientApiWithKey.calendarItemApi.decryptPatientIdOf(retrievedByNewApi)).to.have.members([patient.id]);
99
- (0, chai_1.expect)((yield newPatientApiWithKey.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcpDetails.dataOwnerId)).exchangeData.id ==
100
- exchangeData.exchangeDataId).to.be.false;
101
- }));
102
- it('Should allow re-encryption of exchange data as verified on injection', () => __awaiter(void 0, void 0, void 0, function* () {
103
- const { patientApi, patientCredentials, patientUser, patient, hcpDetails, exchangeData, createdCalendarItem } = yield initializeTestData();
104
- const keyStorage = new TestStorage_1.TestKeyStorage();
105
- const newKey = yield patientApi.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
106
- const newPatientApiWithKeyAndInjected = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, patientCredentials, new TestCryptoStrategies_1.TestCryptoStrategies(newKey), crypto_1.webcrypto, fetch, {
107
- keyStorage,
108
- injectExchangeData: {
109
- details: [Object.assign(Object.assign({}, exchangeData), { verified: true })],
110
- reEncryptWithOwnKeys: true,
111
- },
112
- });
113
- (0, chai_1.expect)((yield newPatientApiWithKeyAndInjected.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcpDetails.dataOwnerId)).exchangeData.id ==
114
- exchangeData.exchangeDataId).to.be.true;
115
- const newPatientApiWithKey = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, patientCredentials, new TestCryptoStrategies_1.TestCryptoStrategies(), crypto_1.webcrypto, fetch, {
116
- keyStorage,
117
- });
118
- (0, chai_1.expect)((yield newPatientApiWithKey.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcpDetails.dataOwnerId)).exchangeData.id ==
119
- exchangeData.exchangeDataId).to.be.true;
120
- const retrievedByNewApi = yield newPatientApiWithKey.calendarItemApi.getCalendarItemWithUser(patientUser, createdCalendarItem.id);
121
- (0, chai_1.expect)(retrievedByNewApi.title).to.equal(calendarItemTitle);
122
- (0, chai_1.expect)(yield newPatientApiWithKey.calendarItemApi.decryptPatientIdOf(retrievedByNewApi)).to.have.members([patient.id]);
123
- }));
124
- });
125
- //# sourceMappingURL=keyless-api.js.map