@yu_robotics/remote-cli 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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -0
  3. package/bin/remote-cli.js +2 -0
  4. package/dist/client/MessageHandler.d.ts +92 -0
  5. package/dist/client/MessageHandler.d.ts.map +1 -0
  6. package/dist/client/MessageHandler.js +496 -0
  7. package/dist/client/MessageHandler.js.map +1 -0
  8. package/dist/client/WebSocketClient.d.ts +109 -0
  9. package/dist/client/WebSocketClient.d.ts.map +1 -0
  10. package/dist/client/WebSocketClient.js +234 -0
  11. package/dist/client/WebSocketClient.js.map +1 -0
  12. package/dist/commands/config.d.ts +35 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +195 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/init.d.ts +25 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +112 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/start.d.ts +20 -0
  21. package/dist/commands/start.d.ts.map +1 -0
  22. package/dist/commands/start.js +108 -0
  23. package/dist/commands/start.js.map +1 -0
  24. package/dist/commands/status.d.ts +37 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +71 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +23 -0
  29. package/dist/commands/stop.d.ts.map +1 -0
  30. package/dist/commands/stop.js +52 -0
  31. package/dist/commands/stop.js.map +1 -0
  32. package/dist/config/ConfigManager.d.ts +109 -0
  33. package/dist/config/ConfigManager.d.ts.map +1 -0
  34. package/dist/config/ConfigManager.js +262 -0
  35. package/dist/config/ConfigManager.js.map +1 -0
  36. package/dist/executor/ClaudeExecutor.d.ts +89 -0
  37. package/dist/executor/ClaudeExecutor.d.ts.map +1 -0
  38. package/dist/executor/ClaudeExecutor.js +365 -0
  39. package/dist/executor/ClaudeExecutor.js.map +1 -0
  40. package/dist/executor/ClaudePersistentExecutor.d.ts +175 -0
  41. package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -0
  42. package/dist/executor/ClaudePersistentExecutor.js +958 -0
  43. package/dist/executor/ClaudePersistentExecutor.js.map +1 -0
  44. package/dist/executor/index.d.ts +20 -0
  45. package/dist/executor/index.d.ts.map +1 -0
  46. package/dist/executor/index.js +48 -0
  47. package/dist/executor/index.js.map +1 -0
  48. package/dist/hooks/ClaudeCodeHooks.d.ts +281 -0
  49. package/dist/hooks/ClaudeCodeHooks.d.ts.map +1 -0
  50. package/dist/hooks/ClaudeCodeHooks.js +350 -0
  51. package/dist/hooks/ClaudeCodeHooks.js.map +1 -0
  52. package/dist/hooks/FeishuNotificationAdapter.d.ts +87 -0
  53. package/dist/hooks/FeishuNotificationAdapter.d.ts.map +1 -0
  54. package/dist/hooks/FeishuNotificationAdapter.js +280 -0
  55. package/dist/hooks/FeishuNotificationAdapter.js.map +1 -0
  56. package/dist/hooks/index.d.ts +4 -0
  57. package/dist/hooks/index.d.ts.map +1 -0
  58. package/dist/hooks/index.js +10 -0
  59. package/dist/hooks/index.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +333 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/security/DirectoryGuard.d.ts +54 -0
  65. package/dist/security/DirectoryGuard.d.ts.map +1 -0
  66. package/dist/security/DirectoryGuard.js +143 -0
  67. package/dist/security/DirectoryGuard.js.map +1 -0
  68. package/dist/types/config.d.ts +46 -0
  69. package/dist/types/config.d.ts.map +1 -0
  70. package/dist/types/config.js +22 -0
  71. package/dist/types/config.js.map +1 -0
  72. package/dist/types/index.d.ts +110 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +3 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/FeishuMessageFormatter.d.ts +84 -0
  77. package/dist/utils/FeishuMessageFormatter.d.ts.map +1 -0
  78. package/dist/utils/FeishuMessageFormatter.js +395 -0
  79. package/dist/utils/FeishuMessageFormatter.js.map +1 -0
  80. package/dist/utils/stripAnsi.d.ts +21 -0
  81. package/dist/utils/stripAnsi.d.ts.map +1 -0
  82. package/dist/utils/stripAnsi.js +30 -0
  83. package/dist/utils/stripAnsi.js.map +1 -0
  84. package/package.json +63 -0
