x-shell.js 0.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.
- package/README.md +304 -0
- package/dist/client/browser-bundle.js +314 -0
- package/dist/client/browser-bundle.js.map +7 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/terminal-client.d.ts +122 -0
- package/dist/client/terminal-client.d.ts.map +1 -0
- package/dist/client/terminal-client.js +328 -0
- package/dist/client/terminal-client.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/terminal-server.d.ts +107 -0
- package/dist/server/terminal-server.d.ts.map +1 -0
- package/dist/server/terminal-server.js +392 -0
- package/dist/server/terminal-server.js.map +1 -0
- package/dist/shared/types.d.ts +133 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/ui/browser-bundle.js +1654 -0
- package/dist/ui/browser-bundle.js.map +7 -0
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +6 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/styles.d.ts +16 -0
- package/dist/ui/styles.d.ts.map +1 -0
- package/dist/ui/styles.js +125 -0
- package/dist/ui/styles.js.map +1 -0
- package/dist/ui/x-shell-terminal.d.ts +100 -0
- package/dist/ui/x-shell-terminal.d.ts.map +1 -0
- package/dist/ui/x-shell-terminal.js +540 -0
- package/dist/ui/x-shell-terminal.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side terminal handler using node-pty
|
|
3
|
+
*
|
|
4
|
+
* Manages PTY sessions and WebSocket connections for web-based terminals.
|
|
5
|
+
*/
|
|
6
|
+
import { WebSocketServer } from 'ws';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
/**
|
|
10
|
+
* Get platform default shell
|
|
11
|
+
*/
|
|
12
|
+
function getDefaultShell() {
|
|
13
|
+
if (process.platform === 'win32') {
|
|
14
|
+
return process.env.COMSPEC || 'cmd.exe';
|
|
15
|
+
}
|
|
16
|
+
return process.env.SHELL || '/bin/bash';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Terminal server class
|
|
20
|
+
*/
|
|
21
|
+
export class TerminalServer {
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
this.sessions = new Map();
|
|
24
|
+
this.wss = null;
|
|
25
|
+
this.pty = null;
|
|
26
|
+
this.cleanupInterval = null;
|
|
27
|
+
this.config = {
|
|
28
|
+
allowedShells: options.allowedShells || [getDefaultShell()],
|
|
29
|
+
allowedPaths: options.allowedPaths || [os.homedir()],
|
|
30
|
+
defaultShell: options.defaultShell || getDefaultShell(),
|
|
31
|
+
defaultCwd: options.defaultCwd || os.homedir(),
|
|
32
|
+
maxSessionsPerClient: options.maxSessionsPerClient || 5,
|
|
33
|
+
idleTimeout: options.idleTimeout || 30 * 60 * 1000, // 30 minutes
|
|
34
|
+
path: options.path || '/terminal',
|
|
35
|
+
verbose: options.verbose || false,
|
|
36
|
+
};
|
|
37
|
+
// Start cleanup interval
|
|
38
|
+
this.cleanupInterval = setInterval(() => this.cleanupSessions(), 60000);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initialize node-pty (lazy load)
|
|
42
|
+
*/
|
|
43
|
+
async initPty() {
|
|
44
|
+
if (this.pty)
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
// @ts-ignore - node-pty is a peer dependency
|
|
48
|
+
this.pty = await import('node-pty');
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error('node-pty is required for x-shell. Install it with: npm install node-pty');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Attach to an existing HTTP server
|
|
56
|
+
*/
|
|
57
|
+
attach(server) {
|
|
58
|
+
this.wss = new WebSocketServer({
|
|
59
|
+
server,
|
|
60
|
+
path: this.config.path,
|
|
61
|
+
});
|
|
62
|
+
this.setupWebSocketServer();
|
|
63
|
+
this.log(`Terminal WebSocket server listening on ${this.config.path}`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Start standalone WebSocket server
|
|
67
|
+
*/
|
|
68
|
+
listen(port) {
|
|
69
|
+
this.wss = new WebSocketServer({ port });
|
|
70
|
+
this.setupWebSocketServer();
|
|
71
|
+
this.log(`Terminal WebSocket server listening on port ${port}`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Setup WebSocket server event handlers
|
|
75
|
+
*/
|
|
76
|
+
setupWebSocketServer() {
|
|
77
|
+
if (!this.wss)
|
|
78
|
+
return;
|
|
79
|
+
this.wss.on('connection', async (ws, req) => {
|
|
80
|
+
this.log(`Client connected from ${req.socket.remoteAddress}`);
|
|
81
|
+
await this.handleConnection(ws, req);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Handle WebSocket connection
|
|
86
|
+
*/
|
|
87
|
+
async handleConnection(ws, req) {
|
|
88
|
+
// Load node-pty
|
|
89
|
+
try {
|
|
90
|
+
await this.initPty();
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
this.sendError(ws, error.message);
|
|
94
|
+
ws.close();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Handle messages
|
|
98
|
+
ws.on('message', (data) => {
|
|
99
|
+
try {
|
|
100
|
+
const message = JSON.parse(data.toString());
|
|
101
|
+
this.handleMessage(ws, message);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.log(`Invalid message: ${error}`, 'error');
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
ws.on('close', () => {
|
|
108
|
+
this.log('Client disconnected');
|
|
109
|
+
// Clean up sessions for this WebSocket
|
|
110
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
111
|
+
if (session.ws === ws) {
|
|
112
|
+
this.closeSession(sessionId);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
ws.on('error', (error) => {
|
|
117
|
+
this.log(`WebSocket error: ${error.message}`, 'error');
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle message from client
|
|
122
|
+
*/
|
|
123
|
+
handleMessage(ws, message) {
|
|
124
|
+
switch (message.type) {
|
|
125
|
+
case 'spawn':
|
|
126
|
+
this.spawnSession(ws, message.options || {});
|
|
127
|
+
break;
|
|
128
|
+
case 'data':
|
|
129
|
+
if (message.sessionId) {
|
|
130
|
+
this.writeToSession(message.sessionId, message.data);
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
case 'resize':
|
|
134
|
+
if (message.sessionId) {
|
|
135
|
+
this.resizeSession(message.sessionId, message.cols, message.rows);
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
case 'close':
|
|
139
|
+
if (message.sessionId) {
|
|
140
|
+
this.closeSession(message.sessionId);
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
this.log(`Unknown message type: ${message.type}`, 'warn');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Validate shell path
|
|
149
|
+
*/
|
|
150
|
+
isShellAllowed(shell) {
|
|
151
|
+
if (this.config.allowedShells.length === 0)
|
|
152
|
+
return true;
|
|
153
|
+
const normalizedShell = path.normalize(shell);
|
|
154
|
+
const shellBasename = path.basename(normalizedShell).toLowerCase();
|
|
155
|
+
return this.config.allowedShells.some((allowedShell) => {
|
|
156
|
+
const normalizedAllowed = path.normalize(allowedShell);
|
|
157
|
+
const allowedBasename = path.basename(normalizedAllowed).toLowerCase();
|
|
158
|
+
return (normalizedShell === normalizedAllowed ||
|
|
159
|
+
shellBasename === allowedBasename);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Validate working directory
|
|
164
|
+
*/
|
|
165
|
+
isCwdAllowed(cwd) {
|
|
166
|
+
if (this.config.allowedPaths.length === 0)
|
|
167
|
+
return true;
|
|
168
|
+
const normalizedCwd = path.normalize(path.resolve(cwd));
|
|
169
|
+
return this.config.allowedPaths.some((allowedPath) => normalizedCwd.startsWith(path.normalize(path.resolve(allowedPath))));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Spawn a new terminal session
|
|
173
|
+
*/
|
|
174
|
+
spawnSession(ws, options) {
|
|
175
|
+
const shell = options.shell || this.config.defaultShell;
|
|
176
|
+
const cwd = options.cwd || this.config.defaultCwd;
|
|
177
|
+
const cols = options.cols || 80;
|
|
178
|
+
const rows = options.rows || 24;
|
|
179
|
+
const env = options.env || {};
|
|
180
|
+
// Count sessions for this client
|
|
181
|
+
let clientSessions = 0;
|
|
182
|
+
for (const session of this.sessions.values()) {
|
|
183
|
+
if (session.ws === ws)
|
|
184
|
+
clientSessions++;
|
|
185
|
+
}
|
|
186
|
+
if (clientSessions >= this.config.maxSessionsPerClient) {
|
|
187
|
+
this.sendError(ws, `Maximum sessions (${this.config.maxSessionsPerClient}) reached`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// Validate shell
|
|
191
|
+
if (!this.isShellAllowed(shell)) {
|
|
192
|
+
this.sendError(ws, `Shell not allowed: ${shell}. Allowed: ${this.config.allowedShells.join(', ')}`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Validate cwd
|
|
196
|
+
if (!this.isCwdAllowed(cwd)) {
|
|
197
|
+
this.sendError(ws, `Working directory not allowed: ${cwd}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
// Spawn PTY
|
|
202
|
+
const ptyProcess = this.pty.spawn(shell, [], {
|
|
203
|
+
name: 'xterm-256color',
|
|
204
|
+
cols,
|
|
205
|
+
rows,
|
|
206
|
+
cwd,
|
|
207
|
+
env: { ...process.env, ...env },
|
|
208
|
+
});
|
|
209
|
+
const sessionId = `term-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
210
|
+
const now = new Date();
|
|
211
|
+
// Store session
|
|
212
|
+
const session = {
|
|
213
|
+
id: sessionId,
|
|
214
|
+
pty: ptyProcess,
|
|
215
|
+
ws,
|
|
216
|
+
shell,
|
|
217
|
+
cwd,
|
|
218
|
+
cols,
|
|
219
|
+
rows,
|
|
220
|
+
createdAt: now,
|
|
221
|
+
lastActivity: now,
|
|
222
|
+
};
|
|
223
|
+
this.sessions.set(sessionId, session);
|
|
224
|
+
// Handle PTY output
|
|
225
|
+
ptyProcess.onData((data) => {
|
|
226
|
+
session.lastActivity = new Date();
|
|
227
|
+
ws.send(JSON.stringify({
|
|
228
|
+
type: 'data',
|
|
229
|
+
sessionId,
|
|
230
|
+
data,
|
|
231
|
+
}));
|
|
232
|
+
});
|
|
233
|
+
// Handle PTY exit
|
|
234
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
235
|
+
ws.send(JSON.stringify({
|
|
236
|
+
type: 'exit',
|
|
237
|
+
sessionId,
|
|
238
|
+
exitCode,
|
|
239
|
+
}));
|
|
240
|
+
this.sessions.delete(sessionId);
|
|
241
|
+
this.log(`Session exited: ${sessionId} (code: ${exitCode})`);
|
|
242
|
+
});
|
|
243
|
+
// Notify client
|
|
244
|
+
ws.send(JSON.stringify({
|
|
245
|
+
type: 'spawned',
|
|
246
|
+
sessionId,
|
|
247
|
+
shell,
|
|
248
|
+
cwd,
|
|
249
|
+
cols,
|
|
250
|
+
rows,
|
|
251
|
+
}));
|
|
252
|
+
this.log(`Session spawned: ${sessionId} (shell: ${shell}, cwd: ${cwd})`);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
this.log(`Failed to spawn session: ${error}`, 'error');
|
|
256
|
+
this.sendError(ws, error.message);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Write data to session
|
|
261
|
+
*/
|
|
262
|
+
writeToSession(sessionId, data) {
|
|
263
|
+
const session = this.sessions.get(sessionId);
|
|
264
|
+
if (!session) {
|
|
265
|
+
this.log(`Session not found: ${sessionId}`, 'warn');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
session.lastActivity = new Date();
|
|
269
|
+
session.pty.write(data);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Resize session
|
|
273
|
+
*/
|
|
274
|
+
resizeSession(sessionId, cols, rows) {
|
|
275
|
+
const session = this.sessions.get(sessionId);
|
|
276
|
+
if (!session) {
|
|
277
|
+
this.log(`Session not found: ${sessionId}`, 'warn');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
session.cols = cols;
|
|
281
|
+
session.rows = rows;
|
|
282
|
+
session.pty.resize(cols, rows);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Close session
|
|
286
|
+
*/
|
|
287
|
+
closeSession(sessionId) {
|
|
288
|
+
const session = this.sessions.get(sessionId);
|
|
289
|
+
if (!session)
|
|
290
|
+
return;
|
|
291
|
+
try {
|
|
292
|
+
session.pty.kill();
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
this.log(`Error killing PTY: ${error}`, 'error');
|
|
296
|
+
}
|
|
297
|
+
this.sessions.delete(sessionId);
|
|
298
|
+
this.log(`Session closed: ${sessionId}`);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Clean up inactive sessions
|
|
302
|
+
*/
|
|
303
|
+
cleanupSessions() {
|
|
304
|
+
if (this.config.idleTimeout === 0)
|
|
305
|
+
return;
|
|
306
|
+
const now = Date.now();
|
|
307
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
308
|
+
const idleTime = now - session.lastActivity.getTime();
|
|
309
|
+
if (idleTime > this.config.idleTimeout) {
|
|
310
|
+
this.log(`Closing inactive session: ${sessionId}`);
|
|
311
|
+
session.ws.send(JSON.stringify({
|
|
312
|
+
type: 'exit',
|
|
313
|
+
sessionId,
|
|
314
|
+
exitCode: -1,
|
|
315
|
+
}));
|
|
316
|
+
this.closeSession(sessionId);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Send error message to client
|
|
322
|
+
*/
|
|
323
|
+
sendError(ws, error, sessionId) {
|
|
324
|
+
ws.send(JSON.stringify({
|
|
325
|
+
type: 'error',
|
|
326
|
+
sessionId,
|
|
327
|
+
error,
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Log message
|
|
332
|
+
*/
|
|
333
|
+
log(message, level = 'info') {
|
|
334
|
+
if (!this.config.verbose && level === 'info')
|
|
335
|
+
return;
|
|
336
|
+
const prefix = '[x-shell]';
|
|
337
|
+
switch (level) {
|
|
338
|
+
case 'error':
|
|
339
|
+
console.error(`${prefix} ${message}`);
|
|
340
|
+
break;
|
|
341
|
+
case 'warn':
|
|
342
|
+
console.warn(`${prefix} ${message}`);
|
|
343
|
+
break;
|
|
344
|
+
default:
|
|
345
|
+
console.log(`${prefix} ${message}`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get all active sessions
|
|
350
|
+
*/
|
|
351
|
+
getSessions() {
|
|
352
|
+
return Array.from(this.sessions.values()).map((session) => ({
|
|
353
|
+
sessionId: session.id,
|
|
354
|
+
shell: session.shell,
|
|
355
|
+
cwd: session.cwd,
|
|
356
|
+
cols: session.cols,
|
|
357
|
+
rows: session.rows,
|
|
358
|
+
createdAt: session.createdAt,
|
|
359
|
+
}));
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Close all sessions and stop server
|
|
363
|
+
*/
|
|
364
|
+
close() {
|
|
365
|
+
// Clear cleanup interval
|
|
366
|
+
if (this.cleanupInterval) {
|
|
367
|
+
clearInterval(this.cleanupInterval);
|
|
368
|
+
this.cleanupInterval = null;
|
|
369
|
+
}
|
|
370
|
+
// Close all sessions
|
|
371
|
+
for (const sessionId of this.sessions.keys()) {
|
|
372
|
+
this.closeSession(sessionId);
|
|
373
|
+
}
|
|
374
|
+
// Close WebSocket server
|
|
375
|
+
if (this.wss) {
|
|
376
|
+
this.wss.close();
|
|
377
|
+
this.wss = null;
|
|
378
|
+
}
|
|
379
|
+
this.log('Terminal server closed');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Express middleware to attach terminal server
|
|
384
|
+
*/
|
|
385
|
+
export function createTerminalMiddleware(options = {}) {
|
|
386
|
+
const server = new TerminalServer(options);
|
|
387
|
+
return {
|
|
388
|
+
server,
|
|
389
|
+
attach: (httpServer) => server.attach(httpServer),
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=terminal-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-server.js","sourceRoot":"","sources":["../../src/server/terminal-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for x-shell.js
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Terminal spawn options
|
|
6
|
+
*/
|
|
7
|
+
export interface TerminalOptions {
|
|
8
|
+
/** Shell to use (e.g., 'bash', 'zsh', 'cmd.exe', 'powershell.exe') */
|
|
9
|
+
shell?: string;
|
|
10
|
+
/** Working directory */
|
|
11
|
+
cwd?: string;
|
|
12
|
+
/** Environment variables */
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
/** Initial columns (default: 80) */
|
|
15
|
+
cols?: number;
|
|
16
|
+
/** Initial rows (default: 24) */
|
|
17
|
+
rows?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Server configuration
|
|
21
|
+
*/
|
|
22
|
+
export interface ServerConfig {
|
|
23
|
+
/** Allowed shells (empty = all allowed) */
|
|
24
|
+
allowedShells?: string[];
|
|
25
|
+
/** Allowed working directories (empty = all allowed) */
|
|
26
|
+
allowedPaths?: string[];
|
|
27
|
+
/** Default shell if not specified by client */
|
|
28
|
+
defaultShell?: string;
|
|
29
|
+
/** Default working directory */
|
|
30
|
+
defaultCwd?: string;
|
|
31
|
+
/** Maximum concurrent sessions per client */
|
|
32
|
+
maxSessionsPerClient?: number;
|
|
33
|
+
/** Session idle timeout in ms (0 = no timeout) */
|
|
34
|
+
idleTimeout?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* WebSocket message types
|
|
38
|
+
*/
|
|
39
|
+
export type MessageType = 'spawn' | 'data' | 'resize' | 'close' | 'error' | 'exit' | 'spawned';
|
|
40
|
+
/**
|
|
41
|
+
* Base message structure
|
|
42
|
+
*/
|
|
43
|
+
export interface BaseMessage {
|
|
44
|
+
type: MessageType;
|
|
45
|
+
sessionId?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Spawn request from client
|
|
49
|
+
*/
|
|
50
|
+
export interface SpawnMessage extends BaseMessage {
|
|
51
|
+
type: 'spawn';
|
|
52
|
+
options?: TerminalOptions;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Spawned response from server
|
|
56
|
+
*/
|
|
57
|
+
export interface SpawnedMessage extends BaseMessage {
|
|
58
|
+
type: 'spawned';
|
|
59
|
+
sessionId: string;
|
|
60
|
+
shell: string;
|
|
61
|
+
cwd: string;
|
|
62
|
+
cols: number;
|
|
63
|
+
rows: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Data message (bidirectional)
|
|
67
|
+
*/
|
|
68
|
+
export interface DataMessage extends BaseMessage {
|
|
69
|
+
type: 'data';
|
|
70
|
+
sessionId: string;
|
|
71
|
+
data: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Resize request from client
|
|
75
|
+
*/
|
|
76
|
+
export interface ResizeMessage extends BaseMessage {
|
|
77
|
+
type: 'resize';
|
|
78
|
+
sessionId: string;
|
|
79
|
+
cols: number;
|
|
80
|
+
rows: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Close request from client
|
|
84
|
+
*/
|
|
85
|
+
export interface CloseMessage extends BaseMessage {
|
|
86
|
+
type: 'close';
|
|
87
|
+
sessionId: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Error message from server
|
|
91
|
+
*/
|
|
92
|
+
export interface ErrorMessage extends BaseMessage {
|
|
93
|
+
type: 'error';
|
|
94
|
+
sessionId?: string;
|
|
95
|
+
error: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Exit message from server
|
|
99
|
+
*/
|
|
100
|
+
export interface ExitMessage extends BaseMessage {
|
|
101
|
+
type: 'exit';
|
|
102
|
+
sessionId: string;
|
|
103
|
+
exitCode: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Union of all message types
|
|
107
|
+
*/
|
|
108
|
+
export type TerminalMessage = SpawnMessage | SpawnedMessage | DataMessage | ResizeMessage | CloseMessage | ErrorMessage | ExitMessage;
|
|
109
|
+
/**
|
|
110
|
+
* Client configuration
|
|
111
|
+
*/
|
|
112
|
+
export interface ClientConfig {
|
|
113
|
+
/** WebSocket URL */
|
|
114
|
+
url: string;
|
|
115
|
+
/** Reconnect on disconnect (default: true) */
|
|
116
|
+
reconnect?: boolean;
|
|
117
|
+
/** Maximum reconnection attempts (default: 10) */
|
|
118
|
+
maxReconnectAttempts?: number;
|
|
119
|
+
/** Initial reconnection delay in ms (default: 1000) */
|
|
120
|
+
reconnectDelay?: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Terminal session info
|
|
124
|
+
*/
|
|
125
|
+
export interface SessionInfo {
|
|
126
|
+
sessionId: string;
|
|
127
|
+
shell: string;
|
|
128
|
+
cwd: string;
|
|
129
|
+
cols: number;
|
|
130
|
+
rows: number;
|
|
131
|
+
createdAt: Date;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|