rocketride 1.0.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 (166) hide show
  1. package/README.md +476 -0
  2. package/dist/cjs/client.js +1745 -0
  3. package/dist/cjs/client.js.map +1 -0
  4. package/dist/cjs/constants.js +48 -0
  5. package/dist/cjs/constants.js.map +1 -0
  6. package/dist/cjs/core/DAPBase.js +328 -0
  7. package/dist/cjs/core/DAPBase.js.map +1 -0
  8. package/dist/cjs/core/DAPClient.js +226 -0
  9. package/dist/cjs/core/DAPClient.js.map +1 -0
  10. package/dist/cjs/core/TransportBase.js +152 -0
  11. package/dist/cjs/core/TransportBase.js.map +1 -0
  12. package/dist/cjs/core/TransportWebSocket.js +646 -0
  13. package/dist/cjs/core/TransportWebSocket.js.map +1 -0
  14. package/dist/cjs/exceptions/index.js +119 -0
  15. package/dist/cjs/exceptions/index.js.map +1 -0
  16. package/dist/cjs/index.js +56 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/package.json +3 -0
  19. package/dist/cjs/schema/Doc.js +79 -0
  20. package/dist/cjs/schema/Doc.js.map +1 -0
  21. package/dist/cjs/schema/DocFilter.js +133 -0
  22. package/dist/cjs/schema/DocFilter.js.map +1 -0
  23. package/dist/cjs/schema/DocGroup.js +230 -0
  24. package/dist/cjs/schema/DocGroup.js.map +1 -0
  25. package/dist/cjs/schema/DocMetadata.js +58 -0
  26. package/dist/cjs/schema/DocMetadata.js.map +1 -0
  27. package/dist/cjs/schema/Question.js +414 -0
  28. package/dist/cjs/schema/Question.js.map +1 -0
  29. package/dist/cjs/schema/index.js +50 -0
  30. package/dist/cjs/schema/index.js.map +1 -0
  31. package/dist/cjs/types/client.js +26 -0
  32. package/dist/cjs/types/client.js.map +1 -0
  33. package/dist/cjs/types/data.js +26 -0
  34. package/dist/cjs/types/data.js.map +1 -0
  35. package/dist/cjs/types/events.js +119 -0
  36. package/dist/cjs/types/events.js.map +1 -0
  37. package/dist/cjs/types/index.js +50 -0
  38. package/dist/cjs/types/index.js.map +1 -0
  39. package/dist/cjs/types/pipeline.js +26 -0
  40. package/dist/cjs/types/pipeline.js.map +1 -0
  41. package/dist/cjs/types/task.js +115 -0
  42. package/dist/cjs/types/task.js.map +1 -0
  43. package/dist/cli/cli/rocketride.js +1399 -0
  44. package/dist/cli/cli/rocketride.js.map +1 -0
  45. package/dist/cli/client/client.js +1745 -0
  46. package/dist/cli/client/client.js.map +1 -0
  47. package/dist/cli/client/constants.js +48 -0
  48. package/dist/cli/client/constants.js.map +1 -0
  49. package/dist/cli/client/core/DAPBase.js +328 -0
  50. package/dist/cli/client/core/DAPBase.js.map +1 -0
  51. package/dist/cli/client/core/DAPClient.js +226 -0
  52. package/dist/cli/client/core/DAPClient.js.map +1 -0
  53. package/dist/cli/client/core/TransportBase.js +152 -0
  54. package/dist/cli/client/core/TransportBase.js.map +1 -0
  55. package/dist/cli/client/core/TransportWebSocket.js +646 -0
  56. package/dist/cli/client/core/TransportWebSocket.js.map +1 -0
  57. package/dist/cli/client/exceptions/index.js +119 -0
  58. package/dist/cli/client/exceptions/index.js.map +1 -0
  59. package/dist/cli/client/index.js +56 -0
  60. package/dist/cli/client/index.js.map +1 -0
  61. package/dist/cli/client/schema/Doc.js +79 -0
  62. package/dist/cli/client/schema/Doc.js.map +1 -0
  63. package/dist/cli/client/schema/DocFilter.js +133 -0
  64. package/dist/cli/client/schema/DocFilter.js.map +1 -0
  65. package/dist/cli/client/schema/DocGroup.js +230 -0
  66. package/dist/cli/client/schema/DocGroup.js.map +1 -0
  67. package/dist/cli/client/schema/DocMetadata.js +58 -0
  68. package/dist/cli/client/schema/DocMetadata.js.map +1 -0
  69. package/dist/cli/client/schema/Question.js +414 -0
  70. package/dist/cli/client/schema/Question.js.map +1 -0
  71. package/dist/cli/client/schema/index.js +50 -0
  72. package/dist/cli/client/schema/index.js.map +1 -0
  73. package/dist/cli/client/types/client.js +26 -0
  74. package/dist/cli/client/types/client.js.map +1 -0
  75. package/dist/cli/client/types/data.js +26 -0
  76. package/dist/cli/client/types/data.js.map +1 -0
  77. package/dist/cli/client/types/events.js +119 -0
  78. package/dist/cli/client/types/events.js.map +1 -0
  79. package/dist/cli/client/types/index.js +50 -0
  80. package/dist/cli/client/types/index.js.map +1 -0
  81. package/dist/cli/client/types/pipeline.js +26 -0
  82. package/dist/cli/client/types/pipeline.js.map +1 -0
  83. package/dist/cli/client/types/task.js +115 -0
  84. package/dist/cli/client/types/task.js.map +1 -0
  85. package/dist/esm/client.js +1740 -0
  86. package/dist/esm/client.js.map +1 -0
  87. package/dist/esm/constants.js +45 -0
  88. package/dist/esm/constants.js.map +1 -0
  89. package/dist/esm/core/DAPBase.js +324 -0
  90. package/dist/esm/core/DAPBase.js.map +1 -0
  91. package/dist/esm/core/DAPClient.js +222 -0
  92. package/dist/esm/core/DAPClient.js.map +1 -0
  93. package/dist/esm/core/TransportBase.js +148 -0
  94. package/dist/esm/core/TransportBase.js.map +1 -0
  95. package/dist/esm/core/TransportWebSocket.js +609 -0
  96. package/dist/esm/core/TransportWebSocket.js.map +1 -0
  97. package/dist/esm/exceptions/index.js +109 -0
  98. package/dist/esm/exceptions/index.js.map +1 -0
  99. package/dist/esm/index.js +40 -0
  100. package/dist/esm/index.js.map +1 -0
  101. package/dist/esm/package.json +3 -0
  102. package/dist/esm/schema/Doc.js +75 -0
  103. package/dist/esm/schema/Doc.js.map +1 -0
  104. package/dist/esm/schema/DocFilter.js +129 -0
  105. package/dist/esm/schema/DocFilter.js.map +1 -0
  106. package/dist/esm/schema/DocGroup.js +226 -0
  107. package/dist/esm/schema/DocGroup.js.map +1 -0
  108. package/dist/esm/schema/DocMetadata.js +54 -0
  109. package/dist/esm/schema/DocMetadata.js.map +1 -0
  110. package/dist/esm/schema/Question.js +409 -0
  111. package/dist/esm/schema/Question.js.map +1 -0
  112. package/dist/esm/schema/index.js +34 -0
  113. package/dist/esm/schema/index.js.map +1 -0
  114. package/dist/esm/types/client.js +25 -0
  115. package/dist/esm/types/client.js.map +1 -0
  116. package/dist/esm/types/data.js +25 -0
  117. package/dist/esm/types/data.js.map +1 -0
  118. package/dist/esm/types/events.js +116 -0
  119. package/dist/esm/types/events.js.map +1 -0
  120. package/dist/esm/types/index.js +34 -0
  121. package/dist/esm/types/index.js.map +1 -0
  122. package/dist/esm/types/pipeline.js +25 -0
  123. package/dist/esm/types/pipeline.js.map +1 -0
  124. package/dist/esm/types/task.js +112 -0
  125. package/dist/esm/types/task.js.map +1 -0
  126. package/dist/types/client.d.ts +798 -0
  127. package/dist/types/client.d.ts.map +1 -0
  128. package/dist/types/constants.d.ts +45 -0
  129. package/dist/types/constants.d.ts.map +1 -0
  130. package/dist/types/core/DAPBase.d.ts +152 -0
  131. package/dist/types/core/DAPBase.d.ts.map +1 -0
  132. package/dist/types/core/DAPClient.d.ts +93 -0
  133. package/dist/types/core/DAPClient.d.ts.map +1 -0
  134. package/dist/types/core/TransportBase.d.ts +113 -0
  135. package/dist/types/core/TransportBase.d.ts.map +1 -0
  136. package/dist/types/core/TransportWebSocket.d.ts +100 -0
  137. package/dist/types/core/TransportWebSocket.d.ts.map +1 -0
  138. package/dist/types/exceptions/index.d.ts +87 -0
  139. package/dist/types/exceptions/index.d.ts.map +1 -0
  140. package/dist/types/index.d.ts +36 -0
  141. package/dist/types/index.d.ts.map +1 -0
  142. package/dist/types/schema/Doc.d.ts +69 -0
  143. package/dist/types/schema/Doc.d.ts.map +1 -0
  144. package/dist/types/schema/DocFilter.d.ts +101 -0
  145. package/dist/types/schema/DocFilter.d.ts.map +1 -0
  146. package/dist/types/schema/DocGroup.d.ts +113 -0
  147. package/dist/types/schema/DocGroup.d.ts.map +1 -0
  148. package/dist/types/schema/DocMetadata.d.ts +77 -0
  149. package/dist/types/schema/DocMetadata.d.ts.map +1 -0
  150. package/dist/types/schema/Question.d.ts +163 -0
  151. package/dist/types/schema/Question.d.ts.map +1 -0
  152. package/dist/types/schema/index.d.ts +34 -0
  153. package/dist/types/schema/index.d.ts.map +1 -0
  154. package/dist/types/types/client.d.ts +149 -0
  155. package/dist/types/types/client.d.ts.map +1 -0
  156. package/dist/types/types/data.d.ts +95 -0
  157. package/dist/types/types/data.d.ts.map +1 -0
  158. package/dist/types/types/events.d.ts +246 -0
  159. package/dist/types/types/events.d.ts.map +1 -0
  160. package/dist/types/types/index.d.ts +34 -0
  161. package/dist/types/types/index.d.ts.map +1 -0
  162. package/dist/types/types/pipeline.d.ts +83 -0
  163. package/dist/types/types/pipeline.d.ts.map +1 -0
  164. package/dist/types/types/task.d.ts +314 -0
  165. package/dist/types/types/task.d.ts.map +1 -0
  166. package/package.json +61 -0
