@b0xs/recorder 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 (46) hide show
  1. package/README.md +89 -0
  2. package/dist/api/client.d.ts +111 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +186 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts +7 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +104 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/login.d.ts +7 -0
  11. package/dist/cli/commands/login.d.ts.map +1 -0
  12. package/dist/cli/commands/login.js +154 -0
  13. package/dist/cli/commands/login.js.map +1 -0
  14. package/dist/cli/commands/record.d.ts +14 -0
  15. package/dist/cli/commands/record.d.ts.map +1 -0
  16. package/dist/cli/commands/record.js +244 -0
  17. package/dist/cli/commands/record.js.map +1 -0
  18. package/dist/core/chunk-uploader.d.ts +52 -0
  19. package/dist/core/chunk-uploader.d.ts.map +1 -0
  20. package/dist/core/chunk-uploader.js +180 -0
  21. package/dist/core/chunk-uploader.js.map +1 -0
  22. package/dist/core/pty-manager.d.ts +72 -0
  23. package/dist/core/pty-manager.d.ts.map +1 -0
  24. package/dist/core/pty-manager.js +205 -0
  25. package/dist/core/pty-manager.js.map +1 -0
  26. package/dist/core/recorder.d.ts +104 -0
  27. package/dist/core/recorder.d.ts.map +1 -0
  28. package/dist/core/recorder.js +330 -0
  29. package/dist/core/recorder.js.map +1 -0
  30. package/dist/core/stream-client.d.ts +62 -0
  31. package/dist/core/stream-client.d.ts.map +1 -0
  32. package/dist/core/stream-client.js +185 -0
  33. package/dist/core/stream-client.js.map +1 -0
  34. package/dist/index.d.ts +8 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +75 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/storage/auth-store.d.ts +37 -0
  39. package/dist/storage/auth-store.d.ts.map +1 -0
  40. package/dist/storage/auth-store.js +168 -0
  41. package/dist/storage/auth-store.js.map +1 -0
  42. package/dist/storage/config-store.d.ts +74 -0
  43. package/dist/storage/config-store.d.ts.map +1 -0
  44. package/dist/storage/config-store.js +164 -0
  45. package/dist/storage/config-store.js.map +1 -0
  46. package/package.json +54 -0
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ /**
3
+ * Recorder
4
+ *
5
+ * Main orchestrator that coordinates PTY, encoder, and uploader
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Recorder = void 0;
9
+ const events_1 = require("events");
10
+ const binary_1 = require("@b0xs/binary");
11
+ const pty_manager_1 = require("./pty-manager");
12
+ const chunk_uploader_1 = require("./chunk-uploader");
13
+ const stream_client_1 = require("./stream-client");
14
+ class Recorder extends events_1.EventEmitter {
15
+ constructor(options) {
16
+ super();
17
+ this.ptyManager = null;
18
+ this.streamClient = null;
19
+ this.sessionStartTime = 0;
20
+ this.chunkFlushInterval = null;
21
+ this.isRecording = false;
22
+ this.isPaused = false;
23
+ this.stats = {
24
+ duration: 0,
25
+ chunksUploaded: 0,
26
+ framesRecorded: 0,
27
+ eventsRecorded: 0,
28
+ bytesEncoded: 0,
29
+ };
30
+ this.sessionId = options.sessionId;
31
+ this.userId = options.userId;
32
+ this.apiClient = options.apiClient;
33
+ this.chunkDuration = options.chunkDuration || 60000; // 60 seconds
34
+ // Initialize encoder
35
+ this.encoder = new binary_1.BoxsBinaryEncoder({
36
+ sessionId: this.sessionId,
37
+ userId: this.userId,
38
+ terminalSize: options.terminalSize,
39
+ chunkDuration: this.chunkDuration,
40
+ compression: options.compression !== false,
41
+ });
42
+ // Initialize uploader
43
+ this.uploader = new chunk_uploader_1.ChunkUploader({
44
+ sessionId: this.sessionId,
45
+ apiClient: this.apiClient,
46
+ });
47
+ // Initialize stream client if streaming enabled
48
+ if (options.streaming?.enabled) {
49
+ this.streamClient = new stream_client_1.StreamClient({
50
+ wsUrl: options.streaming.wsUrl,
51
+ streamToken: options.streaming.streamToken,
52
+ sessionId: this.sessionId,
53
+ });
54
+ // Setup stream client event handlers
55
+ this.streamClient.on('connected', () => {
56
+ this.emit('stream-connected');
57
+ });
58
+ this.streamClient.on('viewers', (count) => {
59
+ this.emit('viewers', count);
60
+ });
61
+ this.streamClient.on('error', (error) => {
62
+ this.emit('stream-error', error);
63
+ });
64
+ this.streamClient.on('disconnected', (reason) => {
65
+ this.emit('stream-disconnected', reason);
66
+ });
67
+ }
68
+ }
69
+ /**
70
+ * Start recording
71
+ */
72
+ async start(ptyOptions = {}) {
73
+ if (this.isRecording) {
74
+ throw new Error('Already recording');
75
+ }
76
+ this.isRecording = true;
77
+ this.sessionStartTime = Date.now();
78
+ // Initialize PTY manager
79
+ this.ptyManager = new pty_manager_1.PTYManager();
80
+ // Setup PTY event handlers
81
+ this.ptyManager.on('output', (data) => {
82
+ if (!this.isPaused) {
83
+ this.handlePtyOutput(data);
84
+ }
85
+ });
86
+ this.ptyManager.on('input', (data) => {
87
+ if (!this.isPaused) {
88
+ this.handlePtyInput(data);
89
+ }
90
+ });
91
+ this.ptyManager.on('resize', (size) => {
92
+ if (!this.isPaused) {
93
+ this.handlePtyResize(size);
94
+ }
95
+ });
96
+ this.ptyManager.on('command', (cmd) => {
97
+ if (!this.isPaused) {
98
+ this.handlePtyCommand(cmd);
99
+ }
100
+ });
101
+ this.ptyManager.on('exit', (exitInfo) => {
102
+ this.handlePtyExit(exitInfo);
103
+ });
104
+ // Spawn PTY
105
+ this.ptyManager.spawn(ptyOptions);
106
+ // Connect to WebSocket server if streaming enabled
107
+ if (this.streamClient) {
108
+ try {
109
+ await this.streamClient.connect();
110
+ }
111
+ catch (error) {
112
+ // Non-blocking: continue recording even if streaming fails
113
+ this.emit('stream-error', new Error(`Failed to connect to stream server: ${error.message}`));
114
+ }
115
+ }
116
+ // Setup automatic chunk flushing
117
+ this.chunkFlushInterval = setInterval(() => {
118
+ this.flushChunk();
119
+ }, this.chunkDuration);
120
+ this.emit('started');
121
+ }
122
+ /**
123
+ * Handle PTY output
124
+ */
125
+ handlePtyOutput(data) {
126
+ const frame = {
127
+ type: binary_1.FrameType.OUTPUT,
128
+ data: data.data,
129
+ };
130
+ // Encode for chunk upload
131
+ this.encoder.writeFrame(frame);
132
+ // Broadcast via WebSocket if streaming
133
+ if (this.streamClient?.getConnected()) {
134
+ this.streamClient.broadcastFrame({
135
+ type: frame.type,
136
+ data: frame.data,
137
+ timestamp: Date.now(),
138
+ });
139
+ }
140
+ this.stats.framesRecorded++;
141
+ this.stats.bytesEncoded += data.data.length;
142
+ }
143
+ /**
144
+ * Handle PTY input
145
+ */
146
+ handlePtyInput(data) {
147
+ const frame = {
148
+ type: binary_1.FrameType.INPUT,
149
+ data: data.data,
150
+ };
151
+ // Encode for chunk upload
152
+ this.encoder.writeFrame(frame);
153
+ // Broadcast via WebSocket if streaming
154
+ if (this.streamClient?.getConnected()) {
155
+ this.streamClient.broadcastFrame({
156
+ type: frame.type,
157
+ data: frame.data,
158
+ timestamp: Date.now(),
159
+ });
160
+ }
161
+ this.stats.framesRecorded++;
162
+ }
163
+ /**
164
+ * Handle PTY resize
165
+ */
166
+ handlePtyResize(size) {
167
+ const frame = {
168
+ type: binary_1.FrameType.RESIZE,
169
+ data: Buffer.from(JSON.stringify(size)),
170
+ };
171
+ // Encode for chunk upload
172
+ this.encoder.writeFrame(frame);
173
+ // Broadcast via WebSocket if streaming
174
+ if (this.streamClient?.getConnected()) {
175
+ this.streamClient.broadcastFrame({
176
+ type: frame.type,
177
+ data: frame.data,
178
+ timestamp: Date.now(),
179
+ });
180
+ }
181
+ this.stats.framesRecorded++;
182
+ }
183
+ /**
184
+ * Handle detected command
185
+ */
186
+ handlePtyCommand(cmd) {
187
+ const event = {
188
+ type: binary_1.EventType.COMMAND,
189
+ data: {
190
+ type: 'command_executed',
191
+ command: cmd.command,
192
+ },
193
+ };
194
+ // Encode for chunk upload
195
+ this.encoder.writeEvent(event);
196
+ // Broadcast via WebSocket if streaming
197
+ if (this.streamClient?.getConnected()) {
198
+ this.streamClient.broadcastEvent({
199
+ type: event.type,
200
+ data: event.data,
201
+ timestamp: cmd.timestamp || Date.now(),
202
+ });
203
+ }
204
+ this.stats.eventsRecorded++;
205
+ this.emit('command', cmd.command);
206
+ }
207
+ /**
208
+ * Handle PTY exit
209
+ */
210
+ async handlePtyExit(exitInfo) {
211
+ this.emit('exit', exitInfo);
212
+ // Stop recording
213
+ await this.stop();
214
+ }
215
+ /**
216
+ * Flush current chunk and upload
217
+ */
218
+ async flushChunk() {
219
+ if (!this.isRecording || this.isPaused) {
220
+ return;
221
+ }
222
+ try {
223
+ const chunk = await this.encoder.flushChunk();
224
+ if (chunk && chunk.length > 0) {
225
+ const chunkIndex = this.stats.chunksUploaded;
226
+ // Upload chunk
227
+ await this.uploader.uploadChunk(chunkIndex, chunk);
228
+ this.stats.chunksUploaded++;
229
+ this.emit('chunk-uploaded', { index: chunkIndex, size: chunk.length });
230
+ }
231
+ }
232
+ catch (error) {
233
+ this.emit('error', error);
234
+ }
235
+ }
236
+ /**
237
+ * Pause recording
238
+ */
239
+ pause() {
240
+ if (!this.isRecording || this.isPaused) {
241
+ return;
242
+ }
243
+ this.isPaused = true;
244
+ this.emit('paused');
245
+ }
246
+ /**
247
+ * Resume recording
248
+ */
249
+ resume() {
250
+ if (!this.isRecording || !this.isPaused) {
251
+ return;
252
+ }
253
+ this.isPaused = false;
254
+ this.emit('resumed');
255
+ }
256
+ /**
257
+ * Stop recording
258
+ */
259
+ async stop() {
260
+ if (!this.isRecording) {
261
+ return;
262
+ }
263
+ this.isRecording = false;
264
+ // Stop auto-flush interval
265
+ if (this.chunkFlushInterval) {
266
+ clearInterval(this.chunkFlushInterval);
267
+ this.chunkFlushInterval = null;
268
+ }
269
+ // Flush final chunk
270
+ await this.flushChunk();
271
+ // Disconnect from WebSocket server if streaming
272
+ if (this.streamClient) {
273
+ try {
274
+ await this.streamClient.disconnect();
275
+ // Call stop-stream API
276
+ await this.apiClient.stopStream(this.sessionId);
277
+ }
278
+ catch (error) {
279
+ // Non-blocking: log but don't fail
280
+ this.emit('error', new Error(`Failed to stop stream: ${error}`));
281
+ }
282
+ }
283
+ // Kill PTY
284
+ if (this.ptyManager) {
285
+ this.ptyManager.kill();
286
+ this.ptyManager = null;
287
+ }
288
+ // Update session status
289
+ try {
290
+ await this.apiClient.updateSession(this.sessionId, {
291
+ status: 'completed',
292
+ });
293
+ }
294
+ catch (error) {
295
+ console.error('Failed to update session status:', error);
296
+ }
297
+ // Calculate final stats
298
+ this.stats.duration = Date.now() - this.sessionStartTime;
299
+ this.emit('stopped', this.stats);
300
+ }
301
+ /**
302
+ * Get recording stats
303
+ */
304
+ getStats() {
305
+ return {
306
+ ...this.stats,
307
+ duration: this.isRecording ? Date.now() - this.sessionStartTime : this.stats.duration,
308
+ };
309
+ }
310
+ /**
311
+ * Check if recording
312
+ */
313
+ isActive() {
314
+ return this.isRecording;
315
+ }
316
+ /**
317
+ * Check if paused
318
+ */
319
+ isPausedState() {
320
+ return this.isPaused;
321
+ }
322
+ /**
323
+ * Get session URL
324
+ */
325
+ getSessionUrl() {
326
+ return this.apiClient.getSessionUrl(this.sessionId);
327
+ }
328
+ }
329
+ exports.Recorder = Recorder;
330
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/core/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Stream Client
3
+ *
4
+ * WebSocket client for broadcasting terminal frames in real-time
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import { FrameType, EventType } from '@b0xs/binary';
8
+ export interface StreamClientOptions {
9
+ wsUrl: string;
10
+ streamToken: string;
11
+ sessionId: string;
12
+ }
13
+ export interface StreamFrame {
14
+ type: FrameType;
15
+ data: Buffer;
16
+ timestamp?: number;
17
+ }
18
+ export interface StreamEvent {
19
+ type: EventType;
20
+ data: any;
21
+ timestamp?: number;
22
+ }
23
+ export declare class StreamClient extends EventEmitter {
24
+ private socket;
25
+ private wsUrl;
26
+ private streamToken;
27
+ private sessionId;
28
+ private isConnected;
29
+ private reconnectAttempts;
30
+ private maxReconnectAttempts;
31
+ private heartbeatInterval;
32
+ constructor(options: StreamClientOptions);
33
+ /**
34
+ * Connect to WebSocket server
35
+ */
36
+ connect(): Promise<void>;
37
+ /**
38
+ * Broadcast a terminal frame
39
+ */
40
+ broadcastFrame(frame: StreamFrame): void;
41
+ /**
42
+ * Broadcast a timeline event
43
+ */
44
+ broadcastEvent(event: StreamEvent): void;
45
+ /**
46
+ * Start heartbeat to keep connection alive
47
+ */
48
+ private startHeartbeat;
49
+ /**
50
+ * Stop heartbeat
51
+ */
52
+ private stopHeartbeat;
53
+ /**
54
+ * Disconnect from WebSocket server
55
+ */
56
+ disconnect(): Promise<void>;
57
+ /**
58
+ * Check if connected
59
+ */
60
+ getConnected(): boolean;
61
+ }
62
+ //# sourceMappingURL=stream-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-client.d.ts","sourceRoot":"","sources":["../../src/core/stream-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,iBAAiB,CAA+B;gBAE5C,OAAO,EAAE,mBAAmB;IAOxC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+E9B;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAmBxC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAmBxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Stream Client
4
+ *
5
+ * WebSocket client for broadcasting terminal frames in real-time
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.StreamClient = void 0;
9
+ const socket_io_client_1 = require("socket.io-client");
10
+ const events_1 = require("events");
11
+ class StreamClient extends events_1.EventEmitter {
12
+ constructor(options) {
13
+ super();
14
+ this.socket = null;
15
+ this.isConnected = false;
16
+ this.reconnectAttempts = 0;
17
+ this.maxReconnectAttempts = 5;
18
+ this.heartbeatInterval = null;
19
+ this.wsUrl = options.wsUrl;
20
+ this.streamToken = options.streamToken;
21
+ this.sessionId = options.sessionId;
22
+ }
23
+ /**
24
+ * Connect to WebSocket server
25
+ */
26
+ async connect() {
27
+ if (this.socket?.connected) {
28
+ return;
29
+ }
30
+ return new Promise((resolve, reject) => {
31
+ try {
32
+ this.socket = (0, socket_io_client_1.io)(`${this.wsUrl}/stream`, {
33
+ auth: {
34
+ token: this.streamToken,
35
+ },
36
+ transports: ['websocket'],
37
+ reconnection: true,
38
+ reconnectionAttempts: this.maxReconnectAttempts,
39
+ reconnectionDelay: 1000,
40
+ });
41
+ // Connection successful
42
+ this.socket.on('connect', () => {
43
+ this.isConnected = true;
44
+ this.reconnectAttempts = 0;
45
+ this.emit('connected');
46
+ this.startHeartbeat();
47
+ resolve();
48
+ });
49
+ // Start stream
50
+ this.socket.on('connect', () => {
51
+ this.socket?.emit('stream:start', {
52
+ sessionId: this.sessionId,
53
+ });
54
+ });
55
+ // Stream started confirmation
56
+ this.socket.on('stream:started', (data) => {
57
+ this.emit('stream-started', data);
58
+ });
59
+ // Viewer count updates
60
+ this.socket.on('viewers', (count) => {
61
+ this.emit('viewers', count);
62
+ });
63
+ // Heartbeat acknowledgment
64
+ this.socket.on('stream:heartbeat:ack', () => {
65
+ // Heartbeat received
66
+ });
67
+ // Stream ended
68
+ this.socket.on('stream_ended', () => {
69
+ this.emit('stream-ended');
70
+ });
71
+ // Error handling
72
+ this.socket.on('error', (error) => {
73
+ this.emit('error', new Error(error.message || 'WebSocket error'));
74
+ });
75
+ this.socket.on('connect_error', (error) => {
76
+ this.reconnectAttempts++;
77
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) {
78
+ reject(new Error(`Failed to connect after ${this.maxReconnectAttempts} attempts: ${error.message}`));
79
+ }
80
+ else {
81
+ this.emit('reconnecting', { attempt: this.reconnectAttempts });
82
+ }
83
+ });
84
+ // Disconnect
85
+ this.socket.on('disconnect', (reason) => {
86
+ this.isConnected = false;
87
+ this.stopHeartbeat();
88
+ this.emit('disconnected', reason);
89
+ });
90
+ }
91
+ catch (error) {
92
+ reject(new Error(`Failed to create WebSocket connection: ${error.message}`));
93
+ }
94
+ });
95
+ }
96
+ /**
97
+ * Broadcast a terminal frame
98
+ */
99
+ broadcastFrame(frame) {
100
+ if (!this.isConnected || !this.socket) {
101
+ return;
102
+ }
103
+ try {
104
+ this.socket.emit('stream:data', {
105
+ sessionId: this.sessionId,
106
+ frame: {
107
+ type: frame.type,
108
+ data: frame.data.toString('base64'),
109
+ timestamp: frame.timestamp || Date.now(),
110
+ },
111
+ });
112
+ }
113
+ catch (error) {
114
+ this.emit('error', new Error(`Failed to broadcast frame: ${error.message}`));
115
+ }
116
+ }
117
+ /**
118
+ * Broadcast a timeline event
119
+ */
120
+ broadcastEvent(event) {
121
+ if (!this.isConnected || !this.socket) {
122
+ return;
123
+ }
124
+ try {
125
+ this.socket.emit('stream:event', {
126
+ sessionId: this.sessionId,
127
+ event: {
128
+ type: event.type,
129
+ data: event.data,
130
+ timestamp: event.timestamp || Date.now(),
131
+ },
132
+ });
133
+ }
134
+ catch (error) {
135
+ this.emit('error', new Error(`Failed to broadcast event: ${error.message}`));
136
+ }
137
+ }
138
+ /**
139
+ * Start heartbeat to keep connection alive
140
+ */
141
+ startHeartbeat() {
142
+ this.stopHeartbeat();
143
+ this.heartbeatInterval = setInterval(() => {
144
+ if (this.isConnected && this.socket) {
145
+ this.socket.emit('stream:heartbeat', {
146
+ sessionId: this.sessionId,
147
+ });
148
+ }
149
+ }, 30000); // Every 30 seconds
150
+ }
151
+ /**
152
+ * Stop heartbeat
153
+ */
154
+ stopHeartbeat() {
155
+ if (this.heartbeatInterval) {
156
+ clearInterval(this.heartbeatInterval);
157
+ this.heartbeatInterval = null;
158
+ }
159
+ }
160
+ /**
161
+ * Disconnect from WebSocket server
162
+ */
163
+ async disconnect() {
164
+ if (this.socket) {
165
+ // Emit stop event
166
+ if (this.isConnected) {
167
+ this.socket.emit('stream:stop', {
168
+ sessionId: this.sessionId,
169
+ });
170
+ }
171
+ this.stopHeartbeat();
172
+ this.socket.disconnect();
173
+ this.socket = null;
174
+ this.isConnected = false;
175
+ }
176
+ }
177
+ /**
178
+ * Check if connected
179
+ */
180
+ getConnected() {
181
+ return this.isConnected;
182
+ }
183
+ }
184
+ exports.StreamClient = StreamClient;
185
+ //# sourceMappingURL=stream-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-client.js","sourceRoot":"","sources":["../../src/core/stream-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BOXS Recorder CLI
4
+ *
5
+ * Main entry point for the CLI tool
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}