@litert/televoke 1.0.2 → 1.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.
Files changed (151) hide show
  1. package/CHANGES.md +13 -0
  2. package/lib/client/Client.decl.d.ts +0 -1
  3. package/lib/client/Client.decl.d.ts.map +1 -1
  4. package/lib/client/JsonApiClient.impl.d.ts.map +1 -1
  5. package/lib/client/JsonApiClient.impl.js +2 -2
  6. package/lib/client/JsonApiClient.impl.js.map +1 -1
  7. package/lib/client/index.d.ts +1 -1
  8. package/lib/client/index.d.ts.map +1 -1
  9. package/lib/client/index.js +1 -1
  10. package/lib/client/index.js.map +1 -1
  11. package/lib/server/LegacyServerChannel.impl.d.ts +2 -2
  12. package/lib/server/LegacyServerChannel.impl.d.ts.map +1 -1
  13. package/lib/server/LegacyServerChannel.impl.js +2 -0
  14. package/lib/server/LegacyServerChannel.impl.js.map +1 -1
  15. package/lib/server/Server.decl.d.ts +0 -1
  16. package/lib/server/Server.decl.d.ts.map +1 -1
  17. package/lib/server/Server.impl.d.ts +0 -1
  18. package/lib/server/Server.impl.d.ts.map +1 -1
  19. package/lib/server/SimpleJsonApiRouter.d.ts +0 -2
  20. package/lib/server/SimpleJsonApiRouter.d.ts.map +1 -1
  21. package/lib/shared/BinaryStream.d.ts +0 -2
  22. package/lib/shared/BinaryStream.d.ts.map +1 -1
  23. package/lib/shared/BinaryStreamManager.js +4 -4
  24. package/lib/shared/BinaryStreamManager.js.map +1 -1
  25. package/lib/shared/Channel.impl.d.ts +2 -3
  26. package/lib/shared/Channel.impl.d.ts.map +1 -1
  27. package/lib/shared/Channel.impl.js +2 -0
  28. package/lib/shared/Channel.impl.js.map +1 -1
  29. package/lib/shared/Encodings/v2/DecoderV2.d.ts +0 -1
  30. package/lib/shared/Encodings/v2/DecoderV2.d.ts.map +1 -1
  31. package/lib/shared/Encodings/v2/DecoderV2.js +14 -3
  32. package/lib/shared/Encodings/v2/DecoderV2.js.map +1 -1
  33. package/lib/shared/Encodings/v2/EncoderV2.d.ts +0 -1
  34. package/lib/shared/Encodings/v2/EncoderV2.d.ts.map +1 -1
  35. package/lib/shared/Encodings/v2/Encoding.v2.decl.d.ts +0 -1
  36. package/lib/shared/Encodings/v2/Encoding.v2.decl.d.ts.map +1 -1
  37. package/lib/shared/Errors.d.ts +4 -4
  38. package/lib/shared/Errors.d.ts.map +1 -1
  39. package/lib/shared/Errors.js +3 -3
  40. package/lib/shared/Errors.js.map +1 -1
  41. package/lib/shared/Shared.decl.d.ts +8 -2
  42. package/lib/shared/Shared.decl.d.ts.map +1 -1
  43. package/lib/shared/Utils.d.ts +0 -1
  44. package/lib/shared/Utils.d.ts.map +1 -1
  45. package/lib/shared/Utils.js +2 -3
  46. package/lib/shared/Utils.js.map +1 -1
  47. package/lib/transporters/Transporter.decl.d.ts +2 -3
  48. package/lib/transporters/Transporter.decl.d.ts.map +1 -1
  49. package/lib/transporters/http-listener/AbstractHttpListener.d.ts +0 -2
  50. package/lib/transporters/http-listener/AbstractHttpListener.d.ts.map +1 -1
  51. package/lib/transporters/http-listener/Http.Decl.d.ts +0 -4
  52. package/lib/transporters/http-listener/Http.Decl.d.ts.map +1 -1
  53. package/lib/transporters/http-listener/HttpListener.js +1 -2
  54. package/lib/transporters/http-listener/HttpListener.js.map +1 -1
  55. package/lib/transporters/http-listener/HttpUnixSocketListener.js +1 -2
  56. package/lib/transporters/http-listener/HttpUnixSocketListener.js.map +1 -1
  57. package/lib/transporters/http-listener/HttpsListener.js +1 -2
  58. package/lib/transporters/http-listener/HttpsListener.js.map +1 -1
  59. package/lib/{client/LegacyHttpClient.impl.d.ts → transporters/legacy-http/LegacyHttp.Client.Native.d.ts} +21 -4
  60. package/lib/transporters/legacy-http/LegacyHttp.Client.Native.d.ts.map +1 -0
  61. package/lib/{client/LegacyHttpClient.impl.js → transporters/legacy-http/LegacyHttp.Client.Native.js} +11 -11
  62. package/lib/transporters/legacy-http/LegacyHttp.Client.Native.js.map +1 -0
  63. package/lib/transporters/legacy-http/LegacyHttp.Server.d.ts.map +1 -1
  64. package/lib/transporters/legacy-http/LegacyHttp.Server.js +8 -2
  65. package/lib/transporters/legacy-http/LegacyHttp.Server.js.map +1 -1
  66. package/lib/transporters/legacy-http/LegacyHttp.Transporter.d.ts +0 -1
  67. package/lib/transporters/legacy-http/LegacyHttp.Transporter.d.ts.map +1 -1
  68. package/lib/transporters/legacy-http/index.d.ts +1 -0
  69. package/lib/transporters/legacy-http/index.d.ts.map +1 -1
  70. package/lib/transporters/legacy-http/index.js +1 -0
  71. package/lib/transporters/legacy-http/index.js.map +1 -1
  72. package/lib/transporters/lwdfx/LwDFX.Tcp.Client.js +1 -2
  73. package/lib/transporters/lwdfx/LwDFX.Tcp.Client.js.map +1 -1
  74. package/lib/transporters/lwdfx/LwDFX.Tcp.Server.js +1 -2
  75. package/lib/transporters/lwdfx/LwDFX.Tcp.Server.js.map +1 -1
  76. package/lib/transporters/lwdfx/LwDFX.Tls.Client.js +1 -2
  77. package/lib/transporters/lwdfx/LwDFX.Tls.Client.js.map +1 -1
  78. package/lib/transporters/lwdfx/LwDFX.Tls.Server.js +1 -2
  79. package/lib/transporters/lwdfx/LwDFX.Tls.Server.js.map +1 -1
  80. package/lib/transporters/lwdfx/LwDFX.Transporter.d.ts +2 -4
  81. package/lib/transporters/lwdfx/LwDFX.Transporter.d.ts.map +1 -1
  82. package/lib/transporters/lwdfx/LwDFX.Transporter.js +1 -4
  83. package/lib/transporters/lwdfx/LwDFX.Transporter.js.map +1 -1
  84. package/lib/transporters/lwdfx/LwDFX.UnixSocket.Client.js +1 -2
  85. package/lib/transporters/lwdfx/LwDFX.UnixSocket.Client.js.map +1 -1
  86. package/lib/transporters/lwdfx/LwDFX.UnixSocket.Server.js +1 -2
  87. package/lib/transporters/lwdfx/LwDFX.UnixSocket.Server.js.map +1 -1
  88. package/lib/transporters/memory/Memory.Impl.d.ts +0 -1
  89. package/lib/transporters/memory/Memory.Impl.d.ts.map +1 -1
  90. package/lib/transporters/memory/Memory.Impl.js +3 -10
  91. package/lib/transporters/memory/Memory.Impl.js.map +1 -1
  92. package/lib/transporters/websocket/WebSocket.Client.js +2 -3
  93. package/lib/transporters/websocket/WebSocket.Client.js.map +1 -1
  94. package/lib/transporters/websocket/WebSocket.Server.js +1 -2
  95. package/lib/transporters/websocket/WebSocket.Server.js.map +1 -1
  96. package/lib/transporters/websocket/WebSocket.Transporter.d.ts +2 -4
  97. package/lib/transporters/websocket/WebSocket.Transporter.d.ts.map +1 -1
  98. package/lib/transporters/websocket/WebSocket.Transporter.js +1 -9
  99. package/lib/transporters/websocket/WebSocket.Transporter.js.map +1 -1
  100. package/lib/transporters/worker-thread/WorkerThread.Client.d.ts +30 -0
  101. package/lib/transporters/worker-thread/WorkerThread.Client.d.ts.map +1 -0
  102. package/lib/transporters/worker-thread/WorkerThread.Client.js +70 -0
  103. package/lib/transporters/worker-thread/WorkerThread.Client.js.map +1 -0
  104. package/lib/transporters/worker-thread/WorkerThread.Constants.d.ts +18 -0
  105. package/lib/transporters/worker-thread/WorkerThread.Constants.d.ts.map +1 -0
  106. package/lib/transporters/worker-thread/WorkerThread.Constants.js +21 -0
  107. package/lib/transporters/worker-thread/WorkerThread.Constants.js.map +1 -0
  108. package/lib/transporters/worker-thread/WorkerThread.Errors.d.ts +49 -0
  109. package/lib/transporters/worker-thread/WorkerThread.Errors.d.ts.map +1 -0
  110. package/lib/transporters/worker-thread/WorkerThread.Errors.js +38 -0
  111. package/lib/transporters/worker-thread/WorkerThread.Errors.js.map +1 -0
  112. package/lib/transporters/worker-thread/WorkerThread.Server.d.ts +42 -0
  113. package/lib/transporters/worker-thread/WorkerThread.Server.d.ts.map +1 -0
  114. package/lib/transporters/worker-thread/WorkerThread.Server.js +94 -0
  115. package/lib/transporters/worker-thread/WorkerThread.Server.js.map +1 -0
  116. package/lib/transporters/worker-thread/WorkerThread.Transporter.d.ts +49 -0
  117. package/lib/transporters/worker-thread/WorkerThread.Transporter.d.ts.map +1 -0
  118. package/lib/transporters/worker-thread/WorkerThread.Transporter.js +140 -0
  119. package/lib/transporters/worker-thread/WorkerThread.Transporter.js.map +1 -0
  120. package/lib/transporters/worker-thread/index.d.ts +19 -0
  121. package/lib/transporters/worker-thread/index.d.ts.map +1 -0
  122. package/lib/transporters/worker-thread/index.js +35 -0
  123. package/lib/transporters/worker-thread/index.js.map +1 -0
  124. package/package.json +8 -8
  125. package/src/lib/client/JsonApiClient.impl.ts +1 -0
  126. package/src/lib/client/index.ts +2 -1
  127. package/src/lib/server/LegacyServerChannel.impl.ts +4 -0
  128. package/src/lib/shared/Channel.impl.ts +4 -0
  129. package/src/lib/shared/Encodings/v2/DecoderV2.ts +21 -3
  130. package/src/lib/shared/Errors.ts +3 -2
  131. package/src/lib/shared/Shared.decl.ts +10 -0
  132. package/src/lib/transporters/Transporter.decl.ts +2 -2
  133. package/src/lib/{client/LegacyHttpClient.impl.ts → transporters/legacy-http/LegacyHttp.Client.Native.ts} +31 -9
  134. package/src/lib/transporters/legacy-http/LegacyHttp.Server.ts +13 -0
  135. package/src/lib/transporters/legacy-http/README.md +13 -0
  136. package/src/lib/transporters/legacy-http/index.ts +1 -0
  137. package/src/lib/transporters/lwdfx/LwDFX.Transporter.ts +2 -7
  138. package/src/lib/transporters/lwdfx/README.md +12 -0
  139. package/src/lib/transporters/memory/Memory.Impl.ts +2 -12
  140. package/src/lib/transporters/memory/README.md +7 -0
  141. package/src/lib/transporters/websocket/README.md +14 -0
  142. package/src/lib/transporters/websocket/WebSocket.Transporter.ts +2 -14
  143. package/src/lib/transporters/worker-thread/README.md +18 -0
  144. package/src/lib/transporters/worker-thread/WorkerThread.Client.ts +88 -0
  145. package/src/lib/transporters/worker-thread/WorkerThread.Constants.ts +19 -0
  146. package/src/lib/transporters/worker-thread/WorkerThread.Errors.ts +53 -0
  147. package/src/lib/transporters/worker-thread/WorkerThread.Server.ts +136 -0
  148. package/src/lib/transporters/worker-thread/WorkerThread.Transporter.ts +204 -0
  149. package/src/lib/transporters/worker-thread/index.ts +19 -0
  150. package/lib/client/LegacyHttpClient.impl.d.ts.map +0 -1
  151. package/lib/client/LegacyHttpClient.impl.js.map +0 -1