@@ -0,0 +1,496 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageHandler = void 0;
4
+ const hooks_1 = require("../hooks");
5
+ const child_process_1 = require("child_process");
6
+ /**
7
+ * Message Handler
8
+ * Responsible for handling messages from WebSocket and invoking Claude executor
9
+ */
10
+ class MessageHandler {
11
+ wsClient;
12
+ executor;
13
+ directoryGuard;
14
+ isDestroyed = false;
15
+ isExecuting = false;
16
+ currentOpenId;
17
+ notificationAdapter;
18
+ constructor(wsClient, executor, directoryGuard) {
19
+ this.wsClient = wsClient;
20
+ this.executor = executor;
21
+ this.directoryGuard = directoryGuard;
22
+ // Initialize Feishu notification adapter
23
+ this.notificationAdapter = new hooks_1.FeishuNotificationAdapter(wsClient);
24
+ this.notificationAdapter.register();
25
+ }
26
+ /**
27
+ * Handle message (supports new IncomingMessage format)
28
+ * @param message Message object
29
+ */
30
+ async handleMessage(message) {
31
+ // Check if already destroyed
32
+ if (this.isDestroyed) {
33
+ return;
34
+ }
35
+ // Validate message structure
36
+ if (!message || !this.isValidMessage(message)) {
37
+ this.sendResponse(message?.messageId || 'unknown', {
38
+ success: false,
39
+ error: 'Invalid message format',
40
+ });
41
+ return;
42
+ }
43
+ // Handle different types of messages
44
+ switch (message.type) {
45
+ case 'status':
46
+ await this.handleStatusQuery(message.messageId);
47
+ return;
48
+ case 'command':
49
+ await this.handleCommandMessage(message);
50
+ return;
51
+ case 'heartbeat':
52
+ // Silently ignore heartbeat responses from server
53
+ return;
54
+ case 'binding_confirm':
55
+ // Silently ignore binding confirmation from server
56
+ return;
57
+ default:
58
+ this.sendResponse(message.messageId, {
59
+ success: false,
60
+ error: `Unknown message type: ${message.type}`,
61
+ });
62
+ }
63
+ }
64
+ /**
65
+ * Handle command message
66
+ */
67
+ async handleCommandMessage(message) {
68
+ const { messageId, content, workingDirectory, openId, isSlashCommand } = message;
69
+ // Store openId for response routing and notifications
70
+ this.currentOpenId = openId;
71
+ this.notificationAdapter.setCurrentOpenId(openId);
72
+ // Handle /abort command first, even when busy
73
+ if (content?.trim() === '/abort') {
74
+ await this.handleAbortCommand(messageId);
75
+ return;
76
+ }
77
+ // Check if executor is waiting for interactive input
78
+ if ('isWaitingInput' in this.executor && typeof this.executor.isWaitingInput === 'function') {
79
+ const executor = this.executor;
80
+ if (executor.isWaitingInput()) {
81
+ const input = content?.trim();
82
+ if (input) {
83
+ const sent = executor.sendInput(input);
84
+ if (sent) {
85
+ this.sendResponse(messageId, {
86
+ success: true,
87
+ output: `✅ Sent: "${input}"`,
88
+ });
89
+ }
90
+ else {
91
+ this.sendResponse(messageId, {
92
+ success: false,
93
+ error: '❌ Failed to send input - executor is no longer waiting',
94
+ });
95
+ }
96
+ }
97
+ else {
98
+ this.sendResponse(messageId, {
99
+ success: false,
100
+ error: '❌ Please provide a non-empty input',
101
+ });
102
+ }
103
+ return;
104
+ }
105
+ }
106
+ // Check if there is a task currently executing
107
+ if (this.isExecuting) {
108
+ this.sendResponse(messageId, {
109
+ success: false,
110
+ error: 'Executor is busy, please wait for current task to complete',
111
+ });
112
+ return;
113
+ }
114
+ // If working directory is provided, validate and set it
115
+ if (workingDirectory) {
116
+ // Verify directory is in the whitelist
117
+ if (!this.directoryGuard.isSafePath(workingDirectory)) {
118
+ this.sendResponse(messageId, {
119
+ success: false,
120
+ error: `Directory not in whitelist: ${workingDirectory}\n\nAllowed directories:\n${this.directoryGuard
121
+ .getAllowedDirectories()
122
+ .map((d) => `• ${d}`)
123
+ .join('\n')}`,
124
+ });
125
+ return;
126
+ }
127
+ // Set working directory
128
+ this.executor.setWorkingDirectory(workingDirectory);
129
+ }
130
+ try {
131
+ this.isExecuting = true;
132
+ // Handle built-in commands (except /abort which was handled above)
133
+ const builtInResult = await this.handleBuiltInCommand(messageId, content);
134
+ if (builtInResult) {
135
+ return;
136
+ }
137
+ // Check if this is a passthrough slash command from server
138
+ if (isSlashCommand) {
139
+ console.log(`[MessageHandler] Executing passthrough slash command: ${content}`);
140
+ await this.executeSlashCommand(messageId, content);
141
+ return;
142
+ }
143
+ // Expand command shortcuts
144
+ const expandedContent = this.expandCommandShortcuts(content);
145
+ // Execute Claude command
146
+ await this.executeCommand(messageId, expandedContent);
147
+ }
148
+ catch (error) {
149
+ this.sendResponse(messageId, {
150
+ success: false,
151
+ error: error instanceof Error ? error.message : 'Unknown error',
152
+ });
153
+ }
154
+ finally {
155
+ this.isExecuting = false;
156
+ }
157
+ }
158
+ /**
159
+ * Handle abort command
160
+ * Can be executed even when executor is busy
161
+ */
162
+ async handleAbortCommand(messageId) {
163
+ const wasExecuting = this.isExecuting;
164
+ const aborted = await this.executor.abort();
165
+ if (aborted) {
166
+ this.isExecuting = false;
167
+ this.sendResponse(messageId, {
168
+ success: true,
169
+ output: wasExecuting
170
+ ? '✅ Current command has been aborted'
171
+ : '⚠️ No command was executing, but executor has been reset',
172
+ });
173
+ }
174
+ else {
175
+ this.sendResponse(messageId, {
176
+ success: true,
177
+ output: 'ℹ️ No command is currently executing',
178
+ });
179
+ }
180
+ }
181
+ /**
182
+ * Handle status query
183
+ */
184
+ async handleStatusQuery(messageId) {
185
+ this.wsClient.send({
186
+ type: 'status',
187
+ messageId,
188
+ status: {
189
+ connected: this.wsClient.isConnected(),
190
+ allowedDirectories: this.directoryGuard.getAllowedDirectories(),
191
+ currentWorkingDirectory: this.executor.getCurrentWorkingDirectory(),
192
+ },
193
+ timestamp: Date.now(),
194
+ });
195
+ }
196
+ /**
197
+ * Validate message structure
198
+ */
199
+ isValidMessage(message) {
200
+ if (!message || typeof message !== 'object') {
201
+ return false;
202
+ }
203
+ if (message.type !== 'command') {
204
+ return true; // Non-command messages don't need further validation
205
+ }
206
+ return Boolean(message.messageId && message.content);
207
+ }
208
+ /**
209
+ * Handle built-in commands
210
+ * @returns Returns true if built-in command was handled, otherwise false
211
+ */
212
+ async handleBuiltInCommand(messageId, content) {
213
+ const trimmed = content.trim();
214
+ // /status command
215
+ if (trimmed === '/status') {
216
+ const cwd = this.executor.getCurrentWorkingDirectory();
217
+ const allowedDirs = this.directoryGuard.getAllowedDirectories();
218
+ this.sendResponse(messageId, {
219
+ success: true,
220
+ output: `📊 Status:
221
+ - Working Directory: ${cwd}
222
+ - Allowed Directories: ${allowedDirs.join(', ')}
223
+ - Connection: Active`,
224
+ });
225
+ return true;
226
+ }
227
+ // /help command
228
+ if (trimmed === '/help') {
229
+ this.sendResponse(messageId, {
230
+ success: true,
231
+ output: `📖 Available commands:
232
+ - /help - Show this help message
233
+ - /status - Show current status
234
+ - /abort - Abort the currently executing command
235
+ - /clear - Clear conversation context
236
+ - /cd <directory> - Change working directory
237
+ - /r or /resume - Resume previous conversation
238
+ - /c or /continue - Continue previous conversation
239
+ - /review - Review changes (supports remote interaction)
240
+
241
+ 💡 Interactive commands like /review will prompt you for input via Feishu when needed.
242
+
243
+ You can also use natural language commands to control Claude Code CLI.`,
244
+ });
245
+ return true;
246
+ }
247
+ // /clear command
248
+ if (trimmed === '/clear') {
249
+ this.executor.resetContext();
250
+ this.sendResponse(messageId, {
251
+ success: true,
252
+ output: '✅ Conversation context cleared',
253
+ });
254
+ return true;
255
+ }
256
+ // /cd command
257
+ if (trimmed.startsWith('/cd')) {
258
+ const parts = trimmed.split(/\s+/);
259
+ if (parts.length < 2) {
260
+ this.sendResponse(messageId, {
261
+ success: false,
262
+ error: 'Usage: /cd <directory>',
263
+ });
264
+ return true;
265
+ }
266
+ const targetDir = parts.slice(1).join(' ');
267
+ try {
268
+ this.executor.setWorkingDirectory(targetDir);
269
+ const newCwd = this.executor.getCurrentWorkingDirectory();
270
+ this.sendResponse(messageId, {
271
+ success: true,
272
+ output: `✅ Changed working directory to: ${newCwd}`,
273
+ });
274
+ }
275
+ catch (error) {
276
+ this.sendResponse(messageId, {
277
+ success: false,
278
+ error: error instanceof Error
279
+ ? error.message
280
+ : 'Failed to change directory',
281
+ });
282
+ }
283
+ return true;
284
+ }
285
+ return false;
286
+ }
287
+ /**
288
+ * Expand command shortcuts
289
+ */
290
+ expandCommandShortcuts(content) {
291
+ const trimmed = content.trim();
292
+ // Only expand when command is the entire content
293
+ if (trimmed === '/r' || trimmed === '/resume') {
294
+ return 'Please resume the previous conversation';
295
+ }
296
+ if (trimmed === '/c' || trimmed === '/continue') {
297
+ return 'Please continue from where we left off';
298
+ }
299
+ return content;
300
+ }
301
+ /**
302
+ * Execute passthrough slash command using local Claude CLI
303
+ * This allows users to use their custom slash commands
304
+ */
305
+ async executeSlashCommand(messageId, command) {
306
+ return new Promise((resolve) => {
307
+ const chunks = [];
308
+ const errorChunks = [];
309
+ console.log(`[MessageHandler] Spawning Claude CLI for command: ${command}`);
310
+ // Spawn Claude CLI with the slash command
311
+ // Use --print to get output and exit
312
+ const child = (0, child_process_1.spawn)('claude', [command, '--print'], {
313
+ cwd: this.executor.getCurrentWorkingDirectory(),
314
+ stdio: ['ignore', 'pipe', 'pipe'],
315
+ env: {
316
+ ...process.env,
317
+ CLAUDECODE: '', // Prevent nested session error
318
+ },
319
+ });
320
+ // Handle stdout (stream chunks)
321
+ child.stdout?.on('data', (data) => {
322
+ const chunk = data.toString();
323
+ chunks.push(chunk);
324
+ this.sendStreamChunk(messageId, chunk);
325
+ });
326
+ // Handle stderr
327
+ child.stderr?.on('data', (data) => {
328
+ const chunk = data.toString();
329
+ errorChunks.push(chunk);
330
+ console.error(`[MessageHandler] Claude stderr: ${chunk}`);
331
+ });
332
+ // Handle process exit
333
+ child.on('exit', (code) => {
334
+ console.log(`[MessageHandler] Claude process exited with code: ${code}`);
335
+ if (code === 0) {
336
+ const output = chunks.join('');
337
+ this.sendResponse(messageId, {
338
+ success: true,
339
+ output: output.trim() || '✅ Command executed successfully',
340
+ });
341
+ }
342
+ else {
343
+ const errorOutput = errorChunks.join('') || chunks.join('');
344
+ this.sendResponse(messageId, {
345
+ success: false,
346
+ error: errorOutput.trim() || `Command failed with exit code ${code}`,
347
+ });
348
+ }
349
+ resolve();
350
+ });
351
+ // Handle process error
352
+ child.on('error', (error) => {
353
+ console.error(`[MessageHandler] Failed to spawn Claude:`, error);
354
+ this.sendResponse(messageId, {
355
+ success: false,
356
+ error: `Failed to execute command: ${error.message}`,
357
+ });
358
+ resolve();
359
+ });
360
+ });
361
+ }
362
+ /**
363
+ * Execute Claude command
364
+ */
365
+ async executeCommand(messageId, content) {
366
+ try {
367
+ const result = await this.executor.execute(content, {
368
+ onStream: (chunk) => {
369
+ this.sendStreamChunk(messageId, chunk);
370
+ },
371
+ onToolUse: (toolUse) => {
372
+ this.sendToolUse(messageId, toolUse);
373
+ },
374
+ onToolResult: (toolResult) => {
375
+ this.sendToolResult(messageId, toolResult);
376
+ },
377
+ });
378
+ // Only send success status, not the output
379
+ // Output has already been streamed via onStream callback
380
+ this.sendResponse(messageId, {
381
+ success: result.success,
382
+ error: result.error,
383
+ });
384
+ }
385
+ catch (error) {
386
+ this.sendResponse(messageId, {
387
+ success: false,
388
+ error: error instanceof Error ? error.message : 'Execution error',
389
+ });
390
+ }
391
+ }
392
+ /**
393
+ * Send streaming output chunk
394
+ */
395
+ sendStreamChunk(messageId, chunk) {
396
+ try {
397
+ this.wsClient.send({
398
+ type: 'stream',
399
+ messageId,
400
+ chunk,
401
+ streamType: 'text',
402
+ openId: this.currentOpenId,
403
+ timestamp: Date.now(),
404
+ });
405
+ }
406
+ catch (error) {
407
+ // Ignore send errors, don't affect main flow
408
+ console.error('Failed to send stream chunk:', error);
409
+ }
410
+ }
411
+ /**
412
+ * Send tool use event
413
+ */
414
+ sendToolUse(messageId, toolUse) {
415
+ try {
416
+ this.wsClient.send({
417
+ type: 'stream',
418
+ messageId,
419
+ streamType: 'tool_use',
420
+ toolUse,
421
+ openId: this.currentOpenId,
422
+ timestamp: Date.now(),
423
+ });
424
+ }
425
+ catch (error) {
426
+ console.error('Failed to send tool use:', error);
427
+ }
428
+ }
429
+ /**
430
+ * Send tool result event
431
+ */
432
+ sendToolResult(messageId, toolResult) {
433
+ try {
434
+ this.wsClient.send({
435
+ type: 'stream',
436
+ messageId,
437
+ streamType: 'tool_result',
438
+ toolResult,
439
+ openId: this.currentOpenId,
440
+ timestamp: Date.now(),
441
+ });
442
+ }
443
+ catch (error) {
444
+ console.error('Failed to send tool result:', error);
445
+ }
446
+ }
447
+ /**
448
+ * Send structured content for rich formatting
449
+ */
450
+ sendStructuredContent(messageId, structuredContent) {
451
+ try {
452
+ this.wsClient.send({
453
+ type: 'structured',
454
+ messageId,
455
+ structuredContent,
456
+ openId: this.currentOpenId,
457
+ timestamp: Date.now(),
458
+ cwd: this.executor.getCurrentWorkingDirectory(),
459
+ });
460
+ }
461
+ catch (error) {
462
+ console.error('Failed to send structured content:', error);
463
+ }
464
+ }
465
+ /**
466
+ * Send response
467
+ */
468
+ sendResponse(messageId, result) {
469
+ try {
470
+ this.wsClient.send({
471
+ type: 'response',
472
+ messageId,
473
+ success: result.success,
474
+ output: result.output,
475
+ error: result.error,
476
+ sessionAbbr: result.sessionAbbr,
477
+ openId: this.currentOpenId,
478
+ timestamp: Date.now(),
479
+ cwd: this.executor.getCurrentWorkingDirectory(),
480
+ });
481
+ }
482
+ catch (error) {
483
+ console.error('Failed to send response:', error);
484
+ }
485
+ }
486
+ /**
487
+ * Destroy handler
488
+ */
489
+ destroy() {
490
+ this.isDestroyed = true;
491
+ this.isExecuting = false;
492
+ this.notificationAdapter.unregister();
493
+ }
494
+ }
495
+ exports.MessageHandler = MessageHandler;
496
+ //# sourceMappingURL=MessageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../src/client/MessageHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * WebSocket client configuration
3
+ */
4
+ export interface WebSocketClientOptions {
5
+ /** Reconnect interval (milliseconds), default 5000 */
6
+ reconnectInterval?: number;
7
+ /** Heartbeat interval (milliseconds), default 15000 */
8
+ heartbeatInterval?: number;
9
+ }
10
+ /**
11
+ * Connection status
12
+ */
13
+ export interface ConnectionStatus {
14
+ connected: boolean;
15
+ serverUrl: string;
16
+ deviceId: string;
17
+ lastHeartbeat?: number;
18
+ }
19
+ /**
20
+ * WebSocket Client
21
+ * Responsible for establishing and maintaining WebSocket connection with router server
22
+ */
23
+ export declare class WebSocketClient {
24
+ private serverUrl;
25
+ private deviceId;
26
+ private ws;
27
+ private reconnectInterval;
28
+ private heartbeatInterval;
29
+ private reconnectTimer;
30
+ private heartbeatTimer;
31
+ private manualDisconnect;
32
+ private connected;
33
+ private messageHandlers;
34
+ private errorHandlers;
35
+ private closeHandlers;
36
+ private connectHandlers;
37
+ constructor(serverUrl: string, deviceId: string, options?: WebSocketClientOptions);
38
+ /**
39
+ * Connect to server
40
+ */
41
+ connect(): Promise<void>;
42
+ /**
43
+ * Disconnect
44
+ */
45
+ disconnect(): void;
46
+ /**
47
+ * Send message
48
+ * @param message Message object
49
+ */
50
+ send(message: any): void;
51
+ /**
52
+ * Check if connected
53
+ */
54
+ isConnected(): boolean;
55
+ /**
56
+ * Get connection status
57
+ */
58
+ getStatus(): ConnectionStatus;
59
+ /**
60
+ * Register message handler
61
+ * @param handler Message handler function
62
+ */
63
+ onMessage(handler: (message: any) => void): void;
64
+ /**
65
+ * Register error handler
66
+ * @param handler Error handler function
67
+ */
68
+ onError(handler: (error: Error) => void): void;
69
+ /**
70
+ * Register close handler
71
+ * @param handler Close handler function
72
+ */
73
+ onClose(handler: (code: number, reason: string) => void): void;
74
+ /**
75
+ * Register connect handler
76
+ * @param handler Connect handler function
77
+ */
78
+ onConnect(handler: () => void): void;
79
+ /**
80
+ * Event emitter style: on method
81
+ * @param event Event name
82
+ * @param handler Event handler
83
+ */
84
+ on(event: 'connected', handler: () => void): void;
85
+ on(event: 'disconnected', handler: () => void): void;
86
+ on(event: 'error', handler: (error: Error) => void): void;
87
+ on(event: 'message', handler: (message: any) => void): void;
88
+ /**
89
+ * Send device registration message
90
+ */
91
+ private sendRegistration;
92
+ /**
93
+ * Start heartbeat
94
+ */
95
+ private startHeartbeat;
96
+ /**
97
+ * Stop heartbeat
98
+ */
99
+ private stopHeartbeat;
100
+ /**
101
+ * Schedule reconnection
102
+ */
103
+ private scheduleReconnect;
104
+ /**
105
+ * Clear reconnect timer
106
+ */
107
+ private clearReconnectTimer;
108
+ }
109
+ //# sourceMappingURL=WebSocketClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/client/WebSocketClient.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,aAAa,CAAqD;IAC1E,OAAO,CAAC,eAAe,CAAyB;gBAEpC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAOrF;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAkBlB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAQxB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,SAAS,IAAI,gBAAgB;IAQ7B;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIhD;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI9C;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpC;;;;OAIG;IACH,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IACjD,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IACpD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IACzD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAoB3D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}