oro-sdk 3.21.2 → 3.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.21.2",
2
+ "version": "3.23.0",
3
3
  "main": "dist/index.js",
4
4
  "typings": "dist/index.d.ts",
5
5
  "files": [
@@ -54,7 +54,7 @@
54
54
  "form-data": "^4.0.0",
55
55
  "formdata-node": "^4.3.1",
56
56
  "idb-keyval": "^5.0.6",
57
- "oro-sdk-apis": "1.54.2",
57
+ "oro-sdk-apis": "1.55.0",
58
58
  "oro-toolbox": "0.0.6",
59
59
  "uuid": "^8.3.2"
60
60
  }
package/src/client.ts CHANGED
@@ -285,6 +285,7 @@ export class OroClient {
285
285
  * @param workflow
286
286
  * @param recoveryQA
287
287
  * @param indexSearch create search index for the consultation if true
288
+ * @param onProgress callback that is called whenever a new step of patient registration is executed. Note: progress ranges from 0 to 1, and descriptionKey is a description of the progress as a key so the app would use it to translate the description
288
289
  * @returns
289
290
  */
290
291
  public async registerPatient(
@@ -295,10 +296,11 @@ export class OroClient {
295
296
  recoverySecurityQuestions: string[]
296
297
  recoverySecurityAnswers: string[]
297
298
  },
298
- indexSearch: boolean = true
299
+ indexSearch: boolean = true,
300
+ onProgress?: (progress: number, descriptionKey: string) => void
299
301
  ): Promise<RegisterPatientOutput> {
300
302
  if (!this.rsa) throw IncompleteAuthentication
301
- return registerPatient(patientUuid, consult, workflow, this, this.toolbox.uuid(), recoveryQA, indexSearch)
303
+ return registerPatient(patientUuid, consult, workflow, this, this.toolbox.uuid(), recoveryQA, indexSearch, onProgress)
302
304
  }
303
305
 
304
306
  /**
@@ -1513,4 +1515,4 @@ export class OroClient {
1513
1515
 
1514
1516
  return updatedIdentity
1515
1517
  }
1516
- }
1518
+ }
@@ -51,6 +51,7 @@ const MAX_RETRIES = 15
51
51
  * @param masterKey
52
52
  * @param recoveryQA
53
53
  * @param indexSearch create search index for the consultation if true
54
+ * @param onProgress callback that is called whenever a new step of patient registration is executed. Note: progress ranges from 0 to 1, and descriptionKey is a description of the progress as a key so the app would use it to translate the description
54
55
  * @returns the successful registration
55
56
  */
56
57
  export async function registerPatient(
@@ -63,7 +64,8 @@ export async function registerPatient(
63
64
  recoverySecurityQuestions: string[]
64
65
  recoverySecurityAnswers: string[]
65
66
  },
66
- indexSearch: boolean = true
67
+ indexSearch: boolean = true,
68
+ onProgress?: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number, totalImagesNum?: number }) => void
67
69
  ): Promise<RegisterPatientOutput> {
68
70
  let consult: Consult | undefined = undefined
69
71
  let lockboxUuid: Uuid | undefined = undefined
@@ -71,9 +73,16 @@ export async function registerPatient(
71
73
  let retry = MAX_RETRIES
72
74
  let identity: IdentityResponse | undefined = undefined
73
75
  let errorsThrown: Error[] = []
76
+ const stepsTotalNum = 9
77
+ let currentStep: number
74
78
 
75
79
  for (; retry > 0; retry--) {
76
80
  try {
81
+ currentStep = 0
82
+
83
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'retrieve_practitioners')
84
+
85
+
77
86
  // Wait a bit each retry (we also want the first one to wait)
78
87
  await new Promise((resolve) => setTimeout(resolve, 2000))
79
88
 
@@ -90,11 +99,15 @@ export async function registerPatient(
90
99
  })
91
100
 
92
101
  // Creating consult
102
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_consult')
103
+
93
104
  if (!consult) {
94
105
  consult = await getOrCreatePatientConsultationUuid(consultRequest, oroClient)
95
106
  }
96
107
 
97
108
  // Creating lockbox
109
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_lockbox')
110
+
98
111
  if (!lockboxUuid) lockboxUuid = await getOrCreatePatientLockbox(oroClient)
99
112
 
100
113
  if (!identity) identity = await oroClient.guardClient.identityGet(patientUuid)
@@ -106,6 +119,8 @@ export async function registerPatient(
106
119
  })
107
120
 
108
121
  // Patient Grant to practice
122
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'grant_patient')
123
+
109
124
  let grantPromises = practitioners
110
125
  .filter((practitioner) => practitioner.uuid !== practitionerAdmin)
