@floegence/floeterm-terminal-web 0.4.32 → 0.5.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.
@@ -1,544 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react';
2
- import { TerminalCore } from '../core/TerminalCore';
3
- import { SequenceBuffer } from '../internal/SequenceBuffer';
4
- import { createTerminalError } from '../utils/errors';
5
- import { getDefaultTerminalConfig, getThemeColors } from '../utils/config';
6
- import { createConsoleLogger, noopLogger } from '../utils/logger';
7
- import { concatChunks } from '../utils/history';
8
- import { TerminalState } from '../types';
9
- var ConnectionState;
10
- (function (ConnectionState) {
11
- ConnectionState["IDLE"] = "idle";
12
- ConnectionState["CONNECTING"] = "connecting";
13
- ConnectionState["CONNECTED"] = "connected";
14
- ConnectionState["DISCONNECTED"] = "disconnected";
15
- ConnectionState["RETRYING"] = "retrying";
16
- ConnectionState["FAILED"] = "failed";
17
- ConnectionState["ABORTED"] = "aborted";
18
- })(ConnectionState || (ConnectionState = {}));
19
- const MAX_WRITE_BATCH_CHUNKS = 64;
20
- const MAX_WRITE_BATCH_BYTES = 256 * 1024;
21
- var LoadingState;
22
- (function (LoadingState) {
23
- LoadingState["IDLE"] = "idle";
24
- LoadingState["INITIALIZING_TERMINAL"] = "initializing_terminal";
25
- LoadingState["ATTACHING"] = "attaching";
26
- LoadingState["PROCESSING_HISTORY"] = "processing_history";
27
- LoadingState["READY"] = "ready";
28
- })(LoadingState || (LoadingState = {}));
29
- // useTerminalInstance creates and manages a single terminal instance.
30
- export const useTerminalInstance = (options) => {
31
- const { sessionId, isActive, transport, eventSource, themeName = 'dark', fontSize, presentationScale, autoFocus = false, onResize, onError, config: customConfig, logger: injectedLogger, coreConstructor } = options;
32
- const logger = injectedLogger ?? createConsoleLogger();
33
- const containerRef = useRef(null);
34
- const terminalCoreRef = useRef(null);
35
- const isInitializingRef = useRef(false);
36
- const terminalDataUnsubscribeRef = useRef(null);
37
- const sequenceBufferRef = useRef(new SequenceBuffer());
38
- const replayCompleteReceivedRef = useRef(false);
39
- const isReplayActiveRef = useRef(false);
40
- const lastAppliedSequenceRef = useRef(0);
41
- const [loadingState, setLoadingState] = useState(LoadingState.IDLE);
42
- const [loadingMessage, setLoadingMessage] = useState('');
43
- const [replaySubscriptionKey, setReplaySubscriptionKey] = useState(0);
44
- const [terminalReadyKey, setTerminalReadyKey] = useState(0);
45
- const [connectionState, setConnectionState] = useState(ConnectionState.IDLE);
46
- const [connectionError, setConnectionError] = useState(null);
47
- const [retryCount, setRetryCount] = useState(0);
48
- const retryTimeoutRef = useRef(null);
49
- const [state, setState] = useState({
50
- state: TerminalState.IDLE,
51
- error: undefined,
52
- dimensions: { cols: 80, rows: 24 }
53
- });
54
- const dimensionsRef = useRef({ cols: 80, rows: 24 });
55
- const dataQueueRef = useRef([]);
56
- const isProcessingRef = useRef(false);
57
- const queueGenerationRef = useRef(0);
58
- const flushRafRef = useRef(null);
59
- const processDataQueueRef = useRef(() => { });
60
- // Reset session-scoped state when switching sessions (important for ordering + history replay).
61
- useEffect(() => {
62
- queueGenerationRef.current += 1;
63
- sequenceBufferRef.current.reset(1);
64
- replayCompleteReceivedRef.current = false;
65
- isReplayActiveRef.current = false;
66
- lastAppliedSequenceRef.current = 0;
67
- dataQueueRef.current = [];
68
- isProcessingRef.current = false;
69
- if (flushRafRef.current !== null) {
70
- cancelAnimationFrame(flushRafRef.current);
71
- flushRafRef.current = null;
72
- }
73
- setConnectionState(ConnectionState.IDLE);
74
- setConnectionError(null);
75
- setRetryCount(0);
76
- if (retryTimeoutRef.current) {
77
- clearTimeout(retryTimeoutRef.current);
78
- retryTimeoutRef.current = null;
79
- }
80
- }, [sessionId]);
81
- const updateState = useCallback((updates) => {
82
- setState(prev => ({ ...prev, ...updates }));
83
- }, []);
84
- const handleStateChange = useCallback((newState) => {
85
- updateState({ state: newState });
86
- }, [updateState]);
87
- const handleResize = useCallback(async (size) => {
88
- dimensionsRef.current = size;
89
- updateState({ dimensions: size });
90
- onResize?.(size.cols, size.rows);
91
- if (!sessionId) {
92
- return;
93
- }
94
- try {
95
- await transport.resize(sessionId, size.cols, size.rows);
96
- }
97
- catch (error) {
98
- logger.warn('[useTerminalInstance] Resize request failed', { error });
99
- }
100
- }, [updateState, onResize, transport, sessionId, logger]);
101
- const handleError = useCallback((error) => {
102
- updateState({ error, state: TerminalState.ERROR });
103
- onError?.(error);
104
- }, [updateState, onError]);
105
- const handleUserInput = useCallback((data) => {
106
- if (!sessionId) {
107
- return;
108
- }
109
- transport.sendInput(sessionId, data).catch(error => {
110
- logger.warn('[useTerminalInstance] sendInput failed', { error });
111
- });
112
- }, [transport, sessionId, logger]);
113
- const scheduleFocus = useCallback(() => {
114
- if (!autoFocus) {
115
- return;
116
- }
117
- // Defer focus until after the terminal is visible/opened and React has flushed updates.
118
- requestAnimationFrame(() => {
119
- requestAnimationFrame(() => {
120
- terminalCoreRef.current?.focus();
121
- });
122
- });
123
- }, [autoFocus]);
124
- const cleanupTerminal = useCallback(() => {
125
- if (terminalCoreRef.current) {
126
- terminalCoreRef.current.dispose();
127
- terminalCoreRef.current = null;
128
- }
129
- dataQueueRef.current = [];
130
- isProcessingRef.current = false;
131
- }, []);
132
- const finishReplayIfIdle = useCallback(() => {
133
- if (!replayCompleteReceivedRef.current || dataQueueRef.current.length > 0 || isProcessingRef.current) {
134
- return;
135
- }
136
- if (isReplayActiveRef.current) {
137
- terminalCoreRef.current?.endHistoryReplay?.();
138
- isReplayActiveRef.current = false;
139
- }
140
- setLoadingState(LoadingState.READY);
141
- setLoadingMessage('');
142
- scheduleFocus();
143
- }, [scheduleFocus]);
144
- const scheduleDataQueueFlush = useCallback(() => {
145
- if (flushRafRef.current !== null) {
146
- return;
147
- }
148
- const generation = queueGenerationRef.current;
149
- flushRafRef.current = requestAnimationFrame(() => {
150
- flushRafRef.current = null;
151
- if (queueGenerationRef.current !== generation) {
152
- return;
153
- }
154
- processDataQueueRef.current();
155
- });
156
- }, []);
157
- const processDataQueue = useCallback(async () => {
158
- const generation = queueGenerationRef.current;
159
- if (isProcessingRef.current || !terminalCoreRef.current || dataQueueRef.current.length === 0) {
160
- return;
161
- }
162
- const terminalState = terminalCoreRef.current.getState();
163
- if (terminalState !== TerminalState.READY && terminalState !== TerminalState.CONNECTED) {
164
- setTimeout(() => {
165
- if (queueGenerationRef.current !== generation) {
166
- return;
167
- }
168
- processDataQueue();
169
- }, 100);
170
- return;
171
- }
172
- isProcessingRef.current = true;
173
- try {
174
- let batchLength = 0;
175
- let batchBytes = 0;
176
- for (const chunk of dataQueueRef.current) {
177
- if (batchLength >= MAX_WRITE_BATCH_CHUNKS) {
178
- break;
179
- }
180
- if (batchLength > 0 && batchBytes + chunk.data.byteLength > MAX_WRITE_BATCH_BYTES) {
181
- break;
182
- }
183
- batchLength += 1;
184
- batchBytes += chunk.data.byteLength;
185
- }
186
- const batch = dataQueueRef.current.splice(0, Math.max(1, batchLength));
187
- if (queueGenerationRef.current !== generation) {
188
- return;
189
- }
190
- const payload = batch.length === 1 ? batch[0].data : concatChunks(batch.map(chunk => chunk.data));
191
- terminalCoreRef.current.write(payload);
192
- for (const chunk of batch) {
193
- if (queueGenerationRef.current !== generation) {
194
- return;
195
- }
196
- if (chunk.sequence > lastAppliedSequenceRef.current) {
197
- lastAppliedSequenceRef.current = chunk.sequence;
198
- }
199
- }
200
- }
201
- finally {
202
- isProcessingRef.current = false;
203
- if (dataQueueRef.current.length > 0) {
204
- scheduleDataQueueFlush();
205
- }
206
- else {
207
- finishReplayIfIdle();
208
- }
209
- }
210
- }, [finishReplayIfIdle, scheduleDataQueueFlush]);
211
- useEffect(() => {
212
- processDataQueueRef.current = processDataQueue;
213
- }, [processDataQueue]);
214
- const addChunkToQueue = useCallback((chunk) => {
215
- if (chunk.sequence > 0 && chunk.sequence <= lastAppliedSequenceRef.current) {
216
- return;
217
- }
218
- const ready = sequenceBufferRef.current.push(chunk);
219
- if (ready.length === 0) {
220
- return;
221
- }
222
- dataQueueRef.current.push(...ready);
223
- if (!isProcessingRef.current) {
224
- scheduleDataQueueFlush();
225
- }
226
- }, [scheduleDataQueueFlush]);
227
- const applyCoreAppearance = useCallback((appearance) => {
228
- const core = terminalCoreRef.current;
229
- if (!core) {
230
- return;
231
- }
232
- const theme = appearance.themeName ? getThemeColors(appearance.themeName) : undefined;
233
- if (core.setAppearance) {
234
- core.setAppearance({
235
- ...(theme ? { theme } : {}),
236
- ...(typeof appearance.fontSize === 'number' ? { fontSize: appearance.fontSize } : {}),
237
- ...(typeof appearance.fontFamily === 'string' ? { fontFamily: appearance.fontFamily } : {}),
238
- ...(typeof appearance.presentationScale === 'number' ? { presentationScale: appearance.presentationScale } : {})
239
- });
240
- return;
241
- }
242
- if (theme) {
243
- core.setTheme(theme);
244
- }
245
- if (typeof appearance.fontSize === 'number') {
246
- core.setFontSize(appearance.fontSize);
247
- }
248
- if (typeof appearance.fontFamily === 'string') {
249
- core.setFontFamily?.(appearance.fontFamily);
250
- }
251
- if (typeof appearance.presentationScale === 'number') {
252
- core.setPresentationScale(appearance.presentationScale);
253
- }
254
- }, []);
255
- const initializeTerminal = useCallback(async () => {
256
- if (!containerRef.current || isInitializingRef.current || terminalCoreRef.current) {
257
- return;
258
- }
259
- isInitializingRef.current = true;
260
- setLoadingState(LoadingState.INITIALIZING_TERMINAL);
261
- setLoadingMessage('Initializing terminal...');
262
- try {
263
- const configOverrides = {
264
- ...(customConfig ?? {}),
265
- ...(fontSize ? { fontSize } : {}),
266
- ...(presentationScale ? { presentationScale } : {}),
267
- };
268
- const config = getDefaultTerminalConfig(themeName, configOverrides);
269
- const CoreCtor = coreConstructor ?? TerminalCore;
270
- terminalCoreRef.current = new CoreCtor(containerRef.current, config, {
271
- onData: handleUserInput,
272
- onResize: handleResize,
273
- onStateChange: handleStateChange,
274
- onError: handleError
275
- }, logger ?? noopLogger);
276
- await terminalCoreRef.current.initialize();
277
- setTerminalReadyKey(prev => prev + 1);
278
- if (isReplayActiveRef.current) {
279
- terminalCoreRef.current.startHistoryReplay(30000);
280
- }
281
- if (sessionId) {
282
- const dimensions = terminalCoreRef.current.getDimensions();
283
- await transport.resize(sessionId, dimensions.cols, dimensions.rows);
284
- }
285
- processDataQueue();
286
- if (!isReplayActiveRef.current || replayCompleteReceivedRef.current) {
287
- setLoadingState(LoadingState.READY);
288
- setLoadingMessage('');
289
- }
290
- else {
291
- setLoadingState(LoadingState.PROCESSING_HISTORY);
292
- setLoadingMessage('Restoring terminal...');
293
- }
294
- }
295
- catch (error) {
296
- handleError(error instanceof Error ? error : new Error(String(error)));
297
- setLoadingState(LoadingState.READY);
298
- setLoadingMessage('');
299
- }
300
- finally {
301
- isInitializingRef.current = false;
302
- }
303
- }, [customConfig, fontSize, presentationScale, themeName, handleUserInput, handleResize, handleStateChange, handleError, transport, sessionId, logger, processDataQueue]);
304
- const connectToSession = useCallback(async () => {
305
- if (!sessionId) {
306
- return;
307
- }
308
- setConnectionState(ConnectionState.CONNECTING);
309
- setConnectionError(null);
310
- setLoadingState(LoadingState.ATTACHING);
311
- setLoadingMessage('Attaching to session...');
312
- try {
313
- const dims = terminalCoreRef.current?.getDimensions() ?? dimensionsRef.current;
314
- await transport.attach(sessionId, dims.cols, dims.rows);
315
- setConnectionState(ConnectionState.CONNECTED);
316
- setRetryCount(0);
317
- if (!isReplayActiveRef.current || replayCompleteReceivedRef.current) {
318
- setLoadingState(LoadingState.READY);
319
- setLoadingMessage('');
320
- }
321
- else {
322
- setLoadingState(LoadingState.PROCESSING_HISTORY);
323
- setLoadingMessage('Restoring terminal...');
324
- }
325
- }
326
- catch (error) {
327
- const terminalError = createTerminalError('transport', error);
328
- setConnectionState(ConnectionState.FAILED);
329
- setConnectionError(terminalError);
330
- setLoadingState(LoadingState.READY);
331
- setLoadingMessage('');
332
- }
333
- }, [sessionId, transport]);
334
- useEffect(() => {
335
- if (!isActive) {
336
- return;
337
- }
338
- if (!terminalCoreRef.current && !isInitializingRef.current) {
339
- const timeoutId = setTimeout(() => {
340
- initializeTerminal();
341
- }, 100);
342
- return () => clearTimeout(timeoutId);
343
- }
344
- }, [isActive, initializeTerminal]);
345
- useEffect(() => {
346
- if (!sessionId) {
347
- return;
348
- }
349
- isReplayActiveRef.current = true;
350
- replayCompleteReceivedRef.current = false;
351
- terminalCoreRef.current?.startHistoryReplay(30000);
352
- setLoadingState(LoadingState.PROCESSING_HISTORY);
353
- setLoadingMessage('Restoring terminal...');
354
- const lastSeq = terminalCoreRef.current ? lastAppliedSequenceRef.current : 0;
355
- const unsubscribe = eventSource.onTerminalData(sessionId, (payload) => {
356
- if (payload.type === 'replay-complete') {
357
- replayCompleteReceivedRef.current = true;
358
- const ready = sequenceBufferRef.current.flushPending();
359
- if (ready.length > 0) {
360
- dataQueueRef.current.push(...ready);
361
- scheduleDataQueueFlush();
362
- }
363
- else if (typeof payload.sequence === 'number' &&
364
- payload.sequence > lastAppliedSequenceRef.current &&
365
- dataQueueRef.current.length === 0 &&
366
- !isProcessingRef.current) {
367
- lastAppliedSequenceRef.current = payload.sequence;
368
- sequenceBufferRef.current.reset(payload.sequence + 1);
369
- }
370
- finishReplayIfIdle();
371
- return;
372
- }
373
- const chunk = {
374
- data: payload.data,
375
- sequence: payload.sequence ?? 0,
376
- timestampMs: payload.timestampMs ?? Date.now()
377
- };
378
- addChunkToQueue(chunk);
379
- }, { lastSeq });
380
- terminalDataUnsubscribeRef.current = unsubscribe;
381
- return () => {
382
- if (terminalDataUnsubscribeRef.current === unsubscribe) {
383
- terminalDataUnsubscribeRef.current = null;
384
- }
385
- unsubscribe();
386
- };
387
- }, [eventSource, sessionId, replaySubscriptionKey, addChunkToQueue, finishReplayIfIdle, scheduleDataQueueFlush]);
388
- useEffect(() => {
389
- if (!isActive || !terminalCoreRef.current || !sessionId) {
390
- return;
391
- }
392
- connectToSession();
393
- }, [isActive, sessionId, terminalReadyKey, connectToSession]);
394
- useEffect(() => {
395
- return () => {
396
- cleanupTerminal();
397
- if (retryTimeoutRef.current) {
398
- clearTimeout(retryTimeoutRef.current);
399
- }
400
- };
401
- }, [cleanupTerminal]);
402
- useEffect(() => {
403
- if (connectionState !== ConnectionState.FAILED) {
404
- return;
405
- }
406
- const delay = Math.min(5000, 1000 * Math.pow(2, retryCount));
407
- if (retryTimeoutRef.current) {
408
- clearTimeout(retryTimeoutRef.current);
409
- }
410
- retryTimeoutRef.current = setTimeout(() => {
411
- setRetryCount(prev => prev + 1);
412
- setConnectionState(ConnectionState.RETRYING);
413
- connectToSession();
414
- }, delay);
415
- }, [connectionState, retryCount, connectToSession]);
416
- useEffect(() => {
417
- if (terminalCoreRef.current) {
418
- terminalCoreRef.current.setConnected(connectionState === ConnectionState.CONNECTED);
419
- }
420
- }, [connectionState]);
421
- useEffect(() => {
422
- applyCoreAppearance({
423
- themeName,
424
- ...(typeof fontSize === 'number' ? { fontSize } : {}),
425
- presentationScale: presentationScale ?? 1
426
- });
427
- }, [applyCoreAppearance, fontSize, presentationScale, themeName]);
428
- const actions = {
429
- write: data => {
430
- const chunk = {
431
- data: new TextEncoder().encode(data),
432
- sequence: 0,
433
- timestampMs: Date.now()
434
- };
435
- addChunkToQueue(chunk);
436
- },
437
- clear: () => {
438
- terminalCoreRef.current?.clear();
439
- dataQueueRef.current = [];
440
- if (sessionId) {
441
- // Use a best-effort sequence:
442
- // 1) clear server-side history so future reconnects don't replay old output
443
- // 2) send an "empty Enter" to the PTY so the shell redraws the prompt immediately
444
- transport.clear(sessionId)
445
- .catch(error => logger.warn('[useTerminalInstance] Clear history failed', { error }))
446
- .finally(() => {
447
- transport.sendInput(sessionId, '\r').catch(error => logger.warn('[useTerminalInstance] Clear redraw failed', { error }));
448
- });
449
- }
450
- },
451
- findNext: (term, options) => terminalCoreRef.current?.findNext(term, options) ?? false,
452
- findPrevious: (term, options) => terminalCoreRef.current?.findPrevious(term, options) ?? false,
453
- clearSearch: () => terminalCoreRef.current?.clearSearch(),
454
- serialize: () => terminalCoreRef.current?.serialize() ?? '',
455
- getSelectionText: () => terminalCoreRef.current?.getSelectionText() ?? '',
456
- hasSelection: () => terminalCoreRef.current?.hasSelection() ?? false,
457
- copySelection: source => terminalCoreRef.current?.copySelection(source) ?? Promise.resolve({
458
- copied: false,
459
- reason: 'empty_selection',
460
- source: source ?? 'command'
461
- }),
462
- setConnected: connected => terminalCoreRef.current?.setConnected(connected),
463
- forceResize: () => terminalCoreRef.current?.forceResize(),
464
- setSearchResultsCallback: callback => terminalCoreRef.current?.setSearchResultsCallback(callback),
465
- focus: () => terminalCoreRef.current?.focus(),
466
- getTerminalInfo: () => terminalCoreRef.current?.getTerminalInfo() ?? null,
467
- sendInput: data => handleUserInput(data),
468
- setAppearance: appearance => applyCoreAppearance(appearance),
469
- setTheme: theme => applyCoreAppearance({ themeName: theme }),
470
- setFontSize: size => applyCoreAppearance({ fontSize: size }),
471
- setPresentationScale: scale => applyCoreAppearance({ presentationScale: scale }),
472
- reinitialize: async () => {
473
- terminalDataUnsubscribeRef.current?.();
474
- terminalDataUnsubscribeRef.current = null;
475
- queueGenerationRef.current += 1;
476
- sequenceBufferRef.current.reset(1);
477
- replayCompleteReceivedRef.current = false;
478
- isReplayActiveRef.current = true;
479
- lastAppliedSequenceRef.current = 0;
480
- dataQueueRef.current = [];
481
- isProcessingRef.current = false;
482
- if (flushRafRef.current !== null) {
483
- cancelAnimationFrame(flushRafRef.current);
484
- flushRafRef.current = null;
485
- }
486
- setLoadingState(LoadingState.PROCESSING_HISTORY);
487
- setLoadingMessage('Restoring terminal...');
488
- cleanupTerminal();
489
- setReplaySubscriptionKey(prev => prev + 1);
490
- await initializeTerminal();
491
- if (isActive && sessionId) {
492
- await connectToSession();
493
- }
494
- }
495
- };
496
- const connection = {
497
- state: connectionState,
498
- error: connectionError,
499
- retryCount,
500
- connect: connectToSession,
501
- disconnect: () => setConnectionState(ConnectionState.ABORTED),
502
- retry: () => {
503
- setRetryCount(0);
504
- setConnectionError(null);
505
- setConnectionState(ConnectionState.IDLE);
506
- connectToSession();
507
- },
508
- clearError: () => setConnectionError(null)
509
- };
510
- return {
511
- containerRef,
512
- state: {
513
- ...state,
514
- get isReady() {
515
- return state.state === TerminalState.READY || state.state === TerminalState.CONNECTED;
516
- },
517
- get isConnected() {
518
- return state.state === TerminalState.CONNECTED;
519
- },
520
- get hasError() {
521
- return state.state === TerminalState.ERROR;
522
- },
523
- get isInitializing() {
524
- return state.state === TerminalState.INITIALIZING;
525
- },
526
- get isIdle() {
527
- return state.state === TerminalState.IDLE;
528
- }
529
- },
530
- actions,
531
- connection: {
532
- ...connection,
533
- get isConnecting() {
534
- return connection.state === 'connecting';
535
- },
536
- get isConnected() {
537
- return connection.state === 'connected';
538
- }
539
- },
540
- loadingState,
541
- loadingMessage
542
- };
543
- };
544
- //# sourceMappingURL=useTerminalInstance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTerminalInstance.js","sourceRoot":"","sources":["../../src/hooks/useTerminalInstance.ts"],"names":[],"mappings":"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"}