oro-sdk 5.0.1 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/oro-sdk.cjs.development.js +9 -13
- package/dist/oro-sdk.cjs.development.js.map +1 -1
- package/dist/oro-sdk.cjs.production.min.js +1 -1
- package/dist/oro-sdk.cjs.production.min.js.map +1 -1
- package/dist/oro-sdk.esm.js +9 -13
- package/dist/oro-sdk.esm.js.map +1 -1
- package/package.json +3 -3
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"oro-sdk.cjs.development.js","sources":["../src/helpers/client.ts","../src/models/error.ts","../src/helpers/workflow.ts","../src/helpers/patient-registration.ts","../src/helpers/vault-grants.ts","../src/sdk-revision/client.ts","../src/client.ts","../src/services/external/clinia.ts","../src/index.ts"],"sourcesContent":["import {\n PopulatedWorkflowData,\n MetadataCategory,\n SelectedAnswersData,\n} from 'oro-sdk-apis'\nimport { PersonalInformations } from '../models/client'\n\nconst personalMetaToPrefix = {\n [MetadataCategory.Personal]: 'you',\n [MetadataCategory.ChildPersonal]: 'child',\n [MetadataCategory.OtherPersonal]: 'other',\n}\n\n/**\n * This function extract PersonalInformations from data input object coming from workflow\n * @param data extracted from WorkflowData\n * @returns PersonalInformations of a patient\n */\nexport function identificationToPersonalInformations(\n data: any,\n category:\n | MetadataCategory.Personal\n | MetadataCategory.ChildPersonal\n | MetadataCategory.OtherPersonal\n): PersonalInformations {\n const prefix = personalMetaToPrefix[category]\n\n return {\n birthday: data[`${prefix}Birthday`],\n firstname: data[`${prefix}Firstname`],\n gender: data[`${prefix}Gender`],\n name: data[`${prefix}Name`],\n phone: data[`${prefix}Phone`],\n zip: data[`${prefix}Zip`],\n hid: data[`${prefix}HID`] ?? data[`${prefix}ID`], // This is done for backward compatibility (historically youID was used)\n pharmacy: data[`${prefix}Pharmacy`],\n address: data[`${prefix}Address`],\n }\n}\n\nexport function toActualObject(data: PopulatedWorkflowData) {\n const ret: any = {}\n\n Object.entries(data.fields).forEach(([key, field]) => {\n ret[key] = field.displayedAnswer ? field.displayedAnswer : field.answer\n })\n\n return ret\n}\n\n/**\n * This function update a PopulatedWorkflowData with PersonalInformations\n * @param infos the personal informations\n * @param data the PopulatedWorkflowData\n * @returns an updated PopulatedWorkflowData\n */\nexport function updatePersonalIntoPopulatedWorkflowData(\n infos: PersonalInformations,\n data: PopulatedWorkflowData,\n category:\n | MetadataCategory.Personal\n | MetadataCategory.ChildPersonal\n | MetadataCategory.OtherPersonal\n) {\n const prefix = personalMetaToPrefix[category]\n\n const ret = JSON.parse(JSON.stringify(data)) // deep copy PopulatedWorkflowData\n\n if (infos.birthday && ret.fields[`${prefix}Birthday`])\n ret.fields[`${prefix}Birthday`].answer = infos.birthday\n if (infos.firstname && ret.fields[`${prefix}Firstname`])\n ret.fields[`${prefix}Firstname`].answer = infos.firstname\n if (infos.gender && ret.fields[`${prefix}Gender`])\n ret.fields[`${prefix}Gender`].answer = infos.gender\n if (infos.name && ret.fields[`${prefix}Name`])\n ret.fields[`${prefix}Name`].answer = infos.name\n if (infos.phone && ret.fields[`${prefix}Phone`])\n ret.fields[`${prefix}Phone`].answer = infos.phone\n if (infos.zip && ret.fields[`${prefix}Zip`])\n ret.fields[`${prefix}Zip`].answer = infos.zip\n if (infos.hid) {\n if (ret.fields[`${prefix}HID`]) {\n ret.fields[`${prefix}HID`].answer = infos.hid\n } else if (ret.fields[`${prefix}ID`]) {\n // This is done for backward compatibility (historically youID was used)\n ret.fields[`${prefix}ID`].answer = infos.hid\n } else {\n // If does not exist create it\n ret.fields[`${prefix}HID`] = { kind: 'text', answer: infos.hid }\n }\n }\n\n return ret\n}\n\n/**\n * This function extract an ISO 3166-1 alpha-2 country and subdivision code from data input object coming from workflow\n * @param answers answers from the WorkflowData\n * @returns an ISO 3166 alpha-2 code or undefined\n */\nexport function extractISOLocalityForConsult(\n answers?: SelectedAnswersData\n): string | undefined {\n if (!answers) {\n return undefined\n }\n\n const arrAnswersWithLocality = answers\n .flatMap((currentAnswerPage) => {\n const arrCountryFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Country') !== -1\n )\n .flat()\n const arrProvinceFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Province') !== -1\n )\n .flat()\n const arrConsultLocalFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Locality') !== -1\n )\n .flat()\n //returning the actual selected values, skipping if their IDs are more complex than a string\n return [\n ...arrCountryFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ...arrProvinceFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ...arrConsultLocalFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ]\n })\n .filter((item) => item !== undefined)\n\n const arrSelectedLocality = arrAnswersWithLocality.filter(\n (currentSelectedLocality) =>\n currentSelectedLocality.startsWith('isoLocalityConsult')\n )\n if (!arrSelectedLocality || arrSelectedLocality.length === 0) {\n console.log('no locality found in ' + arrSelectedLocality)\n return undefined\n }\n //to allow enforcing of an order, we will allow the following pattern in the isoLocalityConsult field name\n // isoLocalityConsult-QC-CA and isoLocalityConsult_1-QC-CA\n // or generally: isoLocalityConsult-<isoValue> or isoLocalityConsult_<priority>-<isoValue>\n const allowedLocalityPatterns = /isoLocalityConsult(?:_(?<indexPriority>\\d*))?-(?<isoValue>[a-zA-Z0-9]{2}-[a-zA-Z0-9]{1,3})/\n const finalLocality = arrSelectedLocality.reduce<string | undefined>(\n (finalLocality, currentSelectedLocality) => {\n const extractedSelected = allowedLocalityPatterns.exec(\n currentSelectedLocality\n )\n const [, indexSelectedPriority, isoSelectedValue] =\n extractedSelected ?? []\n if (!finalLocality) {\n return isoSelectedValue\n }\n\n const extractedFinal = allowedLocalityPatterns.exec(finalLocality)\n const [, indexFinalPriority, isoFinalValue] = extractedFinal ?? []\n //we only keep the old value if there's priority used\n // and the new value is of lower priority\n if (\n !indexSelectedPriority ||\n (indexFinalPriority &&\n indexFinalPriority > indexSelectedPriority)\n ) {\n return isoFinalValue\n }\n\n return isoSelectedValue\n },\n undefined\n )\n\n console.log('Picking locality ' + finalLocality)\n return finalLocality\n}\n\nconst sessionPrivateKeyPrefix = 'sess-pkey'\nexport function sessionStorePrivateKeyName(id: string): string {\n return sessionPrivateKeyPrefix + id\n}\n","export class IncompleteAuthentication extends Error { }\nexport class MissingGrant extends Error { }\nexport class MissingGrantFilter extends Error { }\nexport class MissingLockbox extends Error { }\nexport class MissingLockboxOwner extends Error { }\nexport class AssociatedLockboxNotFound extends Error { }\nexport class WorkflowAnswersMissingError extends Error { }\n","import { getMany } from 'idb-keyval'\nimport { WorkflowAnswersMissingError } from '../models'\nimport {\n MetadataCategory,\n PopulatedWorkflowData,\n PopulatedWorkflowField,\n QuestionData,\n SelectedAnswerData,\n SelectedAnswersData,\n WorkflowData,\n WorkflowPageData,\n WorkflowUploadedImage,\n} from 'oro-sdk-apis'\n\nexport async function filterTriggeredAnsweredWithKind(\n workflowData: WorkflowData,\n kind:\n | 'text'\n | 'text-area'\n | 'text-select-group'\n | 'date'\n | 'number'\n | 'images'\n | 'images-alias'\n | 'body-parts'\n | 'pharmacy-picker'\n | 'online-pharmacy-picker'\n | 'hair-selector-women'\n | 'hair-selector-men'\n | 'hair-loss-stage'\n | 'hair-loss-frontal'\n): Promise<SelectedAnswerData[]> {\n if (!workflowData.selectedAnswers) throw WorkflowAnswersMissingError\n // Flattens the list of answered questions\n let flattenedAnswers = flattenSelectedAnswers(workflowData.selectedAnswers)\n // Generates a list of applicable questions\n let triggeredQuestionsWithKind = Object.fromEntries(\n workflowData.pages\n .map((a) => {\n return Object.entries(a.questions).filter(\n ([_, question]) => isTriggered(question.triggers || [], flattenedAnswers) && question.kind === kind\n )\n })\n .flat()\n )\n\n const samePageAnswers = workflowData.selectedAnswers.reduce((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n\n const res = Object.keys(triggeredQuestionsWithKind).map((questionFieldName) => {\n return samePageAnswers[questionFieldName]\n })\n\n return res\n}\n\n/**\n * Filters and Populates the `selectedAnswers` from the workflow by\n * Cross-referencing the `MetaCategory` of the answer's respective question\n * Populates the fields labels and values that are of radio, dropdown and checkbox types\n *\n * @param workflowData\n * @param category\n * @returns An array of record key, value pairs\n */\nexport async function getWorkflowDataByCategory(\n workflowData: WorkflowData,\n category: MetadataCategory\n): Promise<PopulatedWorkflowData> {\n if (!workflowData.selectedAnswers) throw WorkflowAnswersMissingError\n\n // Flattens the list of answered questions\n let flattenedAnswers = flattenSelectedAnswers(workflowData.selectedAnswers)\n // Generates a list of applicable questions\n let triggeredQuestions = Object.fromEntries(\n workflowData.pages\n .map((a) => {\n return Object.entries(a.questions).filter(([_, question]) =>\n isTriggered(question.triggers || [], flattenedAnswers)\n )\n })\n .flat()\n )\n\n const fields: Record<string, PopulatedWorkflowField> = {}\n\n // Generates the answers of the specified category and adds the appropriate values if any are missing\n return Promise.all(\n workflowData.selectedAnswers\n .map((e) => Object.entries(e))\n .flat()\n .filter(([k, v]) => triggeredQuestions[k] && triggeredQuestions[k]['metaCategory'] === category)\n .map(([k, v]) => {\n return populateWorkflowField(triggeredQuestions[k], v).then((populatedValue) => {\n fields[k] = populatedValue\n })\n })\n )\n .then(() => {\n const ret: PopulatedWorkflowData = {\n workflowCreatedAt: workflowData.createdAt,\n workflowId: workflowData.id,\n locale: workflowData.locale,\n fields,\n }\n return ret\n })\n .catch((err) => {\n console.error(`Error while extracting ${category} data from workflow`, err)\n throw err\n })\n}\n\nexport async function getImagesFromIndexDb(answer: SelectedAnswerData): Promise<WorkflowUploadedImage[]> {\n return await getMany<WorkflowUploadedImage>((answer as any[]).map((v) => v.id ?? v) as string[])\n}\n\n/**\n * (If applicable) Based on the question kind, and the answer type this function will add and replace the appropriate fields to the\n * field values if they are radio, dropdown and checkbox fields\n *\n *\n * @param question\n * @param answerValue\n * @returns\n */\nasync function populateWorkflowField(\n question: QuestionData,\n answerValue: SelectedAnswerData\n): Promise<PopulatedWorkflowField> {\n let answer: any\n let displayedAnswer: string | string[] | undefined = undefined\n switch (question.kind) {\n case 'text-select-group':\n if (question.answers) {\n displayedAnswer = `${answerValue[0]} ${question.answers[answerValue[1] as string].text}`\n }\n answer = answerValue\n break\n case 'radio':\n case 'radio-card':\n case 'select':\n if (question.answers) {\n displayedAnswer = question.answers[answerValue as string].text\n }\n\n answer = answerValue\n break\n case 'multiple':\n case 'checkbox-group':\n displayedAnswer = (answerValue as string[]).map((value) => {\n if (question.answers) {\n return question.answers[value].text\n }\n\n throw new WorkflowAnswersMissingError()\n })\n\n answer = answerValue\n break\n case 'images':\n answer = await getImagesFromIndexDb(answerValue).then((images) =>\n images.map((image) => {\n const { name, imageData } = image\n\n return { name, imageData }\n })\n )\n break\n default:\n answer = answerValue\n }\n\n return Promise.resolve({\n answer,\n displayedAnswer,\n kind: question.kind,\n })\n}\n\n/**\n * Determine if a question is triggered by some answers\n *\n * We use the following logical combinations of rules:\n *\n * #### Single string\n *\n * ```\n * // Required: rule1\n * rules: rule1\n * ```\n *\n * #### Array of strings (AND is applied between statements):\n *\n * ```\n * // Required: rule1 AND rule2\n * rules: [ rule1, rule2 ]\n * ```\n *\n * #### Array of arrays of strings (OR is applied between inner arrays. AND is applied between inner arrays statements)\n *\n * ```\n * // Required: rule1 OR rule2\n * rules: [\n * [ rule1 ],\n * [ rule2 ]\n * ]\n *\n * // Required: rule1 OR (rule2 AND rule3)\n * rules: [\n * [ rule1 ],\n * [ rule2, rule3 ]\n * ]\n *\n * // THIS IS FORBIDDEN\n * rules: [\n * rule1, // <-- THIS IS FORBIDDEN. Instead use [ rule1 ]\n * [ rule2, rule3 ]\n * ]\n * ```\n *\n * @param triggers the triggering rules\n * @param answers the answers to check againts triggering rules\n * @returns `true` if triggers are verified against ansers. Otherwise, returns `false`.\n * @throws an Error if triggers typing is wrong\n */\nexport function isTriggered(triggers: string[][] | string[] | string, answers: string[]): boolean {\n // is triggers contained in answers\n if (typeof triggers === 'string') {\n return answers.includes(triggers)\n }\n\n if (Array.isArray(triggers)) {\n // rule combination kind: rule1 OR (rule2 AND rule3)\n if (Array.isArray(triggers[0])) {\n return (triggers as string[][]).some((subSetTriggers) =>\n subSetTriggers.every((trigger) => answers.includes(trigger))\n )\n } else {\n // rule combination kind: rule1 AND rule2\n return (triggers as string[]).every((trigger) => answers.includes(trigger))\n }\n }\n\n throw Error('[isTriggered] triggers is not typed well')\n}\n\nexport function flattenSelectedAnswers(answers: SelectedAnswersData) {\n const linearAnswers: SelectedAnswerData[] = []\n\n for (const answer of answers) {\n linearAnswers.push(...Object.values(answer))\n }\n\n return linearAnswers.flat(1)\n}\n\n/**\n * This function helps you to get a valid workflow selectedAnswers structure\n * @param workflow the workflow data to use to initialize selectedAnswers\n * @param useDefault use workflow default values or not (this is used to avoid having unset values to appear in summaries)\n * @returns a valid selectedAnswers structure\n */\nexport function getInitialisedSelectedAnswers(workflow: WorkflowData, useDefault: boolean = true) {\n return workflow.pages.map((page) => {\n const ret: any = {}\n for (const [id, question] of Object.entries(page.questions)) {\n if (question.kind === 'body-parts') {\n ret[id] = useDefault ? [] : undefined\n } else {\n ret[id] = useDefault && question.defaultValue ? question.defaultValue : undefined\n }\n }\n return ret\n })\n}\n\nexport function fillWorkflowFromPopulatedWorkflow(workflow: WorkflowData, populatedWorkflow: PopulatedWorkflowData) {\n const filledWorkflow = JSON.parse(JSON.stringify(workflow))\n\n if (!filledWorkflow.selectedAnswers) {\n filledWorkflow.selectedAnswers = getInitialisedSelectedAnswers(filledWorkflow, false)\n }\n\n filledWorkflow.pages.forEach((page: WorkflowPageData, pageIdx: number) => {\n const ret: any = {}\n for (const [id] of Object.entries(page.questions)) {\n if (populatedWorkflow.fields[id]) {\n if (filledWorkflow.selectedAnswers)\n filledWorkflow.selectedAnswers[pageIdx][id] = populatedWorkflow.fields[id].answer as\n | string\n | string[]\n }\n }\n })\n\n return filledWorkflow\n}\n","import {\n Consult,\n ConsultationImageMeta,\n ConsultationMeta,\n ConsultRequest,\n DocumentType,\n IdentityResponse,\n IndexKey,\n MedicalMeta,\n MedicalStatus,\n MetadataCategory,\n PersonalMeta,\n PopulatedWorkflowData,\n Practitioner,\n PreferenceMeta,\n RawConsultationMeta,\n Term,\n Terms,\n Uuid,\n VaultIndex,\n WorkflowData,\n} from 'oro-sdk-apis'\nimport {\n filterTriggeredAnsweredWithKind,\n getImagesFromIndexDb,\n getWorkflowDataByCategory,\n identificationToPersonalInformations,\n OroClient,\n RegisterPatientOutput,\n toActualObject,\n} from '..'\n\nconst MAX_RETRIES = 15\n\n/**\n * Completes a registration for a user retrying the complete flow a maximum of 15 times\n *\n * @description The order of importance when registering:\n * Creates a consultation if none exist\n * Retrieves or create's a lockbox if none exist\n * Grants the lockbox (if new) to all practitioners in the practice\n * Stores or fetches the patient data (without images)\n * Indexes the lockbox to the consult for all practitioners (done after inserting since index can be rebuilt from grants)\n * Stores the image data - done last since the majority of failure cases occur here\n * Creates the recovery payloads if they don't exist\n *\n * @param patientUuid\n * @param consultRequest\n * @param workflow\n * @param oroClient\n * @param masterKey\n * @param recoveryQA\n * @param indexSearch create search index for the consultation if true\n * @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\n * @returns the successful registration\n */\nexport async function registerPatient(\n patientUuid: Uuid,\n consultRequest: ConsultRequest,\n workflow: WorkflowData,\n oroClient: OroClient,\n masterKey?: Uuid,\n recoveryQA?: {\n recoverySecurityQuestions: string[]\n recoverySecurityAnswers: string[]\n },\n indexSearch: boolean = true,\n onProgress?: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number, totalImagesNum?: number }) => void\n): Promise<RegisterPatientOutput> {\n let consult: Consult | undefined = undefined\n let lockboxUuid: Uuid | undefined = undefined\n let practitionerAdmin: Uuid | undefined = undefined\n let retry = MAX_RETRIES\n let identity: IdentityResponse | undefined = undefined\n let errorsThrown: Error[] = []\n const stepsTotalNum = 9\n let currentStep: number\n\n for (; retry > 0; retry--) {\n try {\n currentStep = 0\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'retrieve_practitioners')\n\n\n // Wait a bit each retry (we also want the first one to wait)\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Retrieving practitioners\n if (!practitionerAdmin)\n practitionerAdmin = (await oroClient.practiceClient.practiceGetFromUuid(consultRequest.uuidPractice))\n .uuidAdmin\n\n let practitioners: Practitioner[] = await oroClient.practiceClient\n .practiceGetPractitioners(consultRequest.uuidPractice)\n .catch((err) => {\n console.log(`Error retrieving practitioners`, err)\n return []\n })\n\n // Creating consult\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_consult')\n\n if (!consult) {\n consult = await getOrCreatePatientConsultationUuid(consultRequest, oroClient)\n }\n\n // Creating lockbox\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_lockbox')\n\n if (!lockboxUuid) lockboxUuid = await getOrCreatePatientLockbox(oroClient)\n\n if (!identity) identity = await oroClient.guardClient.identityGet(patientUuid)\n\n await oroClient.grantLockbox(practitionerAdmin, lockboxUuid).catch((err) => {\n console.error(`Error while granting lockbox to practitioner admin ${practitionerAdmin}`, err)\n // if we cannot grant to the admin, then the registration will fail\n errorsThrown.push(err)\n })\n\n // Patient Grant to practice\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'grant_patient')\n\n let grantPromises = practitioners\n .filter((practitioner) => practitioner.uuid !== practitionerAdmin)\n .map(async (practitioner) => {\n return oroClient.grantLockbox(practitioner.uuid, lockboxUuid!).catch((err) => {\n console.error(`Error while granting lockbox to practitioner`, err)\n // Acceptable to continue as admin has already been granted, but we should still retry until the last retry remains\n if (retry <= 1) return\n errorsThrown.push(err)\n })\n })\n\n const consultIndex: VaultIndex = {\n [IndexKey.ConsultationLockbox]: [\n {\n grant: {\n lockboxUuid,\n lockboxOwnerUuid: patientUuid,\n },\n consultationId: consult.uuid,\n },\n ],\n }\n\n // the index will identify in which lockbox a consultation resides\n let consultIndexPromises = practitioners.map(async (practitioner) => {\n return oroClient.vaultIndexAdd(consultIndex, practitioner.uuid).catch((err) => {\n console.error(\n `[SDK: registration] Error while adding to the practitioner's index ${practitioner.uuid}`,\n err\n )\n // Acceptable to continue as the index can be rebuilt, but we should still retry until the last retry remains\n if (retry <= 1) return\n else errorsThrown.push(err)\n })\n })\n\n await storeImageAliases(\n consult.uuid,\n lockboxUuid,\n workflow,\n oroClient,\n onProgress? {\n onProgress,\n currentStep,\n stepsTotalNum\n } : undefined\n ).catch((err) => {\n console.error('[SDK: registration] Some errors happened during image upload', err)\n // Acceptable to continue as images can be requested during the consultation, but we should still retry until the last retry remains\n if (retry <= 1) return\n else errorsThrown.push(err)\n })\n ++currentStep\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'store_patient_data')\n\n await storePatientData(\n consult.uuid,\n consultRequest.isoLanguageRequired,\n lockboxUuid,\n workflow,\n oroClient\n ).catch((err) => {\n console.error('[SDK: registration] Some errors happened during patient data upload', err)\n errorsThrown.push(err)\n })\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_masterkey')\n\n if (masterKey && !identity?.recoveryMasterKey) {\n // generate and store recovery payload and updates the identity\n identity = await oroClient.updateMasterKey(patientUuid, masterKey, lockboxUuid).catch((err) => {\n console.error(`[SDK: registration] Error while updating master key`, err)\n /// it's acceptable to continue registration (return old identity)\n if (retry <= 1) return\n errorsThrown.push(err)\n return identity\n })\n } else {\n // we did not set the master key so we do not return it\n masterKey = undefined\n }\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_security_questions')\n\n if (recoveryQA && !identity?.recoverySecurityQuestions)\n // Patient security question recovery threshold is 2 answers and updates the identity\n identity = await oroClient\n .updateSecurityQuestions(\n patientUuid,\n recoveryQA.recoverySecurityQuestions,\n recoveryQA.recoverySecurityAnswers,\n 2\n )\n .catch((err) => {\n console.error(`[SDK: registration] Error while updating security questions`, err)\n /// it's acceptable to continue registration (return old identity)\n if (retry <= 1) return\n errorsThrown.push(err)\n return identity\n })\n\n await Promise.all([...grantPromises, ...consultIndexPromises])\n\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'search_indexing')\n\n if (indexSearch) {\n await buildConsultSearchIndex(consult, workflow, oroClient).catch((err) => {\n console.error(\n '[SDK: registration] personal information not found or another error occured during search indexing',\n err\n )\n if (retry <= 1) return // this statement is to avoid failing the registration due to the failure in search indexing the consult, this practically implements a soft retry\n errorsThrown.push(err)\n })\n }\n\n if (errorsThrown.length > 0) throw errorsThrown\n\n // Deem the consultation as ready\n await oroClient.consultClient.updateConsultByUUID(consult.uuid, {\n statusMedical: MedicalStatus.New,\n })\n\n // if we got through the complete flow, the registration succeeded\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'success')\n\n break\n } catch (err) {\n console.error(`[SDK] Error occured during registration: ${err}, retrying... Retries remaining: ${retry}`)\n errorsThrown = []\n continue\n }\n }\n\n if (retry <= 0) {\n console.error('[SDK] registration failed: MAX_RETRIES reached')\n throw 'RegistrationFailed'\n }\n\n console.log('Successfully Registered')\n await oroClient.cleanIndex()\n return {\n masterKey,\n consultationId: consult!.uuid,\n lockboxUuid: lockboxUuid!,\n }\n}\n\n/**\n * Creates a consultation if one has not been created and fails to be retrieved by the payment intent\n * @param consult\n * @param oroClient\n * @returns the consult Uuid\n */\nasync function getOrCreatePatientConsultationUuid(consult: ConsultRequest, oroClient: OroClient): Promise<Consult> {\n let payment = await oroClient.practiceClient.practiceGetPayment(\n consult.uuidPractice,\n consult.idStripeInvoiceOrPaymentIntent\n )\n if (payment && payment.uuidConsult) {\n return oroClient.consultClient.getConsultByUUID(payment.uuidConsult).catch((err) => {\n console.error('Error while retrieving consult', err)\n throw err\n })\n } else {\n return await oroClient.consultClient.consultCreate(consult).catch((err) => {\n console.error('Error while creating consult', err)\n throw err\n })\n }\n}\n\n/**\n * Creates a new lockbox for the patient if they do not have any, otherwise, use the first (and only one)\n * @param oroClient\n * @returns the lockbox Uuid\n */\nasync function getOrCreatePatientLockbox(oroClient: OroClient): Promise<Uuid> {\n let grants = await oroClient.getGrants()\n if (grants.length > 0) {\n console.log('The grant has already been created, skipping lockbox create step')\n return grants[0].lockboxUuid!\n } else {\n let lockboxResponse =\n await oroClient.vaultClient.lockboxCreate().catch((err) => {\n console.error('Error while creating lockbox', err)\n throw err\n })\n // Since the creation of a lockbox will change the scope of a user, we will force refresh the tokens\n let tokens = await oroClient.guardClient.authRefresh()\n await oroClient.guardClient.setTokens({ accessToken: tokens.accessToken, refreshToken: tokens.refreshToken })\n await oroClient.guardClient.whoAmI(true)\n\n return lockboxResponse.lockboxUuid\n }\n}\n\n/**\n * Store all patient related information into his/her lockbox\n * @param consultationId The consultation id\n * @param isoLanguage the prefered language of communication (ISO 639-3 https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes)\n * @param lockboxUuid the lockbox uuid to store data in\n * @param workflow the workflow used to extract informations\n * @param oroClient an oroClient instance\n * @returns\n */\nasync function storePatientData(\n consultationId: Uuid,\n isoLanguage: string,\n lockboxUuid: Uuid,\n workflow: WorkflowData,\n oroClient: OroClient\n): Promise<(Uuid | void)[]> {\n // Create and store registration data\n return Promise.all([\n // Storing Raw data first\n oroClient.getOrInsertJsonData<RawConsultationMeta>(\n lockboxUuid,\n workflow,\n {\n category: MetadataCategory.Raw,\n contentType: 'application/json',\n consultationId,\n },\n {}\n ),\n getWorkflowDataByCategory(workflow, MetadataCategory.Consultation).then((data) =>\n oroClient.getOrInsertJsonData<ConsultationMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationId, // TODO: deprecated. Will finally only be in privateMetadata\n },\n { consultationId }\n )\n ),\n getWorkflowDataByCategory(workflow, MetadataCategory.Medical).then((data) =>\n oroClient.getOrInsertJsonData<MedicalMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Medical,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId!],\n },\n {}\n )\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.Personal,\n oroClient\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.ChildPersonal,\n oroClient\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.OtherPersonal,\n oroClient\n ),\n oroClient.getOrInsertJsonData<PreferenceMeta>(\n lockboxUuid,\n { isoLanguage },\n {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n },\n {}\n ),\n ]).then((dataUuids) => dataUuids.flat())\n}\n\nasync function storeImageAliases(\n consultationId: Uuid,\n lockboxUuid: Uuid,\n workflow: WorkflowData,\n oroClient: OroClient,\n progress?: {\n currentStep: number;\n stepsTotalNum: number;\n onProgress: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number; totalImagesNum?: number }) => void;\n }\n): Promise<(Uuid | void)[]> {\n const images = await getImagesFromIndexDb((await filterTriggeredAnsweredWithKind(workflow, 'images-alias')).flat())\n\n const nonNullImages = images.filter((img) => !!img)\n\n if (images.length !== nonNullImages.length) {\n console.error('[SDK] Some images have not been found, they have been skipped.')\n }\n\n let storedImagesNum = 0\n let totalImagesNum = nonNullImages.length\n if (progress)\n progress.onProgress(progress.currentStep/progress.stepsTotalNum, 'store_images', {storedImagesNum, totalImagesNum})\n\n let promises = nonNullImages.map((image) => {\n return oroClient.getOrInsertJsonData<ConsultationImageMeta>(\n lockboxUuid,\n image,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.ImageAlias,\n consultationId,\n idbId: image.idbId as string,\n },\n {}\n ).then(() => {\n if (progress) {\n ++storedImagesNum\n let progressStepValue = Math.round((((progress.currentStep + 1)/progress.stepsTotalNum) - (progress.currentStep/progress.stepsTotalNum)) * 100) / 100\n progress.onProgress(\n (progress.currentStep/progress.stepsTotalNum) + (progressStepValue * (storedImagesNum/totalImagesNum)),\n 'store_images',\n {\n storedImagesNum,\n totalImagesNum\n })\n }\n\n })\n })\n return Promise.all(promises)\n}\n\n/**\n * Extracts the workflow MetadataCategory for Personal, ChildPersonal and OtherPersonal\n * then stores it in the vault\n *\n * @param workflow\n * @param lockboxUuid\n * @param category\n * @returns The data uuid\n */\nexport async function extractAndStorePersonalWorkflowData(\n workflow: WorkflowData,\n lockboxUuid: Uuid,\n consultationId: Uuid,\n category: MetadataCategory.Personal | MetadataCategory.ChildPersonal | MetadataCategory.OtherPersonal,\n oroClient: OroClient\n): Promise<Uuid | void> {\n return getWorkflowDataByCategory(workflow, category as unknown as MetadataCategory).then((data) => {\n if (Object.keys(data.fields).length === 0) return\n return oroClient.getOrInsertJsonData<PersonalMeta>(\n lockboxUuid,\n data,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId],\n },\n {}\n )\n })\n}\n\n/**\n * Given workflow data, it populates it with Personal, ChildPersonal, and OtherPersonal workflow data\n * @param workflow\n */\nexport async function extractPersonalInfoFromWorkflowData(workflow: WorkflowData): Promise<{\n personalInfoPopulatedWfData: PopulatedWorkflowData\n childPersonalInfoPopulatedWfData: PopulatedWorkflowData\n otherPersonalInfoPopulatedWfData: PopulatedWorkflowData\n}> {\n return Promise.all([\n getWorkflowDataByCategory(workflow, MetadataCategory.Personal),\n getWorkflowDataByCategory(workflow, MetadataCategory.ChildPersonal),\n getWorkflowDataByCategory(workflow, MetadataCategory.OtherPersonal),\n ]).then(([personalInfoPopulatedWfData, childPersonalInfoPopulatedWfData, otherPersonalInfoPopulatedWfData]) => {\n return {\n personalInfoPopulatedWfData,\n childPersonalInfoPopulatedWfData,\n otherPersonalInfoPopulatedWfData,\n }\n })\n}\n\n/**\n * Creates the search index for the first name, last name, and the short id of the given consultation\n * @param consult the consultation to be search indexed\n * @param workflow the workflow data\n * @param oroClient\n */\nexport async function buildConsultSearchIndex(consult: Consult, workflow: WorkflowData, oroClient: OroClient) {\n let terms: Terms = [\n <Term>{\n kind: 'consult-shortid',\n value: consult.shortId,\n },\n ]\n\n const { personalInfoPopulatedWfData, childPersonalInfoPopulatedWfData, otherPersonalInfoPopulatedWfData } =\n await extractPersonalInfoFromWorkflowData(workflow)\n\n const personalInfo = identificationToPersonalInformations(\n toActualObject(personalInfoPopulatedWfData),\n MetadataCategory.Personal\n )\n const childPersonalInfo = identificationToPersonalInformations(\n toActualObject(childPersonalInfoPopulatedWfData),\n MetadataCategory.ChildPersonal\n )\n const otherPersonalInfo = identificationToPersonalInformations(\n toActualObject(otherPersonalInfoPopulatedWfData),\n MetadataCategory.OtherPersonal\n )\n\n terms.push(\n <Term>{\n kind: 'first-name',\n value: personalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: personalInfo.name,\n }\n )\n\n if (childPersonalInfo.firstname && childPersonalInfo.name) {\n terms.push(\n <Term>{\n kind: 'first-name',\n value: childPersonalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: childPersonalInfo.name,\n }\n )\n }\n\n if (otherPersonalInfo.firstname && otherPersonalInfo.name) {\n terms.push(\n <Term>{\n kind: 'first-name',\n value: otherPersonalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: otherPersonalInfo.name,\n }\n )\n }\n\n await oroClient.searchClient.index(consult.uuid, terms)\n}","import { CryptoRSA, uuidParse} from \"oro-toolbox\"\nimport { EncryptedIndexEntry, Grant, IndexConsultLockbox } from \"oro-sdk-apis\"\n\n/**\n * Decrypts and returns the encrypted grants\n * If something went wrong during decryption, that grant will be removed from the list\n *\n * @param encryptedGrants: an array of encrypted grants\n * @param rsaKey: the rsa key used to decrypt the encrypted grants\n * @returns an array of grants\n */\nexport function decryptGrants(encryptedGrants: Grant[], rsaKey: CryptoRSA): Grant[] {\n return encryptedGrants\n .map(grant => {\n if (grant.encryptedLockbox && !grant.lockboxUuid) {\n try {\n grant.lockboxUuid = uuidParse(\n rsaKey.base64DecryptToBytes(grant.encryptedLockbox)\n )\n } catch (e) {\n console.error('[sdk:index] The grant could not be decrypted or was not a valid UUID: ', e)\n }\n }\n return grant\n })\n .filter(grant => grant.lockboxUuid)\n}\n\n/**\n * Decrypts the encrypted consult lockboxes and returns their grants\n * If something went wrong during decryption, that grant will be removed from the list\n *\n * @param encryptedConsultLockboxes: an array of encrypted entries\n * @param rsaKey: the rsa key used to decrypt the encrypted entries\n * @returns an array of grants\n */\nexport function decryptConsultLockboxGrants(encryptedConsultLockboxes: EncryptedIndexEntry[], rsaKey: CryptoRSA): Grant[] {\n return encryptedConsultLockboxes\n .map(encryptedConsultLockboxes => {\n try {\n return [true, (rsaKey.base64DecryptToJson(\n encryptedConsultLockboxes.encryptedIndexEntry\n ) as IndexConsultLockbox).grant]\n } catch(e) {\n console.error('[sdk:index] The consult lockbox grant could not be decrypted: ', e)\n return [false, undefined] // if decryption fails, we want to ignore the grant but not fail the call\n }\n })\n .filter(grantsTuple => grantsTuple[0])\n .map(grantTuples => grantTuples[1] as Grant)\n}","import { IndexKey, Grant, IndexConsultLockbox, MetadataCategory, VaultIndex } from 'oro-sdk-apis'\nimport { OroClient, Uuid } from '..'\n\n/**\n * @name filterGrantsWithLockboxMetadata\n * @description searches for the existance of a consult uuid in each granted lockbox\n * @param oroClient\n * @param filter: the consult uuid\n * @returns the grants containing the consult uuid\n */\nexport async function filterGrantsWithLockboxMetadata(\n oroClient: OroClient,\n filter: { consultationId: Uuid },\n): Promise<Grant[]> {\n let grants = await oroClient.getGrants()\n let filteredGrants = []\n for (let grant of grants) {\n // Fetches in each lockbox the existance of a given consult id\n let consultationIdExistsInMetadata = await oroClient.vaultClient.lockboxMetadataGet(grant.lockboxUuid!, ['consultationId'], [], {\n category: MetadataCategory.Consultation,\n consultationId: filter.consultationId\n })\n // If there are entries in the metadata, it means that the consult exists in the lockbox\n if (consultationIdExistsInMetadata[0].length >= 0)\n filteredGrants.push(grant)\n }\n\n return filteredGrants\n}\n","import {\n AllRoleType,\n AuthTokenRequest,\n Consult,\n ConsultRequest,\n ConsultService,\n DataCreateResponse,\n DiagnosisService,\n Document,\n DocumentType,\n EncryptedIndexEntry,\n EncryptedVaultIndex,\n Grant,\n GuardService,\n IdentityCreateRequest,\n IdentityResponse,\n IndexConsultLockbox,\n IndexKey,\n LocalizedData,\n LockboxDataRequest,\n LockboxGrantRequest,\n LockboxManifest,\n ManifestEntry,\n Meta,\n Metadata,\n MetadataCategory,\n OtherRoleType,\n PersonalMeta,\n PopulatedWorkflowData,\n Practice,\n PracticeService,\n PractitionnerRoleType,\n PreferenceMeta,\n RecoveryMeta,\n RoleBasedScopes,\n SearchService,\n SecretShard,\n TellerService,\n TokenData,\n TosAndCpAcceptanceRequest,\n Uuid,\n VaultIndex,\n VaultService,\n WorkflowData,\n WorkflowService,\n} from 'oro-sdk-apis'\nimport * as OroToolbox from 'oro-toolbox'\nimport { CryptoRSA } from 'oro-toolbox'\nimport { decryptConsultLockboxGrants, decryptGrants, registerPatient, sessionStorePrivateKeyName } from './helpers'\nimport {\n AssociatedLockboxNotFound,\n IncompleteAuthentication,\n LocalEncryptedData,\n MissingGrant,\n MissingGrantFilter,\n MissingLockbox,\n MissingLockboxOwner,\n RecoveryData,\n RegisterPatientOutput,\n UserPreference,\n} from './models'\nimport { filterGrantsWithLockboxMetadata } from './sdk-revision'\n\nexport class OroClient {\n private rsa?: CryptoRSA\n private secrets: {\n lockboxUuid: string\n cryptor: OroToolbox.CryptoChaCha\n }[] = []\n private cachedMetadataGrants: {\n [filter: string]: Grant[]\n } = {}\n\n private cachedManifest: {\n [filter: string]: ManifestEntry[]\n } = {}\n\n private vaultIndex?: VaultIndex\n\n constructor(\n private toolbox: typeof OroToolbox,\n public tellerClient: TellerService,\n public vaultClient: VaultService,\n public guardClient: GuardService,\n public searchClient: SearchService,\n public practiceClient: PracticeService,\n public consultClient: ConsultService,\n public workflowClient: WorkflowService,\n public diagnosisClient: DiagnosisService,\n private authenticationCallback?: (err: Error) => void\n ) { }\n\n /**\n * clears the vaultIndex and cached metadata grants\n */\n public async cleanIndex() {\n this.cachedMetadataGrants = {}\n this.cachedManifest = {}\n }\n\n /**\n * Generates an RSA key pair and password payload (rsa private key encrypted with the password)\n * Calls Guard to sign up with the email address, password, practice, legal and token data\n *\n * @param email\n * @param password\n * @param practice\n * @param legal\n * @param tokenData\n * @returns\n */\n public async signUp(\n email: string,\n password: string,\n practice: Practice,\n tosAndCpAcceptance: TosAndCpAcceptanceRequest,\n tokenData?: TokenData,\n subscription?: boolean,\n skipEmailValidation?: boolean\n ): Promise<IdentityResponse> {\n this.rsa = new CryptoRSA()\n const privateKey = this.rsa.private()\n\n const symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(password)\n const recoveryPassword = symmetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n\n const hashedPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(password))\n\n const emailConfirmed = !!skipEmailValidation\n\n const signupRequest: IdentityCreateRequest = {\n practiceUuid: practice.uuid,\n email: email.toLowerCase(),\n emailConfirmed,\n password: hashedPassword,\n publicKey: this.toolbox.encodeToBase64(this.rsa.public()),\n recoveryPassword,\n tosAndCpAcceptance,\n tokenData,\n subscription,\n }\n\n const identity = await this.guardClient.identityCreate(signupRequest)\n\n if (identity.recoveryLogin) {\n //Ensure we can recover from a page reload\n let symetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(identity.recoveryLogin)\n sessionStorage.setItem(\n sessionStorePrivateKeyName(identity.id),\n symetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n )\n }\n\n return identity\n }\n\n /**\n * Parse the given accessToken claims by calling guard whoami and update theidentity to set it's emailConfirmed flag\n * @param accessToken\n * @returns The identity related to confirmedEmail\n */\n public async confirmEmail(accessToken: string): Promise<IdentityResponse> {\n this.guardClient.setTokens({ accessToken })\n const claims = await this.guardClient.whoAmI()\n return this.guardClient.identityUpdate(claims.sub, {\n emailConfirmed: true,\n })\n }\n\n /**\n * Calls Guard to sign in with the email address, password and one time password (if MFA is enabled)\n * Then recover's the rsa private key from the recovery payload\n *\n * @param practiceUuid\n * @param email\n * @param password\n * @param otp\n * @returns the user identity\n */\n public async signIn(practiceUuid: Uuid, email: string, password: string, otp?: string): Promise<IdentityResponse> {\n const hashedPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(password))\n const tokenRequest: AuthTokenRequest = {\n practiceUuid,\n email: email.toLowerCase(),\n password: hashedPassword,\n otp,\n }\n\n await this.guardClient.authToken(tokenRequest)\n const userUuid = (await this.guardClient.whoAmI()).sub\n\n // Updates the rsa key to the one generated on the backend\n await this.recoverPrivateKeyFromPassword(userUuid, password)\n return await this.guardClient.identityGet(userUuid)\n }\n\n /**\n * Will attempt to recover an existing login session and set back\n * the private key in scope\n */\n public async resumeSession() {\n const id = (await this.guardClient.whoAmI()).sub\n const recoveryPayload = sessionStorage.getItem(sessionStorePrivateKeyName(id))\n const recoveryKey = (await this.guardClient.identityGet(id)).recoveryLogin\n\n if (!recoveryKey || !recoveryPayload) throw IncompleteAuthentication\n\n const symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(recoveryKey)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * This function let's you encrypt locally an Object\n * @param value the Object to encrypt\n * @returns a LocalEncryptedData Object\n * @throws IncompleteAuthentication if rsa is not set\n * @calls authenticationCallback if rsa is not set\n */\n public localEncryptToJsonPayload(value: any): LocalEncryptedData {\n if (!this.rsa) {\n if (this.authenticationCallback) {\n this.authenticationCallback(new IncompleteAuthentication())\n }\n\n throw new IncompleteAuthentication()\n }\n\n const chaChaKey = new this.toolbox.CryptoChaCha()\n\n const encryptedData = chaChaKey.jsonEncryptToBase64Payload(value)\n const encryptedKey = this.toolbox.encodeToBase64(this.rsa.encryptToBytes(chaChaKey.key()))\n\n return { encryptedData, encryptedKey }\n }\n\n /**\n * This function let's you decrypt a LocalEncryptedData object\n * @param value a LocalEncryptedData object\n * @returns a decrypted Object\n * @throws IncompleteAuthentication if rsa is not set\n * @calls authenticationCallback if rsa is not set\n */\n public localDecryptJsonPayload({ encryptedKey, encryptedData }: LocalEncryptedData): any {\n if (!this.rsa) {\n if (this.authenticationCallback) {\n this.authenticationCallback(new IncompleteAuthentication())\n }\n\n throw new IncompleteAuthentication()\n }\n\n const chaChaKey = this.rsa.base64DecryptToBytes(encryptedKey)\n const decryptedData = this.toolbox.CryptoChaCha.fromKey(chaChaKey).base64PayloadDecryptToJson(encryptedData)\n\n return decryptedData\n }\n\n /**\n * Effectively kills your \"session\"\n */\n public async signOut() {\n this.rsa = undefined\n this.secrets = []\n this.guardClient.setTokens({\n accessToken: undefined,\n refreshToken: undefined,\n })\n await this.guardClient.authLogout()\n }\n\n /**\n * @name registerPatient\n * @description The complete flow to register a patient\n *\n * Steps:\n * 1. Create a consult (checks if payment has been done)\n * 2. Creates a lockbox\n * 3. Grants lockbox access to all practice personnel\n * 4. Creates secure identification, medical, onboarding data\n * 5. Generates and stores the rsa key pair and recovery payloads\n *\n * @param patientUuid\n * @param consult\n * @param workflow\n * @param recoveryQA\n * @param indexSearch create search index for the consultation if true\n * @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\n * @returns\n */\n public async registerPatient(\n patientUuid: Uuid,\n consult: ConsultRequest,\n workflow: WorkflowData,\n recoveryQA?: {\n recoverySecurityQuestions: string[]\n recoverySecurityAnswers: string[]\n },\n indexSearch: boolean = true,\n onProgress?: (progress: number, descriptionKey: string) => void\n ): Promise<RegisterPatientOutput> {\n if (!this.rsa) throw IncompleteAuthentication\n return registerPatient(patientUuid, consult, workflow, this, this.toolbox.uuid(), recoveryQA, indexSearch, onProgress)\n }\n\n /**\n * Fetches all grants, and consultations that exist in each lockbox\n * Then updates the index for the current user with the lockbox consult relationship\n */\n public async forceUpdateIndexEntries() {\n let grants = await this.getGrants()\n\n let indexConsultLockbox: IndexConsultLockbox[] = await Promise.all(\n grants.map(\n async (grant: Grant) =>\n await this.vaultClient\n .lockboxMetadataGet(\n grant.lockboxUuid!,\n ['consultationId'],\n [],\n { category: MetadataCategory.Consultation },\n grant.lockboxOwnerUuid\n )\n .then((consults) => {\n try {\n return consults[0].map((consult: any) => {\n return {\n ...consult,\n grant: {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid,\n },\n }\n })\n } catch (e) {\n // No consultations in lockbox or index could not be created\n return []\n }\n })\n .catch(() => [])\n )\n ).then((consults) => consults.flat())\n this.vaultIndexAdd({\n [IndexKey.Consultation]: indexConsultLockbox,\n })\n .then(() => alert('The Index was successfully updated!'))\n .catch(() => console.error('The index failed to update!'))\n }\n\n /**\n * Generates, encrypts and adds entries to vault index for a given index owner\n *\n * @param entries\n * @param indexOwnerUuid\n */\n public async vaultIndexAdd(entries: VaultIndex, indexOwnerUuid?: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let rsaPub: Uint8Array\n if (indexOwnerUuid) {\n let base64IndexOwnerPubKey = (await this.guardClient.identityGet(indexOwnerUuid)).publicKey\n rsaPub = this.toolbox.decodeFromBase64(base64IndexOwnerPubKey)\n } else {\n rsaPub = this.rsa.public()\n }\n\n let encryptedIndex: EncryptedVaultIndex = {}\n\n for (let keyString of Object.keys(entries)) {\n let key = keyString as keyof VaultIndex\n switch (key) {\n case IndexKey.ConsultationLockbox:\n encryptedIndex[key] = (entries[key] as IndexConsultLockbox[])\n .map((e) => ({\n ...e,\n uniqueHash: e.consultationId,\n }))\n .map(\n (e: IndexConsultLockbox) =>\n ({\n uuid: e.uuid,\n timestamp: e.timestamp,\n uniqueHash: e.uniqueHash,\n encryptedIndexEntry: CryptoRSA.jsonWithPubEncryptToBase64(\n {\n consultationId: e.consultationId,\n grant: e.grant,\n },\n rsaPub\n ),\n } as EncryptedIndexEntry)\n )\n break\n }\n }\n await this.vaultClient.vaultIndexPut(encryptedIndex, indexOwnerUuid)\n }\n\n /**\n * @name grantLockbox\n * @description Grants a lockbox by retrieving the shared secret of the lockbox and encrypting it with the grantees public key\n * @param granteeUuid\n * @param lockboxUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n */\n public async grantLockbox(granteeUuid: Uuid, lockboxUuid: Uuid, lockboxOwnerUuid?: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let secret = (await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)).key()\n let base64GranteePublicKey = (await this.guardClient.identityGet(granteeUuid)).publicKey\n let granteePublicKey = this.toolbox.decodeFromBase64(base64GranteePublicKey)\n\n let granteeEncryptedSecret = CryptoRSA.bytesWithPubEncryptToBase64(secret, granteePublicKey)\n let request: LockboxGrantRequest = {\n encryptedSecret: granteeEncryptedSecret,\n granteeUuid: granteeUuid,\n }\n await this.vaultClient.lockboxGrant(lockboxUuid, request, lockboxOwnerUuid)\n }\n\n /**\n * @name createMessageData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a message string\n * @param lockboxUuid\n * @param message\n * @param consultationId the consultation for which this message is sent\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createMessageData(\n lockboxUuid: Uuid,\n message: string,\n consultationId: string,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n\n let encryptedData = symmetricEncryptor.jsonEncryptToBase64Payload(message)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload({\n author: (await this.guardClient.whoAmI()).sub,\n })\n\n let meta = {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Message,\n contentType: 'text/plain',\n }\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name createMessageAttachmentData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a file\n * @param lockboxUuid\n * @param data the file stored\n * @param consultationId the consultation for which this message is sent\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createMessageAttachmentData(\n lockboxUuid: Uuid,\n data: File,\n consultationId: string,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.bytesEncryptToBase64Payload(new Uint8Array(await data.arrayBuffer()))\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload({\n author: (await this.guardClient.whoAmI()).sub,\n fileName: data.name,\n lastModified: data.lastModified,\n size: data.size,\n })\n\n let meta = {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Message,\n contentType: data.type,\n }\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name createAttachmentData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a file\n * @param lockboxUuid\n * @param data the file stored\n * @param consultationId the consultation for which this message is sent\n * @param category the category for the attachment data\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createConsultationAttachmentData(\n lockboxUuid: Uuid,\n data: File,\n consultationId: string,\n documentType: DocumentType,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n return this.createBytesData<Meta | any>(\n lockboxUuid,\n new Uint8Array(await data.arrayBuffer()),\n {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType,\n contentType: data.type,\n },\n {\n author: (await this.guardClient.whoAmI()).sub,\n fileName: data.name,\n },\n lockboxOwnerUuid,\n previousDataUuid\n )\n }\n\n /**\n * @name createJsonData\n * @description Creates a Base64 encrypted Payload to send and store in the vault. With the data input as a JSON\n * @param lockboxUuid\n * @param data\n * @param meta\n * @param privateMeta the metadata that will be secured in the vault\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing data, specify the previous data uuid\n * @returns the data uuid\n */\n public async createJsonData<T = Meta>(\n lockboxUuid: Uuid,\n data: any,\n meta?: T,\n privateMeta?: { [val: string]: any },\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.jsonEncryptToBase64Payload(data)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload(privateMeta)\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * Get or upsert a data in lockbox\n * @param lockboxUuid the lockbox uuid\n * @param data the data to insert\n * @param publicMetadata the public Metadata\n * @param privateMetadata the private Metadata\n * @param forceReplace set true when the insertion of data requires to replace the data when it exists already\n * @returns the data uuid\n */\n public async getOrInsertJsonData<M = Metadata>(\n lockboxUuid: Uuid,\n data: any,\n publicMetadata: M,\n privateMetadata: Metadata,\n forceReplace: boolean = false\n ): Promise<Uuid> {\n let manifest = await this.vaultClient.lockboxManifestGet(lockboxUuid, publicMetadata)\n if (!forceReplace && manifest.length > 0) {\n console.log(`The data for ${JSON.stringify(publicMetadata)} already exist`)\n return manifest[0].dataUuid\n } else\n return (\n await this.createJsonData<M>(\n lockboxUuid,\n data,\n publicMetadata,\n privateMetadata,\n undefined,\n forceReplace && manifest.length > 0 ? manifest[0].dataUuid : undefined // if forceReplace and data already exist, then replace data. Otherwise insert it\n ).catch((err) => {\n console.error(`Error while upserting data ${JSON.stringify(publicMetadata)} data`, err)\n throw err\n })\n ).dataUuid\n }\n\n /**\n * @name createBytesData\n * @description Creates a Base64 encrypted Payload to send and store in the vault. With the data input as a Bytes\n * @param lockboxUuid\n * @param data\n * @param meta\n * @param privateMeta the metadata that will be secured in the vault\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing data, specify the previous data uuid\n * @returns the data uuid\n */\n public async createBytesData<T = Meta>(\n lockboxUuid: Uuid,\n data: Uint8Array,\n meta: T,\n privateMeta: { [val: string]: any },\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.bytesEncryptToBase64Payload(data)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload(privateMeta)\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name getJsonData\n * @description Fetches and decrypts the lockbox data with the cached shared secret.\n * Decrypts the data to a valid JSON object. If this is impossible, the call to the WASM binary will fail\n *\n * @type T is the generic type specifying the return type object of the function\n * @param lockboxUuid\n * @param dataUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns the data specified by the generic type <T>\n */\n public async getJsonData<T = any>(lockboxUuid: Uuid, dataUuid: Uuid, lockboxOwnerUuid?: Uuid): Promise<T> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let [encryptedPayload, symmetricDecryptor] = await Promise.all([\n this.vaultClient.lockboxDataGet(lockboxUuid, dataUuid, lockboxOwnerUuid),\n this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid),\n ])\n\n return symmetricDecryptor.base64PayloadDecryptToJson(encryptedPayload.data)\n }\n /**\n * @description Fetches and decrypts the lockbox data with the cached shared secret.\n * @param lockboxUuid\n * @param dataUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns the bytes data\n */\n public async getBytesData(lockboxUuid: Uuid, dataUuid: Uuid, lockboxOwnerUuid?: Uuid): Promise<Uint8Array> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let [encryptedPayload, symmetricDecryptor] = await Promise.all([\n this.vaultClient.lockboxDataGet(lockboxUuid, dataUuid, lockboxOwnerUuid),\n this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid),\n ])\n\n return symmetricDecryptor.base64PayloadDecryptToBytes(encryptedPayload.data)\n }\n\n /**\n * @name getGrants\n * @description Get all lockboxes granted to user with the applied filter\n * @note this function returns cached grants and will not update unless the page is refreshed\n * @todo some versions of lockboxes do not make use of lockbox metadata\n * in this case, all lockboxes need to be filtered one-by-one to find the correct one\n * Remove if this is no longer the case\n * @param filter: the consultationId in which the grant exists\n * @returns decrypted lockboxes granted to user\n */\n public async getGrants(filter?: { consultationId: Uuid }): Promise<Grant[]> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let filterString = JSON.stringify(filter)\n // retrieves cached grants\n if (this.cachedMetadataGrants[filterString]) return this.cachedMetadataGrants[filterString]\n\n // We're using the account role to determine the way a grant is accessed\n let currentAccountRole = await this.getAccountRole()\n if (currentAccountRole.length === 1 && currentAccountRole[0] === OtherRoleType.User)\n return []\n\n if ([OtherRoleType.Patient, OtherRoleType.User].every(requiredRole => currentAccountRole.includes(requiredRole))) {\n let encryptedGrants\n // if there are no grants with the applied filter from index, attempt for naive filter with backwards compatibility\n if (filter) {\n encryptedGrants = await filterGrantsWithLockboxMetadata(this, filter)\n } else {\n encryptedGrants = (await this.vaultClient.grantsGet()).grants\n }\n const decryptedGrants = await decryptGrants(encryptedGrants, this.rsa)\n // sets the cached grant\n this.cachedMetadataGrants[filterString] = decryptedGrants\n console.info('[sdk:grant] Found grant for patient')\n return decryptedGrants\n }\n // if not a patient, then a practitioner is trying to retrieve a grant, it **Must** contain a filter, otherwise too many grants are possible\n if (!filter)\n throw MissingGrantFilter\n // Note: will work only if the filter being applied is exclusively a consult id\n const grantsByConsultLockbox = await this.vaultClient\n .vaultIndexGet([IndexKey.ConsultationLockbox], [filter.consultationId])\n .then((res) => res[IndexKey.ConsultationLockbox])\n .catch((e) => {\n console.error(e)\n return []\n })\n\n const decryptedConsults = decryptConsultLockboxGrants(grantsByConsultLockbox ?? [], this.rsa)\n if (decryptedConsults.length > 0) {\n console.info('[sdk:index] Grants found in user`s constant time secure index')\n this.cachedMetadataGrants[filterString] = decryptedConsults\n return this.cachedMetadataGrants[filterString]\n }\n\n // if we have no valid grants, then return nothing\n return []\n }\n\n /**\n * Fetches the role of the account that is logged in\n * \n * @returns the role based scopes defined by the whoami\n */\n async getAccountRole(): Promise<RoleBasedScopes[]> {\n return (await this.guardClient.whoAmI()).scope.split(' ') as RoleBasedScopes[]\n }\n\n /**\n * @name getCachedSecretCryptor\n * @description Retrieves the cached lockbox secret or fetches the secret from vault, then creates the symmetric cryptor and stores it in memory\n * @param lockboxUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns\n */\n async getCachedSecretCryptor(lockboxUuid: string, lockboxOwnerUuid?: string): Promise<OroToolbox.CryptoChaCha> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let index = this.secrets.findIndex((secret) => secret.lockboxUuid === lockboxUuid)\n if (index === -1) {\n let encryptedSecret = (await this.vaultClient.lockboxSecretGet(lockboxUuid, lockboxOwnerUuid)).sharedSecret\n\n let secret = this.rsa.base64DecryptToBytes(encryptedSecret)\n let cryptor = this.toolbox.CryptoChaCha.fromKey(secret)\n this.secrets.push({ lockboxUuid, cryptor })\n return cryptor\n } else {\n return this.secrets[index].cryptor\n }\n }\n\n /**\n * Retrieves the patient personal information associated to the `consultationId`\n * The `consultationId` only helps to retrieve the patient lockboxes\n * Note: it is possible to have several personal informations data\n * @param consultationId The consultation Id\n * @param category The personal MetadataCategory to fetch\n * @param forceRefresh force data refresh (default to false)\n * @returns the personal data\n */\n public async getPersonalInformationsFromConsultId(\n consultationId: Uuid,\n category: MetadataCategory.Personal | MetadataCategory.ChildPersonal | MetadataCategory.OtherPersonal,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n return this.getMetaCategoryFromConsultId(consultationId, category, forceRefresh)\n }\n\n /**\n * Retrieves the patient medical data associated to the `consultationId`\n * The `consultationId` only helps to retrieve the patient lockboxes\n * Note: it is possible to have several medical data\n * @param consultationId The consultation Id\n * @param forceRefresh force data refresh (default to false)\n * @returns the medical data\n */\n public async getMedicalDataFromConsultId(\n consultationId: Uuid,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n return this.getMetaCategoryFromConsultId(consultationId, MetadataCategory.Medical, forceRefresh)\n }\n\n private async getMetaCategoryFromConsultId(\n consultationId: Uuid,\n category: MetadataCategory,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n let grants = await this.getGrants({ consultationId })\n let workflowData: LocalizedData<PopulatedWorkflowData>[] = []\n for (let grant of grants) {\n let manifest = await this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId],\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n )\n\n // TODO: find another solution for backwards compatibility (those without the metadata consultationIds)\n if (manifest.length === 0) {\n manifest = (\n await this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n // backward compatiblility with TonTest\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n )\n ).filter((entry) => !entry.metadata.consultationIds) // Keep only entries without associated consultationIds\n }\n let data = await Promise.all(\n manifest.map(async (entry) => {\n return {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid!,\n dataUuid: entry.dataUuid,\n data: await this.getJsonData<PopulatedWorkflowData>(grant.lockboxUuid!, entry.dataUuid),\n }\n })\n )\n workflowData = { ...workflowData, ...data }\n }\n return workflowData\n }\n\n /**\n * @description retrieves the personal information stored in the first owned lockbox\n * @param userId The user Id\n * @returns the personal data\n */\n public async getPersonalInformations(userId: Uuid): Promise<LocalizedData<PopulatedWorkflowData>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === userId)\n\n if (!grant) {\n throw MissingGrant\n }\n\n const { lockboxUuid, lockboxOwnerUuid } = grant\n\n if (!lockboxUuid) throw MissingLockbox\n\n if (!lockboxOwnerUuid) throw MissingLockboxOwner\n\n const identificationDataUuid = (\n await this.getLockboxManifest(\n lockboxUuid,\n {\n category: MetadataCategory.Personal,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n false,\n userId\n )\n )[0].dataUuid\n\n return {\n lockboxOwnerUuid,\n lockboxUuid,\n dataUuid: identificationDataUuid,\n data: await this.getJsonData<PopulatedWorkflowData>(lockboxUuid, identificationDataUuid),\n }\n }\n\n /**\n * Retrieves the grant associated to a consultationId\n * @note returns the first grant only\n * @param consultationId The consultationId\n * @returns the grant\n */\n public async getGrantFromConsultId(consultationId: Uuid): Promise<Grant | undefined> {\n let grants = await this.getGrants({ consultationId })\n\n if (grants.length === 0) {\n throw AssociatedLockboxNotFound\n }\n\n return grants[0]\n }\n\n /**\n * retrieves the identity associated to the `consultationId`\n * @param consultationId The consultation Id\n * @returns the identity\n */\n public async getIdentityFromConsultId(consultationId: Uuid): Promise<IdentityResponse | undefined> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (grant && grant.lockboxOwnerUuid) {\n return await this.guardClient.identityGet(grant.lockboxOwnerUuid)\n } else {\n return undefined\n }\n }\n\n /**\n * retrieves the lockbox manifest for a given lockbox and add's its private metadata\n * @note the lockbox manifest will retrieved the cached manifest first unless force refresh is enabled\n * @param lockboxUuid\n * @param filter\n * @param expandPrivateMetadata\n * @param lockboxOwnerUuid\n * @param forceRefresh\n * @returns the lockbox manifest\n */\n public async getLockboxManifest(\n lockboxUuid: Uuid,\n filter: Metadata,\n expandPrivateMetadata: boolean,\n lockboxOwnerUuid?: Uuid,\n forceRefresh: boolean = false\n ): Promise<LockboxManifest> {\n let manifestKey = JSON.stringify({\n lockboxUuid,\n filter,\n expandPrivateMetadata,\n lockboxOwnerUuid,\n })\n if (!forceRefresh && this.cachedManifest[manifestKey]) return this.cachedManifest[manifestKey]\n\n return this.vaultClient.lockboxManifestGet(lockboxUuid, filter, lockboxOwnerUuid).then((manifest) => {\n return Promise.all(\n manifest.map(async (entry) => {\n if (expandPrivateMetadata && entry.metadata.privateMetadata) {\n let privateMeta = await this.getJsonData<Metadata>(\n lockboxUuid!,\n entry.metadata.privateMetadata,\n lockboxOwnerUuid\n )\n entry.metadata = {\n ...entry.metadata,\n ...privateMeta,\n }\n }\n return entry\n })\n ).then((manifest) => (this.cachedManifest[manifestKey] = manifest))\n })\n }\n\n /**\n * @description Create or update the personal information and store it in the first owned lockbox\n * @param identity The identity to use\n * @param data The personal data to store\n * @param dataUuid (optional) The dataUuid to update\n * @returns\n */\n public async createPersonalInformations(\n identity: IdentityResponse,\n data: PopulatedWorkflowData,\n dataUuid?: string\n ): Promise<DataCreateResponse> {\n const lockboxUuid = (await this.getGrants()).find(\n (lockbox) => lockbox.lockboxOwnerUuid === identity.id\n )?.lockboxUuid\n\n if (lockboxUuid) {\n return this.createJsonData<PersonalMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Personal,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n {},\n undefined,\n dataUuid\n )\n } else {\n throw MissingLockbox\n }\n }\n\n /**\n * Create or update user Preference\n * @param identity\n * @param preference\n * @param dataUuid\n * @returns\n */\n public async createUserPreference(\n identity: IdentityResponse,\n preference: UserPreference,\n dataUuid?: string\n ): Promise<DataCreateResponse> {\n const lockboxUuid = (await this.getGrants()).find(\n (lockbox) => lockbox.lockboxOwnerUuid === identity.id\n )?.lockboxUuid\n\n if (lockboxUuid) {\n return this.createJsonData<PreferenceMeta>(\n lockboxUuid,\n preference,\n {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n },\n {},\n undefined,\n dataUuid\n )\n } else {\n throw MissingLockbox\n }\n }\n\n /**\n * retrieves the user preference from a grant\n * @param grant The grant\n * @returns the user preference\n */\n public async getDataFromGrant<T = any>(grant: Grant, filter: Metadata): Promise<LocalizedData<T>> {\n const { lockboxUuid, lockboxOwnerUuid } = grant\n\n if (!lockboxUuid) throw MissingLockbox\n if (!lockboxOwnerUuid) throw MissingLockboxOwner\n const identificationDataUuid = (\n await this.getLockboxManifest(\n lockboxUuid,\n\n filter,\n false,\n grant.lockboxOwnerUuid,\n true\n )\n )[0].dataUuid\n\n return {\n lockboxOwnerUuid,\n lockboxUuid,\n dataUuid: identificationDataUuid,\n data: await this.getJsonData<T>(lockboxUuid, identificationDataUuid),\n }\n }\n\n /**\n * retrieves the user preference from a consultation id\n * @param consultationId The related consultationId\n * @returns the user preference\n */\n public async getUserPreferenceFromConsultId(consultationId: string): Promise<LocalizedData<UserPreference>> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<UserPreference>(grant, {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference stored in the first owned lockbox from identity\n * @param identity The identity to use\n * @returns the user preference\n */\n public async getUserPreference(identity: IdentityResponse): Promise<LocalizedData<UserPreference>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === identity.id)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<UserPreference>(grant, {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference from a consultation id\n * @param consultationId The related consultationId\n * @returns the user preference\n */\n public async getRecoveryDataFromConsultId(consultationId: string): Promise<LocalizedData<RecoveryData>> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<RecoveryData>(grant, {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference stored in the first owned lockbox from identity\n * @param identity The identity to use\n * @returns the user preference\n */\n public async getRecoveryData(identity: IdentityResponse): Promise<LocalizedData<RecoveryData>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === identity.id)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant(grant, {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n })\n }\n\n /**\n * @name getAssignedConsultations\n * @description finds all assigned or owned consultations for the logged user\n * Steps:\n * - Retrieves all granted lockboxes given to the logged user\n * - for each lockbox, find all consultation ids\n * - for each consultation id, retrieve the consult information\n * @param practiceUuid the uuid of the practice to look consult into\n * @returns the list of consults\n */\n public async getAssignedConsultations(practiceUuid: Uuid): Promise<Consult[]> {\n return Promise.all(\n (await this.getGrants()).map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n true,\n undefined\n ).then((manifest) =>\n Promise.all(\n manifest.map(\n async (entry) =>\n await this.consultClient.getConsultByUUID(entry.metadata.consultationId, practiceUuid)\n )\n ).then((promise) => promise.flat())\n )\n )\n ).then((consults) => consults.flat())\n }\n\n /**\n * Gets the past consultations of the patient as well as his relatives if any\n * @param consultationId any consultation uuid from which we will fetch all the other consultations of the same patient as the owner of this consultation id\n * @param practiceUuid\n */\n public async getPastConsultationsFromConsultId(\n consultationId: string,\n practiceUuid: string\n ): Promise<Consult[] | undefined> {\n const grant = await this.getGrantFromConsultId(consultationId)\n if (!grant) return undefined\n\n let consultationsInLockbox: string[] = (\n await this.vaultClient.lockboxMetadataGet(\n grant.lockboxUuid!,\n ['consultationId'],\n ['consultationId'],\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n grant.lockboxOwnerUuid\n )\n )\n .flat()\n .map((metadata: { consultationId: string }) => metadata.consultationId)\n\n if (consultationsInLockbox.length == 0) return []\n\n return await Promise.all(\n consultationsInLockbox.map(async (consultId: string) => {\n return await this.consultClient.getConsultByUUID(consultId, practiceUuid)\n })\n )\n }\n\n /**\n * @name getPatientConsultationData\n * @description retrieves the consultation data\n * @param consultationId\n * @returns\n */\n public async getPatientConsultationData(\n consultationId: Uuid,\n forceRefresh: boolean = false\n ): Promise<PopulatedWorkflowData[]> {\n //TODO: make use of getPatientDocumentsList instead of doing it manually here\n return Promise.all(\n (await this.getGrants({ consultationId }))\n .map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationId, //since we want to update the cached manifest (if another consult data exists)\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n ).then((manifest) =>\n Promise.all(\n manifest.map((e) =>\n this.getJsonData<PopulatedWorkflowData>(\n grant.lockboxUuid!,\n e.dataUuid,\n grant.lockboxOwnerUuid\n )\n )\n )\n )\n )\n .flat()\n ).then((data) => data.flat())\n }\n\n /**\n * This function returns the patient prescriptions\n * @param consultationId\n * @returns\n */\n public async getPatientPrescriptionsList(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Prescription,\n },\n true,\n consultationId\n )\n }\n\n /**\n * This function returns the patient results\n * @param consultationId\n * @returns\n */\n public async getPatientResultsList(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Result,\n },\n true,\n consultationId\n )\n }\n\n /**\n * returns the patient treatment plan options\n * @param consultationId\n * @returns Document[] corresponding to the patient treatment plan options\n */\n public async getPatientTreatmentPlans(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.TreatmentPlan,\n },\n true,\n consultationId\n )\n }\n\n /**\n * returns a specific patient treatment plan option\n * @param consultationId\n * @param treatmentPlanId\n * @returns\n */\n public async getPatientTreatmentPlanByUuid(consultationId: Uuid, treatmentPlanId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.TreatmentPlan,\n treatmentPlanId,\n },\n true,\n consultationId\n )\n }\n\n /**\n * @name getPatientDocumentsList\n * @description applies the provided filter to the vault to only find those documents\n * @param filters the applied filters (e.g. type of documents)\n * @param expandPrivateMetadata whether or not, the private metadata needs to be retrieved\n * (more computationally expensive)\n * @param consultationId\n * @returns the filtered document list\n */\n public async getPatientDocumentsList(\n filters: Object,\n expandPrivateMetadata: boolean,\n consultationId: Uuid\n ): Promise<Document[]> {\n return Promise.all(\n (await this.getGrants({ consultationId }))\n .map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n { ...filters, consultationId },\n expandPrivateMetadata,\n grant.lockboxOwnerUuid,\n true\n ).then((manifest) =>\n Promise.all(\n manifest.map(async (entry): Promise<Document> => {\n return {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid!,\n ...entry,\n }\n })\n )\n )\n )\n .flat()\n ).then((data) => data.flat())\n }\n\n /****************************************************************************************************************\n * RECOVERY *\n ****************************************************************************************************************/\n\n /**\n * @name recoverPrivateKeyFromSecurityQuestions\n * @description Recovers and sets the rsa private key from the answered security questions\n * @param id\n * @param recoverySecurityQuestions\n * @param recoverySecurityAnswers\n * @param threshold the number of answers needed to recover the key\n */\n public async recoverPrivateKeyFromSecurityQuestions(\n id: Uuid,\n recoverySecurityQuestions: string[],\n recoverySecurityAnswers: string[],\n threshold: number\n ) {\n let shards: SecretShard[] = (await this.guardClient.identityGet(id)).recoverySecurityQuestions!\n let answeredShards = shards\n .filter((shard: any) => {\n // filters all answered security questions\n let indexOfQuestion = recoverySecurityQuestions.indexOf(shard.securityQuestion)\n if (indexOfQuestion === -1) return false\n return recoverySecurityAnswers[indexOfQuestion] && recoverySecurityAnswers[indexOfQuestion] != ''\n })\n .map((item: any) => {\n // appends the security answer to the answered shards\n let index = recoverySecurityQuestions.indexOf(item.securityQuestion)\n item.securityAnswer = recoverySecurityAnswers[index]\n return item\n })\n try {\n // reconstructs the key from the answered security answers\n let privateKey = this.toolbox.reconstructSecret(answeredShards, threshold)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n } catch (e) {\n console.error(e)\n }\n }\n\n /**\n * @name recoverPrivateKeyFromPassword\n * @description Recovers and sets the rsa private key from the password\n * @param id\n * @param password\n */\n public async recoverPrivateKeyFromPassword(id: Uuid, password: string) {\n let identity = await this.guardClient.identityGet(id)\n\n let recoveryPayload = identity.recoveryPassword\n let symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(password)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n\n if (identity.recoveryLogin) {\n //Ensure we can recover from a page reload\n let symetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(identity.recoveryLogin)\n sessionStorage.setItem(\n sessionStorePrivateKeyName(id),\n symetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n )\n }\n\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * @name recoverPrivateKeyFromMasterKey\n * @description Recovers and sets the rsa private key from the master key\n * @param id\n * @param masterKey\n */\n public async recoverPrivateKeyFromMasterKey(id: Uuid, masterKey: string) {\n let recoveryPayload = (await this.guardClient.identityGet(id)).recoveryMasterKey!\n let symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(masterKey)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * @description Generates and updates the security questions and answers payload using new recovery questions and answers\n * Important: Since the security questions generate a payload for the private key, they will never be stored on the device as they must remain secret!!!\n * @param id\n * @param recoverySecurityQuestions\n * @param recoverySecurityAnswers\n * @param threshold the number of answers needed to rebuild the secret\n */\n public async updateSecurityQuestions(\n id: Uuid,\n recoverySecurityQuestions: string[],\n recoverySecurityAnswers: string[],\n threshold: number\n ) {\n if (!this.rsa) throw IncompleteAuthentication\n let securityQuestionPayload = this.toolbox.breakSecretIntoShards(\n recoverySecurityQuestions,\n recoverySecurityAnswers,\n this.rsa.private(),\n threshold\n )\n let updateRequest = {\n recoverySecurityQuestions: securityQuestionPayload,\n }\n\n return await this.guardClient.identityUpdate(id, updateRequest)\n }\n\n /**\n * @description Generates and stores the payload encrypted payload and updates the password itself (double hash)\n * @important\n * the recovery payload uses a singly hashed password and the password stored is doubly hashed so\n * the stored password cannot derive the decryption key in the payload\n * @note\n * the old password must be provided when not performing an account recovery\n * @param id\n * @param newPassword\n * @param oldPassword\n */\n public async updatePassword(id: Uuid, newPassword: string, oldPassword?: string) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(newPassword)\n let passwordPayload = symmetricEncryptor.bytesEncryptToBase64Payload(this.rsa.private())\n if (oldPassword) {\n oldPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(oldPassword))\n }\n\n newPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(newPassword))\n\n let updateRequest = {\n password: {\n oldPassword,\n newPassword,\n },\n recoveryPassword: passwordPayload,\n }\n\n return await this.guardClient.identityUpdate(id, updateRequest)\n }\n\n /**\n * @description Generates and stores the master key encrypted payload\n * Important\n * Since the master key is used to generate a payload for the private key, it will never be stored on the device as it must remain secret!\n * @param id\n * @param masterKey\n * @param lockboxUuid\n */\n async updateMasterKey(id: Uuid, masterKey: string, lockboxUuid: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(masterKey)\n let masterKeyPayload = symmetricEncryptor.bytesEncryptToBase64Payload(this.rsa.private())\n let updateRequest = { recoveryMasterKey: masterKeyPayload }\n const updatedIdentity = await this.guardClient.identityUpdate(id, updateRequest)\n\n await this.getOrInsertJsonData<RecoveryMeta>(\n lockboxUuid,\n { masterKey },\n {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n },\n {},\n true\n )\n\n return updatedIdentity\n }\n}","import { AxiosService, CliniaResponse, FacetFilter, PlaceData } from \"oro-sdk-apis\"\n\nexport class CliniaService {\n private api: AxiosService\n\n constructor(private url: string, apiKey: string, private locale?: string) {\n this.api = new AxiosService({ headers: { 'X-Clinia-API-Key': apiKey } })\n }\n\n public placeSearch(searchOptions: {\n locale?: string\n query?: string\n facetFilters?: FacetFilter[]\n location?: string\n aroundLatLng?: string\n page?: number\n }) {\n const { locale, ...data } = searchOptions\n\n return this.api.post<CliniaResponse<PlaceData>>(\n `${this.url}/search/v1/indexes/health_facility/query`,\n data,\n {\n params: { locale: locale ?? this.locale },\n }\n )\n }\n\n public placeMatch(\n searchOptions: {\n locale?: string\n name?: string\n address?: string\n postalCode?: string\n place?: string\n region?: string\n country?: string\n },\n type?: string\n ) {\n const { locale, ...data } = searchOptions\n\n let request = this.api.post<PlaceData[]>(\n `${this.url}/search/v1/matches`,\n data,\n {\n params: { locale: locale ?? this.locale },\n }\n )\n\n if (type) {\n request = request.then((places) =>\n places.filter((place) => place.type === type)\n )\n }\n\n return request\n }\n}\n","import initApis from 'oro-sdk-apis'\nimport { OroClient } from './client'\nimport * as OroToolboxNamespace from 'oro-toolbox'\n\nexport type OroToolbox = typeof OroToolboxNamespace\n\nexport let wasmPath = 'node_modules/oro-toolbox'\n\n/**\n * This function helps you to initialize and OroClient instance\n * @param toolbox the OroToolbox object\n * @param tellerBaseURL the teller service base URL \n * @param vaultBaseURL the vault service base URL \n * @param guardBaseURL the guard service base URL \n * @param searchbaseURL the search service base URL\n * @param practiceBaseURL the practice service base URL \n * @param consultBaseURL the consult service base URL \n * @param workflowBaseURL the workflow service base URL \n * @param diagnosisBaseURL the diagnosis service base URL \n * @param authenticationCallback (optional) authenticationCallback the authentification callback \n * @returns an instance of OroClient\n */\nconst init = (\n toolbox: OroToolbox,\n tellerBaseURL: string,\n vaultBaseURL: string,\n guardBaseURL: string,\n searchBaseURL: string,\n practiceBaseURL: string,\n consultBaseURL: string,\n workflowBaseURL: string,\n diagnosisBaseURL: string,\n authenticationCallback?: (err: Error) => void\n) => {\n const {\n tellerService,\n practiceService,\n consultService,\n vaultService,\n guardService,\n searchService,\n workflowService,\n diagnosisService,\n } = initApis(\n {\n tellerBaseURL,\n vaultBaseURL,\n guardBaseURL,\n searchBaseURL,\n practiceBaseURL,\n consultBaseURL,\n workflowBaseURL,\n diagnosisBaseURL,\n },\n authenticationCallback\n )\n\n const client = new OroClient(\n toolbox,\n tellerService!,\n vaultService!,\n guardService!,\n searchService!,\n practiceService!,\n consultService!,\n workflowService!,\n diagnosisService!,\n authenticationCallback\n )\n\n return client\n}\n\nexport { OroClient } from './client'\nexport * from 'oro-sdk-apis'\nexport * from './models'\nexport * from './helpers'\nexport * from './services'\nexport { OroToolboxNamespace }\nexport default init\n"],"names":["personalMetaToPrefix","MetadataCategory","Personal","ChildPersonal","OtherPersonal","identificationToPersonalInformations","data","category","prefix","birthday","firstname","gender","name","phone","zip","hid","pharmacy","address","toActualObject","ret","Object","entries","fields","forEach","key","field","displayedAnswer","answer","updatePersonalIntoPopulatedWorkflowData","infos","JSON","parse","stringify","kind","extractISOLocalityForConsult","answers","undefined","arrAnswersWithLocality","flatMap","currentAnswerPage","arrCountryFields","keys","filter","workflowFieldName","indexOf","flat","arrProvinceFields","arrConsultLocalFields","map","currentFieldName","item","arrSelectedLocality","currentSelectedLocality","startsWith","length","console","log","allowedLocalityPatterns","finalLocality","reduce","extractedSelected","exec","indexSelectedPriority","isoSelectedValue","extractedFinal","indexFinalPriority","isoFinalValue","sessionPrivateKeyPrefix","sessionStorePrivateKeyName","id","IncompleteAuthentication","Error","MissingGrant","MissingGrantFilter","MissingLockbox","MissingLockboxOwner","AssociatedLockboxNotFound","WorkflowAnswersMissingError","filterTriggeredAnsweredWithKind","workflowData","selectedAnswers","flattenedAnswers","flattenSelectedAnswers","triggeredQuestionsWithKind","fromEntries","pages","a","questions","question","isTriggered","triggers","samePageAnswers","prev","cur","res","questionFieldName","getWorkflowDataByCategory","triggeredQuestions","Promise","all","e","k","v","populateWorkflowField","then","populatedValue","workflowCreatedAt","createdAt","workflowId","locale","err","error","getImagesFromIndexDb","getMany","answerValue","text","value","images","image","imageData","resolve","includes","Array","isArray","some","subSetTriggers","every","trigger","linearAnswers","push","values","getInitialisedSelectedAnswers","workflow","useDefault","page","defaultValue","fillWorkflowFromPopulatedWorkflow","populatedWorkflow","filledWorkflow","pageIdx","MAX_RETRIES","registerPatient","patientUuid","consultRequest","oroClient","masterKey","recoveryQA","indexSearch","onProgress","consult","lockboxUuid","practitionerAdmin","retry","identity","errorsThrown","stepsTotalNum","currentStep","setTimeout","practiceClient","practiceGetFromUuid","uuidPractice","uuidAdmin","practiceGetPractitioners","practitioners","getOrCreatePatientConsultationUuid","getOrCreatePatientLockbox","guardClient","identityGet","grantLockbox","grantPromises","practitioner","uuid","consultIndex","IndexKey","ConsultationLockbox","grant","lockboxOwnerUuid","consultationId","consultIndexPromises","vaultIndexAdd","storeImageAliases","storePatientData","isoLanguageRequired","recoveryMasterKey","updateMasterKey","recoverySecurityQuestions","updateSecurityQuestions","recoverySecurityAnswers","buildConsultSearchIndex","consultClient","updateConsultByUUID","statusMedical","MedicalStatus","New","cleanIndex","practiceGetPayment","idStripeInvoiceOrPaymentIntent","payment","uuidConsult","getConsultByUUID","consultCreate","getGrants","grants","vaultClient","lockboxCreate","lockboxResponse","authRefresh","tokens","setTokens","accessToken","refreshToken","whoAmI","isoLanguage","getOrInsertJsonData","Raw","contentType","Consultation","documentType","DocumentType","PopulatedWorkflowData","Medical","consultationIds","extractAndStorePersonalWorkflowData","Preference","dataUuids","progress","nonNullImages","img","storedImagesNum","totalImagesNum","promises","ImageAlias","idbId","progressStepValue","Math","round","extractPersonalInfoFromWorkflowData","personalInfoPopulatedWfData","childPersonalInfoPopulatedWfData","otherPersonalInfoPopulatedWfData","terms","shortId","personalInfo","childPersonalInfo","otherPersonalInfo","searchClient","index","decryptGrants","encryptedGrants","rsaKey","encryptedLockbox","uuidParse","base64DecryptToBytes","decryptConsultLockboxGrants","encryptedConsultLockboxes","base64DecryptToJson","encryptedIndexEntry","grantsTuple","grantTuples","filterGrantsWithLockboxMetadata","filteredGrants","lockboxMetadataGet","consultationIdExistsInMetadata","OroClient","toolbox","tellerClient","workflowClient","diagnosisClient","authenticationCallback","cachedMetadataGrants","cachedManifest","signUp","email","password","practice","tosAndCpAcceptance","tokenData","subscription","skipEmailValidation","rsa","CryptoRSA","privateKey","symmetricEncryptor","CryptoChaCha","fromPassphrase","recoveryPassword","bytesEncryptToBase64Payload","hashedPassword","hashStringToBase64","emailConfirmed","signupRequest","practiceUuid","toLowerCase","publicKey","encodeToBase64","identityCreate","recoveryLogin","symetricEncryptor","sessionStorage","setItem","confirmEmail","claims","identityUpdate","sub","signIn","otp","tokenRequest","authToken","userUuid","recoverPrivateKeyFromPassword","resumeSession","recoveryPayload","getItem","recoveryKey","symmetricDecryptor","base64PayloadDecryptToBytes","fromKey","localEncryptToJsonPayload","chaChaKey","encryptedData","jsonEncryptToBase64Payload","encryptedKey","encryptToBytes","localDecryptJsonPayload","decryptedData","base64PayloadDecryptToJson","signOut","secrets","authLogout","forceUpdateIndexEntries","consults","indexConsultLockbox","alert","indexOwnerUuid","base64IndexOwnerPubKey","rsaPub","decodeFromBase64","encryptedIndex","keyString","uniqueHash","timestamp","jsonWithPubEncryptToBase64","vaultIndexPut","granteeUuid","getCachedSecretCryptor","secret","base64GranteePublicKey","granteePublicKey","granteeEncryptedSecret","bytesWithPubEncryptToBase64","request","encryptedSecret","lockboxGrant","createMessageData","message","previousDataUuid","author","encryptedPrivateMeta","meta","Message","publicMetadata","privateMetadata","lockboxDataStore","createMessageAttachmentData","Uint8Array","arrayBuffer","lastModified","size","fileName","type","createConsultationAttachmentData","createBytesData","createJsonData","privateMeta","forceReplace","lockboxManifestGet","manifest","dataUuid","getJsonData","lockboxDataGet","encryptedPayload","getBytesData","filterString","getAccountRole","currentAccountRole","OtherRoleType","User","Patient","requiredRole","grantsGet","decryptedGrants","info","vaultIndexGet","grantsByConsultLockbox","decryptedConsults","scope","split","findIndex","lockboxSecretGet","sharedSecret","cryptor","getPersonalInformationsFromConsultId","forceRefresh","getMetaCategoryFromConsultId","getMedicalDataFromConsultId","getLockboxManifest","entry","metadata","getPersonalInformations","userId","find","lockbox","identificationDataUuid","getGrantFromConsultId","getIdentityFromConsultId","expandPrivateMetadata","manifestKey","createPersonalInformations","createUserPreference","preference","getDataFromGrant","getUserPreferenceFromConsultId","getUserPreference","getRecoveryDataFromConsultId","Recovery","getRecoveryData","getAssignedConsultations","promise","getPastConsultationsFromConsultId","consultationsInLockbox","consultId","getPatientConsultationData","getPatientPrescriptionsList","getPatientDocumentsList","Prescription","getPatientResultsList","Result","getPatientTreatmentPlans","TreatmentPlan","getPatientTreatmentPlanByUuid","treatmentPlanId","filters","recoverPrivateKeyFromSecurityQuestions","threshold","shards","answeredShards","shard","indexOfQuestion","securityQuestion","securityAnswer","reconstructSecret","recoverPrivateKeyFromMasterKey","securityQuestionPayload","breakSecretIntoShards","updateRequest","updatePassword","newPassword","oldPassword","passwordPayload","masterKeyPayload","updatedIdentity","CliniaService","url","apiKey","api","AxiosService","headers","placeSearch","searchOptions","post","params","placeMatch","places","place","wasmPath","init","tellerBaseURL","vaultBaseURL","guardBaseURL","searchBaseURL","practiceBaseURL","consultBaseURL","workflowBaseURL","diagnosisBaseURL","initApis","tellerService","practiceService","consultService","vaultService","guardService","searchService","workflowService","diagnosisService","client"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"oro-sdk.cjs.development.js","sources":["../src/helpers/client.ts","../src/models/error.ts","../src/helpers/workflow.ts","../src/helpers/patient-registration.ts","../src/helpers/vault-grants.ts","../src/sdk-revision/client.ts","../src/client.ts","../src/services/external/clinia.ts","../src/index.ts"],"sourcesContent":["import {\n PopulatedWorkflowData,\n MetadataCategory,\n SelectedAnswersData,\n} from 'oro-sdk-apis'\nimport { PersonalInformations } from '../models/client'\n\nconst personalMetaToPrefix = {\n [MetadataCategory.Personal]: 'you',\n [MetadataCategory.ChildPersonal]: 'child',\n [MetadataCategory.OtherPersonal]: 'other',\n}\n\n/**\n * This function extract PersonalInformations from data input object coming from workflow\n * @param data extracted from WorkflowData\n * @returns PersonalInformations of a patient\n */\nexport function identificationToPersonalInformations(\n data: any,\n category:\n | MetadataCategory.Personal\n | MetadataCategory.ChildPersonal\n | MetadataCategory.OtherPersonal\n): PersonalInformations {\n const prefix = personalMetaToPrefix[category]\n\n return {\n birthday: data[`${prefix}Birthday`],\n firstname: data[`${prefix}Firstname`],\n gender: data[`${prefix}Gender`],\n name: data[`${prefix}Name`],\n phone: data[`${prefix}Phone`],\n zip: data[`${prefix}Zip`],\n hid: data[`${prefix}HID`] ?? data[`${prefix}ID`], // This is done for backward compatibility (historically youID was used)\n pharmacy: data[`${prefix}Pharmacy`],\n address: data[`${prefix}Address`],\n }\n}\n\nexport function toActualObject(data: PopulatedWorkflowData) {\n const ret: any = {}\n\n Object.entries(data.fields).forEach(([key, field]) => {\n ret[key] = field.displayedAnswer ? field.displayedAnswer : field.answer\n })\n\n return ret\n}\n\n/**\n * This function update a PopulatedWorkflowData with PersonalInformations\n * @param infos the personal informations\n * @param data the PopulatedWorkflowData\n * @returns an updated PopulatedWorkflowData\n */\nexport function updatePersonalIntoPopulatedWorkflowData(\n infos: PersonalInformations,\n data: PopulatedWorkflowData,\n category:\n | MetadataCategory.Personal\n | MetadataCategory.ChildPersonal\n | MetadataCategory.OtherPersonal\n) {\n const prefix = personalMetaToPrefix[category]\n\n const ret = JSON.parse(JSON.stringify(data)) // deep copy PopulatedWorkflowData\n\n if (infos.birthday && ret.fields[`${prefix}Birthday`])\n ret.fields[`${prefix}Birthday`].answer = infos.birthday\n if (infos.firstname && ret.fields[`${prefix}Firstname`])\n ret.fields[`${prefix}Firstname`].answer = infos.firstname\n if (infos.gender && ret.fields[`${prefix}Gender`])\n ret.fields[`${prefix}Gender`].answer = infos.gender\n if (infos.name && ret.fields[`${prefix}Name`])\n ret.fields[`${prefix}Name`].answer = infos.name\n if (infos.phone && ret.fields[`${prefix}Phone`])\n ret.fields[`${prefix}Phone`].answer = infos.phone\n if (infos.zip && ret.fields[`${prefix}Zip`])\n ret.fields[`${prefix}Zip`].answer = infos.zip\n if (infos.hid) {\n if (ret.fields[`${prefix}HID`]) {\n ret.fields[`${prefix}HID`].answer = infos.hid\n } else if (ret.fields[`${prefix}ID`]) {\n // This is done for backward compatibility (historically youID was used)\n ret.fields[`${prefix}ID`].answer = infos.hid\n } else {\n // If does not exist create it\n ret.fields[`${prefix}HID`] = { kind: 'text', answer: infos.hid }\n }\n }\n\n return ret\n}\n\n/**\n * This function extract an ISO 3166-1 alpha-2 country and subdivision code from data input object coming from workflow\n * @param answers answers from the WorkflowData\n * @returns an ISO 3166 alpha-2 code or undefined\n */\nexport function extractISOLocalityForConsult(\n answers?: SelectedAnswersData\n): string | undefined {\n if (!answers) {\n return undefined\n }\n\n const arrAnswersWithLocality = answers\n .flatMap((currentAnswerPage) => {\n const arrCountryFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Country') !== -1\n )\n .flat()\n const arrProvinceFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Province') !== -1\n )\n .flat()\n const arrConsultLocalFields = Object.keys(currentAnswerPage)\n .filter(\n (workflowFieldName) =>\n workflowFieldName.indexOf('Locality') !== -1\n )\n .flat()\n //returning the actual selected values, skipping if their IDs are more complex than a string\n return [\n ...arrCountryFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ...arrProvinceFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ...arrConsultLocalFields.map(\n (currentFieldName) =>\n (typeof currentAnswerPage[currentFieldName] === 'string'\n ? currentAnswerPage[currentFieldName]\n : undefined) as string\n ),\n ]\n })\n .filter((item) => item !== undefined)\n\n const arrSelectedLocality = arrAnswersWithLocality.filter(\n (currentSelectedLocality) =>\n currentSelectedLocality.startsWith('isoLocalityConsult')\n )\n if (!arrSelectedLocality || arrSelectedLocality.length === 0) {\n console.log('no locality found in ' + arrSelectedLocality)\n return undefined\n }\n //to allow enforcing of an order, we will allow the following pattern in the isoLocalityConsult field name\n // isoLocalityConsult-QC-CA and isoLocalityConsult_1-QC-CA\n // or generally: isoLocalityConsult-<isoValue> or isoLocalityConsult_<priority>-<isoValue>\n const allowedLocalityPatterns = /isoLocalityConsult(?:_(?<indexPriority>\\d*))?-(?<isoValue>[a-zA-Z0-9]{2}-[a-zA-Z0-9]{1,3})/\n const finalLocality = arrSelectedLocality.reduce<string | undefined>(\n (finalLocality, currentSelectedLocality) => {\n const extractedSelected = allowedLocalityPatterns.exec(\n currentSelectedLocality\n )\n const [, indexSelectedPriority, isoSelectedValue] =\n extractedSelected ?? []\n if (!finalLocality) {\n return isoSelectedValue\n }\n\n const extractedFinal = allowedLocalityPatterns.exec(finalLocality)\n const [, indexFinalPriority, isoFinalValue] = extractedFinal ?? []\n //we only keep the old value if there's priority used\n // and the new value is of lower priority\n if (\n !indexSelectedPriority ||\n (indexFinalPriority &&\n indexFinalPriority > indexSelectedPriority)\n ) {\n return isoFinalValue\n }\n\n return isoSelectedValue\n },\n undefined\n )\n\n console.log('Picking locality ' + finalLocality)\n return finalLocality\n}\n\nconst sessionPrivateKeyPrefix = 'sess-pkey'\nexport function sessionStorePrivateKeyName(id: string): string {\n return sessionPrivateKeyPrefix + id\n}\n","export class IncompleteAuthentication extends Error { }\nexport class MissingGrant extends Error { }\nexport class MissingGrantFilter extends Error { }\nexport class MissingLockbox extends Error { }\nexport class MissingLockboxOwner extends Error { }\nexport class AssociatedLockboxNotFound extends Error { }\nexport class WorkflowAnswersMissingError extends Error { }\n","import { getMany } from 'idb-keyval'\nimport { WorkflowAnswersMissingError } from '../models'\nimport {\n MetadataCategory,\n PopulatedWorkflowData,\n PopulatedWorkflowField,\n QuestionData,\n SelectedAnswerData,\n SelectedAnswersData,\n WorkflowData,\n WorkflowPageData,\n WorkflowUploadedImage,\n} from 'oro-sdk-apis'\n\nexport async function filterTriggeredAnsweredWithKind(\n workflowData: WorkflowData,\n kind:\n | 'text'\n | 'text-area'\n | 'text-select-group'\n | 'date'\n | 'number'\n | 'images'\n | 'images-alias'\n | 'body-parts'\n | 'pharmacy-picker'\n | 'online-pharmacy-picker'\n | 'hair-selector-women'\n | 'hair-selector-men'\n | 'hair-loss-stage'\n | 'hair-loss-frontal'\n): Promise<SelectedAnswerData[]> {\n if (!workflowData.selectedAnswers) throw WorkflowAnswersMissingError\n // Flattens the list of answered questions\n let flattenedAnswers = flattenSelectedAnswers(workflowData.selectedAnswers)\n // Generates a list of applicable questions\n let triggeredQuestionsWithKind = Object.fromEntries(\n workflowData.pages\n .map((a) => {\n return Object.entries(a.questions).filter(\n ([_, question]) => isTriggered(question.triggers || [], flattenedAnswers) && question.kind === kind\n )\n })\n .flat()\n )\n\n const samePageAnswers = workflowData.selectedAnswers.reduce((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n\n const res = Object.keys(triggeredQuestionsWithKind).map((questionFieldName) => {\n return samePageAnswers[questionFieldName]\n })\n\n return res\n}\n\n/**\n * Filters and Populates the `selectedAnswers` from the workflow by\n * Cross-referencing the `MetaCategory` of the answer's respective question\n * Populates the fields labels and values that are of radio, dropdown and checkbox types\n *\n * @param workflowData\n * @param category\n * @returns An array of record key, value pairs\n */\nexport async function getWorkflowDataByCategory(\n workflowData: WorkflowData,\n category: MetadataCategory\n): Promise<PopulatedWorkflowData> {\n if (!workflowData.selectedAnswers) throw WorkflowAnswersMissingError\n\n // Flattens the list of answered questions\n let flattenedAnswers = flattenSelectedAnswers(workflowData.selectedAnswers)\n // Generates a list of applicable questions\n let triggeredQuestions = Object.fromEntries(\n workflowData.pages\n .map((a) => {\n return Object.entries(a.questions).filter(([_, question]) =>\n isTriggered(question.triggers || [], flattenedAnswers)\n )\n })\n .flat()\n )\n\n const fields: Record<string, PopulatedWorkflowField> = {}\n\n // Generates the answers of the specified category and adds the appropriate values if any are missing\n return Promise.all(\n workflowData.selectedAnswers\n .map((e) => Object.entries(e))\n .flat()\n .filter(([k, v]) => triggeredQuestions[k] && triggeredQuestions[k]['metaCategory'] === category)\n .map(([k, v]) => {\n return populateWorkflowField(triggeredQuestions[k], v).then((populatedValue) => {\n fields[k] = populatedValue\n })\n })\n )\n .then(() => {\n const ret: PopulatedWorkflowData = {\n workflowCreatedAt: workflowData.createdAt,\n workflowId: workflowData.id,\n locale: workflowData.locale,\n fields,\n }\n return ret\n })\n .catch((err) => {\n console.error(`Error while extracting ${category} data from workflow`, err)\n throw err\n })\n}\n\nexport async function getImagesFromIndexDb(answer: SelectedAnswerData): Promise<WorkflowUploadedImage[]> {\n return await getMany<WorkflowUploadedImage>((answer as any[]).map((v) => v.id ?? v) as string[])\n}\n\n/**\n * (If applicable) Based on the question kind, and the answer type this function will add and replace the appropriate fields to the\n * field values if they are radio, dropdown and checkbox fields\n *\n *\n * @param question\n * @param answerValue\n * @returns\n */\nasync function populateWorkflowField(\n question: QuestionData,\n answerValue: SelectedAnswerData\n): Promise<PopulatedWorkflowField> {\n let answer: any\n let displayedAnswer: string | string[] | undefined = undefined\n switch (question.kind) {\n case 'text-select-group':\n if (question.answers) {\n displayedAnswer = `${answerValue[0]} ${question.answers[answerValue[1] as string].text}`\n }\n answer = answerValue\n break\n case 'radio':\n case 'radio-card':\n case 'select':\n if (question.answers) {\n displayedAnswer = question.answers[answerValue as string].text\n }\n\n answer = answerValue\n break\n case 'multiple':\n case 'checkbox-group':\n displayedAnswer = (answerValue as string[]).map((value) => {\n if (question.answers) {\n return question.answers[value].text\n }\n\n throw new WorkflowAnswersMissingError()\n })\n\n answer = answerValue\n break\n case 'images':\n answer = await getImagesFromIndexDb(answerValue).then((images) =>\n images.map((image) => {\n const { name, imageData } = image\n\n return { name, imageData }\n })\n )\n break\n default:\n answer = answerValue\n }\n\n return Promise.resolve({\n answer,\n displayedAnswer,\n kind: question.kind,\n })\n}\n\n/**\n * Determine if a question is triggered by some answers\n *\n * We use the following logical combinations of rules:\n *\n * #### Single string\n *\n * ```\n * // Required: rule1\n * rules: rule1\n * ```\n *\n * #### Array of strings (AND is applied between statements):\n *\n * ```\n * // Required: rule1 AND rule2\n * rules: [ rule1, rule2 ]\n * ```\n *\n * #### Array of arrays of strings (OR is applied between inner arrays. AND is applied between inner arrays statements)\n *\n * ```\n * // Required: rule1 OR rule2\n * rules: [\n * [ rule1 ],\n * [ rule2 ]\n * ]\n *\n * // Required: rule1 OR (rule2 AND rule3)\n * rules: [\n * [ rule1 ],\n * [ rule2, rule3 ]\n * ]\n *\n * // THIS IS FORBIDDEN\n * rules: [\n * rule1, // <-- THIS IS FORBIDDEN. Instead use [ rule1 ]\n * [ rule2, rule3 ]\n * ]\n * ```\n *\n * @param triggers the triggering rules\n * @param answers the answers to check againts triggering rules\n * @returns `true` if triggers are verified against ansers. Otherwise, returns `false`.\n * @throws an Error if triggers typing is wrong\n */\nexport function isTriggered(triggers: string[][] | string[] | string, answers: string[]): boolean {\n // is triggers contained in answers\n if (typeof triggers === 'string') {\n return answers.includes(triggers)\n }\n\n if (Array.isArray(triggers)) {\n // rule combination kind: rule1 OR (rule2 AND rule3)\n if (Array.isArray(triggers[0])) {\n return (triggers as string[][]).some((subSetTriggers) =>\n subSetTriggers.every((trigger) => answers.includes(trigger))\n )\n } else {\n // rule combination kind: rule1 AND rule2\n return (triggers as string[]).every((trigger) => answers.includes(trigger))\n }\n }\n\n throw Error('[isTriggered] triggers is not typed well')\n}\n\nexport function flattenSelectedAnswers(answers: SelectedAnswersData) {\n const linearAnswers: SelectedAnswerData[] = []\n\n for (const answer of answers) {\n linearAnswers.push(...Object.values(answer))\n }\n\n return linearAnswers.flat(1)\n}\n\n/**\n * This function helps you to get a valid workflow selectedAnswers structure\n * @param workflow the workflow data to use to initialize selectedAnswers\n * @param useDefault use workflow default values or not (this is used to avoid having unset values to appear in summaries)\n * @returns a valid selectedAnswers structure\n */\nexport function getInitialisedSelectedAnswers(workflow: WorkflowData, useDefault: boolean = true) {\n return workflow.pages.map((page) => {\n const ret: any = {}\n for (const [id, question] of Object.entries(page.questions)) {\n if (question.kind === 'body-parts') {\n ret[id] = useDefault ? [] : undefined\n } else {\n ret[id] = useDefault && question.defaultValue ? question.defaultValue : undefined\n }\n }\n return ret\n })\n}\n\nexport function fillWorkflowFromPopulatedWorkflow(workflow: WorkflowData, populatedWorkflow: PopulatedWorkflowData) {\n const filledWorkflow = JSON.parse(JSON.stringify(workflow))\n\n if (!filledWorkflow.selectedAnswers) {\n filledWorkflow.selectedAnswers = getInitialisedSelectedAnswers(filledWorkflow, false)\n }\n\n filledWorkflow.pages.forEach((page: WorkflowPageData, pageIdx: number) => {\n const ret: any = {}\n for (const [id] of Object.entries(page.questions)) {\n if (populatedWorkflow.fields[id]) {\n if (filledWorkflow.selectedAnswers)\n filledWorkflow.selectedAnswers[pageIdx][id] = populatedWorkflow.fields[id].answer as\n | string\n | string[]\n }\n }\n })\n\n return filledWorkflow\n}\n","import {\n Consult,\n ConsultationImageMeta,\n ConsultationMeta,\n ConsultRequest,\n DocumentType,\n IdentityResponse,\n IndexKey,\n MedicalMeta,\n MedicalStatus,\n MetadataCategory,\n PersonalMeta,\n PopulatedWorkflowData,\n Practitioner,\n PreferenceMeta,\n RawConsultationMeta,\n Term,\n Terms,\n Uuid,\n VaultIndex,\n WorkflowData,\n} from 'oro-sdk-apis'\nimport {\n filterTriggeredAnsweredWithKind,\n getImagesFromIndexDb,\n getWorkflowDataByCategory,\n identificationToPersonalInformations,\n OroClient,\n RegisterPatientOutput,\n toActualObject,\n} from '..'\n\nconst MAX_RETRIES = 15\n\n/**\n * Completes a registration for a user retrying the complete flow a maximum of 15 times\n *\n * @description The order of importance when registering:\n * Creates a consultation if none exist\n * Retrieves or create's a lockbox if none exist\n * Grants the lockbox (if new) to all practitioners in the practice\n * Stores or fetches the patient data (without images)\n * Indexes the lockbox to the consult for all practitioners (done after inserting since index can be rebuilt from grants)\n * Stores the image data - done last since the majority of failure cases occur here\n * Creates the recovery payloads if they don't exist\n *\n * @param patientUuid\n * @param consultRequest\n * @param workflow\n * @param oroClient\n * @param masterKey\n * @param recoveryQA\n * @param indexSearch create search index for the consultation if true\n * @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\n * @returns the successful registration\n */\nexport async function registerPatient(\n patientUuid: Uuid,\n consultRequest: ConsultRequest,\n workflow: WorkflowData,\n oroClient: OroClient,\n masterKey?: Uuid,\n recoveryQA?: {\n recoverySecurityQuestions: string[]\n recoverySecurityAnswers: string[]\n },\n indexSearch: boolean = true,\n onProgress?: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number, totalImagesNum?: number }) => void\n): Promise<RegisterPatientOutput> {\n let consult: Consult | undefined = undefined\n let lockboxUuid: Uuid | undefined = undefined\n let practitionerAdmin: Uuid | undefined = undefined\n let retry = MAX_RETRIES\n let identity: IdentityResponse | undefined = undefined\n let errorsThrown: Error[] = []\n const stepsTotalNum = 9\n let currentStep: number\n\n for (; retry > 0; retry--) {\n try {\n currentStep = 0\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'retrieve_practitioners')\n\n\n // Wait a bit each retry (we also want the first one to wait)\n await new Promise((resolve) => setTimeout(resolve, 2000))\n\n // Retrieving practitioners\n if (!practitionerAdmin)\n practitionerAdmin = (await oroClient.practiceClient.practiceGetFromUuid(consultRequest.uuidPractice))\n .uuidAdmin\n\n let practitioners: Practitioner[] = await oroClient.practiceClient\n .practiceGetPractitioners(consultRequest.uuidPractice)\n .catch((err) => {\n console.log(`Error retrieving practitioners`, err)\n return []\n })\n\n // Creating consult\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_consult')\n\n if (!consult) {\n consult = await getOrCreatePatientConsultationUuid(consultRequest, oroClient)\n }\n\n // Creating lockbox\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'create_lockbox')\n\n if (!lockboxUuid) lockboxUuid = await getOrCreatePatientLockbox(oroClient)\n\n if (!identity) identity = await oroClient.guardClient.identityGet(patientUuid)\n\n await oroClient.grantLockbox(practitionerAdmin, lockboxUuid).catch((err) => {\n console.error(`Error while granting lockbox to practitioner admin ${practitionerAdmin}`, err)\n // if we cannot grant to the admin, then the registration will fail\n errorsThrown.push(err)\n })\n\n // Patient Grant to practice\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'grant_patient')\n\n let grantPromises = practitioners\n .filter((practitioner) => practitioner.uuid !== practitionerAdmin)\n .map(async (practitioner) => {\n return oroClient.grantLockbox(practitioner.uuid, lockboxUuid!).catch((err) => {\n console.error(`Error while granting lockbox to practitioner`, err)\n // Acceptable to continue as admin has already been granted, but we should still retry until the last retry remains\n if (retry <= 1) return\n errorsThrown.push(err)\n })\n })\n\n const consultIndex: VaultIndex = {\n [IndexKey.ConsultationLockbox]: [\n {\n grant: {\n lockboxUuid,\n lockboxOwnerUuid: patientUuid,\n },\n consultationId: consult.uuid,\n },\n ],\n }\n\n // the index will identify in which lockbox a consultation resides\n let consultIndexPromises = practitioners.map(async (practitioner) => {\n return oroClient.vaultIndexAdd(consultIndex, practitioner.uuid).catch((err) => {\n console.error(\n `[SDK: registration] Error while adding to the practitioner's index ${practitioner.uuid}`,\n err\n )\n // Acceptable to continue as the index can be rebuilt, but we should still retry until the last retry remains\n if (retry <= 1) return\n else errorsThrown.push(err)\n })\n })\n\n await storeImageAliases(\n consult.uuid,\n lockboxUuid,\n workflow,\n oroClient,\n onProgress? {\n onProgress,\n currentStep,\n stepsTotalNum\n } : undefined\n ).catch((err) => {\n console.error('[SDK: registration] Some errors happened during image upload', err)\n // Acceptable to continue as images can be requested during the consultation, but we should still retry until the last retry remains\n if (retry <= 1) return\n else errorsThrown.push(err)\n })\n ++currentStep\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'store_patient_data')\n\n await storePatientData(\n consult.uuid,\n consultRequest.isoLanguageRequired,\n lockboxUuid,\n workflow,\n oroClient\n ).catch((err) => {\n console.error('[SDK: registration] Some errors happened during patient data upload', err)\n errorsThrown.push(err)\n })\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_masterkey')\n\n if (masterKey && !identity?.recoveryMasterKey) {\n // generate and store recovery payload and updates the identity\n identity = await oroClient.updateMasterKey(patientUuid, masterKey, lockboxUuid).catch((err) => {\n console.error(`[SDK: registration] Error while updating master key`, err)\n /// it's acceptable to continue registration (return old identity)\n if (retry <= 1) return\n errorsThrown.push(err)\n return identity\n })\n } else {\n // we did not set the master key so we do not return it\n masterKey = undefined\n }\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'set_security_questions')\n\n if (recoveryQA && !identity?.recoverySecurityQuestions)\n // Patient security question recovery threshold is 2 answers and updates the identity\n identity = await oroClient\n .updateSecurityQuestions(\n patientUuid,\n recoveryQA.recoverySecurityQuestions,\n recoveryQA.recoverySecurityAnswers,\n 2\n )\n .catch((err) => {\n console.error(`[SDK: registration] Error while updating security questions`, err)\n /// it's acceptable to continue registration (return old identity)\n if (retry <= 1) return\n errorsThrown.push(err)\n return identity\n })\n\n await Promise.all([...grantPromises, ...consultIndexPromises])\n\n\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'search_indexing')\n\n if (indexSearch) {\n await buildConsultSearchIndex(consult, workflow, oroClient).catch((err) => {\n console.error(\n '[SDK: registration] personal information not found or another error occured during search indexing',\n err\n )\n if (retry <= 1) return // this statement is to avoid failing the registration due to the failure in search indexing the consult, this practically implements a soft retry\n errorsThrown.push(err)\n })\n }\n\n if (errorsThrown.length > 0) throw errorsThrown\n\n // Deem the consultation as ready\n await oroClient.consultClient.updateConsultByUUID(consult.uuid, {\n statusMedical: MedicalStatus.New,\n })\n\n // if we got through the complete flow, the registration succeeded\n if (onProgress) onProgress((currentStep++)/stepsTotalNum, 'success')\n\n break\n } catch (err) {\n console.error(`[SDK] Error occured during registration: ${err}, retrying... Retries remaining: ${retry}`)\n errorsThrown = []\n continue\n }\n }\n\n if (retry <= 0) {\n console.error('[SDK] registration failed: MAX_RETRIES reached')\n throw 'RegistrationFailed'\n }\n\n console.log('Successfully Registered')\n await oroClient.cleanIndex()\n return {\n masterKey,\n consultationId: consult!.uuid,\n lockboxUuid: lockboxUuid!,\n }\n}\n\n/**\n * Creates a consultation if one has not been created and fails to be retrieved by the payment intent\n * @param consult\n * @param oroClient\n * @returns the consult Uuid\n */\nasync function getOrCreatePatientConsultationUuid(consult: ConsultRequest, oroClient: OroClient): Promise<Consult> {\n let payment = await oroClient.practiceClient.practiceGetPayment(\n consult.uuidPractice,\n consult.idStripeInvoiceOrPaymentIntent\n )\n if (payment && payment.uuidConsult) {\n return oroClient.consultClient.getConsultByUUID(payment.uuidConsult).catch((err) => {\n console.error('Error while retrieving consult', err)\n throw err\n })\n } else {\n return await oroClient.consultClient.consultCreate(consult).catch((err) => {\n console.error('Error while creating consult', err)\n throw err\n })\n }\n}\n\n/**\n * Creates a new lockbox for the patient if they do not have any, otherwise, use the first (and only one)\n * @param oroClient\n * @returns the lockbox Uuid\n */\nasync function getOrCreatePatientLockbox(oroClient: OroClient): Promise<Uuid> {\n let grants = await oroClient.getGrants()\n if (grants.length > 0) {\n console.log('The grant has already been created, skipping lockbox create step')\n return grants[0].lockboxUuid!\n } else {\n let lockboxResponse =\n await oroClient.vaultClient.lockboxCreate().catch((err) => {\n console.error('Error while creating lockbox', err)\n throw err\n })\n // Since the creation of a lockbox will change the scope of a user, we will force refresh the tokens\n let tokens = await oroClient.guardClient.authRefresh()\n await oroClient.guardClient.setTokens({ accessToken: tokens.accessToken, refreshToken: tokens.refreshToken })\n await oroClient.guardClient.whoAmI(true)\n\n return lockboxResponse.lockboxUuid\n }\n}\n\n/**\n * Store all patient related information into his/her lockbox\n * @param consultationId The consultation id\n * @param isoLanguage the prefered language of communication (ISO 639-3 https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes)\n * @param lockboxUuid the lockbox uuid to store data in\n * @param workflow the workflow used to extract informations\n * @param oroClient an oroClient instance\n * @returns\n */\nasync function storePatientData(\n consultationId: Uuid,\n isoLanguage: string,\n lockboxUuid: Uuid,\n workflow: WorkflowData,\n oroClient: OroClient\n): Promise<(Uuid | void)[]> {\n // Create and store registration data\n return Promise.all([\n // Storing Raw data first\n oroClient.getOrInsertJsonData<RawConsultationMeta>(\n lockboxUuid,\n workflow,\n {\n category: MetadataCategory.Raw,\n contentType: 'application/json',\n consultationId,\n },\n {}\n ),\n getWorkflowDataByCategory(workflow, MetadataCategory.Consultation).then((data) =>\n oroClient.getOrInsertJsonData<ConsultationMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationId, // TODO: deprecated. Will finally only be in privateMetadata\n },\n { consultationId }\n )\n ),\n getWorkflowDataByCategory(workflow, MetadataCategory.Medical).then((data) =>\n oroClient.getOrInsertJsonData<MedicalMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Medical,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId!],\n },\n {}\n )\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.Personal,\n oroClient\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.ChildPersonal,\n oroClient\n ),\n extractAndStorePersonalWorkflowData(\n workflow,\n lockboxUuid,\n consultationId,\n MetadataCategory.OtherPersonal,\n oroClient\n ),\n oroClient.getOrInsertJsonData<PreferenceMeta>(\n lockboxUuid,\n { isoLanguage },\n {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n },\n {}\n ),\n ]).then((dataUuids) => dataUuids.flat())\n}\n\nasync function storeImageAliases(\n consultationId: Uuid,\n lockboxUuid: Uuid,\n workflow: WorkflowData,\n oroClient: OroClient,\n progress?: {\n currentStep: number;\n stepsTotalNum: number;\n onProgress: (progress: number, descriptionKey: string, extraInfo?: { storedImagesNum?: number; totalImagesNum?: number }) => void;\n }\n): Promise<(Uuid | void)[]> {\n const images = await getImagesFromIndexDb((await filterTriggeredAnsweredWithKind(workflow, 'images-alias')).flat())\n\n const nonNullImages = images.filter((img) => !!img)\n\n if (images.length !== nonNullImages.length) {\n console.error('[SDK] Some images have not been found, they have been skipped.')\n }\n\n let storedImagesNum = 0\n let totalImagesNum = nonNullImages.length\n if (progress)\n progress.onProgress(progress.currentStep/progress.stepsTotalNum, 'store_images', {storedImagesNum, totalImagesNum})\n\n let promises = nonNullImages.map((image) => {\n return oroClient.getOrInsertJsonData<ConsultationImageMeta>(\n lockboxUuid,\n image,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.ImageAlias,\n consultationId,\n idbId: image.idbId as string,\n },\n {}\n ).then(() => {\n if (progress) {\n ++storedImagesNum\n let progressStepValue = Math.round((((progress.currentStep + 1)/progress.stepsTotalNum) - (progress.currentStep/progress.stepsTotalNum)) * 100) / 100\n progress.onProgress(\n (progress.currentStep/progress.stepsTotalNum) + (progressStepValue * (storedImagesNum/totalImagesNum)),\n 'store_images',\n {\n storedImagesNum,\n totalImagesNum\n })\n }\n\n })\n })\n return Promise.all(promises)\n}\n\n/**\n * Extracts the workflow MetadataCategory for Personal, ChildPersonal and OtherPersonal\n * then stores it in the vault\n *\n * @param workflow\n * @param lockboxUuid\n * @param category\n * @returns The data uuid\n */\nexport async function extractAndStorePersonalWorkflowData(\n workflow: WorkflowData,\n lockboxUuid: Uuid,\n consultationId: Uuid,\n category: MetadataCategory.Personal | MetadataCategory.ChildPersonal | MetadataCategory.OtherPersonal,\n oroClient: OroClient\n): Promise<Uuid | void> {\n return getWorkflowDataByCategory(workflow, category as unknown as MetadataCategory).then((data) => {\n if (Object.keys(data.fields).length === 0) return\n return oroClient.getOrInsertJsonData<PersonalMeta>(\n lockboxUuid,\n data,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId],\n },\n {}\n )\n })\n}\n\n/**\n * Given workflow data, it populates it with Personal, ChildPersonal, and OtherPersonal workflow data\n * @param workflow\n */\nexport async function extractPersonalInfoFromWorkflowData(workflow: WorkflowData): Promise<{\n personalInfoPopulatedWfData: PopulatedWorkflowData\n childPersonalInfoPopulatedWfData: PopulatedWorkflowData\n otherPersonalInfoPopulatedWfData: PopulatedWorkflowData\n}> {\n return Promise.all([\n getWorkflowDataByCategory(workflow, MetadataCategory.Personal),\n getWorkflowDataByCategory(workflow, MetadataCategory.ChildPersonal),\n getWorkflowDataByCategory(workflow, MetadataCategory.OtherPersonal),\n ]).then(([personalInfoPopulatedWfData, childPersonalInfoPopulatedWfData, otherPersonalInfoPopulatedWfData]) => {\n return {\n personalInfoPopulatedWfData,\n childPersonalInfoPopulatedWfData,\n otherPersonalInfoPopulatedWfData,\n }\n })\n}\n\n/**\n * Creates the search index for the first name, last name, and the short id of the given consultation\n * @param consult the consultation to be search indexed\n * @param workflow the workflow data\n * @param oroClient\n */\nexport async function buildConsultSearchIndex(consult: Consult, workflow: WorkflowData, oroClient: OroClient) {\n let terms: Terms = [\n <Term>{\n kind: 'consult-shortid',\n value: consult.shortId,\n },\n ]\n\n const { personalInfoPopulatedWfData, childPersonalInfoPopulatedWfData, otherPersonalInfoPopulatedWfData } =\n await extractPersonalInfoFromWorkflowData(workflow)\n\n const personalInfo = identificationToPersonalInformations(\n toActualObject(personalInfoPopulatedWfData),\n MetadataCategory.Personal\n )\n const childPersonalInfo = identificationToPersonalInformations(\n toActualObject(childPersonalInfoPopulatedWfData),\n MetadataCategory.ChildPersonal\n )\n const otherPersonalInfo = identificationToPersonalInformations(\n toActualObject(otherPersonalInfoPopulatedWfData),\n MetadataCategory.OtherPersonal\n )\n\n terms.push(\n <Term>{\n kind: 'first-name',\n value: personalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: personalInfo.name,\n }\n )\n\n if (childPersonalInfo.firstname && childPersonalInfo.name) {\n terms.push(\n <Term>{\n kind: 'first-name',\n value: childPersonalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: childPersonalInfo.name,\n }\n )\n }\n\n if (otherPersonalInfo.firstname && otherPersonalInfo.name) {\n terms.push(\n <Term>{\n kind: 'first-name',\n value: otherPersonalInfo.firstname,\n },\n <Term>{\n kind: 'last-name',\n value: otherPersonalInfo.name,\n }\n )\n }\n\n await oroClient.searchClient.index(consult.uuid, terms)\n}","import { CryptoRSA, uuidParse} from \"oro-toolbox\"\nimport { EncryptedIndexEntry, Grant, IndexConsultLockbox } from \"oro-sdk-apis\"\n\n/**\n * Decrypts and returns the encrypted grants\n * If something went wrong during decryption, that grant will be removed from the list\n *\n * @param encryptedGrants: an array of encrypted grants\n * @param rsaKey: the rsa key used to decrypt the encrypted grants\n * @returns an array of grants\n */\nexport function decryptGrants(encryptedGrants: Grant[], rsaKey: CryptoRSA): Grant[] {\n return encryptedGrants\n .map(grant => {\n if (grant.encryptedLockbox && !grant.lockboxUuid) {\n try {\n grant.lockboxUuid = uuidParse(\n rsaKey.base64DecryptToBytes(grant.encryptedLockbox)\n )\n } catch (e) {\n console.error('[sdk:index] The grant could not be decrypted or was not a valid UUID: ', e)\n }\n }\n return grant\n })\n .filter(grant => grant.lockboxUuid)\n}\n\n/**\n * Decrypts the encrypted consult lockboxes and returns their grants\n * If something went wrong during decryption, that grant will be removed from the list\n *\n * @param encryptedConsultLockboxes: an array of encrypted entries\n * @param rsaKey: the rsa key used to decrypt the encrypted entries\n * @returns an array of grants\n */\nexport function decryptConsultLockboxGrants(encryptedConsultLockboxes: EncryptedIndexEntry[], rsaKey: CryptoRSA): Grant[] {\n return encryptedConsultLockboxes\n .map(encryptedConsultLockboxes => {\n try {\n return [true, (rsaKey.base64DecryptToJson(\n encryptedConsultLockboxes.encryptedIndexEntry\n ) as IndexConsultLockbox).grant]\n } catch(e) {\n console.error('[sdk:index] The consult lockbox grant could not be decrypted: ', e)\n return [false, undefined] // if decryption fails, we want to ignore the grant but not fail the call\n }\n })\n .filter(grantsTuple => grantsTuple[0])\n .map(grantTuples => grantTuples[1] as Grant)\n}","import { IndexKey, Grant, IndexConsultLockbox, MetadataCategory, VaultIndex } from 'oro-sdk-apis'\nimport { OroClient, Uuid } from '..'\n\n/**\n * @name filterGrantsWithLockboxMetadata\n * @description searches for the existance of a consult uuid in each granted lockbox\n * @param oroClient\n * @param filter: the consult uuid\n * @returns the grants containing the consult uuid\n */\nexport async function filterGrantsWithLockboxMetadata(\n oroClient: OroClient,\n filter: { consultationId: Uuid },\n): Promise<Grant[]> {\n let grants = await oroClient.getGrants()\n let filteredGrants = []\n for (let grant of grants) {\n // Fetches in each lockbox the existance of a given consult id\n let consultationIdExistsInMetadata = await oroClient.vaultClient.lockboxMetadataGet(grant.lockboxUuid!, ['consultationId'], [], {\n category: MetadataCategory.Consultation,\n consultationId: filter.consultationId\n })\n // If there are entries in the metadata, it means that the consult exists in the lockbox\n if (consultationIdExistsInMetadata[0].length >= 0)\n filteredGrants.push(grant)\n }\n\n return filteredGrants\n}\n","import {\n AllRoleType,\n AuthTokenRequest,\n Consult,\n ConsultRequest,\n ConsultService,\n DataCreateResponse,\n DiagnosisService,\n Document,\n DocumentType,\n EncryptedIndexEntry,\n EncryptedVaultIndex,\n Grant,\n GuardService,\n IdentityCreateRequest,\n IdentityResponse,\n IndexConsultLockbox,\n IndexKey,\n LocalizedData,\n LockboxDataRequest,\n LockboxGrantRequest,\n LockboxManifest,\n ManifestEntry,\n Meta,\n Metadata,\n MetadataCategory,\n OtherRoleType,\n PersonalMeta,\n PopulatedWorkflowData,\n Practice,\n PracticeService,\n PractitionnerRoleType,\n PreferenceMeta,\n RecoveryMeta,\n RoleBasedScopes,\n SearchService,\n SecretShard,\n TellerService,\n TokenData,\n TosAndCpAcceptanceRequest,\n Uuid,\n VaultIndex,\n VaultService,\n WorkflowData,\n WorkflowService,\n} from 'oro-sdk-apis'\nimport * as OroToolbox from 'oro-toolbox'\nimport { CryptoRSA } from 'oro-toolbox'\nimport { decryptConsultLockboxGrants, decryptGrants, registerPatient, sessionStorePrivateKeyName } from './helpers'\nimport {\n AssociatedLockboxNotFound,\n IncompleteAuthentication,\n LocalEncryptedData,\n MissingGrant,\n MissingGrantFilter,\n MissingLockbox,\n MissingLockboxOwner,\n RecoveryData,\n RegisterPatientOutput,\n UserPreference,\n} from './models'\nimport { filterGrantsWithLockboxMetadata } from './sdk-revision'\n\nexport class OroClient {\n private rsa?: CryptoRSA\n private secrets: {\n lockboxUuid: string\n cryptor: OroToolbox.CryptoChaCha\n }[] = []\n private cachedMetadataGrants: {\n [filter: string]: Grant[]\n } = {}\n\n private cachedManifest: {\n [filter: string]: ManifestEntry[]\n } = {}\n\n private vaultIndex?: VaultIndex\n\n constructor(\n private toolbox: typeof OroToolbox,\n public tellerClient: TellerService,\n public vaultClient: VaultService,\n public guardClient: GuardService,\n public searchClient: SearchService,\n public practiceClient: PracticeService,\n public consultClient: ConsultService,\n public workflowClient: WorkflowService,\n public diagnosisClient: DiagnosisService,\n private authenticationCallback?: (err: Error) => void\n ) { }\n\n /**\n * clears the vaultIndex and cached metadata grants\n */\n public async cleanIndex() {\n this.cachedMetadataGrants = {}\n this.cachedManifest = {}\n }\n\n /**\n * Generates an RSA key pair and password payload (rsa private key encrypted with the password)\n * Calls Guard to sign up with the email address, password, practice, legal and token data\n *\n * @param email\n * @param password\n * @param practice\n * @param legal\n * @param tokenData\n * @returns\n */\n public async signUp(\n email: string,\n password: string,\n practice: Practice,\n tosAndCpAcceptance: TosAndCpAcceptanceRequest,\n tokenData?: TokenData,\n subscription?: boolean,\n skipEmailValidation?: boolean\n ): Promise<IdentityResponse> {\n this.rsa = new CryptoRSA()\n const privateKey = this.rsa.private()\n\n const symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(password)\n const recoveryPassword = symmetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n\n const hashedPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(password))\n\n const emailConfirmed = !!skipEmailValidation\n\n const signupRequest: IdentityCreateRequest = {\n practiceUuid: practice.uuid,\n email: email.toLowerCase(),\n emailConfirmed,\n password: hashedPassword,\n publicKey: this.toolbox.encodeToBase64(this.rsa.public()),\n recoveryPassword,\n tosAndCpAcceptance,\n tokenData,\n subscription,\n }\n\n const identity = await this.guardClient.identityCreate(signupRequest)\n\n if (identity.recoveryLogin) {\n //Ensure we can recover from a page reload\n let symetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(identity.recoveryLogin)\n sessionStorage.setItem(\n sessionStorePrivateKeyName(identity.id),\n symetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n )\n }\n\n return identity\n }\n\n /**\n * Parse the given accessToken claims by calling guard whoami and update theidentity to set it's emailConfirmed flag\n * @param accessToken\n * @returns The identity related to confirmedEmail\n */\n public async confirmEmail(accessToken: string): Promise<IdentityResponse> {\n this.guardClient.setTokens({ accessToken })\n const claims = await this.guardClient.whoAmI()\n return this.guardClient.identityUpdate(claims.sub, {\n emailConfirmed: true,\n })\n }\n\n /**\n * Calls Guard to sign in with the email address, password and one time password (if MFA is enabled)\n * Then recover's the rsa private key from the recovery payload\n *\n * @param practiceUuid\n * @param email\n * @param password\n * @param otp\n * @returns the user identity\n */\n public async signIn(practiceUuid: Uuid, email: string, password: string, otp?: string): Promise<IdentityResponse> {\n const hashedPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(password))\n const tokenRequest: AuthTokenRequest = {\n practiceUuid,\n email: email.toLowerCase(),\n password: hashedPassword,\n otp,\n }\n\n await this.guardClient.authToken(tokenRequest)\n const userUuid = (await this.guardClient.whoAmI()).sub\n\n // Updates the rsa key to the one generated on the backend\n await this.recoverPrivateKeyFromPassword(userUuid, password)\n return await this.guardClient.identityGet(userUuid)\n }\n\n /**\n * Will attempt to recover an existing login session and set back\n * the private key in scope\n */\n public async resumeSession() {\n const id = (await this.guardClient.whoAmI()).sub\n const recoveryPayload = sessionStorage.getItem(sessionStorePrivateKeyName(id))\n const recoveryKey = (await this.guardClient.identityGet(id)).recoveryLogin\n\n if (!recoveryKey || !recoveryPayload) throw IncompleteAuthentication\n\n const symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(recoveryKey)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * This function let's you encrypt locally an Object\n * @param value the Object to encrypt\n * @returns a LocalEncryptedData Object\n * @throws IncompleteAuthentication if rsa is not set\n * @calls authenticationCallback if rsa is not set\n */\n public localEncryptToJsonPayload(value: any): LocalEncryptedData {\n if (!this.rsa) {\n if (this.authenticationCallback) {\n this.authenticationCallback(new IncompleteAuthentication())\n }\n\n throw new IncompleteAuthentication()\n }\n\n const chaChaKey = new this.toolbox.CryptoChaCha()\n\n const encryptedData = chaChaKey.jsonEncryptToBase64Payload(value)\n const encryptedKey = this.toolbox.encodeToBase64(this.rsa.encryptToBytes(chaChaKey.key()))\n\n return { encryptedData, encryptedKey }\n }\n\n /**\n * This function let's you decrypt a LocalEncryptedData object\n * @param value a LocalEncryptedData object\n * @returns a decrypted Object\n * @throws IncompleteAuthentication if rsa is not set\n * @calls authenticationCallback if rsa is not set\n */\n public localDecryptJsonPayload({ encryptedKey, encryptedData }: LocalEncryptedData): any {\n if (!this.rsa) {\n if (this.authenticationCallback) {\n this.authenticationCallback(new IncompleteAuthentication())\n }\n\n throw new IncompleteAuthentication()\n }\n\n const chaChaKey = this.rsa.base64DecryptToBytes(encryptedKey)\n const decryptedData = this.toolbox.CryptoChaCha.fromKey(chaChaKey).base64PayloadDecryptToJson(encryptedData)\n\n return decryptedData\n }\n\n /**\n * Effectively kills your \"session\"\n */\n public async signOut() {\n this.rsa = undefined\n this.secrets = []\n this.guardClient.setTokens({\n accessToken: undefined,\n refreshToken: undefined,\n })\n await this.guardClient.authLogout()\n }\n\n /**\n * @name registerPatient\n * @description The complete flow to register a patient\n *\n * Steps:\n * 1. Create a consult (checks if payment has been done)\n * 2. Creates a lockbox\n * 3. Grants lockbox access to all practice personnel\n * 4. Creates secure identification, medical, onboarding data\n * 5. Generates and stores the rsa key pair and recovery payloads\n *\n * @param patientUuid\n * @param consult\n * @param workflow\n * @param recoveryQA\n * @param indexSearch create search index for the consultation if true\n * @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\n * @returns\n */\n public async registerPatient(\n patientUuid: Uuid,\n consult: ConsultRequest,\n workflow: WorkflowData,\n recoveryQA?: {\n recoverySecurityQuestions: string[]\n recoverySecurityAnswers: string[]\n },\n indexSearch: boolean = true,\n onProgress?: (progress: number, descriptionKey: string) => void\n ): Promise<RegisterPatientOutput> {\n if (!this.rsa) throw IncompleteAuthentication\n return registerPatient(patientUuid, consult, workflow, this, this.toolbox.uuid(), recoveryQA, indexSearch, onProgress)\n }\n\n /**\n * Fetches all grants, and consultations that exist in each lockbox\n * Then updates the index for the current user with the lockbox consult relationship\n */\n public async forceUpdateIndexEntries() {\n let grants = await this.getGrants()\n\n let indexConsultLockbox: IndexConsultLockbox[] = await Promise.all(\n grants.map(\n async (grant: Grant) =>\n await this.vaultClient\n .lockboxMetadataGet(\n grant.lockboxUuid!,\n ['consultationId'],\n [],\n { category: MetadataCategory.Consultation },\n grant.lockboxOwnerUuid\n )\n .then((consults) => {\n try {\n return consults[0].map((consult: any) => {\n return {\n ...consult,\n grant: {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid,\n },\n }\n })\n } catch (e) {\n // No consultations in lockbox or index could not be created\n return []\n }\n })\n .catch(() => [])\n )\n ).then((consults) => consults.flat())\n this.vaultIndexAdd({\n [IndexKey.Consultation]: indexConsultLockbox,\n })\n .then(() => alert('The Index was successfully updated!'))\n .catch(() => console.error('The index failed to update!'))\n }\n\n /**\n * Generates, encrypts and adds entries to vault index for a given index owner\n *\n * @param entries\n * @param indexOwnerUuid\n */\n public async vaultIndexAdd(entries: VaultIndex, indexOwnerUuid?: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let rsaPub: Uint8Array\n if (indexOwnerUuid) {\n let base64IndexOwnerPubKey = (await this.guardClient.identityGet(indexOwnerUuid)).publicKey\n rsaPub = this.toolbox.decodeFromBase64(base64IndexOwnerPubKey)\n } else {\n rsaPub = this.rsa.public()\n }\n\n let encryptedIndex: EncryptedVaultIndex = {}\n\n for (let keyString of Object.keys(entries)) {\n let key = keyString as keyof VaultIndex\n switch (key) {\n case IndexKey.ConsultationLockbox:\n encryptedIndex[key] = (entries[key] as IndexConsultLockbox[])\n .map((e) => ({\n ...e,\n uniqueHash: e.consultationId,\n }))\n .map(\n (e: IndexConsultLockbox) =>\n ({\n uuid: e.uuid,\n timestamp: e.timestamp,\n uniqueHash: e.uniqueHash,\n encryptedIndexEntry: CryptoRSA.jsonWithPubEncryptToBase64(\n {\n consultationId: e.consultationId,\n grant: e.grant,\n },\n rsaPub\n ),\n } as EncryptedIndexEntry)\n )\n break\n }\n }\n await this.vaultClient.vaultIndexPut(encryptedIndex, indexOwnerUuid)\n }\n\n /**\n * @name grantLockbox\n * @description Grants a lockbox by retrieving the shared secret of the lockbox and encrypting it with the grantees public key\n * @param granteeUuid\n * @param lockboxUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n */\n public async grantLockbox(granteeUuid: Uuid, lockboxUuid: Uuid, lockboxOwnerUuid?: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let secret = (await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)).key()\n let base64GranteePublicKey = (await this.guardClient.identityGet(granteeUuid)).publicKey\n let granteePublicKey = this.toolbox.decodeFromBase64(base64GranteePublicKey)\n\n let granteeEncryptedSecret = CryptoRSA.bytesWithPubEncryptToBase64(secret, granteePublicKey)\n let request: LockboxGrantRequest = {\n encryptedSecret: granteeEncryptedSecret,\n granteeUuid: granteeUuid,\n }\n await this.vaultClient.lockboxGrant(lockboxUuid, request, lockboxOwnerUuid)\n }\n\n /**\n * @name createMessageData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a message string\n * @param lockboxUuid\n * @param message\n * @param consultationId the consultation for which this message is sent\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createMessageData(\n lockboxUuid: Uuid,\n message: string,\n consultationId: string,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n\n let encryptedData = symmetricEncryptor.jsonEncryptToBase64Payload(message)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload({\n author: (await this.guardClient.whoAmI()).sub,\n })\n\n let meta = {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Message,\n contentType: 'text/plain',\n }\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name createMessageAttachmentData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a file\n * @param lockboxUuid\n * @param data the file stored\n * @param consultationId the consultation for which this message is sent\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createMessageAttachmentData(\n lockboxUuid: Uuid,\n data: File,\n consultationId: string,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.bytesEncryptToBase64Payload(new Uint8Array(await data.arrayBuffer()))\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload({\n author: (await this.guardClient.whoAmI()).sub,\n fileName: data.name,\n lastModified: data.lastModified,\n size: data.size,\n })\n\n let meta = {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Message,\n contentType: data.type,\n }\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name createAttachmentData\n * @description Creates a Base64 encrypted Payload to send and store in the vault from a file\n * @param lockboxUuid\n * @param data the file stored\n * @param consultationId the consultation for which this message is sent\n * @param category the category for the attachment data\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing file, specify the previous data uuid\n * @returns the data uuid\n */\n public async createConsultationAttachmentData(\n lockboxUuid: Uuid,\n data: File,\n consultationId: string,\n documentType: DocumentType,\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n return this.createBytesData<Meta | any>(\n lockboxUuid,\n new Uint8Array(await data.arrayBuffer()),\n {\n consultationId,\n category: MetadataCategory.Consultation,\n documentType,\n contentType: data.type,\n },\n {\n author: (await this.guardClient.whoAmI()).sub,\n fileName: data.name,\n },\n lockboxOwnerUuid,\n previousDataUuid\n )\n }\n\n /**\n * @name createJsonData\n * @description Creates a Base64 encrypted Payload to send and store in the vault. With the data input as a JSON\n * @param lockboxUuid\n * @param data\n * @param meta\n * @param privateMeta the metadata that will be secured in the vault\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing data, specify the previous data uuid\n * @returns the data uuid\n */\n public async createJsonData<T = Meta>(\n lockboxUuid: Uuid,\n data: any,\n meta?: T,\n privateMeta?: { [val: string]: any },\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.jsonEncryptToBase64Payload(data)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload(privateMeta)\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * Get or upsert a data in lockbox\n * @param lockboxUuid the lockbox uuid\n * @param data the data to insert\n * @param publicMetadata the public Metadata\n * @param privateMetadata the private Metadata\n * @param forceReplace set true when the insertion of data requires to replace the data when it exists already\n * @returns the data uuid\n */\n public async getOrInsertJsonData<M = Metadata>(\n lockboxUuid: Uuid,\n data: any,\n publicMetadata: M,\n privateMetadata: Metadata,\n forceReplace: boolean = false\n ): Promise<Uuid> {\n let manifest = await this.vaultClient.lockboxManifestGet(lockboxUuid, publicMetadata)\n if (!forceReplace && manifest.length > 0) {\n console.log(`The data for ${JSON.stringify(publicMetadata)} already exist`)\n return manifest[0].dataUuid\n } else\n return (\n await this.createJsonData<M>(\n lockboxUuid,\n data,\n publicMetadata,\n privateMetadata,\n undefined,\n forceReplace && manifest.length > 0 ? manifest[0].dataUuid : undefined // if forceReplace and data already exist, then replace data. Otherwise insert it\n ).catch((err) => {\n console.error(`Error while upserting data ${JSON.stringify(publicMetadata)} data`, err)\n throw err\n })\n ).dataUuid\n }\n\n /**\n * @name createBytesData\n * @description Creates a Base64 encrypted Payload to send and store in the vault. With the data input as a Bytes\n * @param lockboxUuid\n * @param data\n * @param meta\n * @param privateMeta the metadata that will be secured in the vault\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @param previousDataUuid if it's a revision of existing data, specify the previous data uuid\n * @returns the data uuid\n */\n public async createBytesData<T = Meta>(\n lockboxUuid: Uuid,\n data: Uint8Array,\n meta: T,\n privateMeta: { [val: string]: any },\n lockboxOwnerUuid?: Uuid,\n previousDataUuid?: Uuid\n ): Promise<DataCreateResponse> {\n if (!this.rsa) throw IncompleteAuthentication\n let symmetricEncryptor = await this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid)\n let encryptedData = symmetricEncryptor.bytesEncryptToBase64Payload(data)\n let encryptedPrivateMeta = symmetricEncryptor.jsonEncryptToBase64Payload(privateMeta)\n\n let request: LockboxDataRequest = {\n data: encryptedData,\n publicMetadata: meta,\n privateMetadata: encryptedPrivateMeta,\n }\n\n return this.tellerClient.lockboxDataStore(lockboxUuid, request, lockboxOwnerUuid, previousDataUuid)\n }\n\n /**\n * @name getJsonData\n * @description Fetches and decrypts the lockbox data with the cached shared secret.\n * Decrypts the data to a valid JSON object. If this is impossible, the call to the WASM binary will fail\n *\n * @type T is the generic type specifying the return type object of the function\n * @param lockboxUuid\n * @param dataUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns the data specified by the generic type <T>\n */\n public async getJsonData<T = any>(lockboxUuid: Uuid, dataUuid: Uuid, lockboxOwnerUuid?: Uuid): Promise<T> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let [encryptedPayload, symmetricDecryptor] = await Promise.all([\n this.vaultClient.lockboxDataGet(lockboxUuid, dataUuid, lockboxOwnerUuid),\n this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid),\n ])\n\n return symmetricDecryptor.base64PayloadDecryptToJson(encryptedPayload.data)\n }\n /**\n * @description Fetches and decrypts the lockbox data with the cached shared secret.\n * @param lockboxUuid\n * @param dataUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns the bytes data\n */\n public async getBytesData(lockboxUuid: Uuid, dataUuid: Uuid, lockboxOwnerUuid?: Uuid): Promise<Uint8Array> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let [encryptedPayload, symmetricDecryptor] = await Promise.all([\n this.vaultClient.lockboxDataGet(lockboxUuid, dataUuid, lockboxOwnerUuid),\n this.getCachedSecretCryptor(lockboxUuid, lockboxOwnerUuid),\n ])\n\n return symmetricDecryptor.base64PayloadDecryptToBytes(encryptedPayload.data)\n }\n\n /**\n * @name getGrants\n * @description Get all lockboxes granted to user with the applied filter\n * @note this function returns cached grants and will not update unless the page is refreshed\n * @todo some versions of lockboxes do not make use of lockbox metadata\n * in this case, all lockboxes need to be filtered one-by-one to find the correct one\n * Remove if this is no longer the case\n * @param filter: the consultationId in which the grant exists\n * @returns decrypted lockboxes granted to user\n */\n public async getGrants(filter?: { consultationId: Uuid }): Promise<Grant[]> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let filterString = JSON.stringify(filter)\n // retrieves cached grants\n if (this.cachedMetadataGrants[filterString]) return this.cachedMetadataGrants[filterString]\n\n // We're using the account role to determine the way a grant is accessed\n let currentAccountRole = await this.getAccountRole()\n if (currentAccountRole.length === 1 && currentAccountRole[0] === OtherRoleType.User)\n return []\n\n if ([OtherRoleType.Patient, OtherRoleType.User].every(requiredRole => currentAccountRole.includes(requiredRole))) {\n let encryptedGrants\n // if there are no grants with the applied filter from index, attempt for naive filter with backwards compatibility\n if (filter) {\n encryptedGrants = await filterGrantsWithLockboxMetadata(this, filter)\n } else {\n encryptedGrants = (await this.vaultClient.grantsGet()).grants\n }\n const decryptedGrants = await decryptGrants(encryptedGrants, this.rsa)\n // sets the cached grant\n this.cachedMetadataGrants[filterString] = decryptedGrants\n console.info('[sdk:grant] Found grant for patient')\n return decryptedGrants\n }\n // if not a patient, then a practitioner is trying to retrieve a grant, it **Must** contain a filter, otherwise too many grants are possible\n if (!filter)\n throw MissingGrantFilter\n // Note: will work only if the filter being applied is exclusively a consult id\n const grantsByConsultLockbox = await this.vaultClient\n .vaultIndexGet([IndexKey.ConsultationLockbox], [filter.consultationId])\n .then((res) => res[IndexKey.ConsultationLockbox])\n .catch((e) => {\n console.error(e)\n return []\n })\n\n const decryptedConsults = decryptConsultLockboxGrants(grantsByConsultLockbox ?? [], this.rsa)\n if (decryptedConsults.length > 0) {\n console.info('[sdk:index] Grants found in user`s constant time secure index')\n this.cachedMetadataGrants[filterString] = decryptedConsults\n return this.cachedMetadataGrants[filterString]\n }\n\n // if we have no valid grants, then return nothing\n return []\n }\n\n /**\n * Fetches the role of the account that is logged in\n * \n * @returns the role based scopes defined by the whoami\n */\n async getAccountRole(): Promise<RoleBasedScopes[]> {\n return (await this.guardClient.whoAmI()).scope.split(' ') as RoleBasedScopes[]\n }\n\n /**\n * @name getCachedSecretCryptor\n * @description Retrieves the cached lockbox secret or fetches the secret from vault, then creates the symmetric cryptor and stores it in memory\n * @param lockboxUuid\n * @param lockboxOwnerUuid the lockbox owner (ignored if lockbox is owned by self)\n * @returns\n */\n async getCachedSecretCryptor(lockboxUuid: string, lockboxOwnerUuid?: string): Promise<OroToolbox.CryptoChaCha> {\n if (!this.rsa) throw IncompleteAuthentication\n\n let index = this.secrets.findIndex((secret) => secret.lockboxUuid === lockboxUuid)\n if (index === -1) {\n let encryptedSecret = (await this.vaultClient.lockboxSecretGet(lockboxUuid, lockboxOwnerUuid)).sharedSecret\n\n let secret = this.rsa.base64DecryptToBytes(encryptedSecret)\n let cryptor = this.toolbox.CryptoChaCha.fromKey(secret)\n this.secrets.push({ lockboxUuid, cryptor })\n return cryptor\n } else {\n return this.secrets[index].cryptor\n }\n }\n\n /**\n * Retrieves the patient personal information associated to the `consultationId`\n * The `consultationId` only helps to retrieve the patient lockboxes\n * Note: it is possible to have several personal informations data\n * @param consultationId The consultation Id\n * @param category The personal MetadataCategory to fetch\n * @param forceRefresh force data refresh (default to false)\n * @returns the personal data\n */\n public async getPersonalInformationsFromConsultId(\n consultationId: Uuid,\n category: MetadataCategory.Personal | MetadataCategory.ChildPersonal | MetadataCategory.OtherPersonal,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n return this.getMetaCategoryFromConsultId(consultationId, category, forceRefresh)\n }\n\n /**\n * Retrieves the patient medical data associated to the `consultationId`\n * The `consultationId` only helps to retrieve the patient lockboxes\n * Note: it is possible to have several medical data\n * @param consultationId The consultation Id\n * @param forceRefresh force data refresh (default to false)\n * @returns the medical data\n */\n public async getMedicalDataFromConsultId(\n consultationId: Uuid,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n return this.getMetaCategoryFromConsultId(consultationId, MetadataCategory.Medical, forceRefresh)\n }\n\n private async getMetaCategoryFromConsultId(\n consultationId: Uuid,\n category: MetadataCategory,\n forceRefresh = false\n ): Promise<LocalizedData<PopulatedWorkflowData>[]> {\n let grants = await this.getGrants({ consultationId })\n let workflowData: LocalizedData<PopulatedWorkflowData>[] = []\n for (let grant of grants) {\n let manifest = await this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationIds: [consultationId],\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n )\n\n // TODO: find another solution for backwards compatibility (those without the metadata consultationIds)\n if (manifest.length === 0) {\n manifest = (\n await this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category,\n documentType: DocumentType.PopulatedWorkflowData,\n // backward compatiblility with TonTest\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n )\n ).filter((entry) => !entry.metadata.consultationIds) // Keep only entries without associated consultationIds\n }\n let data = await Promise.all(\n manifest.map(async (entry) => {\n return {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid!,\n dataUuid: entry.dataUuid,\n data: await this.getJsonData<PopulatedWorkflowData>(grant.lockboxUuid!, entry.dataUuid),\n }\n })\n )\n workflowData = { ...workflowData, ...data }\n }\n return workflowData\n }\n\n /**\n * @description retrieves the personal information stored in the first owned lockbox\n * @param userId The user Id\n * @returns the personal data\n */\n public async getPersonalInformations(userId: Uuid): Promise<LocalizedData<PopulatedWorkflowData>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === userId)\n\n if (!grant) {\n throw MissingGrant\n }\n\n const { lockboxUuid, lockboxOwnerUuid } = grant\n\n if (!lockboxUuid) throw MissingLockbox\n\n if (!lockboxOwnerUuid) throw MissingLockboxOwner\n\n const identificationDataUuid = (\n await this.getLockboxManifest(\n lockboxUuid,\n {\n category: MetadataCategory.Personal,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n false,\n userId\n )\n )[0].dataUuid\n\n return {\n lockboxOwnerUuid,\n lockboxUuid,\n dataUuid: identificationDataUuid,\n data: await this.getJsonData<PopulatedWorkflowData>(lockboxUuid, identificationDataUuid),\n }\n }\n\n /**\n * Retrieves the grant associated to a consultationId\n * @note returns the first grant only\n * @param consultationId The consultationId\n * @returns the grant\n */\n public async getGrantFromConsultId(consultationId: Uuid): Promise<Grant | undefined> {\n let grants = await this.getGrants({ consultationId })\n\n if (grants.length === 0) {\n throw AssociatedLockboxNotFound\n }\n\n return grants[0]\n }\n\n /**\n * retrieves the identity associated to the `consultationId`\n * @param consultationId The consultation Id\n * @returns the identity\n */\n public async getIdentityFromConsultId(consultationId: Uuid): Promise<IdentityResponse | undefined> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (grant && grant.lockboxOwnerUuid) {\n return await this.guardClient.identityGet(grant.lockboxOwnerUuid)\n } else {\n return undefined\n }\n }\n\n /**\n * retrieves the lockbox manifest for a given lockbox and add's its private metadata\n * @note the lockbox manifest will retrieved the cached manifest first unless force refresh is enabled\n * @param lockboxUuid\n * @param filter\n * @param expandPrivateMetadata\n * @param lockboxOwnerUuid\n * @param forceRefresh\n * @returns the lockbox manifest\n */\n public async getLockboxManifest(\n lockboxUuid: Uuid,\n filter: Metadata,\n expandPrivateMetadata: boolean,\n lockboxOwnerUuid?: Uuid,\n forceRefresh: boolean = false\n ): Promise<LockboxManifest> {\n let manifestKey = JSON.stringify({\n lockboxUuid,\n filter,\n expandPrivateMetadata,\n lockboxOwnerUuid,\n })\n if (!forceRefresh && this.cachedManifest[manifestKey]) return this.cachedManifest[manifestKey]\n\n return this.vaultClient.lockboxManifestGet(lockboxUuid, filter, lockboxOwnerUuid).then((manifest) => {\n return Promise.all(\n manifest.map(async (entry) => {\n if (expandPrivateMetadata && entry.metadata.privateMetadata) {\n let privateMeta = await this.getJsonData<Metadata>(\n lockboxUuid!,\n entry.metadata.privateMetadata,\n lockboxOwnerUuid\n )\n entry.metadata = {\n ...entry.metadata,\n ...privateMeta,\n }\n }\n return entry\n })\n ).then((manifest) => (this.cachedManifest[manifestKey] = manifest))\n })\n }\n\n /**\n * @description Create or update the personal information and store it in the first owned lockbox\n * @param identity The identity to use\n * @param data The personal data to store\n * @param dataUuid (optional) The dataUuid to update\n * @returns\n */\n public async createPersonalInformations(\n identity: IdentityResponse,\n data: PopulatedWorkflowData,\n dataUuid?: string\n ): Promise<DataCreateResponse> {\n const lockboxUuid = (await this.getGrants()).find(\n (lockbox) => lockbox.lockboxOwnerUuid === identity.id\n )?.lockboxUuid\n\n if (lockboxUuid) {\n return this.createJsonData<PersonalMeta>(\n lockboxUuid,\n data,\n {\n category: MetadataCategory.Personal,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n {},\n undefined,\n dataUuid\n )\n } else {\n throw MissingLockbox\n }\n }\n\n /**\n * Create or update user Preference\n * @param identity\n * @param preference\n * @param dataUuid\n * @returns\n */\n public async createUserPreference(\n identity: IdentityResponse,\n preference: UserPreference,\n dataUuid?: string\n ): Promise<DataCreateResponse> {\n const lockboxUuid = (await this.getGrants()).find(\n (lockbox) => lockbox.lockboxOwnerUuid === identity.id\n )?.lockboxUuid\n\n if (lockboxUuid) {\n return this.createJsonData<PreferenceMeta>(\n lockboxUuid,\n preference,\n {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n },\n {},\n undefined,\n dataUuid\n )\n } else {\n throw MissingLockbox\n }\n }\n\n /**\n * retrieves the user preference from a grant\n * @param grant The grant\n * @returns the user preference\n */\n public async getDataFromGrant<T = any>(grant: Grant, filter: Metadata): Promise<LocalizedData<T>> {\n const { lockboxUuid, lockboxOwnerUuid } = grant\n\n if (!lockboxUuid) throw MissingLockbox\n if (!lockboxOwnerUuid) throw MissingLockboxOwner\n const identificationDataUuid = (\n await this.getLockboxManifest(\n lockboxUuid,\n\n filter,\n false,\n grant.lockboxOwnerUuid,\n true\n )\n )[0].dataUuid\n\n return {\n lockboxOwnerUuid,\n lockboxUuid,\n dataUuid: identificationDataUuid,\n data: await this.getJsonData<T>(lockboxUuid, identificationDataUuid),\n }\n }\n\n /**\n * retrieves the user preference from a consultation id\n * @param consultationId The related consultationId\n * @returns the user preference\n */\n public async getUserPreferenceFromConsultId(consultationId: string): Promise<LocalizedData<UserPreference>> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<UserPreference>(grant, {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference stored in the first owned lockbox from identity\n * @param identity The identity to use\n * @returns the user preference\n */\n public async getUserPreference(identity: IdentityResponse): Promise<LocalizedData<UserPreference>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === identity.id)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<UserPreference>(grant, {\n category: MetadataCategory.Preference,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference from a consultation id\n * @param consultationId The related consultationId\n * @returns the user preference\n */\n public async getRecoveryDataFromConsultId(consultationId: string): Promise<LocalizedData<RecoveryData>> {\n const grant = await this.getGrantFromConsultId(consultationId)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant<RecoveryData>(grant, {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n })\n }\n\n /**\n * retrieves the user preference stored in the first owned lockbox from identity\n * @param identity The identity to use\n * @returns the user preference\n */\n public async getRecoveryData(identity: IdentityResponse): Promise<LocalizedData<RecoveryData>> {\n const grant = (await this.getGrants()).find((lockbox) => lockbox.lockboxOwnerUuid === identity.id)\n\n if (!grant) throw MissingGrant\n\n return this.getDataFromGrant(grant, {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n })\n }\n\n /**\n * @name getAssignedConsultations\n * @description finds all assigned or owned consultations for the logged user\n * Steps:\n * - Retrieves all granted lockboxes given to the logged user\n * - for each lockbox, find all consultation ids\n * - for each consultation id, retrieve the consult information\n * @param practiceUuid the uuid of the practice to look consult into\n * @returns the list of consults\n */\n public async getAssignedConsultations(practiceUuid: Uuid): Promise<Consult[]> {\n return Promise.all(\n (await this.getGrants()).map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n true,\n undefined\n ).then((manifest) =>\n Promise.all(\n manifest.map(\n async (entry) =>\n await this.consultClient.getConsultByUUID(entry.metadata.consultationId, practiceUuid)\n )\n ).then((promise) => promise.flat())\n )\n )\n ).then((consults) => consults.flat())\n }\n\n /**\n * Gets the past consultations of the patient as well as his relatives if any\n * @param consultationId any consultation uuid from which we will fetch all the other consultations of the same patient as the owner of this consultation id\n * @param practiceUuid\n */\n public async getPastConsultationsFromConsultId(\n consultationId: string,\n practiceUuid: string\n ): Promise<Consult[] | undefined> {\n const grant = await this.getGrantFromConsultId(consultationId)\n if (!grant) return undefined\n\n let consultationsInLockbox: string[] = (\n await this.vaultClient.lockboxMetadataGet(\n grant.lockboxUuid!,\n ['consultationId'],\n ['consultationId'],\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n },\n grant.lockboxOwnerUuid\n )\n )\n .flat()\n .map((metadata: { consultationId: string }) => metadata.consultationId)\n\n if (consultationsInLockbox.length == 0) return []\n\n return await Promise.all(\n consultationsInLockbox.map(async (consultId: string) => {\n return await this.consultClient.getConsultByUUID(consultId, practiceUuid)\n })\n )\n }\n\n /**\n * @name getPatientConsultationData\n * @description retrieves the consultation data\n * @param consultationId\n * @returns\n */\n public async getPatientConsultationData(\n consultationId: Uuid,\n forceRefresh: boolean = false\n ): Promise<PopulatedWorkflowData[]> {\n //TODO: make use of getPatientDocumentsList instead of doing it manually here\n return Promise.all(\n (await this.getGrants({ consultationId }))\n .map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.PopulatedWorkflowData,\n consultationId, //since we want to update the cached manifest (if another consult data exists)\n },\n true,\n grant.lockboxOwnerUuid,\n forceRefresh\n ).then((manifest) =>\n Promise.all(\n manifest.map((e) =>\n this.getJsonData<PopulatedWorkflowData>(\n grant.lockboxUuid!,\n e.dataUuid,\n grant.lockboxOwnerUuid\n )\n )\n )\n )\n )\n .flat()\n ).then((data) => data.flat())\n }\n\n /**\n * This function returns the patient prescriptions\n * @param consultationId\n * @returns\n */\n public async getPatientPrescriptionsList(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Prescription,\n },\n true,\n consultationId\n )\n }\n\n /**\n * This function returns the patient results\n * @param consultationId\n * @returns\n */\n public async getPatientResultsList(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.Result,\n },\n true,\n consultationId\n )\n }\n\n /**\n * returns the patient treatment plan options\n * @param consultationId\n * @returns Document[] corresponding to the patient treatment plan options\n */\n public async getPatientTreatmentPlans(consultationId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.TreatmentPlan,\n },\n true,\n consultationId\n )\n }\n\n /**\n * returns a specific patient treatment plan option\n * @param consultationId\n * @param treatmentPlanId\n * @returns\n */\n public async getPatientTreatmentPlanByUuid(consultationId: Uuid, treatmentPlanId: Uuid): Promise<Document[]> {\n return this.getPatientDocumentsList(\n {\n category: MetadataCategory.Consultation,\n documentType: DocumentType.TreatmentPlan,\n treatmentPlanId,\n },\n true,\n consultationId\n )\n }\n\n /**\n * @name getPatientDocumentsList\n * @description applies the provided filter to the vault to only find those documents\n * @param filters the applied filters (e.g. type of documents)\n * @param expandPrivateMetadata whether or not, the private metadata needs to be retrieved\n * (more computationally expensive)\n * @param consultationId\n * @returns the filtered document list\n */\n public async getPatientDocumentsList(\n filters: Object,\n expandPrivateMetadata: boolean,\n consultationId: Uuid\n ): Promise<Document[]> {\n return Promise.all(\n (await this.getGrants({ consultationId }))\n .map((grant) =>\n this.getLockboxManifest(\n grant.lockboxUuid!,\n { ...filters, consultationId },\n expandPrivateMetadata,\n grant.lockboxOwnerUuid,\n true\n ).then((manifest) =>\n Promise.all(\n manifest.map(async (entry): Promise<Document> => {\n return {\n lockboxOwnerUuid: grant.lockboxOwnerUuid,\n lockboxUuid: grant.lockboxUuid!,\n ...entry,\n }\n })\n )\n )\n )\n .flat()\n ).then((data) => data.flat())\n }\n\n /****************************************************************************************************************\n * RECOVERY *\n ****************************************************************************************************************/\n\n /**\n * @name recoverPrivateKeyFromSecurityQuestions\n * @description Recovers and sets the rsa private key from the answered security questions\n * @param id\n * @param recoverySecurityQuestions\n * @param recoverySecurityAnswers\n * @param threshold the number of answers needed to recover the key\n */\n public async recoverPrivateKeyFromSecurityQuestions(\n id: Uuid,\n recoverySecurityQuestions: string[],\n recoverySecurityAnswers: string[],\n threshold: number\n ) {\n let shards: SecretShard[] = (await this.guardClient.identityGet(id)).recoverySecurityQuestions!\n let answeredShards = shards\n .filter((shard: any) => {\n // filters all answered security questions\n let indexOfQuestion = recoverySecurityQuestions.indexOf(shard.securityQuestion)\n if (indexOfQuestion === -1) return false\n return recoverySecurityAnswers[indexOfQuestion] && recoverySecurityAnswers[indexOfQuestion] != ''\n })\n .map((item: any) => {\n // appends the security answer to the answered shards\n let index = recoverySecurityQuestions.indexOf(item.securityQuestion)\n item.securityAnswer = recoverySecurityAnswers[index]\n return item\n })\n try {\n // reconstructs the key from the answered security answers\n let privateKey = this.toolbox.reconstructSecret(answeredShards, threshold)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n } catch (e) {\n console.error(e)\n }\n }\n\n /**\n * @name recoverPrivateKeyFromPassword\n * @description Recovers and sets the rsa private key from the password\n * @param id\n * @param password\n */\n public async recoverPrivateKeyFromPassword(id: Uuid, password: string) {\n let identity = await this.guardClient.identityGet(id)\n\n let recoveryPayload = identity.recoveryPassword\n let symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(password)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n\n if (identity.recoveryLogin) {\n //Ensure we can recover from a page reload\n let symetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(identity.recoveryLogin)\n sessionStorage.setItem(\n sessionStorePrivateKeyName(id),\n symetricEncryptor.bytesEncryptToBase64Payload(privateKey)\n )\n }\n\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * @name recoverPrivateKeyFromMasterKey\n * @description Recovers and sets the rsa private key from the master key\n * @param id\n * @param masterKey\n */\n public async recoverPrivateKeyFromMasterKey(id: Uuid, masterKey: string) {\n let recoveryPayload = (await this.guardClient.identityGet(id)).recoveryMasterKey!\n let symmetricDecryptor = this.toolbox.CryptoChaCha.fromPassphrase(masterKey)\n let privateKey = symmetricDecryptor.base64PayloadDecryptToBytes(recoveryPayload)\n this.rsa = this.toolbox.CryptoRSA.fromKey(privateKey)\n }\n\n /**\n * @description Generates and updates the security questions and answers payload using new recovery questions and answers\n * Important: Since the security questions generate a payload for the private key, they will never be stored on the device as they must remain secret!!!\n * @param id\n * @param recoverySecurityQuestions\n * @param recoverySecurityAnswers\n * @param threshold the number of answers needed to rebuild the secret\n */\n public async updateSecurityQuestions(\n id: Uuid,\n recoverySecurityQuestions: string[],\n recoverySecurityAnswers: string[],\n threshold: number\n ) {\n if (!this.rsa) throw IncompleteAuthentication\n let securityQuestionPayload = this.toolbox.breakSecretIntoShards(\n recoverySecurityQuestions,\n recoverySecurityAnswers,\n this.rsa.private(),\n threshold\n )\n let updateRequest = {\n recoverySecurityQuestions: securityQuestionPayload,\n }\n\n return await this.guardClient.identityUpdate(id, updateRequest)\n }\n\n /**\n * @description Generates and stores the payload encrypted payload and updates the password itself (double hash)\n * @important\n * the recovery payload uses a singly hashed password and the password stored is doubly hashed so\n * the stored password cannot derive the decryption key in the payload\n * @note\n * the old password must be provided when not performing an account recovery\n * @param id\n * @param newPassword\n * @param oldPassword\n */\n public async updatePassword(id: Uuid, newPassword: string, oldPassword?: string) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(newPassword)\n let passwordPayload = symmetricEncryptor.bytesEncryptToBase64Payload(this.rsa.private())\n if (oldPassword) {\n oldPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(oldPassword))\n }\n\n newPassword = this.toolbox.hashStringToBase64(this.toolbox.hashStringToBase64(newPassword))\n\n let updateRequest = {\n password: {\n oldPassword,\n newPassword,\n },\n recoveryPassword: passwordPayload,\n }\n\n return await this.guardClient.identityUpdate(id, updateRequest)\n }\n\n /**\n * @description Generates and stores the master key encrypted payload\n * Important\n * Since the master key is used to generate a payload for the private key, it will never be stored on the device as it must remain secret!\n * @param id\n * @param masterKey\n * @param lockboxUuid\n */\n async updateMasterKey(id: Uuid, masterKey: string, lockboxUuid: Uuid) {\n if (!this.rsa) throw IncompleteAuthentication\n\n let symmetricEncryptor = this.toolbox.CryptoChaCha.fromPassphrase(masterKey)\n let masterKeyPayload = symmetricEncryptor.bytesEncryptToBase64Payload(this.rsa.private())\n let updateRequest = { recoveryMasterKey: masterKeyPayload }\n const updatedIdentity = await this.guardClient.identityUpdate(id, updateRequest)\n\n await this.getOrInsertJsonData<RecoveryMeta>(\n lockboxUuid,\n { masterKey },\n {\n category: MetadataCategory.Recovery,\n contentType: 'application/json',\n },\n {},\n true\n )\n\n return updatedIdentity\n }\n}","import { AxiosService, CliniaResponse, FacetFilter, PlaceData } from \"oro-sdk-apis\"\n\nexport class CliniaService {\n private api: AxiosService\n\n constructor(private url: string, apiKey: string, private locale?: string) {\n this.api = new AxiosService({ headers: { 'X-Clinia-API-Key': apiKey } })\n }\n\n public placeSearch(searchOptions: {\n locale?: string\n query?: string\n facetFilters?: FacetFilter[]\n location?: string\n aroundLatLng?: string\n page?: number\n }) {\n const { locale, ...data } = searchOptions\n\n return this.api.post<CliniaResponse<PlaceData>>(\n `${this.url}/search/v1/indexes/health_facility/query`,\n data,\n {\n params: { locale: locale ?? this.locale },\n }\n )\n }\n\n public placeMatch(\n searchOptions: {\n locale?: string\n name?: string\n address?: string\n postalCode?: string\n place?: string\n region?: string\n country?: string\n },\n type?: string\n ) {\n const { locale, ...data } = searchOptions\n\n let request = this.api.post<PlaceData[]>(\n `${this.url}/search/v1/matches`,\n data,\n {\n params: { locale: locale ?? this.locale },\n }\n )\n\n if (type) {\n request = request.then((places) =>\n places.filter((place) => place.type === type)\n )\n }\n\n return request\n }\n}\n","import initApis from 'oro-sdk-apis'\nimport { OroClient } from './client'\nimport * as OroToolboxNamespace from 'oro-toolbox'\n\nexport type OroToolbox = typeof OroToolboxNamespace\n\nexport let wasmPath = 'node_modules/oro-toolbox'\n\n/**\n * This function helps you to initialize and OroClient instance\n * @param toolbox the OroToolbox object\n * @param tellerBaseURL the teller service base URL \n * @param vaultBaseURL the vault service base URL \n * @param guardBaseURL the guard service base URL \n * @param searchbaseURL the search service base URL\n * @param practiceBaseURL the practice service base URL \n * @param consultBaseURL the consult service base URL \n * @param workflowBaseURL the workflow service base URL \n * @param diagnosisBaseURL the diagnosis service base URL \n * @param authenticationCallback (optional) authenticationCallback the authentification callback \n * @returns an instance of OroClient\n */\nconst init = (\n toolbox: OroToolbox,\n tellerBaseURL: string,\n vaultBaseURL: string,\n guardBaseURL: string,\n searchBaseURL: string,\n practiceBaseURL: string,\n consultBaseURL: string,\n workflowBaseURL: string,\n diagnosisBaseURL: string,\n authenticationCallback?: (err: Error) => void\n) => {\n const {\n tellerService,\n practiceService,\n consultService,\n vaultService,\n guardService,\n searchService,\n workflowService,\n diagnosisService,\n } = initApis(\n {\n tellerBaseURL,\n vaultBaseURL,\n guardBaseURL,\n searchBaseURL,\n practiceBaseURL,\n consultBaseURL,\n workflowBaseURL,\n diagnosisBaseURL,\n },\n authenticationCallback\n )\n\n const client = new OroClient(\n toolbox,\n tellerService!,\n vaultService!,\n guardService!,\n searchService!,\n practiceService!,\n consultService!,\n workflowService!,\n diagnosisService!,\n authenticationCallback\n )\n\n return client\n}\n\nexport { OroClient } from './client'\nexport * from 'oro-sdk-apis'\nexport * from './models'\nexport * from './helpers'\nexport * from './services'\nexport { OroToolboxNamespace }\nexport default init\n"],"names":["personalMetaToPrefix","MetadataCategory","Personal","ChildPersonal","OtherPersonal","identificationToPersonalInformations","data","category","prefix","birthday","firstname","gender","name","phone","zip","hid","pharmacy","address","toActualObject","ret","Object","entries","fields","forEach","key","field","displayedAnswer","answer","updatePersonalIntoPopulatedWorkflowData","infos","JSON","parse","stringify","kind","extractISOLocalityForConsult","answers","undefined","arrAnswersWithLocality","flatMap","currentAnswerPage","arrCountryFields","keys","filter","workflowFieldName","indexOf","flat","arrProvinceFields","arrConsultLocalFields","map","currentFieldName","item","arrSelectedLocality","currentSelectedLocality","startsWith","length","console","log","allowedLocalityPatterns","finalLocality","reduce","extractedSelected","exec","indexSelectedPriority","isoSelectedValue","extractedFinal","indexFinalPriority","isoFinalValue","sessionPrivateKeyPrefix","sessionStorePrivateKeyName","id","IncompleteAuthentication","Error","MissingGrant","MissingGrantFilter","MissingLockbox","MissingLockboxOwner","AssociatedLockboxNotFound","WorkflowAnswersMissingError","filterTriggeredAnsweredWithKind","workflowData","selectedAnswers","flattenedAnswers","flattenSelectedAnswers","triggeredQuestionsWithKind","fromEntries","pages","a","questions","question","isTriggered","triggers","samePageAnswers","prev","cur","res","questionFieldName","getWorkflowDataByCategory","triggeredQuestions","Promise","all","e","k","v","populateWorkflowField","then","populatedValue","workflowCreatedAt","createdAt","workflowId","locale","err","error","getImagesFromIndexDb","getMany","answerValue","text","value","images","image","imageData","resolve","includes","Array","isArray","some","subSetTriggers","every","trigger","linearAnswers","push","values","getInitialisedSelectedAnswers","workflow","useDefault","page","defaultValue","fillWorkflowFromPopulatedWorkflow","populatedWorkflow","filledWorkflow","pageIdx","MAX_RETRIES","registerPatient","patientUuid","consultRequest","oroClient","masterKey","recoveryQA","indexSearch","onProgress","consult","lockboxUuid","practitionerAdmin","retry","identity","errorsThrown","stepsTotalNum","currentStep","setTimeout","practiceClient","practiceGetFromUuid","uuidPractice","uuidAdmin","practiceGetPractitioners","practitioners","getOrCreatePatientConsultationUuid","getOrCreatePatientLockbox","guardClient","identityGet","grantLockbox","grantPromises","practitioner","uuid","consultIndex","IndexKey","ConsultationLockbox","grant","lockboxOwnerUuid","consultationId","consultIndexPromises","vaultIndexAdd","storeImageAliases","storePatientData","isoLanguageRequired","recoveryMasterKey","updateMasterKey","recoverySecurityQuestions","updateSecurityQuestions","recoverySecurityAnswers","buildConsultSearchIndex","consultClient","updateConsultByUUID","statusMedical","MedicalStatus","New","cleanIndex","practiceGetPayment","idStripeInvoiceOrPaymentIntent","payment","uuidConsult","getConsultByUUID","consultCreate","getGrants","grants","vaultClient","lockboxCreate","lockboxResponse","authRefresh","tokens","setTokens","accessToken","refreshToken","whoAmI","isoLanguage","getOrInsertJsonData","Raw","contentType","Consultation","documentType","DocumentType","PopulatedWorkflowData","Medical","consultationIds","extractAndStorePersonalWorkflowData","Preference","dataUuids","progress","nonNullImages","img","storedImagesNum","totalImagesNum","promises","ImageAlias","idbId","progressStepValue","Math","round","extractPersonalInfoFromWorkflowData","personalInfoPopulatedWfData","childPersonalInfoPopulatedWfData","otherPersonalInfoPopulatedWfData","terms","shortId","personalInfo","childPersonalInfo","otherPersonalInfo","searchClient","index","decryptGrants","encryptedGrants","rsaKey","encryptedLockbox","uuidParse","base64DecryptToBytes","decryptConsultLockboxGrants","encryptedConsultLockboxes","base64DecryptToJson","encryptedIndexEntry","grantsTuple","grantTuples","filterGrantsWithLockboxMetadata","filteredGrants","lockboxMetadataGet","consultationIdExistsInMetadata","OroClient","toolbox","tellerClient","workflowClient","diagnosisClient","authenticationCallback","cachedMetadataGrants","cachedManifest","signUp","email","password","practice","tosAndCpAcceptance","tokenData","subscription","skipEmailValidation","rsa","CryptoRSA","privateKey","symmetricEncryptor","CryptoChaCha","fromPassphrase","recoveryPassword","bytesEncryptToBase64Payload","hashedPassword","hashStringToBase64","emailConfirmed","signupRequest","practiceUuid","toLowerCase","publicKey","encodeToBase64","identityCreate","recoveryLogin","symetricEncryptor","sessionStorage","setItem","confirmEmail","claims","identityUpdate","sub","signIn","otp","tokenRequest","authToken","userUuid","recoverPrivateKeyFromPassword","resumeSession","recoveryPayload","getItem","recoveryKey","symmetricDecryptor","base64PayloadDecryptToBytes","fromKey","localEncryptToJsonPayload","chaChaKey","encryptedData","jsonEncryptToBase64Payload","encryptedKey","encryptToBytes","localDecryptJsonPayload","decryptedData","base64PayloadDecryptToJson","signOut","secrets","authLogout","forceUpdateIndexEntries","consults","indexConsultLockbox","alert","indexOwnerUuid","base64IndexOwnerPubKey","rsaPub","decodeFromBase64","encryptedIndex","keyString","uniqueHash","timestamp","jsonWithPubEncryptToBase64","vaultIndexPut","granteeUuid","getCachedSecretCryptor","secret","base64GranteePublicKey","granteePublicKey","granteeEncryptedSecret","bytesWithPubEncryptToBase64","request","encryptedSecret","lockboxGrant","createMessageData","message","previousDataUuid","author","encryptedPrivateMeta","meta","Message","publicMetadata","privateMetadata","lockboxDataStore","createMessageAttachmentData","Uint8Array","arrayBuffer","lastModified","size","fileName","type","createConsultationAttachmentData","createBytesData","createJsonData","privateMeta","forceReplace","lockboxManifestGet","manifest","dataUuid","getJsonData","lockboxDataGet","encryptedPayload","getBytesData","filterString","getAccountRole","currentAccountRole","OtherRoleType","User","Patient","requiredRole","grantsGet","decryptedGrants","info","vaultIndexGet","grantsByConsultLockbox","decryptedConsults","scope","split","findIndex","lockboxSecretGet","sharedSecret","cryptor","getPersonalInformationsFromConsultId","forceRefresh","getMetaCategoryFromConsultId","getMedicalDataFromConsultId","getLockboxManifest","entry","metadata","getPersonalInformations","userId","find","lockbox","identificationDataUuid","getGrantFromConsultId","getIdentityFromConsultId","expandPrivateMetadata","manifestKey","createPersonalInformations","createUserPreference","preference","getDataFromGrant","getUserPreferenceFromConsultId","getUserPreference","getRecoveryDataFromConsultId","Recovery","getRecoveryData","getAssignedConsultations","promise","getPastConsultationsFromConsultId","consultationsInLockbox","consultId","getPatientConsultationData","getPatientPrescriptionsList","getPatientDocumentsList","Prescription","getPatientResultsList","Result","getPatientTreatmentPlans","TreatmentPlan","getPatientTreatmentPlanByUuid","treatmentPlanId","filters","recoverPrivateKeyFromSecurityQuestions","threshold","shards","answeredShards","shard","indexOfQuestion","securityQuestion","securityAnswer","reconstructSecret","recoverPrivateKeyFromMasterKey","securityQuestionPayload","breakSecretIntoShards","updateRequest","updatePassword","newPassword","oldPassword","passwordPayload","masterKeyPayload","updatedIdentity","CliniaService","url","apiKey","api","AxiosService","headers","placeSearch","searchOptions","post","params","placeMatch","places","place","wasmPath","init","tellerBaseURL","vaultBaseURL","guardBaseURL","searchBaseURL","practiceBaseURL","consultBaseURL","workflowBaseURL","diagnosisBaseURL","initApis","tellerService","practiceService","consultService","vaultService","guardService","searchService","workflowService","diagnosisService","client"],"mappings":"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"}
|