@@ -75,7 +75,7 @@ export class LwDFXTransporter extends EventEmitter implements dT.ITransporter, S
75
75
  return this._conn.connected;
76
76
  }
77
77
 
78
- public write(frame: string | Buffer | Array<string | Buffer>): void {
78
+ public write(frame: Array<string | Buffer>): void {
79
79
 
80
80
  if (!this._conn.writable) {
81
81
 
@@ -85,15 +85,10 @@ export class LwDFXTransporter extends EventEmitter implements dT.ITransporter, S
85
85
  this._conn.write(frame);
86
86
  }
87
87
 
88
- public end(frame?: Buffer | string): void {
88
+ public end(): void {
89
89
 
90
90
  if (this._conn.writable) {
91
91
 
92
- if (frame) {
93
-
94
- this._conn.write(frame);
95
- }
96
-
97
92
  this._conn.end();
98
93
  }
99
94
  }
@@ -0,0 +1,12 @@
1
+ # Televoke2/LwDFX
2
+
3
+ This module provides the Televoke2 protocol over LwDFXv1. It allows you to connect to the Televoke2 server with LwDFXv1.
4
+
5
+ > `@litert/lwdfx` is required to use this module.
6
+
7
+ ## Examples
8
+
9
+ - [Server](../../../examples/network/server.ts)
10
+ - [Client over TCP](../../../examples/network/lwdfx-tcp-client.ts)
11
+ - [Client over TLS](../../../examples/network/lwdfx-tls-client.ts)
12
+ - [Client over Unix Domain Socket](../../../examples/network/lwdfx-unix-client.ts)
@@ -176,18 +176,13 @@ class MemorySocket extends EventEmitter implements dT.ITransporter, Shared.ITran
176
176
  };
177
177
  }
178
178
 
179
- public write(data: string | Buffer | Array<string | Buffer>): void {
179
+ public write(data: Array<string | Buffer>): void {
180
180
 
181
181
  if (this._exchange.isEnded(this._endpoint)) {
182
182
 
183
183
  throw new Shared.errors.network_error({ reason: 'conn_lost' });
184
184
  }
185
185
 
186
- if (!Array.isArray(data)) {
187
-
188
- data = [data];
189
- }
190
-
191
186
  for (let i = 0; i < data.length; ++i) {
192
187
 
193
188
  if (!(data[i] instanceof Buffer)) {
@@ -204,12 +199,7 @@ class MemorySocket extends EventEmitter implements dT.ITransporter, Shared.ITran
204
199
  this._exchange.close();
205
200
  }
206
201
 
207
- public end(lastChunk?: any): void {
208
-
209
- if (lastChunk !== undefined) {
210
-
211
- this.write(lastChunk);
212
- }
202
+ public end(): void {
213
203
 
214
204
  this._exchange.end(this._endpoint);
215
205
  }
@@ -0,0 +1,7 @@
1
+ # Televoke2/Memory
2
+
3
+ This module provides the Televoke2 protocol in-memory. It allows you to simulate a server and client in the same process (thread).
4
+
5
+ ## Examples
6
+
7
+ - [Go to examples](../../../examples/memory.ts)
@@ -0,0 +1,14 @@
1
+ # Televoke2/Websocket
2
+
3
+ This module provides the Televoke2 protocol over websocket. It allows you to connect to the Televoke2 server with websocket.
4
+
5
+ > `@litert/websocket` is required to use this module.
6
+ >
7
+ > And by default it uses unmasked data frames in client-side, which maybe incompatible with some server implementations. You could enable the mask feature by yourself, and improved the masking performance by use the `@litert/ws-utils` module, which is a C++ addon.
8
+
9
+ ## Examples
10
+
11
+ - [Server](../../../examples/network/server.ts)
12
+ - [Client over TCP](../../../examples/network/ws-client.ts)
13
+ - [Client over TLS](../../../examples/network/wss-client.ts)
14
+ - [Client over Unix Domain Socket](../../../examples/network/ws-unix-client.ts)
@@ -93,7 +93,7 @@ export class WebSocketTransporter extends EventEmitter implements dT.ITransporte
93
93
  return this._conn.connected;
94
94
  }
95
95
 
96
- public write(frame: string | Buffer | Array<string | Buffer>): void {
96
+ public write(frame: Array<string | Buffer>): void {
97
97
 
98
98
  if (!this._conn.writable) {
99
99
 
@@ -110,22 +110,10 @@ export class WebSocketTransporter extends EventEmitter implements dT.ITransporte
110
110
  }
111
111
  }
112
112
 
113
- public end(frame?: Buffer | string): void {
113
+ public end(): void {
114
114
 
115
115
  if (this._conn.writable) {
116
116
 
117
- if (frame) {
118
-
119
- try {
120
-
121
- this._conn.writeBinary(frame);
122
- }
123
- catch (e) {
124
-
125
- throw new Shared.errors.network_error({ reason: 'conn_lost', cause: e });
126
- }
127
- }
128
-
129
117
  this._conn.end();
130
118
  }
131
119
  }
@@ -0,0 +1,18 @@
1
+ # Televoke2/WorkerThread
2
+
3
+ This module provides the Televoke2 protocol over Node.js Worker Threads, which allows you to connect the main thread and
4
+ worker threads with the Televoke2 protocol.
5
+
6
+ You could either make the main thread as a server or a client, and the worker threads as clients or servers.
7
+
8
+ ## Examples
9
+
10
+ - Main Thread As Server
11
+
12
+ - Check the [server code (main thread)](../../../examples/worker-thread/main-server.ts)
13
+ - Check the [client code (worker thread)](../../../examples/worker-thread/worker-client.ts)
14
+
15
+ - Worker Thread As Server
16
+
17
+ - Check the [server code (worker thread)](../../../examples/worker-thread/worker-server.ts)
18
+ - Check the [client code (main thread)](../../../examples/worker-thread/main-client.ts)
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import * as NodeWorker from 'node:worker_threads';
18
+ import type * as dT from '../Transporter.decl';
19
+ import * as eWT from './WorkerThread.Errors';
20
+ import { MAIN_THREAD_PROTOCOL_NAME } from './WorkerThread.Constants';
21
+ import { MainThreadTransporter, WorkerThreadTransporter } from './WorkerThread.Transporter';
22
+
23
+ class MainServerConnector implements dT.IConnector {
24
+
25
+ private _transporter: dT.ITransporter | null = null;
26
+
27
+ public async connect(): Promise<dT.ITransporter> {
28
+
29
+ return Promise.resolve(this._transporter ??= new WorkerThreadTransporter(MAIN_THREAD_PROTOCOL_NAME));
30
+ }
31
+ }
32
+
33
+ class WorkerServerConnector implements dT.IConnector {
34
+
35
+ private _worker: NodeWorker.Worker | null = null;
36
+
37
+ public constructor(worker: NodeWorker.Worker) {
38
+
39
+ this._worker = worker
40
+ .on('exit', () => { this._worker = null; });
41
+ }
42
+
43
+ private _transporter: dT.ITransporter | null = null;
44
+
45
+ public async connect(): Promise<dT.ITransporter> {
46
+
47
+ if (!this._worker) {
48
+
49
+ throw new eWT.E_WORKER_THREAD_OFFLINE();
50
+ }
51
+
52
+ this._transporter ??= new MainThreadTransporter(MAIN_THREAD_PROTOCOL_NAME, this._worker);
53
+
54
+ return Promise.resolve(this._transporter);
55
+ }
56
+ }
57
+
58
+ let inst: MainServerConnector | null = null;
59
+
60
+ /**
61
+ * Create a connector to connect to the server running in the main thread.
62
+ *
63
+ * @experimental
64
+ */
65
+ export function connectToMainThreadServer(): dT.IConnector {
66
+
67
+ if (NodeWorker.isMainThread) {
68
+
69
+ throw new eWT.E_WORKER_THREAD_ONLY();
70
+ }
71
+
72
+ return inst ??= new MainServerConnector();
73
+ }
74
+
75
+ /**
76
+ * Create a connector to connect to the server running in the worker thread.
77
+ *
78
+ * @experimental
79
+ */
80
+ export function connectToWorkerThreadServer(worker: NodeWorker.Worker): dT.IConnector {
81
+
82
+ if (!NodeWorker.isMainThread) {
83
+
84
+ throw new eWT.E_MAIN_THREAD_ONLY();
85
+ }
86
+
87
+ return new WorkerServerConnector(worker);
88
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export const MAIN_THREAD_PROTOCOL_NAME = 'worker_thread/main';
18
+
19
+ export const WORKER_THREAD_PROTOCOL_NAME = 'worker_thread/worker';
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { TelevokeError } from '../../shared';
18
+
19
+ export const E_WORKER_THREAD_OFFLINE = class extends TelevokeError {
20
+
21
+ public constructor(origin: unknown = null) {
22
+
23
+ super(
24
+ 'worker_thread_offline',
25
+ 'The worker thread is offline.',
26
+ origin
27
+ );
28
+ }
29
+ };
30
+
31
+ export const E_MAIN_THREAD_ONLY = class extends TelevokeError {
32
+
33
+ public constructor(origin: unknown = null) {
34
+
35
+ super(
36
+ 'main_thread_only',
37
+ 'The operation is only allowed in the main thread.',
38
+ origin
39
+ );
40
+ }
41
+ };
42
+
43
+ export const E_WORKER_THREAD_ONLY = class extends TelevokeError {
44
+
45
+ public constructor(origin: unknown = null) {
46
+
47
+ super(
48
+ 'worker_thread_only',
49
+ 'The operation is only allowed in a worker thread.',
50
+ origin
51
+ );
52
+ }
53
+ };
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import * as NodeWorker from 'node:worker_threads';
18
+ import type * as dT from '../Transporter.decl';
19
+ import * as cWT from './WorkerThread.Constants';
20
+ import { EventEmitter } from 'node:events';
21
+ import { MainThreadTransporter, WorkerThreadTransporter } from './WorkerThread.Transporter';
22
+ import * as eWT from './WorkerThread.Errors';
23
+
24
+ export interface IMainThreadGateway extends dT.IGateway {
25
+
26
+ /**
27
+ * Add a worker thread to the gateway, so that the gateway can communicate with it.
28
+ *
29
+ * > The worker thread must be online already.
30
+ *
31
+ * @param worker The worker instance on the main thread.
32
+ */
33
+ registerWorker(worker: NodeWorker.Worker): void;
34
+ }
35
+
36
+ const VOID_OK_PROMISE = Promise.resolve();
37
+
38
+ class MainThreadGateway extends EventEmitter implements IMainThreadGateway {
39
+
40
+ public constructor(
41
+ private readonly _server: dT.IServer,
42
+ ) { super(); }
43
+
44
+ public get running(): boolean {
45
+
46
+ return true;
47
+ }
48
+
49
+ public start(): Promise<void> {
50
+
51
+ return VOID_OK_PROMISE;
52
+ }
53
+
54
+ public stop(): Promise<void> {
55
+
56
+ return VOID_OK_PROMISE;
57
+ }
58
+
59
+ public registerWorker(worker: NodeWorker.Worker): void {
60
+
61
+ if (worker?.threadId === -1) {
62
+
63
+ throw new eWT.E_WORKER_THREAD_OFFLINE();
64
+ }
65
+
66
+ this._server.registerChannel(new MainThreadTransporter(cWT.MAIN_THREAD_PROTOCOL_NAME, worker));
67
+ }
68
+ }
69
+
70
+ class WorkerThreadGateway extends EventEmitter implements dT.IGateway {
71
+
72
+ private _transporter: WorkerThreadTransporter | null = null;
73
+
74
+ public constructor(
75
+ private readonly _server: dT.IServer,
76
+ ) { super(); }
77
+
78
+ public get running(): boolean {
79
+
80
+ return !!this._transporter;
81
+ }
82
+
83
+ public start(): Promise<void> {
84
+
85
+ if (this._transporter) {
86
+
87
+ return VOID_OK_PROMISE;
88
+ }
89
+
90
+ this._server.registerChannel(this._transporter = new WorkerThreadTransporter(cWT.WORKER_THREAD_PROTOCOL_NAME));
91
+
92
+ return VOID_OK_PROMISE;
93
+ }
94
+
95
+ public stop(): Promise<void> {
96
+
97
+ this._transporter?.end();
98
+ this._transporter = null;
99
+
100
+ return VOID_OK_PROMISE;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Create a gateway that runs in the main thread.
106
+ *
107
+ * @param server The server instance.
108
+ * @experimental
109
+ */
110
+ export function createMainThreadGateway(server: dT.IServer): IMainThreadGateway {
111
+
112
+ if (!NodeWorker.isMainThread) {
113
+
114
+ throw new eWT.E_MAIN_THREAD_ONLY();
115
+ }
116
+
117
+ return new MainThreadGateway(server);
118
+ }
119
+
120
+ let workerThreadGateway: WorkerThreadGateway | null = null;
121
+
122
+ /**
123
+ * Create a gateway that runs in the worker thread.
124
+ *
125
+ * @param server The server instance.
126
+ * @experimental
127
+ */
128
+ export function createWorkerThreadGateway(server: dT.IServer): dT.IGateway {
129
+
130
+ if (NodeWorker.isMainThread) {
131
+
132
+ throw new eWT.E_WORKER_THREAD_ONLY();
133
+ }
134
+
135
+ return workerThreadGateway ??= new WorkerThreadGateway(server);
136
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import * as NodeWorker from 'node:worker_threads';
18
+ import * as Shared from '../../shared';
19
+ import type * as dT from '../Transporter.decl';
20
+ import * as eWT from './WorkerThread.Errors';
21
+ import { EventEmitter } from 'node:events';
22
+
23
+ const PROPERTY_NAMES = ['remoteAddress', 'remotePort', 'localAddress', 'localPort', 'threadId'];
24
+
25
+ const MSG_PREFIX = 'televoke2://';
26
+
27
+ abstract class AbstractThreadTransporter extends EventEmitter {
28
+
29
+ public constructor(
30
+ public readonly protocol: string
31
+ ) {
32
+
33
+ super();
34
+ }
35
+
36
+ public getPropertyNames(): string[] {
37
+
38
+ return PROPERTY_NAMES;
39
+ }
40
+
41
+ public getAllProperties(): Record<string, unknown> {
42
+
43
+ return {
44
+ 'remoteAddress': '127.0.0.1',
45
+ 'remotePort': 0,
46
+ 'localAddress': '127.0.0.1',
47
+ 'localPort': 0,
48
+ 'threadId': NodeWorker.threadId,
49
+ };
50
+ }
51
+
52
+ public getProperty(name: string): unknown {
53
+
54
+ switch (name) {
55
+ case 'localPort':
56
+ return 0;
57
+ case 'localAddress':
58
+ return '127.0.0.1';
59
+ case 'remotePort':
60
+ return 0;
61
+ case 'remoteAddress':
62
+ return '127.0.0.1';
63
+ case 'threadId':
64
+ return NodeWorker.threadId;
65
+ default:
66
+ return undefined;
67
+ }
68
+ }
69
+
70
+ public abstract destroy(): void;
71
+
72
+ public end(): void {
73
+
74
+ this.destroy();
75
+ }
76
+
77
+ protected _write(
78
+ worker: NodeWorker.MessagePort | NodeWorker.Worker,
79
+ frame: Array<string | Buffer>
80
+ ): void {
81
+
82
+ for (let i = 0; i < frame.length; i++) {
83
+
84
+ const f = frame[i];
85
+
86
+ if (!(f instanceof Buffer)) {
87
+
88
+ frame[i] = Buffer.from(f);
89
+ }
90
+ }
91
+
92
+ try {
93
+
94
+ worker.postMessage(MSG_PREFIX + Buffer.concat(frame as Buffer[]).toString('base64'));
95
+ }
96
+ catch (e) {
97
+
98
+ throw new Shared.errors.network_error({ reason: 'conn_lost', cause: e });
99
+ }
100
+ }
101
+
102
+ protected _onMessage = (frame: unknown): void => {
103
+
104
+ if (typeof frame !== 'string' || !frame.startsWith(MSG_PREFIX)) {
105
+
106
+ return;
107
+ }
108
+
109
+ this.emit('frame', [Buffer.from(frame.slice(MSG_PREFIX.length), 'base64')]);
110
+ };
111
+ }
112
+
113
+ export class MainThreadTransporter extends AbstractThreadTransporter implements dT.ITransporter, Shared.ITransporter {
114
+
115
+ private _closed: boolean = false;
116
+
117
+ public constructor(
118
+ protocol: string,
119
+ protected readonly _worker: NodeWorker.Worker
120
+ ) {
121
+
122
+ super(protocol);
123
+
124
+ this._worker
125
+ .on('message', this._onMessage)
126
+ .on('error', this._onError)
127
+ .on('exit', this._onExit);
128
+ }
129
+
130
+ private readonly _onError = (e: unknown): void => { this.emit('error', e); };
131
+
132
+ private readonly _onExit = (): void => { this.destroy(); };
133
+
134
+ public destroy(): void {
135
+
136
+ this._closed = true;
137
+
138
+ this._worker.removeListener('message', this._onMessage);
139
+ this._worker.removeListener('error', this._onError);
140
+ this._worker.removeListener('exit', this._onExit);
141
+
142
+ this.emit('close');
143
+ }
144
+
145
+ public get writable(): boolean {
146
+
147
+ return !this._closed;
148
+ }
149
+
150
+ public write(frame: Array<string | Buffer>): void {
151
+
152
+ if (this._closed) {
153
+
154
+ throw new Shared.errors.network_error({ reason: 'conn_lost' });
155
+ }
156
+
157
+ this._write(this._worker, frame);
158
+ }
159
+ }
160
+
161
+ export class WorkerThreadTransporter extends AbstractThreadTransporter implements dT.ITransporter, Shared.ITransporter {
162
+
163
+ private _hold: NodeJS.Timeout | null = setInterval(() => { return; }, 3600_000);
164
+
165
+ public constructor(protocol: string) {
166
+
167
+ super(protocol);
168
+
169
+ if (NodeWorker.isMainThread) {
170
+
171
+ throw new eWT.E_WORKER_THREAD_ONLY();
172
+ }
173
+
174
+ NodeWorker.parentPort!.on('message', this._onMessage);
175
+ }
176
+
177
+ public destroy(): void {
178
+
179
+ if (this._hold) {
180
+
181
+ clearInterval(this._hold);
182
+ this._hold = null;
183
+
184
+ NodeWorker.parentPort!.removeListener('message', this._onMessage);
185
+
186
+ this.emit('close');
187
+ }
188
+ }
189
+
190
+ public get writable(): boolean {
191
+
192
+ return !!this._hold;
193
+ }
194
+
195
+ public write(frame: Array<string | Buffer>): void {
196
+
197
+ if (!this._hold) {
198
+
199
+ throw new Shared.errors.network_error({ reason: 'conn_lost' });
200
+ }
201
+
202
+ super._write(NodeWorker.parentPort!, frame);
203
+ }
204
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright 2024 Angus.Fenying <fenying@litert.org>
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export * from './WorkerThread.Client';
18
+ export * from './WorkerThread.Server';
19
+ export * from './WorkerThread.Constants';
@@ -1 +0,0 @@
1
- {"version":3,"file":"LegacyHttpClient.impl.d.ts","sourceRoot":"","sources":["../../src/lib/client/LegacyHttpClient.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;AAGH,OAAO,KAAK,MAAM,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,CAAC,MAAM,eAAe,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AA8NpC,UAAU,sBAAuB,SAAQ,MAAM,CAAC,cAAc;IAE1D;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAE1C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IAErE;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,4BAA6B,SAAQ,sBAAsB;IAExE;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,GAAG,4BAA4B,CAAC;AAE1F,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,kBAAkB,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAiB/G"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LegacyHttpClient.impl.js","sourceRoot":"","sources":["../../src/lib/client/LegacyHttpClient.impl.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,8BAA8B;AAC9B,gCAAgC;AAEhC,oCAAoC;AACpC,6CAA6C;AAC7C,6CAA2C;AAE3C,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AACpD,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,MAAM,eAAe,GAAG,KAAM,CAAC;AAE/B,MAAM,qBAAqB,GAAG,MAAM,CAAC,kCAAkC,EAAE,CAAC,IAAW,CAAC,CAAC;AAEvF,MAAM,kBAAmB,SAAQ,0BAAY;IAIzC,YACqB,QAAuF,EACvF,KAA4B,EAC5B,MAAmB,EACnB,oBAA6B,IAAI,EACjC,eAA0C;QAG3D,KAAK,EAAE,CAAC;QAPS,aAAQ,GAAR,QAAQ,CAA+E;QACvF,UAAK,GAAL,KAAK,CAAuB;QAC5B,WAAM,GAAN,MAAM,CAAa;QACnB,sBAAiB,GAAjB,iBAAiB,CAAgB;QACjC,oBAAe,GAAf,eAAe,CAA2B;QAgB/C,aAAQ,GAAY,IAAI,CAAC;QAEzB,UAAK,GAAY,KAAK,CAAC;QAEvB,aAAQ,GAAY,KAAK,CAAC;QAE1B,gBAAW,GAAG,IAAI,CAAC;IAlBnC,CAAC;IAED,IAAW,OAAO;QAEd,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC;IACjD,CAAC;IAED,IAAW,OAAO;QAEd,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAUM,eAAe;QAElB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEM,WAAW;QAEd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEM,IAAI;QAEP,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAQ,EAAE,GAAG,IAAW;QAExC,IAAI,CAAC;YAED,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YAEP,IAAI,IAAI,CAAC,iBAAiB,IAAK,CAAS,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBAE9D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACtC,CAAC;iBACI,CAAC;gBAEF,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,GAAQ,EAAE,GAAG,IAAW;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe;YAC1C,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG;YACR,IAAI;YACJ,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG;SAC1C,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAEnC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,MAAM,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;gBAE9B,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;gBACzE,OAAO;YACX,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACtB,GAAG,IAAI,CAAC,KAAK;gBACb,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;oBACrB,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;oBACxD,CAAC,kBAAkB,CAAC,EAAE,CAAC;iBAC1B;aACJ,EAAE,CAAC,IAAI,EAAE,EAAE;gBAER,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAE1B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;wBACtC,MAAM,EAAE,qBAAqB;wBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;qBAC9B,CAAC,CAAC,CAAC;oBACJ,OAAO;gBACX,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,CAAC;oBAE5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;oBACjF,OAAO;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAElE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,iCAAiC;oBAEjG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBACzE,OAAO;gBACX,CAAC;gBAED,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAEvC,IAAI,MAAM,GAAW,CAAC,CAAC;gBAEvB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAE9B,MAAM,KAAK,GAAG,MAAM,CAAC;oBAErB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;oBAE3B,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;wBAElB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;wBAC/B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;wBAChC,IAAI,CAAC,OAAO,EAAE,CAAC;wBAEf,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;wBACjF,OAAO;oBACX,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAE3B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBAEd,IAAI,IAA2B,CAAC;oBAEhC,IAAI,CAAC;wBAED,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAU,CAAC,CAAC;oBAClC,CAAC;oBACD,OAAO,CAAC,EAAE,CAAC;wBAEP,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;4BACtC,MAAM,EAAE,cAAc;4BACtB,GAAG,EAAE,GAAG;yBACX,EAAE,CAAC,CAAC,CAAC,CAAC;wBACP,OAAO;oBACX,CAAC;oBAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;wBAChB,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE;4BACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACnB,MAAM;wBACV,KAAK,EAAE,CAAC,aAAa,CAAC,OAAO;4BACzB,MAAM,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;4BAC9C,MAAM;wBACV,KAAK,EAAE,CAAC,aAAa,CAAC,aAAa;4BAC/B,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;4BACjD,MAAM;wBACV,KAAK,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC;wBAC1C,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;wBACnC;4BACI,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;gCAC3C,GAAG,EAAE,GAAG,IAAI;6BACf,CAAC,CAAC,CAAC;4BACJ,MAAM;oBACd,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBACrB,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;oBAC7B,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;iBACrD,CAAC,CAAC,CAAC;YACR,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE1B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,OAAO;QAEV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAEM,KAAK;QAER,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAEtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ;AAqDD,SAAgB,sBAAsB,CAA+B,IAAwB;IAEzF,OAAO,IAAI,kBAAkB,CACzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAC3C,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC;QAC1B,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,eAAe;KACpC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,eAAe;KACpC,CAAC,EACF,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,cAAc,CACtB,CAAC;AACN,CAAC;AAjBD,wDAiBC"}