@@ -0,0 +1,609 @@
1
+ /**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2026 RocketRide, Inc.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+ import { TransportBase } from './TransportBase';
25
+ import { CONST_DEFAULT_SERVICE, CONST_SOCKET_TIMEOUT, CONST_WS_PING_INTERVAL, CONST_WS_PING_TIMEOUT } from '../constants';
26
+ /**
27
+ * Node.js WebSocket (ws package) loading - ESM/CJS compatibility
28
+ *
29
+ * We use dynamic import() instead of require() because:
30
+ * - In ESM (type: "module"), require is not defined; require('ws') throws ReferenceError at load time
31
+ * - The package is dual-mode (exports both CJS and ESM builds); ESM consumers would hit this
32
+ *
33
+ * Loading is deferred until connect() (lazy) so:
34
+ * - Browser builds never load ws (no window check needed at module load)
35
+ * - Single load is cached; concurrent connect() calls share the same promise
36
+ *
37
+ * Install ws in Node.js projects: npm install ws
38
+ */
39
+ let NodeWebSocket;
40
+ let NodeWebSocketPromise = null;
41
+ async function ensureNodeWebSocket() {
42
+ if (NodeWebSocket !== undefined)
43
+ return NodeWebSocket;
44
+ if (typeof window !== 'undefined')
45
+ return undefined;
46
+ if (NodeWebSocketPromise)
47
+ return NodeWebSocketPromise;
48
+ NodeWebSocketPromise = (async () => {
49
+ try {
50
+ const wsModule = await import('ws');
51
+ // ESM interop: default export is the constructor; CJS-style modules may expose it directly
52
+ const WsConstructor = wsModule.default ?? wsModule;
53
+ NodeWebSocket = WsConstructor;
54
+ return NodeWebSocket;
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ })();
60
+ return NodeWebSocketPromise;
61
+ }
62
+ /**
63
+ * WebSocket transport implementation for DAP protocol communication.
64
+ *
65
+ * Provides WebSocket-based communication between RocketRide clients and servers
66
+ * with support for both text (JSON) and binary (CBOR) message formats. Handles
67
+ * connection lifecycle management, message serialization/deserialization, automatic
68
+ * heartbeat/ping messages, and connection timeout detection.
69
+ *
70
+ * Features:
71
+ * - Cross-platform: Works in both browser (native WebSocket) and Node.js (ws library)
72
+ * - Automatic message encoding/decoding (JSON and CBOR)
73
+ * - Connection timeout handling
74
+ * - Authentication via headers
75
+ * - Message queuing during connection
76
+ *
77
+ * @extends TransportBase
78
+ */
79
+ export class TransportWebSocket extends TransportBase {
80
+ constructor(uri = CONST_DEFAULT_SERVICE, auth) {
81
+ super();
82
+ this._messageTasks = new Set();
83
+ this._lastPong = Date.now();
84
+ this._uri = uri;
85
+ this._auth = auth;
86
+ }
87
+ /** Auth credential for use by connect flow (e.g. first DAP auth command). */
88
+ getAuth() {
89
+ return this._auth;
90
+ }
91
+ /** Connection info for the "connected" callback (URI). */
92
+ getConnectionInfo() {
93
+ return this._uri;
94
+ }
95
+ /** Update auth credential. Takes effect on the next connect(). */
96
+ setAuth(auth) { this._auth = auth; }
97
+ /** Update connection URI. Takes effect on the next connect(). */
98
+ setUri(uri) { this._uri = uri; }
99
+ /**
100
+ * Start ping interval for Node.js WebSocket connections.
101
+ * Sends ping frames at regular intervals and monitors for pong responses.
102
+ * If no pong is received within the timeout period, the connection is terminated.
103
+ */
104
+ _startPingInterval() {
105
+ // Only for Node.js WebSocket (browser handles ping/pong automatically)
106
+ if (typeof window !== 'undefined' || !this._websocket) {
107
+ return;
108
+ }
109
+ this._lastPong = Date.now();
110
+ this._pingInterval = setInterval(() => {
111
+ if (!this._connected || !this._websocket) {
112
+ this._stopPingInterval();
113
+ return;
114
+ }
115
+ // Cast to Node.js WebSocket type for ping/terminate methods
116
+ const nodeWs = this._websocket;
117
+ // Check if we've received a pong within the timeout period
118
+ const timeSinceLastPong = Date.now() - this._lastPong;
119
+ if (timeSinceLastPong > CONST_WS_PING_TIMEOUT * 1000) {
120
+ this._debugMessage(`No pong received for ${timeSinceLastPong}ms - connection dead`);
121
+ this._stopPingInterval();
122
+ nodeWs.terminate();
123
+ return;
124
+ }
125
+ // Send ping
126
+ try {
127
+ if (nodeWs.readyState === 1) { // OPEN state
128
+ nodeWs.ping();
129
+ this._debugMessage('Sent ping to server');
130
+ }
131
+ }
132
+ catch (error) {
133
+ this._debugMessage(`Error sending ping: ${error}`);
134
+ }
135
+ }, CONST_WS_PING_INTERVAL * 1000);
136
+ }
137
+ /**
138
+ * Stop the ping interval timer.
139
+ */
140
+ _stopPingInterval() {
141
+ if (this._pingInterval) {
142
+ clearInterval(this._pingInterval);
143
+ this._pingInterval = undefined;
144
+ }
145
+ }
146
+ /**
147
+ * Process raw WebSocket data into structured messages.
148
+ *
149
+ * Handles both JSON text messages and DAP binary format messages.
150
+ * Binary messages use format: JSON header + newline + binary payload.
151
+ */
152
+ async _receiveData(data) {
153
+ try {
154
+ if (!this._connected) {
155
+ return;
156
+ }
157
+ if (typeof data === 'string') {
158
+ // JSON text message
159
+ const jsonMessage = JSON.parse(data);
160
+ await this._transportReceive(jsonMessage);
161
+ }
162
+ else {
163
+ // Binary message - look for JSON header separator
164
+ const dataArray = new Uint8Array(data);
165
+ const newlinePos = dataArray.indexOf(10); // ASCII newline
166
+ if (newlinePos === -1) {
167
+ // No separator - treat as JSON text
168
+ const textData = new TextDecoder().decode(dataArray);
169
+ const jsonMessage = JSON.parse(textData);
170
+ await this._transportReceive(jsonMessage);
171
+ }
172
+ else {
173
+ // DAP binary format: JSON header + newline + binary data
174
+ const jsonHeader = dataArray.slice(0, newlinePos);
175
+ const binaryData = dataArray.slice(newlinePos + 1);
176
+ // Parse JSON header
177
+ const headerText = new TextDecoder().decode(jsonHeader);
178
+ const jsonMessage = JSON.parse(headerText);
179
+ // Add binary data to message arguments
180
+ if (!jsonMessage.arguments) {
181
+ jsonMessage.arguments = {};
182
+ }
183
+ jsonMessage.arguments.data = binaryData;
184
+ await this._transportReceive(jsonMessage);
185
+ }
186
+ }
187
+ }
188
+ catch (error) {
189
+ // Only log errors if still connected
190
+ if (this._connected) {
191
+ this._debugMessage(`Error processing WebSocket message: ${error}`);
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Connect to WebSocket server and start receiving messages.
197
+ * Works in both browser and Node.js environments.
198
+ */
199
+ async connect(timeout) {
200
+ const isBrowser = typeof window !== 'undefined';
201
+ let nodeWs;
202
+ if (!isBrowser) {
203
+ // Must load ws before creating the connection; ensureNodeWebSocket() uses dynamic import()
204
+ // so it works when this package is consumed as ESM (e.g. from a project with "type": "module")
205
+ nodeWs = await ensureNodeWebSocket();
206
+ if (!nodeWs) {
207
+ throw new Error('WebSocket library (ws) not available in Node.js environment. Install it with: npm install ws');
208
+ }
209
+ }
210
+ return new Promise((resolve, reject) => {
211
+ let promiseResolved = false;
212
+ const resolveOnce = () => {
213
+ if (!promiseResolved) {
214
+ promiseResolved = true;
215
+ resolve();
216
+ }
217
+ };
218
+ const rejectOnce = (error) => {
219
+ if (!promiseResolved) {
220
+ promiseResolved = true;
221
+ reject(error);
222
+ }
223
+ };
224
+ try {
225
+ this._debugMessage(`Connecting to WebSocket server at ${this._uri}`);
226
+ if (this._connectionTimeout) {
227
+ clearTimeout(this._connectionTimeout);
228
+ this._connectionTimeout = undefined;
229
+ }
230
+ if (isBrowser) {
231
+ // ============================================================
232
+ // BROWSER WebSocket (native API)
233
+ // ============================================================
234
+ // Connect without auth on URL; first DAP message must be auth (sent by connect flow via request())
235
+ const wsUrl = this._uri;
236
+ this._websocket = new WebSocket(wsUrl);
237
+ this._websocket.binaryType = 'arraybuffer';
238
+ this._websocket.onopen = async () => {
239
+ if (this._connectionTimeout) {
240
+ clearTimeout(this._connectionTimeout);
241
+ this._connectionTimeout = undefined;
242
+ }
243
+ this._connected = true;
244
+ this._debugMessage(`Successfully connected to ${this._uri}`);
245
+ // Resolve so DAPClient can send auth; do not fire _transportConnected until after auth
246
+ resolveOnce();
247
+ };
248
+ this._websocket.onmessage = async (event) => {
249
+ const data = typeof event.data === 'string' ? event.data : event.data;
250
+ const task = this._receiveData(data);
251
+ this._messageTasks.add(task);
252
+ task.finally(() => this._messageTasks.delete(task));
253
+ };
254
+ this._websocket.onclose = async (event) => {
255
+ if (this._connectionTimeout) {
256
+ clearTimeout(this._connectionTimeout);
257
+ this._connectionTimeout = undefined;
258
+ }
259
+ this._connected = false;
260
+ const wasClean = event.code === 1000;
261
+ const reasonText = event.reason || (wasClean ? 'Connection closed normally' : 'Connection closed unexpectedly');
262
+ // Always notify disconnection to enable reconnection
263
+ await this._transportDisconnected(reasonText, !wasClean);
264
+ if (!promiseResolved) {
265
+ rejectOnce(new Error(`Connection failed: ${reasonText} (code: ${event.code})`));
266
+ }
267
+ };
268
+ this._websocket.onerror = async () => {
269
+ if (this._connectionTimeout) {
270
+ clearTimeout(this._connectionTimeout);
271
+ this._connectionTimeout = undefined;
272
+ }
273
+ this._connected = false;
274
+ this._debugMessage(`WebSocket error occurred`);
275
+ // Close the websocket and release for garbage collection
276
+ if (this._websocket) {
277
+ try {
278
+ this._websocket.close();
279
+ }
280
+ catch {
281
+ // Ignore close errors
282
+ }
283
+ this._websocket = null;
284
+ }
285
+ if (!promiseResolved) {
286
+ rejectOnce(new Error(`Failed to connect to ${this._uri}`));
287
+ }
288
+ else {
289
+ await this._transportDisconnected('WebSocket error', true);
290
+ }
291
+ };
292
+ }
293
+ else {
294
+ // ============================================================
295
+ // NODE.JS WebSocket (ws library)
296
+ // ============================================================
297
+ // nodeWs is the WebSocket constructor from 'ws' (loaded above via ensureNodeWebSocket)
298
+ // ws exports the constructor directly: new WebSocket(url)
299
+ this._websocket = new nodeWs(this._uri);
300
+ this._websocket.on('open', async () => {
301
+ if (this._connectionTimeout) {
302
+ clearTimeout(this._connectionTimeout);
303
+ this._connectionTimeout = undefined;
304
+ }
305
+ this._connected = true;
306
+ this._debugMessage(`Successfully connected to ${this._uri}`);
307
+ // Start ping/pong heartbeat for Node.js WebSocket
308
+ this._startPingInterval();
309
+ // Resolve so DAPClient can send auth; do not fire _transportConnected until after auth
310
+ resolveOnce();
311
+ });
312
+ // Handle pong responses to track connection health
313
+ this._websocket.on('pong', () => {
314
+ this._lastPong = Date.now();
315
+ this._debugMessage('Received pong from server');
316
+ });
317
+ this._websocket.on('message', async (data, isBinary) => {
318
+ // Convert to string or ArrayBuffer for compatibility
319
+ let messageData;
320
+ if (!isBinary && typeof data === 'string') {
321
+ messageData = data;
322
+ }
323
+ else if (Buffer.isBuffer(data)) {
324
+ // Convert Buffer to ArrayBuffer
325
+ const arrayBuffer = new ArrayBuffer(data.length);
326
+ const view = new Uint8Array(arrayBuffer);
327
+ view.set(data);
328
+ messageData = arrayBuffer;
329
+ }
330
+ else if (data instanceof ArrayBuffer) {
331
+ messageData = data;
332
+ }
333
+ else if (Array.isArray(data)) {
334
+ // Buffer[] - concatenate into single ArrayBuffer
335
+ const totalLength = data.reduce((sum, buf) => sum + buf.length, 0);
336
+ const arrayBuffer = new ArrayBuffer(totalLength);
337
+ const view = new Uint8Array(arrayBuffer);
338
+ let offset = 0;
339
+ for (const buf of data) {
340
+ view.set(buf, offset);
341
+ offset += buf.length;
342
+ }
343
+ messageData = arrayBuffer;
344
+ }
345
+ else {
346
+ // Fallback: treat as string
347
+ messageData = String(data);
348
+ }
349
+ const task = this._receiveData(messageData);
350
+ this._messageTasks.add(task);
351
+ task.finally(() => this._messageTasks.delete(task));
352
+ });
353
+ this._websocket.on('close', async (code, reason) => {
354
+ if (this._connectionTimeout) {
355
+ clearTimeout(this._connectionTimeout);
356
+ this._connectionTimeout = undefined;
357
+ }
358
+ this._connected = false;
359
+ const wasClean = code === 1000;
360
+ const reasonText = (reason ? reason.toString() : '') || (wasClean ? 'Connection closed normally' : 'Connection closed unexpectedly');
361
+ // Always notify disconnection to enable reconnection
362
+ await this._transportDisconnected(reasonText, !wasClean);
363
+ if (!promiseResolved) {
364
+ rejectOnce(new Error(`Connection failed: ${reasonText} (code: ${code})`));
365
+ }
366
+ });
367
+ this._websocket.on('error', async (error) => {
368
+ if (this._connectionTimeout) {
369
+ clearTimeout(this._connectionTimeout);
370
+ this._connectionTimeout = undefined;
371
+ }
372
+ this._connected = false;
373
+ this._debugMessage(`WebSocket error: ${error.message}`);
374
+ // Close the websocket and release for garbage collection
375
+ if (this._websocket) {
376
+ try {
377
+ this._websocket.close();
378
+ }
379
+ catch {
380
+ // Ignore close errors
381
+ }
382
+ this._websocket = null;
383
+ }
384
+ if (!promiseResolved) {
385
+ rejectOnce(new Error(`Failed to connect to ${this._uri}: ${error.message}`));
386
+ }
387
+ else {
388
+ await this._transportDisconnected(`WebSocket error: ${error.message}`, true);
389
+ }
390
+ });
391
+ }
392
+ // Set connection timeout (works same in both environments)
393
+ const effectiveTimeout = timeout ?? CONST_SOCKET_TIMEOUT * 1000;
394
+ this._connectionTimeout = setTimeout(() => {
395
+ if (this._connectionTimeout) {
396
+ clearTimeout(this._connectionTimeout);
397
+ this._connectionTimeout = undefined;
398
+ }
399
+ // Force close WebSocket if still connecting and release for GC
400
+ if (this._websocket) {
401
+ if (isBrowser) {
402
+ this._websocket.close();
403
+ }
404
+ else {
405
+ this._websocket.close();
406
+ }
407
+ this._websocket = null;
408
+ }
409
+ rejectOnce(new Error(`Connection timeout after ${effectiveTimeout}ms`));
410
+ }, effectiveTimeout);
411
+ }
412
+ catch (error) {
413
+ if (this._connectionTimeout) {
414
+ clearTimeout(this._connectionTimeout);
415
+ this._connectionTimeout = undefined;
416
+ }
417
+ this._debugMessage(`Failed to connect to ${this._uri}: ${error}`);
418
+ rejectOnce(new Error(`Connection setup failed: ${error}`));
419
+ }
420
+ });
421
+ }
422
+ /**
423
+ * Disconnect and close the WebSocket connection gracefully.
424
+ * Works in both browser and Node.js environments.
425
+ * @param reason - Optional reason for disconnection (reported to onDisconnected).
426
+ * @param hasError - Optional; when true, report as error to onDisconnected.
427
+ */
428
+ async disconnect(reason, hasError) {
429
+ // Clear any pending connection timeout
430
+ if (this._connectionTimeout) {
431
+ clearTimeout(this._connectionTimeout);
432
+ this._connectionTimeout = undefined;
433
+ }
434
+ // Stop ping interval
435
+ this._stopPingInterval();
436
+ if (!this._connected || !this._websocket) {
437
+ return;
438
+ }
439
+ let callbackCalled = false;
440
+ const isBrowser = typeof window !== 'undefined';
441
+ try {
442
+ this._debugMessage('Gracefully disconnecting WebSocket');
443
+ // Cancel pending message processing tasks
444
+ if (this._messageTasks.size > 0) {
445
+ this._debugMessage(`Waiting for ${this._messageTasks.size} pending message tasks`);
446
+ await Promise.allSettled(Array.from(this._messageTasks));
447
+ this._debugMessage('Message tasks completed');
448
+ }
449
+ // Close WebSocket and wait for complete closure
450
+ if (this._websocket) {
451
+ const ws = this._websocket;
452
+ if (isBrowser) {
453
+ // Browser WebSocket
454
+ const browserWs = ws;
455
+ const closePromise = new Promise((resolve) => {
456
+ if (browserWs.readyState === WebSocket.CLOSED) {
457
+ resolve();
458
+ return;
459
+ }
460
+ let resolved = false;
461
+ const resolveOnce = (timerId) => {
462
+ if (!resolved) {
463
+ resolved = true;
464
+ if (timerId)
465
+ clearTimeout(timerId);
466
+ browserWs.onclose = null;
467
+ resolve();
468
+ }
469
+ };
470
+ browserWs.close(1000, 'Disconnected by request');
471
+ const timeoutId = setTimeout(() => {
472
+ this._debugMessage('WebSocket close timeout - forcing resolution');
473
+ resolveOnce();
474
+ }, 500);
475
+ browserWs.onclose = () => {
476
+ this._debugMessage('WebSocket close event received');
477
+ resolveOnce(timeoutId);
478
+ };
479
+ });
480
+ await closePromise;
481
+ }
482
+ else {
483
+ // Node.js WebSocket
484
+ ws.removeAllListeners();
485
+ const closePromise = new Promise((resolve) => {
486
+ if (ws.readyState === 3) { // CLOSED state
487
+ resolve();
488
+ return;
489
+ }
490
+ let resolved = false;
491
+ const nodeWs = ws;
492
+ const resolveOnce = (timerId) => {
493
+ if (!resolved) {
494
+ resolved = true;
495
+ if (timerId)
496
+ clearTimeout(timerId);
497
+ resolve();
498
+ }
499
+ };
500
+ const tempCloseHandler = () => {
501
+ this._debugMessage('WebSocket close event received');
502
+ resolveOnce(timeoutId);
503
+ };
504
+ nodeWs.on('close', tempCloseHandler);
505
+ ws.close(1000, 'Disconnected by request');
506
+ const timeoutId = setTimeout(() => {
507
+ nodeWs.removeListener('close', tempCloseHandler);
508
+ this._debugMessage('WebSocket close timeout - forcing resolution');
509
+ resolveOnce();
510
+ }, 500);
511
+ });
512
+ await closePromise;
513
+ }
514
+ }
515
+ this._debugMessage('WebSocket disconnected successfully');
516
+ // Notify about disconnection (use caller-provided reason/hasError when given)
517
+ await this._transportDisconnected(reason ?? 'Disconnected by request', hasError ?? false);
518
+ callbackCalled = true;
519
+ }
520
+ catch (error) {
521
+ this._debugMessage(`Error during disconnect: ${error}`);
522
+ if (!callbackCalled) {
523
+ await this._transportDisconnected(`Disconnect error: ${error}`, true);
524
+ callbackCalled = true;
525
+ }
526
+ }
527
+ finally {
528
+ // Always clean up resources
529
+ this._connected = false;
530
+ this._websocket = undefined;
531
+ this._messageTasks.clear();
532
+ this._debugMessage('Disconnect cleanup completed');
533
+ }
534
+ }
535
+ /**
536
+ * Send a DAP message with automatic format selection.
537
+ *
538
+ * Handles both standard JSON messages and DAP binary messages with
539
+ * data payloads. Automatically chooses appropriate WebSocket message
540
+ * format based on message content.
541
+ *
542
+ * Works in both browser and Node.js environments.
543
+ */
544
+ async send(message) {
545
+ if (!this.isConnected()) {
546
+ throw new Error('WebSocket not connected. Call connect() first.');
547
+ }
548
+ if (!this._websocket) {
549
+ throw new Error('WebSocket connection lost before send');
550
+ }
551
+ let binaryData;
552
+ const args = message.arguments || {};
553
+ try {
554
+ if ('data' in args) {
555
+ // Binary message - use DAP binary format
556
+ if (typeof args.data === 'string') {
557
+ binaryData = new TextEncoder().encode(args.data);
558
+ }
559
+ else if (args.data instanceof Uint8Array) {
560
+ binaryData = args.data;
561
+ }
562
+ else {
563
+ binaryData = new TextEncoder().encode(JSON.stringify(args.data));
564
+ }
565
+ // Create debug version for logging
566
+ const debugMessage = { ...message };
567
+ if (debugMessage.arguments) {
568
+ debugMessage.arguments = { ...debugMessage.arguments };
569
+ debugMessage.arguments.data = `<${binaryData.length} bytes>`;
570
+ }
571
+ this._debugProtocol(`SEND: ${JSON.stringify(debugMessage)}`);
572
+ // Remove data from message for header
573
+ const headerMessage = { ...message };
574
+ if (headerMessage.arguments) {
575
+ headerMessage.arguments = { ...headerMessage.arguments };
576
+ delete headerMessage.arguments.data;
577
+ }
578
+ // Create DAP binary message: JSON header + newline + binary data
579
+ const jsonHeader = new TextEncoder().encode(JSON.stringify(headerMessage));
580
+ const newline = new Uint8Array([10]); // ASCII newline
581
+ const combinedMessage = new Uint8Array(jsonHeader.length + 1 + binaryData.length);
582
+ combinedMessage.set(jsonHeader);
583
+ combinedMessage.set(newline, jsonHeader.length);
584
+ combinedMessage.set(binaryData, jsonHeader.length + 1);
585
+ // Send binary message
586
+ this._websocket.send(combinedMessage);
587
+ }
588
+ else {
589
+ // Standard JSON message
590
+ this._debugProtocol(`SEND: ${JSON.stringify(message)}`);
591
+ this._websocket.send(JSON.stringify(message));
592
+ }
593
+ }
594
+ catch (error) {
595
+ if (error instanceof Error && error.name === 'NetworkError') {
596
+ // Connection errors should update state
597
+ this._connected = false;
598
+ this._debugMessage(`Connection lost during send: ${error.message}`);
599
+ throw new Error(`Connection lost during send: ${error.message}`);
600
+ }
601
+ else {
602
+ // Log send failures for debugging
603
+ this._debugMessage(`Failed to send message: ${error}`);
604
+ throw error;
605
+ }
606
+ }
607
+ }
608
+ }
609
+ //# sourceMappingURL=TransportWebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransportWebSocket.js","sourceRoot":"","sources":["../../../src/client/core/TransportWebSocket.ts"],"names":[],"mappings":"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"}