@icure/api 8.0.67 → 8.0.68

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.
@@ -144,7 +144,7 @@ class WebSocketWrapper {
144
144
  Authorization: bearerToken,
145
145
  },
146
146
  })
147
- : new WebSocket(`${this.url}?jwt=${bearerToken}`);
147
+ : new WebSocket(`${this.url}?jwt=${bearerToken.slice(7) /* "Bearer ".length */}`);
148
148
  this.socket = new WebsocketAdapter(socket);
149
149
  this.socket.on('open', () => __awaiter(this, void 0, void 0, function* () {
150
150
  if (this.debug)
@@ -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 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"]}
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 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.slice(7) /* \"Bearer \".length */ }`)\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.67",
3
+ "version": "8.0.68",
4
4
  "description": "Typescript version of iCure standalone API client",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",