111
126
  .map(async (practitioner) => {
@@ -142,12 +157,25 @@ export async function registerPatient(
142
157
  })
143
158
  })
144
159
 
145
- await storeImageAliases(consult.uuid, lockboxUuid, workflow, oroClient).catch((err) => {
160
+ await storeImageAliases(
161
+ consult.uuid,
162
+ lockboxUuid,
163
+ workflow,
164
+ oroClient,
165
+ onProgress? {
166
+ onProgress,
167
+ currentStep,
168
+ stepsTotalNum
169
+ } : undefined
170
+ ).catch((err) => {
146
171
  console.error('[SDK: registration] Some errors happened during image upload', err)
147
172
  // Acceptable to continue as images can be requested during the consultation, but we should still retry until the last retry remains
148
173
  if (retry <= 1) return
149
174
  else errorsThrown.push(err)
150
175
  })
176
+ ++currentStep
177
+
178
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'store_patient_data')
151
179
 
152
180
  await storePatientData(
153
181
  consult.uuid,
@@ -160,6 +188,8 @@ export async function registerPatient(
160
188
  errorsThrown.push(err)
161
189
  })
162
190
 
191
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_masterkey')
192
+
163
193
  if (masterKey && !identity?.recoveryMasterKey) {
164
194
  // generate and store recovery payload and updates the identity
165
195
  identity = await oroClient.updateMasterKey(patientUuid, masterKey, lockboxUuid).catch((err) => {
@@ -174,6 +204,8 @@ export async function registerPatient(
174
204
  masterKey = undefined
175
205
  }
176
206
 
207
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_security_questions')
208
+
177
209
  if (recoveryQA && !identity?.recoverySecurityQuestions)
178
210
  // Patient security question recovery threshold is 2 answers and updates the identity
179
211
  identity = await oroClient
@@ -194,6 +226,8 @@ export async function registerPatient(
194
226
  await Promise.all([...grantPromises, ...consultIndexPromises])
195
227
 
196
228
 
229
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'search_indexing')
230
+
197
231
  if (indexSearch) {
198
232
  await buildConsultSearchIndex(consult, workflow, oroClient).catch((err) => {
199
233
  console.error(
@@ -213,6 +247,8 @@ export async function registerPatient(
213
247
  })
214
248
 
215
249
  // if we got through the complete flow, the registration succeeded
250
+ if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'success')
251
+
216
252
  break
217
253
  } catch (err) {
218
254
  console.error(`[SDK] Error occured during registration: ${err}, retrying... Retries remaining: ${retry}`)
@@ -374,7 +410,12 @@ async function storeImageAliases(
374
410
  consultationId: Uuid,
375
411
  lockboxUuid: Uuid,
376
412
  workflow: WorkflowData,
377
- oroClient: OroClient
413
+ oroClient: OroClient,
414
+ progress?: {
415
+ currentStep: number;
416
+ stepsTotalNum: number;
417
+ onProgress: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number; totalImagesNum?: number }) => void;
418
+ }
378
419
  ): Promise<(Uuid | void)[]> {
379
420
  const images = await getImagesFromIndexDb((await filterTriggeredAnsweredWithKind(workflow, 'images-alias')).flat())
380
421
 
@@ -384,6 +425,11 @@ async function storeImageAliases(
384
425
  console.error('[SDK] Some images have not been found, they have been skipped.')
385
426
  }
386
427
 
428
+ let storedImagesNum = 0
429
+ let totalImagesNum = nonNullImages.length
430
+ if (progress)
431
+ progress.onProgress(progress.currentStep/progress.stepsTotalNum, 'store_images', {storedImagesNum, totalImagesNum})
432
+
387
433
  let promises = nonNullImages.map((image) => {
388
434
  return oroClient.getOrInsertJsonData<ConsultationImageMeta>(
389
435
  lockboxUuid,
@@ -395,7 +441,20 @@ async function storeImageAliases(
395
441
  idbId: image.idbId as string,
396
442
  },
397
443
  {}
398
- )
444
+ ).then(() => {
445
+ if (progress) {
446
+ ++storedImagesNum
447
+ let progressStepValue = Math.round((((progress.currentStep + 1)/progress.stepsTotalNum) - (progress.currentStep/progress.stepsTotalNum)) * 100) / 100
448
+ progress.onProgress(
449
+ (progress.currentStep/progress.stepsTotalNum) + (progressStepValue * (storedImagesNum/totalImagesNum)),
450
+ 'store_images',
451
+ {
452
+ storedImagesNum,
453
+ totalImagesNum
454
+ })
455
+ }
456
+
457
+ })
399
458
  })
400
459
  return Promise.all(promises)
401
460
  }