@icure/api 7.0.0-beta.4 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/icc-api/api/IccDocumentApi.d.ts +6 -4
- package/icc-api/api/IccDocumentApi.js +8 -5
- package/icc-api/api/IccDocumentApi.js.map +1 -1
- package/icc-api/model/Address.d.ts +6 -0
- package/icc-api/model/Address.js.map +1 -1
- package/icc-api/model/Annotation.d.ts +18 -0
- package/icc-api/model/Annotation.js.map +1 -1
- package/icc-api/model/Connection.d.ts +16 -0
- package/icc-api/model/Connection.js +38 -0
- package/icc-api/model/Connection.js.map +1 -0
- package/icc-api/model/Content.js +1 -1
- package/icc-api/model/Content.js.map +1 -1
- package/icc-api/model/CryptoActorStub.d.ts +5 -0
- package/icc-api/model/CryptoActorStub.js +1 -0
- package/icc-api/model/CryptoActorStub.js.map +1 -1
- package/icc-api/model/Delegation.d.ts +3 -0
- package/icc-api/model/Delegation.js.map +1 -1
- package/icc-api/model/HealthElement.d.ts +6 -0
- package/icc-api/model/HealthElement.js.map +1 -1
- package/icc-api/model/HealthcareParty.js +1 -1
- package/icc-api/model/HealthcareParty.js.map +1 -1
- package/icc-api/model/ISO639_1.d.ts +8 -0
- package/icc-api/model/ISO639_1.js +3 -0
- package/icc-api/model/ISO639_1.js.map +1 -0
- package/icc-api/model/Patient.d.ts +7 -0
- package/icc-api/model/Patient.js +1 -1
- package/icc-api/model/Patient.js.map +1 -1
- package/icc-api/model/models.d.ts +2 -0
- package/icc-api/model/models.js +1 -0
- package/icc-api/model/models.js.map +1 -1
- package/icc-x-api/crypto/EntitiesEncryption.d.ts +2 -1
- package/icc-x-api/crypto/EntitiesEncryption.js +13 -11
- package/icc-x-api/crypto/EntitiesEncryption.js.map +1 -1
- package/icc-x-api/filters/filters.d.ts +4 -0
- package/icc-x-api/filters/filters.js +4 -0
- package/icc-x-api/filters/filters.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.d.ts +1 -1
- package/icc-x-api/icc-accesslog-x-api.js +9 -21
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.d.ts +1 -1
- package/icc-x-api/icc-calendar-item-x-api.js +9 -18
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-classification-x-api.js +6 -17
- package/icc-x-api/icc-classification-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.d.ts +30 -2
- package/icc-x-api/icc-contact-x-api.js +82 -96
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-device-x-api.d.ts +17 -0
- package/icc-x-api/icc-device-x-api.js +35 -0
- package/icc-x-api/icc-device-x-api.js.map +1 -0
- package/icc-x-api/icc-doctemplate-x-api.js +2 -13
- package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.d.ts +12 -4
- package/icc-x-api/icc-document-x-api.js +22 -23
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.js +6 -15
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-hcparty-x-api.d.ts +9 -2
- package/icc-x-api/icc-hcparty-x-api.js +9 -1
- package/icc-x-api/icc-hcparty-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.d.ts +12 -3
- package/icc-x-api/icc-helement-x-api.js +19 -19
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-invoice-x-api.js +6 -17
- package/icc-x-api/icc-invoice-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.d.ts +12 -2
- package/icc-x-api/icc-maintenance-task-x-api.js +17 -13
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-message-x-api.js +6 -16
- package/icc-x-api/icc-message-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.d.ts +12 -3
- package/icc-x-api/icc-patient-x-api.js +21 -18
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.js +5 -15
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/icc-time-table-x-api.js +5 -15
- package/icc-x-api/icc-time-table-x-api.js.map +1 -1
- package/icc-x-api/icc-user-x-api.d.ts +10 -1
- package/icc-x-api/icc-user-x-api.js +8 -1
- package/icc-x-api/icc-user-x-api.js.map +1 -1
- package/icc-x-api/index.d.ts +110 -4
- package/icc-x-api/index.js +17 -15
- package/icc-x-api/index.js.map +1 -1
- package/icc-x-api/utils/crypto-utils.d.ts +140 -11
- package/icc-x-api/utils/crypto-utils.js +285 -36
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/icc-x-api/utils/index.d.ts +1 -0
- package/icc-x-api/utils/index.js +1 -0
- package/icc-x-api/utils/index.js.map +1 -1
- package/icc-x-api/utils/websocket.d.ts +61 -0
- package/icc-x-api/utils/websocket.js +351 -0
- package/icc-x-api/utils/websocket.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var _a;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.WebSocketWrapper = exports.subscribeToEntityEvents = void 0;
|
|
14
|
+
const WebSocketNode = require("ws");
|
|
15
|
+
const loglevel_1 = require("loglevel");
|
|
16
|
+
const browser_or_node_1 = require("browser-or-node");
|
|
17
|
+
loglevel_1.default.setLevel((_a = process.env.WEBSOCKET_LOG_LEVEL) !== null && _a !== void 0 ? _a : 'info');
|
|
18
|
+
function subscribeToEntityEvents(basePath, authApi, entityClass, eventTypes, filter, eventFired, options = {}, decryptor) {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
const config = {
|
|
21
|
+
User: {
|
|
22
|
+
qualifiedName: 'org.taktik.icure.entities.User',
|
|
23
|
+
decryptor: (data) => Promise.resolve(data),
|
|
24
|
+
},
|
|
25
|
+
Patient: {
|
|
26
|
+
qualifiedName: 'org.taktik.icure.entities.Patient',
|
|
27
|
+
decryptor: (data) => decryptor(data),
|
|
28
|
+
},
|
|
29
|
+
Service: {
|
|
30
|
+
qualifiedName: 'org.taktik.icure.entities.embed.Service',
|
|
31
|
+
decryptor: (data) => decryptor(data),
|
|
32
|
+
},
|
|
33
|
+
HealthElement: {
|
|
34
|
+
qualifiedName: 'org.taktik.icure.entities.HealthElement',
|
|
35
|
+
decryptor: (data) => decryptor(data),
|
|
36
|
+
},
|
|
37
|
+
MaintenanceTask: {
|
|
38
|
+
qualifiedName: 'org.taktik.icure.entities.MaintenanceTask',
|
|
39
|
+
decryptor: (data) => decryptor(data),
|
|
40
|
+
},
|
|
41
|
+
HealthcareParty: {
|
|
42
|
+
qualifiedName: 'org.taktik.icure.entities.HealthcareParty',
|
|
43
|
+
decryptor: (data) => Promise.resolve(data),
|
|
44
|
+
},
|
|
45
|
+
Device: {
|
|
46
|
+
qualifiedName: 'org.taktik.icure.entities.Device',
|
|
47
|
+
decryptor: (data) => Promise.resolve(data),
|
|
48
|
+
},
|
|
49
|
+
Contact: {
|
|
50
|
+
qualifiedName: 'org.taktik.icure.entities.Contact',
|
|
51
|
+
decryptor: (data) => decryptor(data),
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
return WebSocketWrapper.create(basePath.replace('http', 'ws').replace('rest', 'ws') + '/notification/subscribe', new WebSocketAuthProviderImpl(authApi), (_a = options.connectionMaxRetry) !== null && _a !== void 0 ? _a : 5, (_b = options.connectionRetryIntervalMs) !== null && _b !== void 0 ? _b : 1000, {
|
|
55
|
+
CONNECTED: [
|
|
56
|
+
(ws) => __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const subscription = {
|
|
58
|
+
eventTypes,
|
|
59
|
+
entityClass: config[entityClass].qualifiedName,
|
|
60
|
+
filter: { filter }
|
|
61
|
+
};
|
|
62
|
+
ws.send(JSON.stringify(subscription));
|
|
63
|
+
}),
|
|
64
|
+
],
|
|
65
|
+
}, (data) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
try {
|
|
67
|
+
yield config[entityClass].decryptor(data).then((o) => eventFired(o));
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
loglevel_1.default.error(e);
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
exports.subscribeToEntityEvents = subscribeToEntityEvents;
|
|
75
|
+
class WebSocketWrapper {
|
|
76
|
+
constructor(url, authProvider, maxRetries = 3, retryDelay = 1000, statusCallbacks = {}, messageCallback = () => {
|
|
77
|
+
}) {
|
|
78
|
+
this.url = url;
|
|
79
|
+
this.authProvider = authProvider;
|
|
80
|
+
this.maxRetries = maxRetries;
|
|
81
|
+
this.retryDelay = retryDelay;
|
|
82
|
+
this.statusCallbacks = statusCallbacks;
|
|
83
|
+
this.messageCallback = messageCallback;
|
|
84
|
+
this.pingLifetime = 20000;
|
|
85
|
+
this.socket = null;
|
|
86
|
+
this.retries = 0;
|
|
87
|
+
this.closed = false;
|
|
88
|
+
this.lastPingReceived = Date.now();
|
|
89
|
+
this.intervalIds = [];
|
|
90
|
+
this.methodPath = new URL(url).pathname;
|
|
91
|
+
}
|
|
92
|
+
static create(url, authProvider, maxRetries, retryDelay, statusCallbacks, messageCallback) {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
const ws = new WebSocketWrapper(url, authProvider, maxRetries, retryDelay, statusCallbacks, messageCallback);
|
|
95
|
+
yield ws.connect();
|
|
96
|
+
return ws;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
send(data) {
|
|
100
|
+
if (this.socket && this.socket.readyState === ReadyState.OPEN) {
|
|
101
|
+
this.socket.send(data);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
close() {
|
|
105
|
+
if (this.socket) {
|
|
106
|
+
this.closed = true;
|
|
107
|
+
this.socket.close(1000, 'Client closed connection');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
addStatusCallback(status, callback) {
|
|
111
|
+
var _a, _b, _c, _d;
|
|
112
|
+
switch (status) {
|
|
113
|
+
case 'CONNECTED':
|
|
114
|
+
case 'CLOSED':
|
|
115
|
+
if (!this.statusCallbacks[status])
|
|
116
|
+
this.statusCallbacks[status] = [];
|
|
117
|
+
(_b = (_a = this.statusCallbacks) === null || _a === void 0 ? void 0 : _a[status]) === null || _b === void 0 ? void 0 : _b.push(callback);
|
|
118
|
+
break;
|
|
119
|
+
case 'ERROR':
|
|
120
|
+
(_d = (_c = this.statusCallbacks) === null || _c === void 0 ? void 0 : _c.ERROR) === null || _d === void 0 ? void 0 : _d.push(callback);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
connect() {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
if (this.retries >= this.maxRetries) {
|
|
127
|
+
throw new Error('WebSocket connection failed after ' + this.maxRetries + ' retries');
|
|
128
|
+
}
|
|
129
|
+
const bearerToken = yield this.authProvider.getBearerToken();
|
|
130
|
+
const socket = browser_or_node_1.isNode && !!bearerToken ? new WebSocketNode(this.url, {
|
|
131
|
+
headers: {
|
|
132
|
+
Authorization: bearerToken,
|
|
133
|
+
},
|
|
134
|
+
})
|
|
135
|
+
: yield this.authProvider.getIcureOtt(this.methodPath).then((icureOttToken) => {
|
|
136
|
+
const address = `${this.url};tokenid=${icureOttToken}`;
|
|
137
|
+
return browser_or_node_1.isNode ? new WebSocketNode(address) : new WebSocket(address);
|
|
138
|
+
});
|
|
139
|
+
this.socket = new WebsocketAdapter(socket);
|
|
140
|
+
this.socket.on('open', () => __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
loglevel_1.default.debug('WebSocket connection opened');
|
|
142
|
+
this.intervalIds.push(setTimeout(() => {
|
|
143
|
+
this.retries = 0;
|
|
144
|
+
}, (this.maxRetries + 1) * this.retryDelay));
|
|
145
|
+
this.callStatusCallbacks('CONNECTED');
|
|
146
|
+
}));
|
|
147
|
+
this.socket.on('message', (event) => {
|
|
148
|
+
loglevel_1.default.debug('WebSocket message received', event);
|
|
149
|
+
// Handle ping messages
|
|
150
|
+
if (event === 'ping') {
|
|
151
|
+
loglevel_1.default.debug('Received ping, sending pong');
|
|
152
|
+
this.send('pong');
|
|
153
|
+
this.lastPingReceived = Date.now();
|
|
154
|
+
this.intervalIds.push(setTimeout(() => {
|
|
155
|
+
var _a;
|
|
156
|
+
if (Date.now() - this.lastPingReceived > this.pingLifetime) {
|
|
157
|
+
loglevel_1.default.error(`No ping received in the last ${this.pingLifetime} ms`);
|
|
158
|
+
(_a = this.socket) === null || _a === void 0 ? void 0 : _a.close();
|
|
159
|
+
}
|
|
160
|
+
}, this.pingLifetime));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Call the message callback for other messages
|
|
164
|
+
try {
|
|
165
|
+
const data = JSON.parse(event);
|
|
166
|
+
this.messageCallback(data);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
loglevel_1.default.error('Failed to parse WebSocket message', error);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
this.socket.on('close', ({ code, reason }) => {
|
|
173
|
+
loglevel_1.default.debug('WebSocket connection closed', code, reason === null || reason === void 0 ? void 0 : reason.toString());
|
|
174
|
+
this.callStatusCallbacks('CLOSED');
|
|
175
|
+
this.intervalIds.forEach((id) => clearTimeout(id));
|
|
176
|
+
this.intervalIds = [];
|
|
177
|
+
if (this.closed) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
181
|
+
++this.retries;
|
|
182
|
+
return yield this.connect();
|
|
183
|
+
}), this.retryDelay);
|
|
184
|
+
});
|
|
185
|
+
this.socket.on('error', (err) => __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
loglevel_1.default.error('WebSocket error', err);
|
|
187
|
+
this.callStatusCallbacks('ERROR', err);
|
|
188
|
+
if (this.socket) {
|
|
189
|
+
this.socket.close();
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
callStatusCallbacks(event, error) {
|
|
195
|
+
var _a, _b, _c, _d;
|
|
196
|
+
switch (event) {
|
|
197
|
+
case 'CONNECTED':
|
|
198
|
+
case 'CLOSED':
|
|
199
|
+
(_b = (_a = this.statusCallbacks) === null || _a === void 0 ? void 0 : _a[event]) === null || _b === void 0 ? void 0 : _b.forEach((callback) => callback(this));
|
|
200
|
+
break;
|
|
201
|
+
case 'ERROR':
|
|
202
|
+
(_d = (_c = this.statusCallbacks) === null || _c === void 0 ? void 0 : _c.ERROR) === null || _d === void 0 ? void 0 : _d.forEach((callback) => callback(this, error));
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.WebSocketWrapper = WebSocketWrapper;
|
|
208
|
+
class WebSocketAuthProviderImpl {
|
|
209
|
+
constructor(authApi) {
|
|
210
|
+
this.authApi = authApi;
|
|
211
|
+
}
|
|
212
|
+
getBearerToken() {
|
|
213
|
+
var _a;
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
const headers = yield this.authApi.authenticationProvider.getAuthService().getAuthHeaders();
|
|
216
|
+
return (_a = headers.find((header) => header.header === 'Authorization' && header.data.startsWith('Bearer '))) === null || _a === void 0 ? void 0 : _a.data;
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
getIcureOtt(icureMethodPath) {
|
|
220
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
221
|
+
return yield this.authApi.token('GET', icureMethodPath);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
var ReadyState;
|
|
226
|
+
(function (ReadyState) {
|
|
227
|
+
ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING";
|
|
228
|
+
ReadyState[ReadyState["OPEN"] = 1] = "OPEN";
|
|
229
|
+
ReadyState[ReadyState["CLOSING"] = 2] = "CLOSING";
|
|
230
|
+
ReadyState[ReadyState["CLOSED"] = 3] = "CLOSED";
|
|
231
|
+
})(ReadyState || (ReadyState = {}));
|
|
232
|
+
class WebsocketAdapter {
|
|
233
|
+
constructor(websocket) {
|
|
234
|
+
this.websocket = websocket;
|
|
235
|
+
}
|
|
236
|
+
get readyState() {
|
|
237
|
+
if (this.websocket) {
|
|
238
|
+
if (browser_or_node_1.isNode) {
|
|
239
|
+
switch (this.websocket.readyState) {
|
|
240
|
+
case WebSocketNode.CONNECTING:
|
|
241
|
+
return ReadyState.CONNECTING;
|
|
242
|
+
case WebSocketNode.OPEN:
|
|
243
|
+
return ReadyState.OPEN;
|
|
244
|
+
case WebSocketNode.CLOSING:
|
|
245
|
+
return ReadyState.CLOSING;
|
|
246
|
+
case WebSocketNode.CLOSED:
|
|
247
|
+
return ReadyState.CLOSED;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
switch (this.websocket.readyState) {
|
|
252
|
+
case WebSocket.CONNECTING:
|
|
253
|
+
return ReadyState.CONNECTING;
|
|
254
|
+
case WebSocket.OPEN:
|
|
255
|
+
return ReadyState.OPEN;
|
|
256
|
+
case WebSocket.CLOSING:
|
|
257
|
+
return ReadyState.CLOSING;
|
|
258
|
+
case WebSocket.CLOSED:
|
|
259
|
+
return ReadyState.CLOSED;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return ReadyState.CLOSED;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 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)
|
|
267
|
+
* 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
|
|
268
|
+
* @param data the data to send
|
|
269
|
+
*/
|
|
270
|
+
send(data) {
|
|
271
|
+
if (this.websocket && this.readyState === ReadyState.OPEN) {
|
|
272
|
+
this.websocket.send(data);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
close(code, reason) {
|
|
276
|
+
if (this.websocket) {
|
|
277
|
+
this.websocket.close(code, reason);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
onMessage(callback) {
|
|
281
|
+
if (this.websocket) {
|
|
282
|
+
if (browser_or_node_1.isNode) {
|
|
283
|
+
this.websocket.on('message', (x) => callback(x.toString('utf8')));
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.websocket.addEventListener('message', (event) => __awaiter(this, void 0, void 0, function* () {
|
|
287
|
+
let dataAsString;
|
|
288
|
+
if (event.type === 'message') {
|
|
289
|
+
dataAsString = event.data;
|
|
290
|
+
}
|
|
291
|
+
else
|
|
292
|
+
loglevel_1.default.error("Unexpected event type: " + event.type);
|
|
293
|
+
if (!dataAsString) {
|
|
294
|
+
loglevel_1.default.error("Failed to parse WebSocket message");
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
callback(dataAsString);
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
loglevel_1.default.error("Websocket is not defined");
|
|
303
|
+
throw new Error('Websocket is not defined');
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
onOpen(callback) {
|
|
307
|
+
if (this.websocket) {
|
|
308
|
+
if (browser_or_node_1.isNode) {
|
|
309
|
+
this.websocket.on('open', callback);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
this.websocket.addEventListener('open', callback);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
onClose(callback) {
|
|
317
|
+
if (this.websocket) {
|
|
318
|
+
if (browser_or_node_1.isNode) {
|
|
319
|
+
this.websocket.on('close', callback);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
this.websocket.addEventListener('close', callback);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
onError(callback) {
|
|
327
|
+
if (this.websocket) {
|
|
328
|
+
if (browser_or_node_1.isNode) {
|
|
329
|
+
this.websocket.on('error', callback);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
this.websocket.addEventListener('error', callback);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
on(event, callback) {
|
|
337
|
+
if (this.websocket) {
|
|
338
|
+
switch (event) {
|
|
339
|
+
case 'message':
|
|
340
|
+
return this.onMessage(callback);
|
|
341
|
+
case 'open':
|
|
342
|
+
return this.onOpen(callback);
|
|
343
|
+
case 'close':
|
|
344
|
+
return this.onClose(callback);
|
|
345
|
+
case 'error':
|
|
346
|
+
return this.onError(callback);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +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 log, {LogLevelDesc} from 'loglevel'\nimport {Patient} from \"../../icc-api/model/Patient\"\nimport {AbstractFilter} from \"../filters/filters\"\nimport {User} from \"../../icc-api/model/User\"\nimport {isBrowser, 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\"\n\nexport type EventTypes = 'CREATE' | 'UPDATE' | 'DELETE'\ntype Subscribable = 'Patient' | 'Service' | 'User' | 'HealthElement' | 'MaintenanceTask' | 'HealthcareParty' | 'Device' | 'Contact'\ntype SubscribableEntity = Patient | Service | User | HealthElement | MaintenanceTask | HealthcareParty | Device | Contact\ntype SubscriptionOptions = {\n connectionMaxRetry?: number\n connectionRetryIntervalMs?: number\n}\n\nlog.setLevel((process.env.WEBSOCKET_LOG_LEVEL as LogLevelDesc) ?? 'info')\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: Service) => Promise<Service>\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: '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(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) =>\n decryptor!(data as HealthElement as T),\n },\n MaintenanceTask: {\n qualifiedName: 'org.taktik.icure.entities.MaintenanceTask',\n decryptor: (data: MaintenanceTask) =>\n decryptor!(data as MaintenanceTask as T),\n },\n HealthcareParty: {\n qualifiedName: 'org.taktik.icure.entities.HealthcareParty',\n decryptor: (data: HealthcareParty) =>\n Promise.resolve(data as HealthcareParty as T),\n },\n Device: {\n qualifiedName: 'org.taktik.icure.entities.Device',\n decryptor: (data: Device) =>\n Promise.resolve(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 log.error(e)\n }\n }\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 }\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 ): Promise<WebSocketWrapper> {\n const ws = new WebSocketWrapper(url, authProvider, maxRetries, retryDelay, statusCallbacks, messageCallback)\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 = isNode && !!bearerToken ? 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 log.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 log.debug('WebSocket message received', event)\n\n // Handle ping messages\n if (event === 'ping') {\n log.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 log.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 log.error('Failed to parse WebSocket message', error)\n }\n })\n\n this.socket.on('close', ({code, reason}) => {\n log.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 log.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\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(\n private readonly websocket: WebSocketNode | WebSocket,\n ) {\n }\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 log.error(\"Unexpected event type: \" + event.type)\n if (!dataAsString) {\n log.error(\"Failed to parse WebSocket message\")\n return\n }\n\n callback(dataAsString)\n })\n }\n }\n else {\n log.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\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,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@icure/api",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"description": "Typescript version of iCure standalone API client",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
|
+
"browser-or-node": "^2.1.1",
|
|
8
9
|
"date-fns": "^2.23.0",
|
|
9
10
|
"libphonenumber-js": "^1.7.18",
|
|
10
11
|
"lodash": "^4.17.21",
|
|
12
|
+
"loglevel": "^1.8.1",
|
|
11
13
|
"moment": "^2.22.1",
|
|
12
14
|
"text-encoding": "^0.7.0",
|
|
13
15
|
"uuid": "^8.3.2",
|
|
14
|
-
"uuid-encoder": "^1.1.0"
|
|
16
|
+
"uuid-encoder": "^1.1.0",
|
|
17
|
+
"ws": "^8.13.0"
|
|
15
18
|
},
|
|
16
19
|
"author": "Taktik sa - B12 Consulting",
|
|
17
20
|
"license": "MIT",
|