@delight-rpc/extra-websocket 0.7.5 → 0.7.6

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/lib/client.js CHANGED
@@ -4,26 +4,36 @@ import { CustomError } from '@blackglory/errors';
4
4
  import { getResult } from 'return-style';
5
5
  import { isntUndefined, isString } from '@blackglory/prelude';
6
6
  import { withAbortSignal, raceAbortSignals, timeoutSignal } from 'extra-abort';
7
+ import { SyncDestructor } from 'extra-defer';
7
8
  export function createClient(socket, { parameterValidators, expectedVersion, channel, timeout } = {}) {
9
+ const destructor = new SyncDestructor();
8
10
  const pendings = new Map();
9
- const removeMessageListener = socket.on('message', listener);
11
+ destructor.defer(abortAllPendings);
12
+ const removeMessageListener = socket.on('message', receive);
13
+ destructor.defer(removeMessageListener);
14
+ const removeCloseListener = socket.on('close', close);
15
+ destructor.defer(removeCloseListener);
10
16
  const client = DelightRPC.createClient(async function send(request, signal) {
17
+ const destructor = new SyncDestructor();
11
18
  const res = new Deferred();
12
19
  pendings.set(request.id, res);
20
+ destructor.defer(() => pendings.delete(request.id));
13
21
  try {
14
22
  socket.send(JSON.stringify(request));
15
23
  const mergedSignal = raceAbortSignals([
16
24
  isntUndefined(timeout) && timeoutSignal(timeout),
17
25
  signal
18
26
  ]);
19
- mergedSignal.addEventListener('abort', () => {
20
- const abort = DelightRPC.createAbort(request.id, channel);
21
- socket.send(JSON.stringify(abort));
22
- });
27
+ mergedSignal.addEventListener('abort', sendAbort);
28
+ destructor.defer(sendAbort);
23
29
  return await withAbortSignal(mergedSignal, () => res);
24
30
  }
25
31
  finally {
26
- pendings.delete(request.id);
32
+ destructor.execute();
33
+ }
34
+ function sendAbort() {
35
+ const abort = DelightRPC.createAbort(request.id, channel);
36
+ socket.send(JSON.stringify(abort));
27
37
  }
28
38
  }, {
29
39
  parameterValidators,
@@ -32,13 +42,16 @@ export function createClient(socket, { parameterValidators, expectedVersion, cha
32
42
  });
33
43
  return [client, close];
34
44
  function close() {
35
- removeMessageListener();
36
- for (const [key, deferred] of pendings.entries()) {
37
- deferred.reject(new ClientClosed());
38
- pendings.delete(key);
45
+ destructor.execute();
46
+ }
47
+ function abortAllPendings() {
48
+ const err = new ClientClosed();
49
+ for (const deferred of pendings.values()) {
50
+ deferred.reject(err);
39
51
  }
52
+ pendings.clear();
40
53
  }
41
- function listener(event) {
54
+ function receive(event) {
42
55
  var _a;
43
56
  const data = event.data;
44
57
  if (isString(data)) {
@@ -50,24 +63,33 @@ export function createClient(socket, { parameterValidators, expectedVersion, cha
50
63
  }
51
64
  }
52
65
  export function createBatchClient(socket, { expectedVersion, channel, timeout } = {}) {
66
+ const destructor = new SyncDestructor();
53
67
  const pendings = new Map();
54
- const removeMessageListener = socket.on('message', listener);
68
+ destructor.defer(abortAllPendings);
69
+ const removeMessageListener = socket.on('message', receive);
70
+ destructor.defer(removeMessageListener);
71
+ const removeCloseListener = socket.on('close', close);
72
+ destructor.defer(removeCloseListener);
55
73
  const client = new DelightRPC.BatchClient(async function send(request) {
74
+ const destructor = new SyncDestructor();
56
75
  const res = new Deferred();
57
76
  pendings.set(request.id, res);
77
+ destructor.defer(() => pendings.delete(request.id));
58
78
  try {
59
79
  socket.send(JSON.stringify(request));
60
- const signal = isntUndefined(timeout)
61
- ? timeoutSignal(timeout)
62
- : undefined;
63
- signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', () => {
64
- const abort = DelightRPC.createAbort(request.id, channel);
65
- socket.send(JSON.stringify(abort));
66
- });
67
- return await withAbortSignal(signal, () => res);
80
+ const mergedSignal = raceAbortSignals([
81
+ isntUndefined(timeout) && timeoutSignal(timeout)
82
+ ]);
83
+ mergedSignal.addEventListener('abort', sendAbort);
84
+ destructor.defer(() => mergedSignal.removeEventListener('abort', sendAbort));
85
+ return await withAbortSignal(mergedSignal, () => res);
68
86
  }
69
87
  finally {
70
- pendings.delete(request.id);
88
+ destructor.execute();
89
+ }
90
+ function sendAbort() {
91
+ const abort = DelightRPC.createAbort(request.id, channel);
92
+ socket.send(JSON.stringify(abort));
71
93
  }
72
94
  }, {
73
95
  expectedVersion,
@@ -75,13 +97,16 @@ export function createBatchClient(socket, { expectedVersion, channel, timeout }
75
97
  });
76
98
  return [client, close];
77
99
  function close() {
78
- removeMessageListener();
79
- for (const [key, deferred] of pendings.entries()) {
80
- deferred.reject(new ClientClosed());
81
- pendings.delete(key);
100
+ destructor.execute();
101
+ }
102
+ function abortAllPendings() {
103
+ const err = new ClientClosed();
104
+ for (const deferred of pendings.values()) {
105
+ deferred.reject(err);
82
106
  }
107
+ pendings.clear();
83
108
  }
84
- function listener(event) {
109
+ function receive(event) {
85
110
  var _a;
86
111
  const data = event.data;
87
112
  if (isString(data)) {
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,UAAU,YAAY,CAC1B,MAAsB,EACtB,EAAE,mBAAmB,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAKpD,EAAE;IAEN,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAA;IAEvC,MAAM,QAAQ,GAA8C,IAAI,GAAG,EAAE,CAAA;IACrE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAElC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3D,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAEvC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACrD,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAErC,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CACpC,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM;QACjC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAA;QAEvC,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAsB,CAAA;QAC9C,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC7B,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YAEpC,MAAM,YAAY,GAAG,gBAAgB,CAAC;gBACpC,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;gBAChD,MAAM;aACP,CAAC,CAAA;YACF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YACjD,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAE3B,OAAO,MAAM,eAAe,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QACvD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,OAAO,EAAE,CAAA;QACtB,CAAC;QAED,SAAS,SAAS;YAChB,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACzD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,EACD;QACE,mBAAmB;QACnB,eAAe;QACf,OAAO;KACR,CACF,CAAA;IAED,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAEtB,SAAS,KAAK;QACZ,UAAU,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED,SAAS,gBAAgB;QACvB,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAA;QAE9B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;QAED,QAAQ,CAAC,KAAK,EAAE,CAAA;IAClB,CAAC;IAED,SAAS,OAAO,CAAC,KAAmB;;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;QACvB,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,0CAAE,OAAO,CAAC,GAAG,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAI/B,EAAE;IAEN,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAA;IAEvC,MAAM,QAAQ,GAA4D,IAAI,GAAG,EAAE,CAAA;IACnF,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAElC,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3D,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAEvC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACrD,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAErC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CACvC,KAAK,UAAU,IAAI,CAAC,OAAO;QACzB,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAA;QAEvC,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAoC,CAAA;QAC5D,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC7B,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YAEpC,MAAM,YAAY,GAAG,gBAAgB,CAAC;gBACpC,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;aACjD,CAAC,CAAA;YACF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YACjD,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;YAE5E,OAAO,MAAM,eAAe,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QACvD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,OAAO,EAAE,CAAA;QACtB,CAAC;QAED,SAAS,SAAS;YAChB,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACzD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,EACD;QACE,eAAe;QACf,OAAO;KACR,CACF,CAAA;IAED,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAEtB,SAAS,KAAK;QACZ,UAAU,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED,SAAS,gBAAgB;QACvB,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAA;QAE9B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;QAED,QAAQ,CAAC,KAAK,EAAE,CAAA;IAClB,CAAC;IAED,SAAS,OAAO,CAAC,KAAmB;;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;QACvB,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAC7C,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/D,MAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,0CAAE,OAAO,CAAC,GAAG,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,WAAW;CAAG"}
package/lib/server.js CHANGED
@@ -4,29 +4,40 @@ import { Logger, TerminalTransport, Level } from 'extra-logger';
4
4
  import { isntNull, isString } from '@blackglory/prelude';
5
5
  import { AbortController } from 'extra-abort';
6
6
  import { HashMap } from '@blackglory/structures';
7
+ import { SyncDestructor } from 'extra-defer';
7
8
  export { Level } from 'extra-logger';
8
9
  export function createServer(api, socket, { loggerLevel = Level.None, parameterValidators, version, channel, ownPropsOnly } = {}) {
10
+ const destructor = new SyncDestructor();
9
11
  const logger = new Logger({
10
12
  level: loggerLevel,
11
13
  transport: new TerminalTransport()
12
14
  });
13
15
  const channelIdToController = new HashMap(({ channel, id }) => JSON.stringify([channel, id]));
14
- const removeMessageListener = socket.on('message', listener);
15
- socket.on('close', () => {
16
+ destructor.defer(abortAllPendings);
17
+ const removeMessageListener = socket.on('message', receive);
18
+ destructor.defer(removeMessageListener);
19
+ const removeCloseListener = socket.on('close', close);
20
+ destructor.defer(removeCloseListener);
21
+ return close;
22
+ function close() {
23
+ destructor.execute();
24
+ }
25
+ function abortAllPendings() {
16
26
  for (const controller of channelIdToController.values()) {
17
27
  controller.abort();
18
28
  }
19
29
  channelIdToController.clear();
20
- });
21
- return () => removeMessageListener();
22
- async function listener(event) {
30
+ }
31
+ async function receive(event) {
23
32
  var _a;
24
33
  const data = event.data;
25
34
  if (isString(data)) {
26
35
  const message = getResult(() => JSON.parse(data));
27
36
  if (DelightRPC.isRequest(message) || DelightRPC.isBatchRequest(message)) {
37
+ const destructor = new SyncDestructor();
28
38
  const controller = new AbortController();
29
39
  channelIdToController.set(message, controller);
40
+ destructor.defer(() => channelIdToController.delete(message));
30
41
  try {
31
42
  const response = await logger.infoTime(() => {
32
43
  if (DelightRPC.isRequest(message)) {
@@ -47,7 +58,7 @@ export function createServer(api, socket, { loggerLevel = Level.None, parameterV
47
58
  }
48
59
  }
49
60
  finally {
50
- channelIdToController.delete(message);
61
+ destructor.execute();
51
62
  }
52
63
  }
53
64
  else if (DelightRPC.isAbort(message)) {
package/lib/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delight-rpc/extra-websocket",
3
- "version": "0.7.5",
3
+ "version": "0.7.6",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [
@@ -37,7 +37,7 @@
37
37
  "@commitlint/config-conventional": "^18.4.3",
38
38
  "@delight-rpc/websocket": "^0.7.4",
39
39
  "@types/jest": "^29.5.11",
40
- "@types/node": "16",
40
+ "@types/node": "18",
41
41
  "@types/ws": "^8.5.10",
42
42
  "@typescript-eslint/eslint-plugin": "^6.13.2",
43
43
  "@typescript-eslint/parser": "^6.13.2",
@@ -64,6 +64,7 @@
64
64
  "@blackglory/structures": "^0.14.13",
65
65
  "@delight-rpc/protocol": "^4.1.1",
66
66
  "extra-abort": "^0.4.0",
67
+ "extra-defer": "^0.3.1",
67
68
  "extra-logger": "^0.8.0",
68
69
  "extra-promise": "^7.0.1",
69
70
  "return-style": "^3.0.1"