@icure/api 8.0.65 → 8.0.67

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.
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../icc-x-api/utils/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import * as WebSocketNode from 'ws'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { AbstractFilter } from '../filters/filters'\nimport { User } from '../../icc-api/model/User'\nimport { isNode } from 'browser-or-node'\nimport { IccAuthApi } from '../../icc-api'\nimport { Service } from '../../icc-api/model/Service'\nimport { HealthElement } from '../../icc-api/model/HealthElement'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { Device } from '../../icc-api/model/Device'\nimport { Contact } from '../../icc-api/model/Contact'\nimport { Message } from '../../icc-api/model/Message'\nimport { Topic } from '../../icc-api/model/Topic'\n\nexport type EventTypes = 'CREATE' | 'UPDATE' | 'DELETE'\ntype Subscribable =\n | 'Patient'\n | 'Service'\n | 'User'\n | 'HealthElement'\n | 'MaintenanceTask'\n | 'HealthcareParty'\n | 'Device'\n | 'Contact'\n | 'Message'\n | 'Topic'\ntype SubscribableEntity = Patient | Service | User | HealthElement | MaintenanceTask | HealthcareParty | Device | Contact | Message | Topic\nexport type SubscriptionOptions = {\n connectionMaxRetry?: number\n connectionRetryIntervalMs?: number\n debug?: boolean\n}\n\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Patient',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Patient> | undefined,\n eventFired: (entity: Patient) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Patient) => Promise<Patient>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Service',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Service> | undefined,\n eventFired: (entity: Service) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Service) => Promise<Service>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Contact',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Contact> | undefined,\n eventFired: (entity: Contact) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Contact) => Promise<Contact>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'HealthElement',\n eventTypes: EventTypes[],\n filter: AbstractFilter<HealthElement> | undefined,\n eventFired: (entity: HealthElement) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: HealthElement) => Promise<HealthElement>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Message',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Message> | undefined,\n eventFired: (entity: Message) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Message) => Promise<Message>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Topic',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Topic> | undefined,\n eventFired: (entity: Topic) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Topic) => Promise<Topic>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'User',\n eventTypes: EventTypes[],\n filter: AbstractFilter<User> | undefined,\n eventFired: (entity: User) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'MaintenanceTask',\n eventTypes: EventTypes[],\n filter: AbstractFilter<MaintenanceTask> | undefined,\n eventFired: (entity: MaintenanceTask) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: MaintenanceTask) => Promise<MaintenanceTask>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'HealthcareParty',\n eventTypes: EventTypes[],\n filter: AbstractFilter<HealthcareParty> | undefined,\n eventFired: (entity: HealthcareParty) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Device',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Device> | undefined,\n eventFired: (entity: Device) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\n\nexport function subscribeToEntityEvents<T extends SubscribableEntity>(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: Subscribable,\n eventTypes: EventTypes[],\n filter: AbstractFilter<T> | undefined,\n eventFired: (entity: T) => Promise<void>,\n options: SubscriptionOptions = {},\n decryptor?: (encrypted: T) => Promise<T>\n): Promise<WebSocketWrapper> {\n const config = {\n User: {\n qualifiedName: 'org.taktik.icure.entities.User',\n decryptor: (data: User) => Promise.resolve(new User({ ...data }) as T),\n },\n Patient: {\n qualifiedName: 'org.taktik.icure.entities.Patient',\n decryptor: (data: Patient) => decryptor!(data as Patient as T),\n },\n Service: {\n qualifiedName: 'org.taktik.icure.entities.embed.Service',\n decryptor: (data: Service) => decryptor!(data as Service as T),\n },\n HealthElement: {\n qualifiedName: 'org.taktik.icure.entities.HealthElement',\n decryptor: (data: HealthElement) => decryptor!(data as HealthElement as T),\n },\n Message: {\n qualifiedName: 'org.taktik.icure.entities.Message',\n decryptor: (data: Message) => decryptor!(data as Message as T),\n },\n Topic: {\n qualifiedName: 'org.taktik.icure.entities.Topic',\n decryptor: (data: Topic) => decryptor!(data as Topic as T),\n },\n MaintenanceTask: {\n qualifiedName: 'org.taktik.icure.entities.MaintenanceTask',\n decryptor: (data: MaintenanceTask) => decryptor!(data as MaintenanceTask as T),\n },\n HealthcareParty: {\n qualifiedName: 'org.taktik.icure.entities.HealthcareParty',\n decryptor: (data: HealthcareParty) => Promise.resolve(new HealthcareParty({ ...data }) as HealthcareParty as T),\n },\n Device: {\n qualifiedName: 'org.taktik.icure.entities.Device',\n decryptor: (data: Device) => Promise.resolve(new Device({ ...data }) as Device as T),\n },\n Contact: {\n qualifiedName: 'org.taktik.icure.entities.Contact',\n decryptor: (data: Contact) => decryptor!(data as Contact as T),\n },\n }\n\n return WebSocketWrapper.create(\n basePath.replace('http', 'ws').replace('rest', 'ws') + '/notification/subscribe',\n new WebSocketAuthProviderImpl(authApi),\n options.connectionMaxRetry ?? 5,\n options.connectionRetryIntervalMs ?? 1_000,\n {\n CONNECTED: [\n async (ws: WebSocketWrapper) => {\n const subscription = {\n eventTypes,\n entityClass: config[entityClass].qualifiedName,\n filter: { filter },\n }\n\n ws.send(JSON.stringify(subscription))\n },\n ],\n },\n async (data: any) => {\n try {\n await config[entityClass].decryptor(data).then((o) => eventFired(o))\n } catch (e) {\n console.error(e)\n }\n },\n options.debug\n )\n}\n\nexport type ConnectionStatus = 'NOT_CONNECTED' | 'CONNECTED' | 'CLOSED' | 'ERROR'\nexport type StatusCallback = (ws: WebSocketWrapper) => void\nexport type ErrorStatusCallback = (ws: WebSocketWrapper, error?: Error) => void\nexport type ConnectionStatusFunction = {\n [K in ConnectionStatus]: K extends 'ERROR' ? ErrorStatusCallback : StatusCallback\n}\nexport type ConnectionStatusFunctions = {\n [K in ConnectionStatus]?: K extends 'ERROR' ? Array<ErrorStatusCallback> : Array<StatusCallback>\n}\nexport type WebSocketWrapperMessageCallback = (data: any) => void\n\nexport class WebSocketWrapper {\n private readonly pingLifetime: number = 20_000\n private socket: WebsocketAdapter | null = null\n private retries = 0\n private closed = false\n private lastPingReceived = Date.now()\n private intervalIds: (NodeJS.Timeout | number)[] = []\n private readonly methodPath: string\n\n private constructor(\n private readonly url: string,\n private readonly authProvider: WebSocketAuthProvider,\n private readonly maxRetries = 3,\n private readonly retryDelay = 1000,\n private readonly statusCallbacks: ConnectionStatusFunctions = {},\n private readonly messageCallback: WebSocketWrapperMessageCallback = () => {},\n private readonly debug: boolean = false\n ) {\n this.methodPath = new URL(url).pathname\n }\n\n public static async create(\n url: string,\n authProvider: WebSocketAuthProvider,\n maxRetries?: number,\n retryDelay?: number,\n statusCallbacks?: ConnectionStatusFunctions,\n messageCallback?: WebSocketWrapperMessageCallback,\n debug?: boolean\n ): Promise<WebSocketWrapper> {\n const ws = new WebSocketWrapper(url, authProvider, maxRetries, retryDelay, statusCallbacks, messageCallback, debug)\n await ws.connect()\n return ws\n }\n\n public send(data: Buffer | ArrayBuffer | string) {\n if (this.socket && this.socket.readyState === ReadyState.OPEN) {\n this.socket.send(data)\n }\n }\n\n public close() {\n if (this.socket) {\n this.closed = true\n this.socket.close(1000, 'Client closed connection')\n }\n }\n\n public addStatusCallback(status: ConnectionStatus, callback: ConnectionStatusFunction[ConnectionStatus]) {\n switch (status) {\n case 'CONNECTED':\n case 'CLOSED':\n if (!this.statusCallbacks[status]) this.statusCallbacks[status] = []\n this.statusCallbacks?.[status]?.push(callback)\n break\n case 'ERROR':\n this.statusCallbacks?.ERROR?.push(callback)\n break\n }\n }\n\n private async connect() {\n if (this.retries >= this.maxRetries) {\n throw new Error('WebSocket connection failed after ' + this.maxRetries + ' retries')\n }\n\n const bearerToken = await this.authProvider.getBearerToken()\n\n const socket =\n isNode && !!bearerToken\n ? new WebSocketNode(this.url, {\n headers: {\n Authorization: bearerToken,\n },\n })\n : await this.authProvider.getIcureOtt(this.methodPath).then((icureOttToken) => {\n const address = `${this.url};tokenid=${icureOttToken}`\n return isNode ? new WebSocketNode(address) : new WebSocket(address)\n })\n\n this.socket = new WebsocketAdapter(socket)\n\n this.socket.on('open', async () => {\n if (this.debug) console.debug('WebSocket connection opened')\n\n this.intervalIds.push(\n setTimeout(() => {\n this.retries = 0\n }, (this.maxRetries + 1) * this.retryDelay)\n )\n\n this.callStatusCallbacks('CONNECTED')\n })\n\n this.socket.on('message', (event: string) => {\n if (this.debug) console.debug('WebSocket message received', event)\n\n // Handle ping messages\n if (event === 'ping') {\n if (this.debug) console.debug('Received ping, sending pong')\n\n this.send('pong')\n this.lastPingReceived = Date.now()\n\n this.intervalIds.push(\n setTimeout(() => {\n if (Date.now() - this.lastPingReceived > this.pingLifetime) {\n console.error(`No ping received in the last ${this.pingLifetime} ms`)\n this.socket?.close()\n }\n }, this.pingLifetime)\n )\n\n return\n }\n\n // Call the message callback for other messages\n try {\n const data = JSON.parse(event)\n this.messageCallback(data)\n } catch (error) {\n console.error('Failed to parse WebSocket message', error)\n }\n })\n\n this.socket.on('close', ({ code, reason }) => {\n if (this.debug) console.debug('WebSocket connection closed', code, reason?.toString())\n\n this.callStatusCallbacks('CLOSED')\n\n this.intervalIds.forEach((id) => clearTimeout(id as number))\n this.intervalIds = []\n\n if (this.closed) {\n return\n }\n\n setTimeout(async () => {\n ++this.retries\n return await this.connect()\n }, this.retryDelay)\n })\n\n this.socket.on('error', async (err) => {\n console.error('WebSocket error', err)\n\n this.callStatusCallbacks('ERROR', err)\n\n if (this.socket) {\n this.socket.close()\n }\n })\n }\n\n private callStatusCallbacks(event: ConnectionStatus, error?: Error) {\n switch (event) {\n case 'CONNECTED':\n case 'CLOSED':\n this.statusCallbacks?.[event]?.forEach((callback) => callback(this))\n break\n case 'ERROR':\n this.statusCallbacks?.ERROR?.forEach((callback) => callback(this, error))\n break\n }\n }\n}\n\ninterface WebSocketAuthProvider {\n getBearerToken(): Promise<string | undefined>\n\n getIcureOtt(icureMethodPath: string): Promise<string>\n}\n\nclass WebSocketAuthProviderImpl {\n constructor(private readonly authApi: IccAuthApi) {}\n\n async getBearerToken(): Promise<string | undefined> {\n const headers = await this.authApi.authenticationProvider.getAuthService().getAuthHeaders()\n return headers.find((header) => header.header === 'Authorization' && header.data.startsWith('Bearer '))?.data\n }\n\n async getIcureOtt(icureMethodPath: string): Promise<string> {\n return await this.authApi.token('GET', icureMethodPath)\n }\n}\n\ntype EventCallback = {\n open: (event: any) => void\n message: (event: string) => void\n close: (event: { code: number; reason: string }) => void\n error: (error: any) => void\n}\n\nenum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nclass WebsocketAdapter {\n constructor(private readonly websocket: WebSocketNode | WebSocket) {}\n\n public get readyState(): number {\n if (this.websocket) {\n if (isNode) {\n switch ((this.websocket as WebSocketNode).readyState) {\n case WebSocketNode.CONNECTING:\n return ReadyState.CONNECTING\n case WebSocketNode.OPEN:\n return ReadyState.OPEN\n case WebSocketNode.CLOSING:\n return ReadyState.CLOSING\n case WebSocketNode.CLOSED:\n return ReadyState.CLOSED\n }\n } else {\n switch ((this.websocket as WebSocket).readyState) {\n case WebSocket.CONNECTING:\n return ReadyState.CONNECTING\n case WebSocket.OPEN:\n return ReadyState.OPEN\n case WebSocket.CLOSING:\n return ReadyState.CLOSING\n case WebSocket.CLOSED:\n return ReadyState.CLOSED\n }\n }\n }\n return ReadyState.CLOSED\n }\n\n /**\n * This is not throwing an error if the websocket is not open, because the purpose of the websocket wrapper is custom to notifications needs (subscribe and ping pong only)\n * If in the future we need to use it for other purposes, we will have to throw an error and update the implementation of ping pong in the notification\n * @param data the data to send\n */\n public send(data: Buffer | ArrayBuffer | string) {\n if (this.websocket && this.readyState === ReadyState.OPEN) {\n this.websocket.send(data)\n }\n }\n\n public close(code?: number, reason?: string) {\n if (this.websocket) {\n this.websocket.close(code, reason)\n }\n }\n\n private onMessage(callback: (event: string) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('message', (x) => callback(x.toString('utf8')))\n } else {\n ;(this.websocket as WebSocket).addEventListener('message', async (event) => {\n let dataAsString: string | undefined\n if (event.type === 'message') {\n dataAsString = event.data\n } else console.error('Unexpected event type: ' + event.type)\n if (!dataAsString) {\n console.error('Failed to parse WebSocket message')\n return\n }\n\n callback(dataAsString)\n })\n }\n } else {\n console.error('Websocket is not defined')\n throw new Error('Websocket is not defined')\n }\n }\n\n private onOpen(callback: (event: any) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('open', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('open', callback)\n }\n }\n }\n\n private onClose(callback: (event: { code: number; reason: string }) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('close', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('close', callback)\n }\n }\n }\n\n private onError(callback: (error: any) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('error', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('error', callback)\n }\n }\n }\n\n public on<K extends keyof EventCallback>(event: K, callback: EventCallback[K]) {\n if (this.websocket) {\n switch (event) {\n case 'message':\n return this.onMessage(callback as EventCallback['message'])\n case 'open':\n return this.onOpen(callback as EventCallback['open'])\n case 'close':\n return this.onClose(callback as EventCallback['close'])\n case 'error':\n return this.onError(callback as EventCallback['error'])\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../icc-x-api/utils/websocket.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAmC;AAGnC,mDAA+C;AAC/C,qDAAwC;AAKxC,yEAAqE;AACrE,uDAAmD;AA0HnD,SAAgB,uBAAuB,CACrC,QAAgB,EAChB,OAAmB,EACnB,WAAyB,EACzB,UAAwB,EACxB,MAAqC,EACrC,UAAwC,EACxC,UAA+B,EAAE,EACjC,SAAwC;;IAExC,MAAM,MAAM,GAAG;QACb,IAAI,EAAE;YACJ,aAAa,EAAE,gCAAgC;YAC/C,SAAS,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,WAAI,mBAAM,IAAI,EAAQ,CAAC;SACvE;QACD,OAAO,EAAE;YACP,aAAa,EAAE,mCAAmC;YAClD,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,SAAU,CAAC,IAAoB,CAAC;SAC/D;QACD,OAAO,EAAE;YACP,aAAa,EAAE,yCAAyC;YACxD,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,SAAU,CAAC,IAAoB,CAAC;SAC/D;QACD,aAAa,EAAE;YACb,aAAa,EAAE,yCAAyC;YACxD,SAAS,EAAE,CAAC,IAAmB,EAAE,EAAE,CAAC,SAAU,CAAC,IAA0B,CAAC;SAC3E;QACD,OAAO,EAAE;YACP,aAAa,EAAE,mCAAmC;YAClD,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,SAAU,CAAC,IAAoB,CAAC;SAC/D;QACD,KAAK,EAAE;YACL,aAAa,EAAE,iCAAiC;YAChD,SAAS,EAAE,CAAC,IAAW,EAAE,EAAE,CAAC,SAAU,CAAC,IAAkB,CAAC;SAC3D;QACD,eAAe,EAAE;YACf,aAAa,EAAE,2CAA2C;YAC1D,SAAS,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,SAAU,CAAC,IAA4B,CAAC;SAC/E;QACD,eAAe,EAAE;YACf,aAAa,EAAE,2CAA2C;YAC1D,SAAS,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,iCAAe,mBAAM,IAAI,EAA2B,CAAC;SAChH;QACD,MAAM,EAAE;YACN,aAAa,EAAE,kCAAkC;YACjD,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,eAAM,mBAAM,IAAI,EAAkB,CAAC;SACrF;QACD,OAAO,EAAE;YACP,aAAa,EAAE,mCAAmC;YAClD,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,SAAU,CAAC,IAAoB,CAAC;SAC/D;KACF,CAAA;IAED,OAAO,gBAAgB,CAAC,MAAM,CAC5B,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,yBAAyB,EAChF,IAAI,yBAAyB,CAAC,OAAO,CAAC,EACtC,MAAA,OAAO,CAAC,kBAAkB,mCAAI,CAAC,EAC/B,MAAA,OAAO,CAAC,yBAAyB,mCAAI,IAAK,EAC1C;QACE,SAAS,EAAE;YACT,CAAO,EAAoB,EAAE,EAAE;gBAC7B,MAAM,YAAY,GAAG;oBACnB,UAAU;oBACV,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa;oBAC9C,MAAM,EAAE,EAAE,MAAM,EAAE;iBACnB,CAAA;gBAED,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;YACvC,CAAC,CAAA;SACF;KACF,EACD,CAAO,IAAS,EAAE,EAAE;QAClB,IAAI;YACF,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;SACrE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;SACjB;IACH,CAAC,CAAA,EACD,OAAO,CAAC,KAAK,CACd,CAAA;AACH,CAAC;AAhFD,0DAgFC;AAaD,MAAa,gBAAgB;IAS3B,YACmB,GAAW,EACX,YAAmC,EACnC,aAAa,CAAC,EACd,aAAa,IAAI,EACjB,kBAA6C,EAAE,EAC/C,kBAAmD,GAAG,EAAE,GAAE,CAAC,EAC3D,QAAiB,KAAK;QANtB,QAAG,GAAH,GAAG,CAAQ;QACX,iBAAY,GAAZ,YAAY,CAAuB;QACnC,eAAU,GAAV,UAAU,CAAI;QACd,eAAU,GAAV,UAAU,CAAO;QACjB,oBAAe,GAAf,eAAe,CAAgC;QAC/C,oBAAe,GAAf,eAAe,CAA4C;QAC3D,UAAK,GAAL,KAAK,CAAiB;QAfxB,iBAAY,GAAW,KAAM,CAAA;QACtC,WAAM,GAA4B,IAAI,CAAA;QACtC,YAAO,GAAG,CAAC,CAAA;QACX,WAAM,GAAG,KAAK,CAAA;QACd,qBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC7B,gBAAW,GAAgC,EAAE,CAAA;QAYnD,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;IACzC,CAAC;IAEM,MAAM,CAAO,MAAM,CACxB,GAAW,EACX,YAAmC,EACnC,UAAmB,EACnB,UAAmB,EACnB,eAA2C,EAC3C,eAAiD,EACjD,KAAe;;YAEf,MAAM,EAAE,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,CAAC,CAAA;YACnH,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;YAClB,OAAO,EAAE,CAAA;QACX,CAAC;KAAA;IAEM,IAAI,CAAC,IAAmC;QAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,EAAE;YAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SACvB;IACH,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAA;SACpD;IACH,CAAC;IAEM,iBAAiB,CAAC,MAAwB,EAAE,QAAoD;;QACrG,QAAQ,MAAM,EAAE;YACd,KAAK,WAAW,CAAC;YACjB,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;oBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;gBACpE,MAAA,MAAA,IAAI,CAAC,eAAe,0CAAG,MAAM,CAAC,0CAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC9C,MAAK;YACP,KAAK,OAAO;gBACV,MAAA,MAAA,IAAI,CAAC,eAAe,0CAAE,KAAK,0CAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC3C,MAAK;SACR;IACH,CAAC;IAEa,OAAO;;YACnB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,CAAA;aACrF;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAA;YAE5D,IAAI,CAAC,WAAW,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;aAClD;YAED,MAAM,MAAM,GAAG,wBAAM;gBACnB,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC1B,OAAO,EAAE;wBACP,aAAa,EAAE,WAAW;qBAC3B;iBACF,CAAC;gBACJ,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,WAAW,EAAE,CAAC,CAAA;YAEnD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;YAE1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAS,EAAE;gBAChC,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBAE5D,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;gBAClB,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAC5C,CAAA;gBAED,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;YACvC,CAAC,CAAA,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1C,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;gBAElE,uBAAuB;gBACvB,IAAI,KAAK,KAAK,MAAM,EAAE;oBACpB,IAAI,IAAI,CAAC,KAAK;wBAAE,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;oBAE5D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACjB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;oBAElC,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,UAAU,CAAC,GAAG,EAAE;;wBACd,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE;4BAC1D,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,YAAY,KAAK,CAAC,CAAA;4BACrE,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,EAAE,CAAA;yBACrB;oBACH,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CACtB,CAAA;oBAED,OAAM;iBACP;gBAED,+CAA+C;gBAC/C,IAAI;oBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBAC9B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;iBAC3B;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAA;iBAC1D;YACH,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC3C,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,IAAI,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,EAAE,CAAC,CAAA;gBAEtF,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAElC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAY,CAAC,CAAC,CAAA;gBAC5D,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;gBAErB,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,OAAM;iBACP;gBAED,UAAU,CAAC,GAAS,EAAE;oBACpB,EAAE,IAAI,CAAC,OAAO,CAAA;oBACd,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;gBAC7B,CAAC,CAAA,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAO,GAAG,EAAE,EAAE;gBACpC,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;gBAErC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAEtC,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;iBACpB;YACH,CAAC,CAAA,CAAC,CAAA;QACJ,CAAC;KAAA;IAEO,mBAAmB,CAAC,KAAuB,EAAE,KAAa;;QAChE,QAAQ,KAAK,EAAE;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,QAAQ;gBACX,MAAA,MAAA,IAAI,CAAC,eAAe,0CAAG,KAAK,CAAC,0CAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;gBACpE,MAAK;YACP,KAAK,OAAO;gBACV,MAAA,MAAA,IAAI,CAAC,eAAe,0CAAE,KAAK,0CAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;gBACzE,MAAK;SACR;IACH,CAAC;CACF;AArKD,4CAqKC;AAMD,MAAM,yBAAyB;IAC7B,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAE9C,cAAc;;;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE,CAAA;YAC3F,OAAO,MAAA,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,0CAAE,IAAI,CAAA;;KAC9G;CACF;AASD,IAAK,UAKJ;AALD,WAAK,UAAU;IACb,uDAAc,CAAA;IACd,2CAAQ,CAAA;IACR,iDAAW,CAAA;IACX,+CAAU,CAAA;AACZ,CAAC,EALI,UAAU,KAAV,UAAU,QAKd;AAED,MAAM,gBAAgB;IACpB,YAA6B,SAAoC;QAApC,cAAS,GAAT,SAAS,CAA2B;IAAG,CAAC;IAErE,IAAW,UAAU;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,wBAAM,EAAE;gBACV,QAAS,IAAI,CAAC,SAA2B,CAAC,UAAU,EAAE;oBACpD,KAAK,aAAa,CAAC,UAAU;wBAC3B,OAAO,UAAU,CAAC,UAAU,CAAA;oBAC9B,KAAK,aAAa,CAAC,IAAI;wBACrB,OAAO,UAAU,CAAC,IAAI,CAAA;oBACxB,KAAK,aAAa,CAAC,OAAO;wBACxB,OAAO,UAAU,CAAC,OAAO,CAAA;oBAC3B,KAAK,aAAa,CAAC,MAAM;wBACvB,OAAO,UAAU,CAAC,MAAM,CAAA;iBAC3B;aACF;iBAAM;gBACL,QAAS,IAAI,CAAC,SAAuB,CAAC,UAAU,EAAE;oBAChD,KAAK,SAAS,CAAC,UAAU;wBACvB,OAAO,UAAU,CAAC,UAAU,CAAA;oBAC9B,KAAK,SAAS,CAAC,IAAI;wBACjB,OAAO,UAAU,CAAC,IAAI,CAAA;oBACxB,KAAK,SAAS,CAAC,OAAO;wBACpB,OAAO,UAAU,CAAC,OAAO,CAAA;oBAC3B,KAAK,SAAS,CAAC,MAAM;wBACnB,OAAO,UAAU,CAAC,MAAM,CAAA;iBAC3B;aACF;SACF;QACD,OAAO,UAAU,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,IAAmC;QAC7C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,EAAE;YACzD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAC1B;IACH,CAAC;IAEM,KAAK,CAAC,IAAa,EAAE,MAAe;QACzC,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;SACnC;IACH,CAAC;IAEO,SAAS,CAAC,QAAiC;QACjD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,wBAAM,EAAE;gBACV,CAAC;gBAAC,IAAI,CAAC,SAA2B,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;aACtF;iBAAM;gBACL,CAAC;gBAAC,IAAI,CAAC,SAAuB,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAO,KAAK,EAAE,EAAE;oBACzE,IAAI,YAAgC,CAAA;oBACpC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;wBAC5B,YAAY,GAAG,KAAK,CAAC,IAAI,CAAA;qBAC1B;;wBAAM,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;oBAC5D,IAAI,CAAC,YAAY,EAAE;wBACjB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;wBAClD,OAAM;qBACP;oBAED,QAAQ,CAAC,YAAY,CAAC,CAAA;gBACxB,CAAC,CAAA,CAAC,CAAA;aACH;SACF;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACzC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;SAC5C;IACH,CAAC;IAEO,MAAM,CAAC,QAA8B;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,wBAAM,EAAE;gBACV,CAAC;gBAAC,IAAI,CAAC,SAA2B,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;aACxD;iBAAM;gBACL,CAAC;gBAAC,IAAI,CAAC,SAAuB,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;aAClE;SACF;IACH,CAAC;IAEO,OAAO,CAAC,QAA2D;QACzE,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,wBAAM,EAAE;gBACV,CAAC;gBAAC,IAAI,CAAC,SAA2B,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;aACzD;iBAAM;gBACL,CAAC;gBAAC,IAAI,CAAC,SAAuB,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;aACnE;SACF;IACH,CAAC;IAEO,OAAO,CAAC,QAA8B;QAC5C,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,wBAAM,EAAE;gBACV,CAAC;gBAAC,IAAI,CAAC,SAA2B,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;aACzD;iBAAM;gBACL,CAAC;gBAAC,IAAI,CAAC,SAAuB,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;aACnE;SACF;IACH,CAAC;IAEM,EAAE,CAAgC,KAAQ,EAAE,QAA0B;QAC3E,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,QAAQ,KAAK,EAAE;gBACb,KAAK,SAAS;oBACZ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAoC,CAAC,CAAA;gBAC7D,KAAK,MAAM;oBACT,OAAO,IAAI,CAAC,MAAM,CAAC,QAAiC,CAAC,CAAA;gBACvD,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAkC,CAAC,CAAA;gBACzD,KAAK,OAAO;oBACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAkC,CAAC,CAAA;aAC1D;SACF;IACH,CAAC;CACF","sourcesContent":["import * as WebSocketNode from 'ws'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { AbstractFilter } from '../filters/filters'\nimport { User } from '../../icc-api/model/User'\nimport { isNode } from 'browser-or-node'\nimport { IccAuthApi } from '../../icc-api'\nimport { Service } from '../../icc-api/model/Service'\nimport { HealthElement } from '../../icc-api/model/HealthElement'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { Device } from '../../icc-api/model/Device'\nimport { Contact } from '../../icc-api/model/Contact'\nimport { Message } from '../../icc-api/model/Message'\nimport { Topic } from '../../icc-api/model/Topic'\n\nexport type EventTypes = 'CREATE' | 'UPDATE' | 'DELETE'\ntype Subscribable =\n | 'Patient'\n | 'Service'\n | 'User'\n | 'HealthElement'\n | 'MaintenanceTask'\n | 'HealthcareParty'\n | 'Device'\n | 'Contact'\n | 'Message'\n | 'Topic'\ntype SubscribableEntity = Patient | Service | User | HealthElement | MaintenanceTask | HealthcareParty | Device | Contact | Message | Topic\nexport type SubscriptionOptions = {\n connectionMaxRetry?: number\n connectionRetryIntervalMs?: number\n debug?: boolean\n}\n\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Patient',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Patient> | undefined,\n eventFired: (entity: Patient) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Patient) => Promise<Patient>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Service',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Service> | undefined,\n eventFired: (entity: Service) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Service) => Promise<Service>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Contact',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Contact> | undefined,\n eventFired: (entity: Contact) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Contact) => Promise<Contact>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'HealthElement',\n eventTypes: EventTypes[],\n filter: AbstractFilter<HealthElement> | undefined,\n eventFired: (entity: HealthElement) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: HealthElement) => Promise<HealthElement>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Message',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Message> | undefined,\n eventFired: (entity: Message) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Message) => Promise<Message>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Topic',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Topic> | undefined,\n eventFired: (entity: Topic) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: Topic) => Promise<Topic>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'User',\n eventTypes: EventTypes[],\n filter: AbstractFilter<User> | undefined,\n eventFired: (entity: User) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'MaintenanceTask',\n eventTypes: EventTypes[],\n filter: AbstractFilter<MaintenanceTask> | undefined,\n eventFired: (entity: MaintenanceTask) => Promise<void>,\n options: SubscriptionOptions,\n decryptor: (encrypted: MaintenanceTask) => Promise<MaintenanceTask>\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'HealthcareParty',\n eventTypes: EventTypes[],\n filter: AbstractFilter<HealthcareParty> | undefined,\n eventFired: (entity: HealthcareParty) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\nexport function subscribeToEntityEvents(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: 'Device',\n eventTypes: EventTypes[],\n filter: AbstractFilter<Device> | undefined,\n eventFired: (entity: Device) => Promise<void>,\n options: SubscriptionOptions\n): Promise<WebSocketWrapper>\n\nexport function subscribeToEntityEvents<T extends SubscribableEntity>(\n basePath: string,\n authApi: IccAuthApi,\n entityClass: Subscribable,\n eventTypes: EventTypes[],\n filter: AbstractFilter<T> | undefined,\n eventFired: (entity: T) => Promise<void>,\n options: SubscriptionOptions = {},\n decryptor?: (encrypted: T) => Promise<T>\n): Promise<WebSocketWrapper> {\n const config = {\n User: {\n qualifiedName: 'org.taktik.icure.entities.User',\n decryptor: (data: User) => Promise.resolve(new User({ ...data }) as T),\n },\n Patient: {\n qualifiedName: 'org.taktik.icure.entities.Patient',\n decryptor: (data: Patient) => decryptor!(data as Patient as T),\n },\n Service: {\n qualifiedName: 'org.taktik.icure.entities.embed.Service',\n decryptor: (data: Service) => decryptor!(data as Service as T),\n },\n HealthElement: {\n qualifiedName: 'org.taktik.icure.entities.HealthElement',\n decryptor: (data: HealthElement) => decryptor!(data as HealthElement as T),\n },\n Message: {\n qualifiedName: 'org.taktik.icure.entities.Message',\n decryptor: (data: Message) => decryptor!(data as Message as T),\n },\n Topic: {\n qualifiedName: 'org.taktik.icure.entities.Topic',\n decryptor: (data: Topic) => decryptor!(data as Topic as T),\n },\n MaintenanceTask: {\n qualifiedName: 'org.taktik.icure.entities.MaintenanceTask',\n decryptor: (data: MaintenanceTask) => decryptor!(data as MaintenanceTask as T),\n },\n HealthcareParty: {\n qualifiedName: 'org.taktik.icure.entities.HealthcareParty',\n decryptor: (data: HealthcareParty) => Promise.resolve(new HealthcareParty({ ...data }) as HealthcareParty as T),\n },\n Device: {\n qualifiedName: 'org.taktik.icure.entities.Device',\n decryptor: (data: Device) => Promise.resolve(new Device({ ...data }) as Device as T),\n },\n Contact: {\n qualifiedName: 'org.taktik.icure.entities.Contact',\n decryptor: (data: Contact) => decryptor!(data as Contact as T),\n },\n }\n\n return WebSocketWrapper.create(\n basePath.replace('http', 'ws').replace('rest', 'ws') + '/notification/subscribe',\n new WebSocketAuthProviderImpl(authApi),\n options.connectionMaxRetry ?? 5,\n options.connectionRetryIntervalMs ?? 1_000,\n {\n CONNECTED: [\n async (ws: WebSocketWrapper) => {\n const subscription = {\n eventTypes,\n entityClass: config[entityClass].qualifiedName,\n filter: { filter },\n }\n\n ws.send(JSON.stringify(subscription))\n },\n ],\n },\n async (data: any) => {\n try {\n await config[entityClass].decryptor(data).then((o) => eventFired(o))\n } catch (e) {\n console.error(e)\n }\n },\n options.debug\n )\n}\n\nexport type ConnectionStatus = 'NOT_CONNECTED' | 'CONNECTED' | 'CLOSED' | 'ERROR'\nexport type StatusCallback = (ws: WebSocketWrapper) => void\nexport type ErrorStatusCallback = (ws: WebSocketWrapper, error?: Error) => void\nexport type ConnectionStatusFunction = {\n [K in ConnectionStatus]: K extends 'ERROR' ? ErrorStatusCallback : StatusCallback\n}\nexport type ConnectionStatusFunctions = {\n [K in ConnectionStatus]?: K extends 'ERROR' ? Array<ErrorStatusCallback> : Array<StatusCallback>\n}\nexport type WebSocketWrapperMessageCallback = (data: any) => void\n\nexport class WebSocketWrapper {\n private readonly pingLifetime: number = 20_000\n private socket: WebsocketAdapter | null = null\n private retries = 0\n private closed = false\n private lastPingReceived = Date.now()\n private intervalIds: (NodeJS.Timeout | number)[] = []\n private readonly methodPath: string\n\n private constructor(\n private readonly url: string,\n private readonly authProvider: WebSocketAuthProvider,\n private readonly maxRetries = 3,\n private readonly retryDelay = 1000,\n private readonly statusCallbacks: ConnectionStatusFunctions = {},\n private readonly messageCallback: WebSocketWrapperMessageCallback = () => {},\n private readonly debug: boolean = false\n ) {\n this.methodPath = new URL(url).pathname\n }\n\n public static async create(\n url: string,\n authProvider: WebSocketAuthProvider,\n maxRetries?: number,\n retryDelay?: number,\n statusCallbacks?: ConnectionStatusFunctions,\n messageCallback?: WebSocketWrapperMessageCallback,\n debug?: boolean\n ): Promise<WebSocketWrapper> {\n const ws = new WebSocketWrapper(url, authProvider, maxRetries, retryDelay, statusCallbacks, messageCallback, debug)\n await ws.connect()\n return ws\n }\n\n public send(data: Buffer | ArrayBuffer | string) {\n if (this.socket && this.socket.readyState === ReadyState.OPEN) {\n this.socket.send(data)\n }\n }\n\n public close() {\n if (this.socket) {\n this.closed = true\n this.socket.close(1000, 'Client closed connection')\n }\n }\n\n public addStatusCallback(status: ConnectionStatus, callback: ConnectionStatusFunction[ConnectionStatus]) {\n switch (status) {\n case 'CONNECTED':\n case 'CLOSED':\n if (!this.statusCallbacks[status]) this.statusCallbacks[status] = []\n this.statusCallbacks?.[status]?.push(callback)\n break\n case 'ERROR':\n this.statusCallbacks?.ERROR?.push(callback)\n break\n }\n }\n\n private async connect() {\n if (this.retries >= this.maxRetries) {\n throw new Error('WebSocket connection failed after ' + this.maxRetries + ' retries')\n }\n\n const bearerToken = await this.authProvider.getBearerToken()\n\n if (!bearerToken) {\n throw new Error('Cannot obtain JWT for the user')\n }\n\n const socket = isNode\n ? new WebSocketNode(this.url, {\n headers: {\n Authorization: bearerToken,\n },\n })\n : new WebSocket(`${this.url}?jwt=${bearerToken}`)\n\n this.socket = new WebsocketAdapter(socket)\n\n this.socket.on('open', async () => {\n if (this.debug) console.debug('WebSocket connection opened')\n\n this.intervalIds.push(\n setTimeout(() => {\n this.retries = 0\n }, (this.maxRetries + 1) * this.retryDelay)\n )\n\n this.callStatusCallbacks('CONNECTED')\n })\n\n this.socket.on('message', (event: string) => {\n if (this.debug) console.debug('WebSocket message received', event)\n\n // Handle ping messages\n if (event === 'ping') {\n if (this.debug) console.debug('Received ping, sending pong')\n\n this.send('pong')\n this.lastPingReceived = Date.now()\n\n this.intervalIds.push(\n setTimeout(() => {\n if (Date.now() - this.lastPingReceived > this.pingLifetime) {\n console.error(`No ping received in the last ${this.pingLifetime} ms`)\n this.socket?.close()\n }\n }, this.pingLifetime)\n )\n\n return\n }\n\n // Call the message callback for other messages\n try {\n const data = JSON.parse(event)\n this.messageCallback(data)\n } catch (error) {\n console.error('Failed to parse WebSocket message', error)\n }\n })\n\n this.socket.on('close', ({ code, reason }) => {\n if (this.debug) console.debug('WebSocket connection closed', code, reason?.toString())\n\n this.callStatusCallbacks('CLOSED')\n\n this.intervalIds.forEach((id) => clearTimeout(id as number))\n this.intervalIds = []\n\n if (this.closed) {\n return\n }\n\n setTimeout(async () => {\n ++this.retries\n return await this.connect()\n }, this.retryDelay)\n })\n\n this.socket.on('error', async (err) => {\n console.error('WebSocket error', err)\n\n this.callStatusCallbacks('ERROR', err)\n\n if (this.socket) {\n this.socket.close()\n }\n })\n }\n\n private callStatusCallbacks(event: ConnectionStatus, error?: Error) {\n switch (event) {\n case 'CONNECTED':\n case 'CLOSED':\n this.statusCallbacks?.[event]?.forEach((callback) => callback(this))\n break\n case 'ERROR':\n this.statusCallbacks?.ERROR?.forEach((callback) => callback(this, error))\n break\n }\n }\n}\n\ninterface WebSocketAuthProvider {\n getBearerToken(): Promise<string | undefined>\n}\n\nclass WebSocketAuthProviderImpl {\n constructor(private readonly authApi: IccAuthApi) {}\n\n async getBearerToken(): Promise<string | undefined> {\n const headers = await this.authApi.authenticationProvider.getAuthService().getAuthHeaders()\n return headers.find((header) => header.header === 'Authorization' && header.data.startsWith('Bearer '))?.data\n }\n}\n\ntype EventCallback = {\n open: (event: any) => void\n message: (event: string) => void\n close: (event: { code: number; reason: string }) => void\n error: (error: any) => void\n}\n\nenum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nclass WebsocketAdapter {\n constructor(private readonly websocket: WebSocketNode | WebSocket) {}\n\n public get readyState(): number {\n if (this.websocket) {\n if (isNode) {\n switch ((this.websocket as WebSocketNode).readyState) {\n case WebSocketNode.CONNECTING:\n return ReadyState.CONNECTING\n case WebSocketNode.OPEN:\n return ReadyState.OPEN\n case WebSocketNode.CLOSING:\n return ReadyState.CLOSING\n case WebSocketNode.CLOSED:\n return ReadyState.CLOSED\n }\n } else {\n switch ((this.websocket as WebSocket).readyState) {\n case WebSocket.CONNECTING:\n return ReadyState.CONNECTING\n case WebSocket.OPEN:\n return ReadyState.OPEN\n case WebSocket.CLOSING:\n return ReadyState.CLOSING\n case WebSocket.CLOSED:\n return ReadyState.CLOSED\n }\n }\n }\n return ReadyState.CLOSED\n }\n\n /**\n * This is not throwing an error if the websocket is not open, because the purpose of the websocket wrapper is custom to notifications needs (subscribe and ping pong only)\n * If in the future we need to use it for other purposes, we will have to throw an error and update the implementation of ping pong in the notification\n * @param data the data to send\n */\n public send(data: Buffer | ArrayBuffer | string) {\n if (this.websocket && this.readyState === ReadyState.OPEN) {\n this.websocket.send(data)\n }\n }\n\n public close(code?: number, reason?: string) {\n if (this.websocket) {\n this.websocket.close(code, reason)\n }\n }\n\n private onMessage(callback: (event: string) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('message', (x) => callback(x.toString('utf8')))\n } else {\n ;(this.websocket as WebSocket).addEventListener('message', async (event) => {\n let dataAsString: string | undefined\n if (event.type === 'message') {\n dataAsString = event.data\n } else console.error('Unexpected event type: ' + event.type)\n if (!dataAsString) {\n console.error('Failed to parse WebSocket message')\n return\n }\n\n callback(dataAsString)\n })\n }\n } else {\n console.error('Websocket is not defined')\n throw new Error('Websocket is not defined')\n }\n }\n\n private onOpen(callback: (event: any) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('open', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('open', callback)\n }\n }\n }\n\n private onClose(callback: (event: { code: number; reason: string }) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('close', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('close', callback)\n }\n }\n }\n\n private onError(callback: (error: any) => void) {\n if (this.websocket) {\n if (isNode) {\n ;(this.websocket as WebSocketNode).on('error', callback)\n } else {\n ;(this.websocket as WebSocket).addEventListener('error', callback)\n }\n }\n }\n\n public on<K extends keyof EventCallback>(event: K, callback: EventCallback[K]) {\n if (this.websocket) {\n switch (event) {\n case 'message':\n return this.onMessage(callback as EventCallback['message'])\n case 'open':\n return this.onOpen(callback as EventCallback['open'])\n case 'close':\n return this.onClose(callback as EventCallback['close'])\n case 'error':\n return this.onError(callback as EventCallback['error'])\n }\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icure/api",
3
- "version": "8.0.65",
3
+ "version": "8.0.67",
4
4
  "description": "Typescript version of iCure standalone API client",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -81,7 +81,7 @@ const IccExchangeDataApi_1 = require("../../../icc-api/api/internal/IccExchangeD
81
81
  ]);
82
82
  const cryptoStrategies = new TestCryptoStrategies_1.TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys);
83
83
  exchangeDataApi = new FakeExchangeDataApi_1.FakeExchangeDataApi();
84
- baseExchangeData = new BaseExchangeDataManager_1.BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad);
84
+ baseExchangeData = new BaseExchangeDataManager_1.BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false);
85
85
  encryptionKeysManager = yield FakeEncryptionKeysManager_1.FakeEncryptionKeysManager.create(primitives, [selfKeypair]);
