@simplysm/service-client 13.0.69 → 13.0.70
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/README.md +28 -620
- package/dist/features/event-client.js +2 -2
- package/dist/features/event-client.js.map +1 -1
- package/dist/features/orm/orm-client-connector.js +1 -1
- package/dist/features/orm/orm-client-connector.js.map +1 -1
- package/dist/features/orm/orm-client-db-context-executor.js +7 -7
- package/dist/features/orm/orm-client-db-context-executor.js.map +1 -1
- package/dist/protocol/client-protocol-wrapper.js +2 -2
- package/dist/service-client.js +6 -6
- package/dist/service-client.js.map +1 -1
- package/dist/transport/service-transport.js +1 -1
- package/dist/transport/service-transport.js.map +1 -1
- package/dist/transport/socket-provider.js +6 -6
- package/dist/transport/socket-provider.js.map +1 -1
- package/dist/types/connection-config.d.ts +1 -1
- package/dist/types/connection-config.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/features/event-client.ts +7 -7
- package/src/features/file-client.ts +3 -3
- package/src/features/orm/orm-client-connector.ts +1 -1
- package/src/features/orm/orm-client-db-context-executor.ts +7 -7
- package/src/protocol/client-protocol-wrapper.ts +16 -16
- package/src/service-client.ts +12 -12
- package/src/transport/service-transport.ts +15 -15
- package/src/transport/socket-provider.ts +35 -35
- package/src/types/connection-config.ts +1 -1
- package/src/workers/client-protocol.worker.ts +9 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/features/event-client.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,YAAY;AAGrB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,4BAA4B;AAiBpD,SAAS,kBAAkB,WAA0C;AAC1E,QAAM,cAAc,oBAAI,IAGtB;AAEF,YAAU,GAAG,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM;AAC9C,UAAM,aAAa,MAAM,IAAI;AAAA,EAC/B,CAAC;AAED,iBAAe,YACb,UACA,MACA,IACiB;AACjB,UAAM,MAAM,KAAK,IAAI,EAAE,SAAS;AAChC,UAAM,YAAY,SAAS;AAG3B,UAAM,UAAU,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,KAAK,MAAM,WAAW,KAAK;AAAA,IACrC,CAAC;AAGD,gBAAY,IAAI,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,iBAAe,eAAe,KAA4B;AACxD,UAAM,UAAU,KAAK,EAAE,MAAM,cAAc,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1D,gBAAY,OAAO,GAAG;AAAA,EACxB;AAEA,iBAAe,aACb,UACA,cACA,MACe;AACf,UAAM,YAAY,SAAS;AAG3B,UAAM,gBAAiB,MAAM,UAAU,KAAK;AAAA,MAC1C,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,UAAU;AAAA,IAC1B,CAAC;AAED,UAAM,aAAa,cAChB,OAAO,CAAC,SAAS,aAAa,KAAK,IAAI,CAAC,EACxC,IAAI,CAAC,SAAS,KAAK,GAAG;AAEzB,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,YAAY,KAAK;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,iBAAe,gBAA+B;AAC5C,eAAW,CAAC,KAAK,KAAK,KAAK,YAAY,QAAQ,GAAG;AAChD,UAAI;AACF,cAAM,UAAU,KAAK;AAAA,UACnB,MAAM;AAAA,UACN,MAAM,EAAE,KAAK,MAAM,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QACvD,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,
|
|
4
|
+
"mappings": "AAAA,SAAS,YAAY;AAGrB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,4BAA4B;AAiBpD,SAAS,kBAAkB,WAA0C;AAC1E,QAAM,cAAc,oBAAI,IAGtB;AAEF,YAAU,GAAG,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM;AAC9C,UAAM,aAAa,MAAM,IAAI;AAAA,EAC/B,CAAC;AAED,iBAAe,YACb,UACA,MACA,IACiB;AACjB,UAAM,MAAM,KAAK,IAAI,EAAE,SAAS;AAChC,UAAM,YAAY,SAAS;AAG3B,UAAM,UAAU,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,KAAK,MAAM,WAAW,KAAK;AAAA,IACrC,CAAC;AAGD,gBAAY,IAAI,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,iBAAe,eAAe,KAA4B;AACxD,UAAM,UAAU,KAAK,EAAE,MAAM,cAAc,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1D,gBAAY,OAAO,GAAG;AAAA,EACxB;AAEA,iBAAe,aACb,UACA,cACA,MACe;AACf,UAAM,YAAY,SAAS;AAG3B,UAAM,gBAAiB,MAAM,UAAU,KAAK;AAAA,MAC1C,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,UAAU;AAAA,IAC1B,CAAC;AAED,UAAM,aAAa,cAChB,OAAO,CAAC,SAAS,aAAa,KAAK,IAAI,CAAC,EACxC,IAAI,CAAC,SAAS,KAAK,GAAG;AAEzB,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,YAAY,KAAK;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,iBAAe,gBAA+B;AAC5C,eAAW,CAAC,KAAK,KAAK,KAAK,YAAY,QAAQ,GAAG;AAChD,UAAI;AACF,cAAM,UAAU,KAAK;AAAA,UACnB,MAAM;AAAA,UACN,MAAM,EAAE,KAAK,MAAM,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QACvD,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,oCAAoC,EAAE,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAGA,iBAAe,aAAa,MAAgB,MAA8B;AACxE,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAI,SAAS,MAAM;AACjB,YAAI;AACF,gBAAM,MAAM,GAAG,IAAI;AAAA,QACrB,SAAS,KAAK;AACZ,iBAAO,MAAM,uBAAuB,EAAE,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -21,7 +21,7 @@ function createOrmClientConnector(serviceClient) {
|
|
|
21
21
|
return await callback(db);
|
|
22
22
|
} catch (err) {
|
|
23
23
|
if (err instanceof Error && (err.message.includes("a parent row: a foreign key constraint") || err.message.includes("conflicted with the REFERENCE"))) {
|
|
24
|
-
throw new Error("
|
|
24
|
+
throw new Error("Warning! Operation rejected due to related operations. Please check subsequent operations.", { cause: err });
|
|
25
25
|
}
|
|
26
26
|
throw err;
|
|
27
27
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/features/orm/orm-client-connector.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,kCAAkC;AAE3C,SAAS,uBAAkE;AAcpE,SAAS,yBAAyB,eAAkD;AACzF,iBAAe,oBACb,QACkC;AAnBtC;AAoBI,UAAM,WAAW,IAAI,2BAA2B,eAAe,OAAO,OAAO;AAC7E,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAW,YAAO,iBAAP,mBAAqB,aAAY,KAAK;AACvD,QAAI,YAAY,QAAQ,aAAa,IAAI;AACvC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,gBAAgB,OAAO,cAAc,UAAU;AAAA,MACpD;AAAA,MACA,UAAQ,YAAO,iBAAP,mBAAqB,WAAU,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,iBAAe,QACb,QACA,UACY;AACZ,UAAM,KAAK,MAAM,oBAAoB,MAAM;AAC3C,WAAO,GAAG,QAAQ,YAAY;AAC5B,UAAI;AACF,eAAO,MAAM,SAAS,EAAE;AAAA,MAC1B,SAAS,KAAK;AACZ,YACE,eAAe,UACd,IAAI,QAAQ,SAAS,wCAAwC,KAC5D,IAAI,QAAQ,SAAS,+BAA+B,IACtD;AACA,gBAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AAAA,SAAS,kCAAkC;AAE3C,SAAS,uBAAkE;AAcpE,SAAS,yBAAyB,eAAkD;AACzF,iBAAe,oBACb,QACkC;AAnBtC;AAoBI,UAAM,WAAW,IAAI,2BAA2B,eAAe,OAAO,OAAO;AAC7E,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAW,YAAO,iBAAP,mBAAqB,aAAY,KAAK;AACvD,QAAI,YAAY,QAAQ,aAAa,IAAI;AACvC,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,gBAAgB,OAAO,cAAc,UAAU;AAAA,MACpD;AAAA,MACA,UAAQ,YAAO,iBAAP,mBAAqB,WAAU,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,iBAAe,QACb,QACA,UACY;AACZ,UAAM,KAAK,MAAM,oBAAoB,MAAM;AAC3C,WAAO,GAAG,QAAQ,YAAY;AAC5B,UAAI;AACF,eAAO,MAAM,SAAS,EAAE;AAAA,MAC1B,SAAS,KAAK;AACZ,YACE,eAAe,UACd,IAAI,QAAQ,SAAS,wCAAwC,KAC5D,IAAI,QAAQ,SAAS,+BAA+B,IACtD;AACA,gBAAM,IAAI,MAAM,8FAA8F,EAAE,OAAO,IAAI,CAAC;AAAA,QAC9H;AAEA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAe,0BACb,QACA,UACY;AACZ,UAAM,KAAK,MAAM,oBAAoB,MAAM;AAC3C,WAAO,GAAG,0BAA0B,YAAY,SAAS,EAAE,CAAC;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -14,43 +14,43 @@ class OrmClientDbContextExecutor {
|
|
|
14
14
|
}
|
|
15
15
|
async beginTransaction(isolationLevel) {
|
|
16
16
|
if (this._connId === void 0) {
|
|
17
|
-
throw new Error("
|
|
17
|
+
throw new Error("Not connected to the database.");
|
|
18
18
|
}
|
|
19
19
|
await this._ormService.beginTransaction(this._connId, isolationLevel);
|
|
20
20
|
}
|
|
21
21
|
async commitTransaction() {
|
|
22
22
|
if (this._connId === void 0) {
|
|
23
|
-
throw new Error("
|
|
23
|
+
throw new Error("Not connected to the database.");
|
|
24
24
|
}
|
|
25
25
|
await this._ormService.commitTransaction(this._connId);
|
|
26
26
|
}
|
|
27
27
|
async rollbackTransaction() {
|
|
28
28
|
if (this._connId === void 0) {
|
|
29
|
-
throw new Error("
|
|
29
|
+
throw new Error("Not connected to the database.");
|
|
30
30
|
}
|
|
31
31
|
await this._ormService.rollbackTransaction(this._connId);
|
|
32
32
|
}
|
|
33
33
|
async close() {
|
|
34
34
|
if (this._connId === void 0) {
|
|
35
|
-
throw new Error("
|
|
35
|
+
throw new Error("Not connected to the database.");
|
|
36
36
|
}
|
|
37
37
|
await this._ormService.close(this._connId);
|
|
38
38
|
}
|
|
39
39
|
async executeDefs(defs, options) {
|
|
40
40
|
if (this._connId === void 0) {
|
|
41
|
-
throw new Error("
|
|
41
|
+
throw new Error("Not connected to the database.");
|
|
42
42
|
}
|
|
43
43
|
return await this._ormService.executeDefs(this._connId, defs, options);
|
|
44
44
|
}
|
|
45
45
|
async executeParametrized(query, params) {
|
|
46
46
|
if (this._connId === void 0) {
|
|
47
|
-
throw new Error("
|
|
47
|
+
throw new Error("Not connected to the database.");
|
|
48
48
|
}
|
|
49
49
|
return this._ormService.executeParametrized(this._connId, query, params);
|
|
50
50
|
}
|
|
51
51
|
async bulkInsert(tableName, columnDefs, records) {
|
|
52
52
|
if (this._connId === void 0) {
|
|
53
|
-
throw new Error("
|
|
53
|
+
throw new Error("Not connected to the database.");
|
|
54
54
|
}
|
|
55
55
|
return this._ormService.bulkInsert(this._connId, tableName, columnDefs, records);
|
|
56
56
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/features/orm/orm-client-db-context-executor.ts"],
|
|
4
|
-
"mappings": "AAWO,MAAM,2BAAwD;AAAA,EAInE,YACmB,SACA,MACjB;AAFiB;AACA;AAEjB,SAAK,cAAc,QAAQ,WAAuB,KAAK;AAAA,EACzD;AAAA,EARQ;AAAA,EACS;AAAA,EASjB,MAAM,UAIH;AACD,WAAO,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,UAAU,MAAM,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,EACzD;AAAA,EAEA,MAAM,iBAAiB,gBAAgD;AACrE,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AAWO,MAAM,2BAAwD;AAAA,EAInE,YACmB,SACA,MACjB;AAFiB;AACA;AAEjB,SAAK,cAAc,QAAQ,WAAuB,KAAK;AAAA,EACzD;AAAA,EARQ;AAAA,EACS;AAAA,EASjB,MAAM,UAIH;AACD,WAAO,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,UAAU,MAAM,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,EACzD;AAAA,EAEA,MAAM,iBAAiB,gBAAgD;AACrE,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,KAAK,YAAY,iBAAiB,KAAK,SAAS,cAAc;AAAA,EACtE;AAAA,EAEA,MAAM,oBAAmC;AACvC,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,KAAK,YAAY,kBAAkB,KAAK,OAAO;AAAA,EACvD;AAAA,EAEA,MAAM,sBAAqC;AACzC,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,KAAK,YAAY,oBAAoB,KAAK,OAAO;AAAA,EACzD;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,KAAK,YAAY,MAAM,KAAK,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAM,YACJ,MACA,SACgB;AAChB,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAQ,MAAM,KAAK,YAAY,YAAY,KAAK,SAAS,MAAM,OAAO;AAAA,EACxE;AAAA,EAEA,MAAM,oBAAoB,OAAe,QAA0C;AACjF,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,KAAK,YAAY,oBAAoB,KAAK,SAAS,OAAO,MAAM;AAAA,EACzE;AAAA,EAEA,MAAM,WACJ,WACA,YACA,SACe;AACf,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,KAAK,YAAY,WAAW,KAAK,SAAS,WAAW,YAAY,OAAO;AAAA,EACjF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -2,9 +2,9 @@ import { LazyGcMap, transferableDecode, Uuid } from "@simplysm/core-common";
|
|
|
2
2
|
let worker;
|
|
3
3
|
const workerResolvers = new LazyGcMap({
|
|
4
4
|
gcInterval: 5 * 1e3,
|
|
5
|
-
//
|
|
5
|
+
// Check for expired entries every 5s
|
|
6
6
|
expireTime: 60 * 1e3,
|
|
7
|
-
//
|
|
7
|
+
// Expire after 60s (timeout)
|
|
8
8
|
onExpire: (key, item) => {
|
|
9
9
|
item.reject(new Error(`Worker task timed out (uuid: ${key})`));
|
|
10
10
|
}
|
package/dist/service-client.js
CHANGED
|
@@ -29,7 +29,7 @@ class ServiceClient extends EventEmitter {
|
|
|
29
29
|
}
|
|
30
30
|
await this._eventClient.reRegisterAll();
|
|
31
31
|
} catch (err) {
|
|
32
|
-
logger.error("
|
|
32
|
+
logger.error("Failed to recover event listeners", err);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
});
|
|
@@ -37,13 +37,13 @@ class ServiceClient extends EventEmitter {
|
|
|
37
37
|
this.emit("reload", changedFiles);
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
-
//
|
|
40
|
+
// Modules
|
|
41
41
|
_socket;
|
|
42
42
|
_transport;
|
|
43
43
|
_eventClient;
|
|
44
44
|
_fileClient;
|
|
45
45
|
_authToken;
|
|
46
|
-
//
|
|
46
|
+
// State accessors
|
|
47
47
|
get connected() {
|
|
48
48
|
return this._socket.connected;
|
|
49
49
|
}
|
|
@@ -51,7 +51,7 @@ class ServiceClient extends EventEmitter {
|
|
|
51
51
|
const hostProtocol = this.options.ssl ? "https" : "http";
|
|
52
52
|
return `${hostProtocol}://${this.options.host}:${this.options.port}`;
|
|
53
53
|
}
|
|
54
|
-
//
|
|
54
|
+
// Proxy creation method for type safety
|
|
55
55
|
getService(serviceName) {
|
|
56
56
|
return new Proxy({}, {
|
|
57
57
|
get: (_target, prop) => {
|
|
@@ -93,7 +93,7 @@ class ServiceClient extends EventEmitter {
|
|
|
93
93
|
this._authToken = token;
|
|
94
94
|
}
|
|
95
95
|
async addEventListener(eventDef, info, cb) {
|
|
96
|
-
if (!this.connected) throw new Error("
|
|
96
|
+
if (!this.connected) throw new Error("Not connected to the server.");
|
|
97
97
|
return this._eventClient.addListener(eventDef, info, cb);
|
|
98
98
|
}
|
|
99
99
|
async removeEventListener(key) {
|
|
@@ -105,7 +105,7 @@ class ServiceClient extends EventEmitter {
|
|
|
105
105
|
async uploadFile(files) {
|
|
106
106
|
if (this._authToken == null) {
|
|
107
107
|
throw new Error(
|
|
108
|
-
"
|
|
108
|
+
"No authentication token found. Call auth() to authenticate before uploading files."
|
|
109
109
|
);
|
|
110
110
|
}
|
|
111
111
|
return this._fileClient.upload(files, this._authToken);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/service-client.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,aAAa;AACpB,SAAS,oBAAoB;AAE7B,SAAS,6BAA6B;AAItC,SAAS,8BAAqD;AAC9D,SAAS,4BAAiD;AAC1D,SAAS,yBAA2C;AACpD,SAAS,wBAAyC;AAClD,SAAS,mCAAmC;AAE5C,MAAM,SAAS,QAAQ,QAAQ,8BAA8B;AAStD,MAAM,sBAAsB,aAAkC;AAAA,EAkBnE,YACkB,MACA,SAChB;AACA,UAAM;AAHU;AACA;AAIhB,UAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,UAAM,QAAQ,GAAG,UAAU,MAAM,QAAQ,IAAI,IAAI,QAAQ,IAAI;AAG7D,SAAK,UAAU,qBAAqB,OAAO,KAAK,MAAM,KAAK,QAAQ,qBAAqB,EAAE;AAC1F,UAAM,WAAW,sBAAsB;AACvC,UAAM,kBAAkB,4BAA4B,QAAQ;AAC5D,SAAK,aAAa,uBAAuB,KAAK,SAAS,eAAe;AACtE,SAAK,eAAe,kBAAkB,KAAK,UAAU;AACrD,SAAK,cAAc,iBAAiB,KAAK,SAAS,KAAK,IAAI;AAG3D,SAAK,QAAQ,GAAG,SAAS,OAAO,UAAU;AACxC,WAAK,KAAK,SAAS,KAAK;AAGxB,UAAI,UAAU,aAAa;AACzB,YAAI;AACF,cAAI,KAAK,cAAc,MAAM;AAC3B,kBAAM,KAAK,KAAK,KAAK,UAAU;AAAA,UACjC;AACA,gBAAM,KAAK,aAAa,cAAc;AAAA,QACxC,SAAS,KAAK;AACZ,iBAAO,MAAM,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -79,7 +79,7 @@ function createServiceTransport(socket, protocol) {
|
|
|
79
79
|
const body = decoded.message.body;
|
|
80
80
|
emitter.emit("event", { keys: body.keys, data: body.data });
|
|
81
81
|
} else {
|
|
82
|
-
throw new Error("
|
|
82
|
+
throw new Error("Invalid message received from server.");
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
} catch (err) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/transport/service-transport.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,cAAc,YAAY;AA2B5B,SAAS,uBACd,QACA,UACkB;AAClB,QAAM,UAAU,IAAI,aAAqC;AAEzD,QAAM,kBAAkB,oBAAI,IAO1B;AAGF,QAAM,4BAA4B,oBAAI,IAAoB;AAE1D,SAAO,GAAG,WAAW,SAAS;AAG9B,SAAO,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAI,UAAU,YAAY,UAAU,gBAAgB;AAClD,wBAAkB,wBAAwB;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,iBAAe,KAAK,SAA+B,UAA8C;AAvDnG;AAwDI,UAAM,OAAO,KAAK,IAAI,EAAE,SAAS;AAGjC,UAAM,kBAAkB,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvD,sBAAgB,IAAI,MAAM,EAAE,SAAS,QAAQ,SAAS,CAAC;AAAA,IACzD,CAAC;AAGD,QAAI;AACF,YAAM,EAAE,QAAQ,UAAU,IAAI,MAAM,SAAS,OAAO,MAAM,OAAO;AAGjE,UAAI,OAAO,SAAS,GAAG;AACrB,mDAAU,YAAV,kCAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAGA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF,SAAS,KAAK;AAEZ,4BAAgB,IAAI,IAAI,MAAxB,mBAA2B,OAAO;AAClC,sBAAgB,OAAO,IAAI;AAC3B,YAAM;AAAA,IACR;AAGA,WAAO;AAAA,EACT;AAEA,iBAAe,UAAU,KAA2B;AA3FtD;AA4FI,UAAM,UAAU,MAAM,SAAS,OAAO,GAAG;AAEzC,UAAM,eAAe,gBAAgB,IAAI,QAAQ,IAAI;AAErD,QAAI;AACF,UAAI,QAAQ,SAAS,YAAY;AAE/B,kCAA0B,IAAI,QAAQ,MAAM,QAAQ,SAAS;AAE7D,iEAAc,aAAd,mBAAwB,aAAxB,4BAAmC;AAAA,UACjC,MAAM,QAAQ;AAAA,UACd,WAAW,QAAQ;AAAA,UACnB,eAAe,QAAQ;AAAA,QACzB;AAAA,MACF,OAAO;AACL,YAAI,QAAQ,QAAQ,SAAS,YAAY;AACvC,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,mEAAc,aAAd,mBAAwB,YAAxB,4BAAkC;AAAA,YAChC,MAAM,QAAQ;AAAA,YACd,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK;AAAA,UACtB;AAAA,QACF,WAAW,QAAQ,QAAQ,SAAS,YAAY;AAE9C,gBAAM,YAAY,0BAA0B,IAAI,QAAQ,IAAI;AAC5D,cAAI,aAAa,MAAM;AACrB,sCAA0B,OAAO,QAAQ,IAAI;AAC7C,qEAAc,aAAd,mBAAwB,aAAxB,4BAAmC;AAAA,cACjC,MAAM,QAAQ;AAAA,cACd;AAAA,cACA,eAAe;AAAA,YACjB;AAAA,UACF;AAGA,0BAAgB,OAAO,QAAQ,IAAI;AAEnC,uDAAc,QAAQ,QAAQ,QAAQ;AAAA,QACxC,WAAW,QAAQ,QAAQ,SAAS,SAAS;AAE3C,oCAA0B,OAAO,QAAQ,IAAI;AAG7C,0BAAgB,OAAO,QAAQ,IAAI;AAEnC,uDAAc,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAAA,QACnD,WAAW,QAAQ,QAAQ,SAAS,UAAU;AAC5C,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,OAAO,eAAe,KAAK,YAAY;AACzC,oBAAQ,KAAK,UAAU,KAAK,cAAc;AAAA,UAC5C;AAAA,QACF,WAAW,QAAQ,QAAQ,SAAS,UAAU;AAC5C,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,kBAAQ,KAAK,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,QAC5D,OAAO;AACL,gBAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "AACA,SAAS,cAAc,YAAY;AA2B5B,SAAS,uBACd,QACA,UACkB;AAClB,QAAM,UAAU,IAAI,aAAqC;AAEzD,QAAM,kBAAkB,oBAAI,IAO1B;AAGF,QAAM,4BAA4B,oBAAI,IAAoB;AAE1D,SAAO,GAAG,WAAW,SAAS;AAG9B,SAAO,GAAG,SAAS,CAAC,UAAU;AAC5B,QAAI,UAAU,YAAY,UAAU,gBAAgB;AAClD,wBAAkB,wBAAwB;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,iBAAe,KAAK,SAA+B,UAA8C;AAvDnG;AAwDI,UAAM,OAAO,KAAK,IAAI,EAAE,SAAS;AAGjC,UAAM,kBAAkB,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvD,sBAAgB,IAAI,MAAM,EAAE,SAAS,QAAQ,SAAS,CAAC;AAAA,IACzD,CAAC;AAGD,QAAI;AACF,YAAM,EAAE,QAAQ,UAAU,IAAI,MAAM,SAAS,OAAO,MAAM,OAAO;AAGjE,UAAI,OAAO,SAAS,GAAG;AACrB,mDAAU,YAAV,kCAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAGA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF,SAAS,KAAK;AAEZ,4BAAgB,IAAI,IAAI,MAAxB,mBAA2B,OAAO;AAClC,sBAAgB,OAAO,IAAI;AAC3B,YAAM;AAAA,IACR;AAGA,WAAO;AAAA,EACT;AAEA,iBAAe,UAAU,KAA2B;AA3FtD;AA4FI,UAAM,UAAU,MAAM,SAAS,OAAO,GAAG;AAEzC,UAAM,eAAe,gBAAgB,IAAI,QAAQ,IAAI;AAErD,QAAI;AACF,UAAI,QAAQ,SAAS,YAAY;AAE/B,kCAA0B,IAAI,QAAQ,MAAM,QAAQ,SAAS;AAE7D,iEAAc,aAAd,mBAAwB,aAAxB,4BAAmC;AAAA,UACjC,MAAM,QAAQ;AAAA,UACd,WAAW,QAAQ;AAAA,UACnB,eAAe,QAAQ;AAAA,QACzB;AAAA,MACF,OAAO;AACL,YAAI,QAAQ,QAAQ,SAAS,YAAY;AACvC,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,mEAAc,aAAd,mBAAwB,YAAxB,4BAAkC;AAAA,YAChC,MAAM,QAAQ;AAAA,YACd,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK;AAAA,UACtB;AAAA,QACF,WAAW,QAAQ,QAAQ,SAAS,YAAY;AAE9C,gBAAM,YAAY,0BAA0B,IAAI,QAAQ,IAAI;AAC5D,cAAI,aAAa,MAAM;AACrB,sCAA0B,OAAO,QAAQ,IAAI;AAC7C,qEAAc,aAAd,mBAAwB,aAAxB,4BAAmC;AAAA,cACjC,MAAM,QAAQ;AAAA,cACd;AAAA,cACA,eAAe;AAAA,YACjB;AAAA,UACF;AAGA,0BAAgB,OAAO,QAAQ,IAAI;AAEnC,uDAAc,QAAQ,QAAQ,QAAQ;AAAA,QACxC,WAAW,QAAQ,QAAQ,SAAS,SAAS;AAE3C,oCAA0B,OAAO,QAAQ,IAAI;AAG7C,0BAAgB,OAAO,QAAQ,IAAI;AAEnC,uDAAc,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAAA,QACnD,WAAW,QAAQ,QAAQ,SAAS,UAAU;AAC5C,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,OAAO,eAAe,KAAK,YAAY;AACzC,oBAAQ,KAAK,UAAU,KAAK,cAAc;AAAA,UAC5C;AAAA,QACF,WAAW,QAAQ,QAAQ,SAAS,UAAU;AAC5C,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,kBAAQ,KAAK,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,QAC5D,OAAO;AACL,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,mDAAc,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,IACzE;AAAA,EACF;AAGA,WAAS,kBAAkB,QAAsB;AAC/C,eAAW,gBAAgB,gBAAgB,OAAO,GAAG;AACnD,mBAAa,OAAO,IAAI,MAAM,qBAAqB,MAAM,EAAE,CAAC;AAAA,IAC9D;AACA,oBAAgB,MAAM;AACtB,8BAA0B,MAAM;AAAA,EAClC;AAEA,WAAS,QAAQ,MAA0C;AACzD,QAAI,MAAM,IAAI,MAAM,KAAK,OAAO;AAChC,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,QAAQ,GAAG,KAAK,OAAO;AAAA,IAC3B,KAAK,QAAQ,IAAI,KAAK,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -42,11 +42,11 @@ function createSocketProvider(url, clientName, maxReconnectCount) {
|
|
|
42
42
|
try {
|
|
43
43
|
await waitUntil(() => isConnected(), void 0, 50);
|
|
44
44
|
} catch {
|
|
45
|
-
throw new Error("
|
|
45
|
+
throw new Error("Not connected to the server. Please check your internet connection.");
|
|
46
46
|
}
|
|
47
47
|
const currentWs = ws;
|
|
48
48
|
if (currentWs == null) {
|
|
49
|
-
throw new Error("WebSocket
|
|
49
|
+
throw new Error("WebSocket is not connected.");
|
|
50
50
|
}
|
|
51
51
|
currentWs.send(data);
|
|
52
52
|
}
|
|
@@ -74,7 +74,7 @@ function createSocketProvider(url, clientName, maxReconnectCount) {
|
|
|
74
74
|
});
|
|
75
75
|
const currentWs = ws;
|
|
76
76
|
if (currentWs == null) {
|
|
77
|
-
throw new Error("WebSocket
|
|
77
|
+
throw new Error("WebSocket initialization failed");
|
|
78
78
|
}
|
|
79
79
|
currentWs.onmessage = (event) => {
|
|
80
80
|
lastHeartbeatTime = Date.now();
|
|
@@ -94,7 +94,7 @@ function createSocketProvider(url, clientName, maxReconnectCount) {
|
|
|
94
94
|
while (reconnectCount < maxReconnectCount) {
|
|
95
95
|
reconnectCount++;
|
|
96
96
|
emitter.emit("state", "reconnecting");
|
|
97
|
-
logger.warn("WebSocket
|
|
97
|
+
logger.warn("WebSocket disconnected. Attempting reconnect...", {
|
|
98
98
|
reconnectCount,
|
|
99
99
|
maxReconnectCount
|
|
100
100
|
});
|
|
@@ -104,12 +104,12 @@ function createSocketProvider(url, clientName, maxReconnectCount) {
|
|
|
104
104
|
startHeartbeat();
|
|
105
105
|
reconnectCount = 0;
|
|
106
106
|
emitter.emit("state", "connected");
|
|
107
|
-
logger.info("WebSocket
|
|
107
|
+
logger.info("WebSocket reconnected successfully");
|
|
108
108
|
return;
|
|
109
109
|
} catch {
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
-
logger.error("
|
|
112
|
+
logger.error("Reconnect retry limit exceeded. Giving up.");
|
|
113
113
|
emitter.emit("state", "closed");
|
|
114
114
|
}
|
|
115
115
|
function startHeartbeat() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/transport/socket-provider.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,cAAc,MAAM,WAAW,gBAAgB;AACxD,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,+BAA+B;AAuBvD,SAAS,qBACd,KACA,YACA,mBACgB;AAEhB,QAAM,oBAAoB;AAC1B,QAAM,qBAAqB;AAC3B,QAAM,kBAAkB;AAGxB,QAAM,cAAc,IAAI,WAAW,CAAC,CAAI,CAAC;AAGzC,MAAI;AACJ,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AACrB,MAAI;AACJ,MAAI,oBAAoB,KAAK,IAAI;AAEjC,QAAM,UAAU,IAAI,aAAmC;AAEvD,WAAS,cAAuB;AAC9B,YAAO,yBAAI,gBAAe,UAAU;AAAA,EACtC;AAEA,iBAAe,UAAyB;AACtC,QAAI,YAAY,EAAG;AACnB,oBAAgB;AAEhB,QAAI;AACF,YAAM,aAAa;AACnB,qBAAe;AACf,uBAAiB;AACjB,cAAQ,KAAK,SAAS,WAAW;AAAA,IACnC,SAAS,KAAK;AAEZ,YAAM;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,QAAuB;AACpC,oBAAgB;AAChB,kBAAc;AACd,UAAM,YAAY;AAClB,QAAI,aAAa,MAAM;AACrB,gBAAU,MAAM;AAEhB,YAAM,UAAU,MAAM,UAAU,eAAe,UAAU,QAAQ,KAAK,EAAE,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1F;AACA,YAAQ,KAAK,SAAS,QAAQ;AAAA,EAChC;AAEA,iBAAe,KAAK,MAA4B;AAC9C,QAAI;AACF,YAAM,UAAU,MAAM,YAAY,GAAG,QAAW,EAAE;AAAA,IACpD,QAAQ;AACN,YAAM,IAAI,MAAM,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -2,7 +2,7 @@ export interface ServiceConnectionConfig {
|
|
|
2
2
|
port: number;
|
|
3
3
|
host: string;
|
|
4
4
|
ssl?: boolean;
|
|
5
|
-
/** 0
|
|
5
|
+
/** Set to 0 to disable reconnect; disconnects immediately */
|
|
6
6
|
maxReconnectCount?: number;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=connection-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-config.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\connection-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd
|
|
1
|
+
{"version":3,"file":"connection-config.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\connection-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/service-client",
|
|
3
|
-
"version": "13.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "
|
|
3
|
+
"version": "13.0.70",
|
|
4
|
+
"description": "Simplysm package - Service module (client)",
|
|
5
|
+
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"consola": "^3.4.2",
|
|
22
|
-
"@simplysm/core-common": "13.0.
|
|
23
|
-
"@simplysm/
|
|
24
|
-
"@simplysm/
|
|
22
|
+
"@simplysm/core-common": "13.0.70",
|
|
23
|
+
"@simplysm/service-common": "13.0.70",
|
|
24
|
+
"@simplysm/orm-common": "13.0.70"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/ws": "^8.18.1",
|
|
@@ -38,13 +38,13 @@ export function createEventClient(transport: ServiceTransport): EventClient {
|
|
|
38
38
|
const key = Uuid.new().toString();
|
|
39
39
|
const eventName = eventDef.eventName;
|
|
40
40
|
|
|
41
|
-
//
|
|
41
|
+
// Send registration request to server
|
|
42
42
|
await transport.send({
|
|
43
43
|
name: "evt:add",
|
|
44
44
|
body: { key, name: eventName, info },
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
//
|
|
47
|
+
// Store in local map (for recovery on reconnect)
|
|
48
48
|
listenerMap.set(key, {
|
|
49
49
|
eventName,
|
|
50
50
|
info,
|
|
@@ -66,7 +66,7 @@ export function createEventClient(transport: ServiceTransport): EventClient {
|
|
|
66
66
|
): Promise<void> {
|
|
67
67
|
const eventName = eventDef.eventName;
|
|
68
68
|
|
|
69
|
-
//
|
|
69
|
+
// Send 'gets' request to server to obtain targets
|
|
70
70
|
const listenerInfos = (await transport.send({
|
|
71
71
|
name: "evt:gets",
|
|
72
72
|
body: { name: eventName },
|
|
@@ -84,7 +84,7 @@ export function createEventClient(transport: ServiceTransport): EventClient {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
//
|
|
87
|
+
// Called on reconnect
|
|
88
88
|
async function reRegisterAll(): Promise<void> {
|
|
89
89
|
for (const [key, value] of listenerMap.entries()) {
|
|
90
90
|
try {
|
|
@@ -93,12 +93,12 @@ export function createEventClient(transport: ServiceTransport): EventClient {
|
|
|
93
93
|
body: { key, name: value.eventName, info: value.info },
|
|
94
94
|
});
|
|
95
95
|
} catch (err) {
|
|
96
|
-
logger.error("
|
|
96
|
+
logger.error("Failed to recover event listener", { err, eventName: value.eventName });
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
//
|
|
101
|
+
// Dispatch server events to local listeners
|
|
102
102
|
async function executeByKey(keys: string[], data: unknown): Promise<void> {
|
|
103
103
|
for (const key of keys) {
|
|
104
104
|
const entry = listenerMap.get(key);
|
|
@@ -106,7 +106,7 @@ export function createEventClient(transport: ServiceTransport): EventClient {
|
|
|
106
106
|
try {
|
|
107
107
|
await entry.cb(data);
|
|
108
108
|
} catch (err) {
|
|
109
|
-
logger.error("
|
|
109
|
+
logger.error("Event handler error", { err, eventName: entry.eventName });
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
}
|
|
@@ -11,7 +11,7 @@ export interface FileClient {
|
|
|
11
11
|
|
|
12
12
|
export function createFileClient(hostUrl: string, clientName: string): FileClient {
|
|
13
13
|
async function download(relPath: string): Promise<Bytes> {
|
|
14
|
-
// URL
|
|
14
|
+
// Build URL
|
|
15
15
|
const url = `${hostUrl}${relPath.startsWith("/") ? "" : "/"}${relPath}`;
|
|
16
16
|
|
|
17
17
|
const res = await fetch(url);
|
|
@@ -32,11 +32,11 @@ export function createFileClient(hostUrl: string, clientName: string): FileClien
|
|
|
32
32
|
|
|
33
33
|
for (const file of fileList) {
|
|
34
34
|
if ("data" in file) {
|
|
35
|
-
//
|
|
35
|
+
// Custom object ({ name, data })
|
|
36
36
|
const blob = file.data instanceof Blob ? file.data : new Blob([file.data]);
|
|
37
37
|
formData.append("files", blob, file.name);
|
|
38
38
|
} else {
|
|
39
|
-
//
|
|
39
|
+
// Browser File object
|
|
40
40
|
formData.append("files", file, file.name);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -44,7 +44,7 @@ export function createOrmClientConnector(serviceClient: ServiceClient): OrmClien
|
|
|
44
44
|
(err.message.includes("a parent row: a foreign key constraint") ||
|
|
45
45
|
err.message.includes("conflicted with the REFERENCE"))
|
|
46
46
|
) {
|
|
47
|
-
throw new Error("
|
|
47
|
+
throw new Error("Warning! Operation rejected due to related operations. Please check subsequent operations.", { cause: err });
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
throw err;
|
|
@@ -34,7 +34,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
34
34
|
|
|
35
35
|
async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {
|
|
36
36
|
if (this._connId === undefined) {
|
|
37
|
-
throw new Error("
|
|
37
|
+
throw new Error("Not connected to the database.");
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
await this._ormService.beginTransaction(this._connId, isolationLevel);
|
|
@@ -42,7 +42,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
42
42
|
|
|
43
43
|
async commitTransaction(): Promise<void> {
|
|
44
44
|
if (this._connId === undefined) {
|
|
45
|
-
throw new Error("
|
|
45
|
+
throw new Error("Not connected to the database.");
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
await this._ormService.commitTransaction(this._connId);
|
|
@@ -50,7 +50,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
50
50
|
|
|
51
51
|
async rollbackTransaction(): Promise<void> {
|
|
52
52
|
if (this._connId === undefined) {
|
|
53
|
-
throw new Error("
|
|
53
|
+
throw new Error("Not connected to the database.");
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
await this._ormService.rollbackTransaction(this._connId);
|
|
@@ -58,7 +58,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
58
58
|
|
|
59
59
|
async close(): Promise<void> {
|
|
60
60
|
if (this._connId === undefined) {
|
|
61
|
-
throw new Error("
|
|
61
|
+
throw new Error("Not connected to the database.");
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
await this._ormService.close(this._connId);
|
|
@@ -69,7 +69,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
69
69
|
options?: (ResultMeta | undefined)[],
|
|
70
70
|
): Promise<T[][]> {
|
|
71
71
|
if (this._connId === undefined) {
|
|
72
|
-
throw new Error("
|
|
72
|
+
throw new Error("Not connected to the database.");
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
return (await this._ormService.executeDefs(this._connId, defs, options)) as T[][];
|
|
@@ -77,7 +77,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
77
77
|
|
|
78
78
|
async executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]> {
|
|
79
79
|
if (this._connId === undefined) {
|
|
80
|
-
throw new Error("
|
|
80
|
+
throw new Error("Not connected to the database.");
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
return this._ormService.executeParametrized(this._connId, query, params);
|
|
@@ -89,7 +89,7 @@ export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
|
89
89
|
records: Record<string, unknown>[],
|
|
90
90
|
): Promise<void> {
|
|
91
91
|
if (this._connId === undefined) {
|
|
92
|
-
throw new Error("
|
|
92
|
+
throw new Error("Not connected to the database.");
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
return this._ormService.bulkInsert(this._connId, tableName, columnDefs, records);
|
|
@@ -17,10 +17,10 @@ const workerResolvers = new LazyGcMap<
|
|
|
17
17
|
string,
|
|
18
18
|
{ resolve: (res: unknown) => void; reject: (err: Error) => void }
|
|
19
19
|
>({
|
|
20
|
-
gcInterval: 5 * 1000, //
|
|
21
|
-
expireTime: 60 * 1000, //
|
|
20
|
+
gcInterval: 5 * 1000, // Check for expired entries every 5s
|
|
21
|
+
expireTime: 60 * 1000, // Expire after 60s (timeout)
|
|
22
22
|
onExpire: (key, item) => {
|
|
23
|
-
//
|
|
23
|
+
// Reject on expiry (critical for preventing memory leaks)
|
|
24
24
|
item.reject(new Error(`Worker task timed out (uuid: ${key})`));
|
|
25
25
|
},
|
|
26
26
|
});
|
|
@@ -40,8 +40,8 @@ function getWorker(): Worker | undefined {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
if (!worker) {
|
|
43
|
-
// Vite/Esbuild/Webpack
|
|
44
|
-
//
|
|
43
|
+
// Modern bundlers (Vite/Esbuild/Webpack) use this syntax to split/load the Worker as a separate file
|
|
44
|
+
// Note: use relative path instead of import.meta.resolve (Vite compatibility)
|
|
45
45
|
worker = new Worker(new URL("../workers/client-protocol.worker.ts", import.meta.url), {
|
|
46
46
|
type: "module",
|
|
47
47
|
});
|
|
@@ -71,8 +71,8 @@ function getWorker(): Worker | undefined {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
74
|
+
* Delegate work to Worker and await result
|
|
75
|
+
* Note: only call when workerAvailable is true
|
|
76
76
|
*/
|
|
77
77
|
async function runWorker(
|
|
78
78
|
type: "encode" | "decode",
|
|
@@ -83,20 +83,20 @@ async function runWorker(
|
|
|
83
83
|
const id = Uuid.new().toString();
|
|
84
84
|
|
|
85
85
|
workerResolvers.set(id, { resolve, reject });
|
|
86
|
-
// workerAvailable
|
|
86
|
+
// Called after workerAvailable check, so worker always exists
|
|
87
87
|
getWorker()!.postMessage({ id, type, data }, { transfer });
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
export function createClientProtocolWrapper(protocol: ServiceProtocol): ClientProtocolWrapper {
|
|
92
|
-
//
|
|
92
|
+
// Threshold: 30KB
|
|
93
93
|
const SIZE_THRESHOLD = 30 * 1024;
|
|
94
94
|
|
|
95
95
|
function shouldUseWorkerForEncode(msg: ServiceMessage): boolean {
|
|
96
96
|
if (!("body" in msg)) return false;
|
|
97
97
|
const body = msg.body;
|
|
98
98
|
|
|
99
|
-
// Uint8Array
|
|
99
|
+
// Use worker if Uint8Array is present or array length is large
|
|
100
100
|
if (body instanceof Uint8Array) return true;
|
|
101
101
|
if (typeof body === "string" && body.length > SIZE_THRESHOLD) return true;
|
|
102
102
|
if (Array.isArray(body)) {
|
|
@@ -110,14 +110,14 @@ export function createClientProtocolWrapper(protocol: ServiceProtocol): ClientPr
|
|
|
110
110
|
uuid: string,
|
|
111
111
|
message: ServiceMessage,
|
|
112
112
|
): Promise<{ chunks: Bytes[]; totalSize: number }> {
|
|
113
|
-
//
|
|
113
|
+
// Process on main thread if no Worker or small data
|
|
114
114
|
if (!isWorkerAvailable() || !shouldUseWorkerForEncode(message)) {
|
|
115
115
|
return protocol.encode(uuid, message);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
// [Worker]
|
|
119
|
-
// Encode
|
|
120
|
-
//
|
|
119
|
+
// Encode requires sending an object, so Structured Clone occurs.
|
|
120
|
+
// But the benefit of offloading JSON.stringify cost from the main thread is greater.
|
|
121
121
|
return (await runWorker("encode", { uuid, message })) as {
|
|
122
122
|
chunks: Bytes[];
|
|
123
123
|
totalSize: number;
|
|
@@ -127,16 +127,16 @@ export function createClientProtocolWrapper(protocol: ServiceProtocol): ClientPr
|
|
|
127
127
|
async function decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>> {
|
|
128
128
|
const totalSize = bytes.length;
|
|
129
129
|
|
|
130
|
-
//
|
|
130
|
+
// Process on main thread if no Worker or small data
|
|
131
131
|
if (!isWorkerAvailable() || totalSize <= SIZE_THRESHOLD) {
|
|
132
132
|
return protocol.decode(bytes);
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
// [Worker]
|
|
136
|
-
// Zero-
|
|
136
|
+
// Zero-copy transfer (buffer ownership moves to Worker)
|
|
137
137
|
const rawResult = await runWorker("decode", bytes, [bytes.buffer]);
|
|
138
138
|
|
|
139
|
-
//
|
|
139
|
+
// Restore class instances (DateTime, etc.) from Worker's plain object result
|
|
140
140
|
return transferableDecode(rawResult) as ServiceMessageDecodeResult<ServiceMessage>;
|
|
141
141
|
}
|
|
142
142
|
|