86
86
  exchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, cryptoStrategies, dataOwnerApi, primitives, true, optionalParameters);
87
87
  });
@@ -1 +1 @@
1
- {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
1
+ {"version":3,"file":"exchange-data-manager-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/exchange-data-manager-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from 'mocha'\nimport {\n ExchangeDataManager,\n ExchangeDataManagerOptionalParameters,\n initialiseExchangeDataManagerForCurrentDataOwner,\n} from '../../../icc-x-api/crypto/ExchangeDataManager'\nimport { WebCryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { BaseExchangeDataManager } from '../../../icc-x-api/crypto/BaseExchangeDataManager'\nimport { FakeExchangeDataApi } from '../../utils/FakeExchangeDataApi'\nimport { FakeDataOwnerApi } from '../../utils/FakeDataOwnerApi'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { EntityWithDelegationTypeName, ShaVersion, ua2b64, ua2hex } from '../../../icc-x-api'\nimport { FakeEncryptionKeysManager } from '../../utils/FakeEncryptionKeysManager'\nimport { AccessControlSecretUtils } from '../../../icc-x-api/crypto/AccessControlSecretUtils'\nimport { ExchangeData } from '../../../icc-api/model/internal/ExchangeData'\nimport { expect } from 'chai'\nimport { setEquals } from '../../../icc-x-api/utils/collection-utils'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport * as _ from 'lodash'\nimport { fingerprintV1, fingerprintV1toV2, fingerprintV2 } from '../../../icc-x-api/crypto/utils'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../../utils/test_utils'\nimport 'isomorphic-fetch'\nimport { IccExchangeDataApi } from '../../../icc-api/api/internal/IccExchangeDataApi'\n\nsetLocalStorage(fetch)\n\ndescribe('Exchange data manager - unit', async function () {\n const primitives = new WebCryptoPrimitives(webcrypto as any)\n const accessControlSecretUtils = new AccessControlSecretUtils(primitives)\n let selfId: string\n let selfKeyFpV1: string\n let selfKeyFpV2: string\n let selfKeypair: KeyPair<CryptoKey>\n let delegateId: string\n let delegateKeyFp: string\n let delegateKeypair: KeyPair<CryptoKey>\n let delegate2Id: string\n let delegate2KeyFp: string\n let delegate2Keypair: KeyPair<CryptoKey>\n let dataOwnerApi: FakeDataOwnerApi\n let exchangeDataApi: FakeExchangeDataApi\n let baseExchangeData: BaseExchangeDataManager\n let exchangeData: ExchangeDataManager\n let encryptionKeysManager: FakeEncryptionKeysManager\n\n async function initialiseComponents(\n allowFullExchangeDataLoad: boolean,\n optionalParameters: ExchangeDataManagerOptionalParameters & { verifiedDelegateKeys?: Set<string> } = {}\n ) {\n const dataOwnerType = allowFullExchangeDataLoad ? DataOwnerTypeEnum.Patient : DataOwnerTypeEnum.Hcp\n selfId = primitives.randomUuid()\n selfKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n selfKeyFpV1 = fingerprintV1(ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki')))\n selfKeyFpV2 = fingerprintV1toV2(selfKeyFpV1)\n delegateId = primitives.randomUuid()\n delegateKeypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegateKeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki')))\n delegate2Id = primitives.randomUuid()\n delegate2Keypair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n delegate2KeyFp = fingerprintV1(ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki')))\n dataOwnerApi = new FakeDataOwnerApi(\n {\n id: selfId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(selfKeypair.publicKey, 'spki'))],\n },\n [\n {\n id: delegateId,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegateKeypair.publicKey, 'spki'))],\n },\n {\n id: delegate2Id,\n type: dataOwnerType,\n publicKeysForOaepWithSha256: [ua2hex(await primitives.RSA.exportKey(delegate2Keypair.publicKey, 'spki'))],\n },\n ]\n )\n const cryptoStrategies = new TestCryptoStrategies(undefined, undefined, optionalParameters.verifiedDelegateKeys)\n exchangeDataApi = new FakeExchangeDataApi()\n baseExchangeData = new BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, allowFullExchangeDataLoad, false)\n encryptionKeysManager = await FakeEncryptionKeysManager.create(primitives, [selfKeypair])\n exchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n cryptoStrategies,\n dataOwnerApi,\n primitives,\n true,\n optionalParameters\n )\n }\n\n async function checkDataEqual(\n actual: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined } | undefined,\n expected: { exchangeData: ExchangeData; accessControlSecret?: string; exchangeKey: CryptoKey | undefined }\n ) {\n expect(actual).to.not.be.undefined\n expect(_.isEqual(_.omit(expected.exchangeData, ['rev']), _.omit(actual!.exchangeData, ['rev']))).to.equal(\n true,\n `Data should be equivalent\\nExpected: ${JSON.stringify(expected.exchangeData, undefined, 2)}\\nActual: ${JSON.stringify(\n actual!.exchangeData,\n undefined,\n 2\n )}\\n`\n )\n expect(expected.accessControlSecret).to.equal(actual!.accessControlSecret)\n await checkAesKeysEquality(actual!.exchangeKey, expected.exchangeKey)\n }\n\n async function checkAesKeysEquality(actual: CryptoKey | undefined, expected: CryptoKey | undefined) {\n if (!actual && !expected) return\n expect(!actual).to.equal(!expected, !expected ? 'Key should not have been decrypted' : 'Key should have been decrypted')\n expect(ua2hex(await primitives.AES.exportKey(expected!, 'raw'))).to.equal(ua2hex(await primitives.AES.exportKey(actual!, 'raw')))\n }\n\n async function createDataFromRandomToSelf(): Promise<{ exchangeData: ExchangeData; exchangeKey: CryptoKey; accessControlSecret: string }> {\n const encryptionKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const encryptionFp = ua2hex(await primitives.RSA.exportKey(encryptionKey.publicKey, 'spki')).slice(-32)\n const signatureKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha1)\n const signatureFp = ua2hex(await primitives.RSA.exportKey(signatureKey.publicKey, 'spki')).slice(-32)\n const created = await baseExchangeData.createExchangeData(\n selfId,\n { [signatureFp]: signatureKey.privateKey },\n { [encryptionFp]: encryptionKey.publicKey, [selfKeyFpV1]: selfKeypair.publicKey }\n )\n const modified = await exchangeDataApi.modifyExchangeData(\n new ExchangeData({\n ...created.exchangeData,\n delegator: primitives.randomUuid(),\n })\n )\n return { exchangeData: modified, exchangeKey: created.exchangeKey, accessControlSecret: created.accessControlSecret }\n }\n\n async function generateEncryptionKeys(n: number): Promise<{ pair: KeyPair<CryptoKey>; fingerprintV2: string; hexPub: string }[]> {\n return await Promise.all(\n Array(n)\n .fill(null)\n .map(async () => {\n const pair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const hexPub = ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki'))\n const fingerprint = fingerprintV2(hexPub)\n return { pair, fingerprintV2: fingerprint, hexPub }\n })\n )\n }\n\n it('base should be able to retrieve all exchange data for the current data owner if allowed by the crypto strategies', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const expectedData = await Promise.all(\n Array.from(Array(3500), async (_, i) => {\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: i % 2 === 0 ? selfId : primitives.randomUuid(),\n delegator: i % 2 === 0 ? primitives.randomUuid() : selfId,\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n return data\n })\n )\n await Promise.all(\n Array.from(Array(500), async () => {\n // Should not be in result\n const data = new ExchangeData({\n id: primitives.randomUuid(),\n delegate: primitives.randomUuid(),\n delegator: primitives.randomUuid(),\n exchangeKey: { not: 'important' },\n accessControlSecret: { not: 'important' },\n sharedSignatureKey: { not: 'important' },\n delegatorSignature: { not: 'important' },\n sharedSignature: 'not important',\n })\n await exchangeDataApi.createExchangeData(data)\n })\n )\n const retrieved = await baseExchangeData.getAllExchangeDataForCurrentDataOwnerIfAllowed()\n if (allowFullExchangeDataLoad) {\n expect(retrieved).to.not.be.undefined\n expect(retrieved).to.have.length(expectedData.length)\n expect(setEquals(new Set(expectedData.map((x) => x.id)), new Set(retrieved!.map((x) => x.id))), 'Retrieved and expected ids').to.be.true\n } else {\n expect(retrieved).to.be.undefined\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new encryption keys when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const initialisedCount = exchangeDataApi.callCount\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const retrievedCachedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(initialisedCount, {\n createExchangeData: 1,\n // If we could fully preload we already know whether the exchange key already exists or not, otherwise we have to request from the api\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(retrievedCachedData, createdData)\n const decryptedKeyByDelegate = await baseExchangeData.tryDecryptExchangeKeys([createdData.exchangeData], { [delegateKeyFp]: delegateKeypair })\n const decryptedAccessControlSecretByDelegate = await baseExchangeData.tryDecryptAccessControlSecret([createdData.exchangeData], {\n [delegateKeyFp]: delegateKeypair,\n })\n await checkAesKeysEquality(decryptedKeyByDelegate.successfulDecryptions[0], createdData.exchangeKey)\n expect(decryptedAccessControlSecretByDelegate.successfulDecryptions[0]).to.equal(createdData.accessControlSecret)\n expect(retrievedCachedData.exchangeData.delegator).to.equal(selfId)\n expect(retrievedCachedData.exchangeData.delegate).to.equal(delegateId)\n expect(Object.keys(retrievedCachedData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(retrievedCachedData.exchangeData.exchangeKey)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.accessControlSecret)).to.have.length(2)\n expect(Object.keys(retrievedCachedData.exchangeData.sharedSignatureKey)).to.have.length(2)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create encryption keys to self when none is available', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n expect(createdData.exchangeData.delegator).to.equal(selfId)\n expect(createdData.exchangeData.delegate).to.equal(selfId)\n expect(Object.keys(createdData.exchangeData.delegatorSignature)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.sharedSignatureKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.exchangeKey)).to.have.length(1)\n expect(Object.keys(createdData.exchangeData.accessControlSecret)).to.have.length(1)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should ignore unverified keys when creating new exchange data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n const delegateVerifiedKeys = await generateEncryptionKeys(5)\n const extraDelegateUnverifiedKeys = await generateEncryptionKeys(5)\n const extraDelegatorVerifiedKeys = await generateEncryptionKeys(5)\n const delegatorUnverifiedKeys = await generateEncryptionKeys(5)\n await initialiseComponents(allowFullExchangeDataLoad, { verifiedDelegateKeys: new Set(delegateVerifiedKeys.map((x) => x.hexPub)) })\n for (const keyData of [...delegateVerifiedKeys, ...extraDelegateUnverifiedKeys]) {\n await dataOwnerApi.addPublicKeyForOwner(delegateId, keyData.pair)\n }\n for (const keyData of extraDelegatorVerifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, true)\n }\n for (const keyData of delegatorUnverifiedKeys) {\n await dataOwnerApi.addPublicKeyForOwner(selfId, keyData.pair)\n await encryptionKeysManager.addOrUpdateKey(primitives, keyData.pair, false)\n }\n const created = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n expect(\n setEquals(new Set(Object.keys(created.exchangeData.exchangeKey)), new Set(Object.keys(created.exchangeData.accessControlSecret))),\n 'Keys used for encryption of exchange key and access control secret must be the same.'\n ).to.be.true\n expect(\n setEquals(\n new Set(Object.keys(created.exchangeData.exchangeKey)),\n new Set([...delegateVerifiedKeys.map((x) => x.fingerprintV2), ...extraDelegatorVerifiedKeys.map((x) => x.fingerprintV2), selfKeyFpV2])\n ),\n 'Only verified keys of delegate and delegator should be used for encryption of exchange key and access control secret.'\n ).to.be.true\n for (const keyData of [{ pair: selfKeypair, fingerprintV2: selfKeyFpV1 }, ...extraDelegatorVerifiedKeys, ...delegateVerifiedKeys]) {\n await checkAesKeysEquality(\n (\n await baseExchangeData.tryDecryptExchangeKeys([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair })\n ).successfulDecryptions[0],\n created.exchangeKey\n )\n expect(\n (await baseExchangeData.tryDecryptAccessControlSecret([created.exchangeData], { [keyData.fingerprintV2]: keyData.pair }))\n .successfulDecryptions[0]\n ).to.equal(created.accessControlSecret)\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should reuse existing exchange data for encryption when it can be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const reloadedData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 0,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n await checkDataEqual(reloadedData, createdData)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to unavailable verification key', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(_.isEqual(_.omit(createdData.exchangeData, ['rev']), _.omit(newData.exchangeData, ['rev']))).to.equal(\n false,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the encrypted access control secret and/or encrypted exchange key', async function () {\n async function doTest(\n allowFullExchangeDataLoad: boolean,\n tamper: (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) => Promise<ExchangeData>\n ) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const sfk = primitives.randomUuid()\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData(await tamper(createdData.exchangeData, selfKeypair, selfKeyFpV2))\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 1,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 1,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).not.to.equal(\n newData.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newData.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newData.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n }\n const extraKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairFp = fingerprintV2(ua2hex(await primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki')))\n const fakeKey = primitives.randomBytes(16)\n const tamperByChangingEncryptionKey = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingAccessControlSecret = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n new ExchangeData({\n ...exchangeData,\n accessControlSecret: {\n ...exchangeData.accessControlSecret,\n [selfKeyFp]: ua2b64(await primitives.RSA.encrypt(selfKeyPair.publicKey, fakeKey)),\n },\n })\n const tamperByChangingBoth = async (exchangeData: ExchangeData, selfKeyPair: KeyPair<CryptoKey>, selfKeyFp: string) =>\n tamperByChangingEncryptionKey(await tamperByChangingAccessControlSecret(exchangeData, selfKeyPair, selfKeyFp), selfKeyPair, selfKeyFp)\n const tamperByAddingEncryptionKey = async (exchangeData: ExchangeData) =>\n new ExchangeData({\n ...exchangeData,\n exchangeKey: {\n ...exchangeData.exchangeKey,\n [extraKeyPairFp]: ua2b64(await primitives.RSA.encrypt(extraKeyPair.publicKey, fakeKey)),\n },\n })\n await doTest(true, tamperByChangingEncryptionKey)\n await doTest(false, tamperByChangingEncryptionKey)\n await doTest(true, tamperByChangingAccessControlSecret)\n await doTest(false, tamperByChangingAccessControlSecret)\n await doTest(true, tamperByChangingBoth)\n await doTest(false, tamperByChangingBoth)\n await doTest(true, tamperByAddingEncryptionKey)\n await doTest(false, tamperByAddingEncryptionKey)\n })\n\n it('should create new exchange data for encryption when the existing data can not be verified due to tampering of the delegate id', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n // Tamper with exchange data\n await exchangeDataApi.modifyExchangeData({\n ...createdData.exchangeData,\n delegate: delegate2Id,\n })\n await exchangeData.clearOrRepopulateCache()\n const countAfterCacheClear = exchangeDataApi.callCount\n const newDataToDelegate = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const newDataToDelegate2 = await exchangeData.getOrCreateEncryptionDataTo(delegate2Id, false)\n exchangeDataApi.compareCallCountFromBaseline(countAfterCacheClear, {\n createExchangeData: 2,\n getExchangeDataByDelegatorDelegate: allowFullExchangeDataLoad ? 0 : 2,\n modifyExchangeData: 0,\n getExchangeDataByIds: 0,\n getExchangeDataByParticipant: 0,\n })\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate'\n )\n expect(createdData.exchangeData.id).to.not.equal(\n newDataToDelegate2.exchangeData.id,\n 'Exchange data manager should have created new exchange data for encryption to delegate 2'\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate.exchangeKey, 'raw'))\n )\n expect(ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))).to.not.equal(\n ua2hex(await primitives.AES.exportKey(newDataToDelegate2.exchangeKey, 'raw'))\n )\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate.accessControlSecret)\n expect(createdData.accessControlSecret).to.not.equal(newDataToDelegate2.accessControlSecret)\n const updatedUnverifiedOldData = (await exchangeData.getDecryptionDataKeyByIds([createdData.exchangeData.id!], true))[\n createdData.exchangeData.id!\n ]\n expect(updatedUnverifiedOldData).to.not.be.undefined\n expect(ua2hex(await primitives.AES.exportKey(updatedUnverifiedOldData!.exchangeKey!, 'raw'))).to.equal(\n ua2hex(await primitives.AES.exportKey(createdData.exchangeKey, 'raw'))\n )\n expect(updatedUnverifiedOldData!.accessControlSecret).to.equal(createdData.accessControlSecret)\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('should return existing exchange data keys for decryption even if the data authenticity could not be verified', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdData2 = await createDataFromRandomToSelf()\n await encryptionKeysManager.unverifyExistingKeysAndCreateNewVerified(primitives)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData1.exchangeData.id!], true)\n )[createdData1.exchangeData.id!],\n createdData1\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('newly created data or data retrieved by id should be cached and retrievable by hash', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdData1 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const hashes1 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData1.accessControlSecret)\n const retrievedKeys1 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash(hashes1)\n for (const hash of hashes1) {\n await checkDataEqual(retrievedKeys1[hash], createdData1)\n }\n if (!allowFullExchangeDataLoad) {\n const createdData2 = await createDataFromRandomToSelf()\n const hashes2 = await accessControlSecretUtils.allSecureDelegationKeysFor(createdData2.accessControlSecret)\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdData2.exchangeData.id!], true)\n )[createdData2.exchangeData.id!],\n createdData2\n )\n const retrievedKeys2 = await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...hashes1, ...hashes2])\n for (const hash of hashes2) {\n await checkDataEqual(retrievedKeys2[hash], createdData2)\n }\n }\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('if data can not be decrypted the retrieval method should return undefined', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n await dataOwnerApi.addPublicKeyForOwner(selfId, newKey)\n // Simulate loss of key\n encryptionKeysManager.deleteKey(selfKeyFpV1)\n await encryptionKeysManager.addOrUpdateKey(primitives, newKey, true)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true))[createdBySelf.exchangeData.id!], {\n exchangeData: createdBySelf.exchangeData,\n exchangeKey: undefined,\n })\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true))[createdByOther.exchangeData.id!], {\n exchangeData: createdByOther.exchangeData,\n exchangeKey: undefined,\n })\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('unverified keys should still be usable for decryption of data', async function () {\n async function doTest(allowFullExchangeDataLoad: boolean) {\n await initialiseComponents(allowFullExchangeDataLoad)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n await encryptionKeysManager.addOrUpdateKey(primitives, selfKeypair, false)\n await exchangeData.clearOrRepopulateCache()\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], true)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await exchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], true)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n }\n await doTest(true)\n await doTest(false)\n })\n\n it('implementation with limited cache should trigger eviction of delegate and hash cache on eviction of data by id cache', async function () {\n await initialiseComponents(false, { lruCacheSize: 3 })\n const entityType = EntityWithDelegationTypeName.Contact\n const sfks = [primitives.randomUuid(), primitives.randomUuid(), primitives.randomUuid()]\n\n async function verifyCached(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = await accessControlSecretUtils.allSecureDelegationKeysFor(data.accessControlSecret)\n for (const hash of hashes) {\n await checkDataEqual((await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))[hash], data)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n }\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n\n async function verifyNotCachedThenCache(data: { exchangeData: ExchangeData; accessControlSecret: string; exchangeKey: CryptoKey }) {\n const apiCallsBaseline = exchangeDataApi.callCount\n const hashes = [await accessControlSecretUtils.secureDelegationKeyFor(data.accessControlSecret, entityType)]\n for (const hash of hashes) {\n expect(Object.keys(await exchangeData.getCachedDecryptionDataKeyByAccessControlHash([hash]))).to.have.length(0)\n }\n if (data.exchangeData.delegator === selfId) {\n await checkDataEqual(await exchangeData.getOrCreateEncryptionDataTo(data.exchangeData.delegate, false), data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 1,\n })\n } else {\n await checkDataEqual((await exchangeData.getDecryptionDataKeyByIds([data.exchangeData.id!], true))[data.exchangeData.id!], data)\n exchangeDataApi.compareCallCountFromBaseline(apiCallsBaseline, {\n getExchangeDataByIds: 1,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n }\n }\n\n const createdBySelf1 = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdBySelf2 = await exchangeData.getOrCreateEncryptionDataTo(delegateId, false)\n const createdByOther1 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n const createdByOther2 = await createDataFromRandomToSelf() // Not automatically cached: created by someone else\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyNotCachedThenCache(createdBySelf1)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n await verifyCached(createdBySelf1)\n await verifyNotCachedThenCache(createdBySelf2)\n await verifyCached(createdByOther2)\n // noinspection DuplicatedCode\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyNotCachedThenCache(createdByOther1)\n await verifyCached(createdBySelf1)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyNotCachedThenCache(createdByOther2)\n await verifyCached(createdBySelf2)\n await verifyCached(createdByOther1)\n await verifyCached(createdByOther2)\n })\n\n it('implementation with unlimited cache should preload all existing exchange data on creation', async function () {\n await initialiseComponents(true)\n const createdBySelf = await exchangeData.getOrCreateEncryptionDataTo(selfId, false)\n const createdByOther = await createDataFromRandomToSelf()\n const recreatedExchangeData = await initialiseExchangeDataManagerForCurrentDataOwner(\n baseExchangeData,\n encryptionKeysManager,\n accessControlSecretUtils,\n new TestCryptoStrategies(),\n dataOwnerApi,\n primitives,\n true\n )\n const apiCallsAfterCreation = exchangeDataApi.callCount\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdBySelf.exchangeData.id!], false)\n )[createdBySelf.exchangeData.id!],\n createdBySelf\n )\n await checkDataEqual(\n (\n await recreatedExchangeData.getDecryptionDataKeyByIds([createdByOther.exchangeData.id!], false)\n )[createdByOther.exchangeData.id!],\n createdByOther\n )\n exchangeDataApi.compareCallCountFromBaseline(apiCallsAfterCreation, {\n getExchangeDataByIds: 0,\n createExchangeData: 0,\n modifyExchangeData: 0,\n getExchangeDataByParticipant: 0,\n getExchangeDataByDelegatorDelegate: 0,\n })\n })\n})\n\nlet env: TestVars\n\ndescribe('Exchange data manager - e2e', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('give access back should not invalidate existing and valid exchange data', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.equal(ed1to2.exchangeData.id)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed2to1.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd2to1.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd2to1.exchangeData.sharedSignatureKey).length)\n expect(updatedEd2to1.exchangeData.id).to.equal(ed2to1.exchangeData.id)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.be.greaterThan(Object.keys(ed1to2.exchangeData.exchangeKey).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.accessControlSecret).length)\n expect(Object.keys(updatedEd1to2.exchangeData.exchangeKey).length).to.equal(Object.keys(updatedEd1to2.exchangeData.sharedSignatureKey).length)\n })\n\n it('invalid exchange data should not be re-validated by give access back', async function () {\n const hcp1Details = await createNewHcpApi(env)\n const hcp2Details = await createNewHcpApi(env)\n const ed1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const ed2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const exchangeDataApi = new IccExchangeDataApi(env.iCureUrl, {}, hcp1Details.api.authApi.authenticationProvider, fetch)\n const extraKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const extraKeyPairPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(extraKeyPair.publicKey, 'spki'))\n const extraKeyPairFp = fingerprintV2(extraKeyPairPub)\n const fakeData = await hcp1Details.api.cryptoApi.primitives.randomBytes(16)\n async function tamperWithData(data: ExchangeData) {\n await exchangeDataApi.modifyExchangeData({\n ...data,\n exchangeKey: {\n ...data.exchangeKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n accessControlSecret: {\n ...data.accessControlSecret,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n sharedSignatureKey: {\n ...data.sharedSignatureKey,\n [extraKeyPairFp]: ua2b64(await hcp1Details.api.cryptoApi.primitives.RSA.encrypt(extraKeyPair.publicKey, fakeData)),\n },\n })\n }\n await tamperWithData(ed1to2.exchangeData)\n await tamperWithData(ed2to1.exchangeData)\n const newKeyPair = await hcp1Details.api.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const exportedPub = ua2hex(await hcp1Details.api.cryptoApi.primitives.RSA.exportKey(newKeyPair.publicKey, 'spki'))\n const hcp2 = await hcp2Details.api.healthcarePartyApi.getHealthcareParty(hcp2Details.credentials.dataOwnerId)\n await hcp2Details.api.healthcarePartyApi.modifyHealthcareParty({\n ...hcp2,\n publicKeysForOaepWithSha256: [...hcp2.publicKeysForOaepWithSha256, exportedPub, extraKeyPairPub],\n })\n await hcp1Details.api.cryptoApi.exchangeData.giveAccessBackTo(hcp2Details.credentials.dataOwnerId, exportedPub)\n await hcp1Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n await hcp2Details.api.cryptoApi.exchangeData.clearOrRepopulateCache()\n const updatedEd1to2 = await hcp1Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp2Details.credentials.dataOwnerId, false)\n const updatedEd2to1 = await hcp2Details.api.cryptoApi.exchangeData.getOrCreateEncryptionDataTo(hcp1Details.credentials.dataOwnerId, false)\n expect(updatedEd1to2.exchangeData.id).to.not.equal(ed1to2.exchangeData.id)\n expect(updatedEd2to1.exchangeData.id).to.not.equal(ed2to1.exchangeData.id)\n const decData1to2 = (await hcp1Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed1to2.exchangeData.id!], true))[\n ed1to2.exchangeData.id!\n ]\n expect(decData1to2).to.not.be.undefined\n expect(decData1to2!.exchangeKey).to.not.be.undefined\n expect(decData1to2!.accessControlSecret).to.not.be.undefined\n const decData2to1 = (await hcp2Details.api.cryptoApi.exchangeData.getDecryptionDataKeyByIds([ed2to1.exchangeData.id!], true))[\n ed2to1.exchangeData.id!\n ]\n expect(decData2to1).to.not.be.undefined\n expect(decData2to1!.exchangeKey).to.not.be.undefined\n expect(decData2to1!.accessControlSecret).to.not.be.undefined\n })\n})\n"]}
@@ -72,7 +72,7 @@ var EntryUpdateTypeEnum = EntitySharedMetadataUpdateRequest_1.EntitySharedMetada
72
72
  const exchangeDataApi = new FakeExchangeDataApi_1.FakeExchangeDataApi();
73
73
  accessControlSecretUtils = new AccessControlSecretUtils_1.AccessControlSecretUtils(primitives);
74
74
  const encryptionKeysManager = yield FakeEncryptionKeysManager_1.FakeEncryptionKeysManager.create(primitives, [selfKeypair]);
75
- const baseExchangeData = new BaseExchangeDataManager_1.BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, !explicitSelf);
75
+ const baseExchangeData = new BaseExchangeDataManager_1.BaseExchangeDataManager(exchangeDataApi, dataOwnerApi, primitives, !explicitSelf, false);
76
76
  exchangeData = yield (0, ExchangeDataManager_1.initialiseExchangeDataManagerForCurrentDataOwner)(baseExchangeData, encryptionKeysManager, accessControlSecretUtils, cryptoStrategies, dataOwnerApi, primitives, true);
77
77
  exchangeDataMapManager = new FakeExchangeDataMapManager_1.FakeExchangeDataMapManager();
78
78
  secureDelegationsEncryption = new SecureDelegationsEncryption_1.SecureDelegationsEncryption(encryptionKeysManager, primitives);