@floegence/floeterm-terminal-web 0.1.1

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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/core/TerminalCore.d.ts +69 -0
  4. package/dist/core/TerminalCore.d.ts.map +1 -0
  5. package/dist/core/TerminalCore.js +412 -0
  6. package/dist/core/TerminalCore.js.map +1 -0
  7. package/dist/hooks/useTerminalInstance.d.ts +3 -0
  8. package/dist/hooks/useTerminalInstance.d.ts.map +1 -0
  9. package/dist/hooks/useTerminalInstance.js +455 -0
  10. package/dist/hooks/useTerminalInstance.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +5 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/internal/SequenceBuffer.d.ts +22 -0
  16. package/dist/internal/SequenceBuffer.d.ts.map +1 -0
  17. package/dist/internal/SequenceBuffer.js +116 -0
  18. package/dist/internal/SequenceBuffer.js.map +1 -0
  19. package/dist/types.d.ts +221 -0
  20. package/dist/types.d.ts.map +1 -0
  21. package/dist/types.js +38 -0
  22. package/dist/types.js.map +1 -0
  23. package/dist/utils/config.d.ts +4 -0
  24. package/dist/utils/config.d.ts.map +1 -0
  25. package/dist/utils/config.js +153 -0
  26. package/dist/utils/config.js.map +1 -0
  27. package/dist/utils/errors.d.ts +3 -0
  28. package/dist/utils/errors.d.ts.map +1 -0
  29. package/dist/utils/errors.js +11 -0
  30. package/dist/utils/errors.js.map +1 -0
  31. package/dist/utils/history.d.ts +2 -0
  32. package/dist/utils/history.d.ts.map +1 -0
  33. package/dist/utils/history.js +12 -0
  34. package/dist/utils/history.js.map +1 -0
  35. package/dist/utils/logger.d.ts +4 -0
  36. package/dist/utils/logger.d.ts.map +1 -0
  37. package/dist/utils/logger.js +13 -0
  38. package/dist/utils/logger.js.map +1 -0
  39. package/dist/utils/xtermAutoResponseFilter.d.ts +2 -0
  40. package/dist/utils/xtermAutoResponseFilter.d.ts.map +1 -0
  41. package/dist/utils/xtermAutoResponseFilter.js +109 -0
  42. package/dist/utils/xtermAutoResponseFilter.js.map +1 -0
  43. package/package.json +66 -0
@@ -0,0 +1,455 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { TerminalCore } from '../core/TerminalCore';
3
+ import { SequenceBuffer } from '../internal/SequenceBuffer';
4
+ import { concatChunks } from '../utils/history';
5
+ import { createTerminalError } from '../utils/errors';
6
+ import { getDefaultTerminalConfig, getThemeColors } from '../utils/config';
7
+ import { createConsoleLogger, noopLogger } from '../utils/logger';
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
+ var LoadingState;
20
+ (function (LoadingState) {
21
+ LoadingState["IDLE"] = "idle";
22
+ LoadingState["INITIALIZING_TERMINAL"] = "initializing_terminal";
23
+ LoadingState["ATTACHING"] = "attaching";
24
+ LoadingState["PROCESSING_HISTORY"] = "processing_history";
25
+ LoadingState["READY"] = "ready";
26
+ })(LoadingState || (LoadingState = {}));
27
+ // useTerminalInstance creates and manages a single terminal instance.
28
+ export const useTerminalInstance = (options) => {
29
+ const { sessionId, isActive, transport, eventSource, themeName = 'dark', fontSize, autoFocus = false, onResize, onError, config: customConfig, logger: injectedLogger, coreConstructor } = options;
30
+ const logger = injectedLogger ?? createConsoleLogger();
31
+ const containerRef = useRef(null);
32
+ const terminalCoreRef = useRef(null);
33
+ const isInitializingRef = useRef(false);
34
+ const historyLoadedRef = useRef(false);
35
+ const sequenceBufferRef = useRef(new SequenceBuffer());
36
+ const [loadingState, setLoadingState] = useState(LoadingState.IDLE);
37
+ const [loadingMessage, setLoadingMessage] = useState('');
38
+ const [connectionState, setConnectionState] = useState(ConnectionState.IDLE);
39
+ const [connectionError, setConnectionError] = useState(null);
40
+ const [retryCount, setRetryCount] = useState(0);
41
+ const retryTimeoutRef = useRef(null);
42
+ const [state, setState] = useState({
43
+ state: TerminalState.IDLE,
44
+ error: undefined,
45
+ dimensions: { cols: 80, rows: 24 }
46
+ });
47
+ const dataQueueRef = useRef([]);
48
+ const isProcessingRef = useRef(false);
49
+ const queueGenerationRef = useRef(0);
50
+ // Reset session-scoped state when switching sessions (important for ordering + history replay).
51
+ useEffect(() => {
52
+ queueGenerationRef.current += 1;
53
+ historyLoadedRef.current = false;
54
+ sequenceBufferRef.current.reset(1);
55
+ dataQueueRef.current = [];
56
+ isProcessingRef.current = false;
57
+ setConnectionState(ConnectionState.IDLE);
58
+ setConnectionError(null);
59
+ setRetryCount(0);
60
+ if (retryTimeoutRef.current) {
61
+ clearTimeout(retryTimeoutRef.current);
62
+ retryTimeoutRef.current = null;
63
+ }
64
+ }, [sessionId]);
65
+ const updateState = useCallback((updates) => {
66
+ setState(prev => ({ ...prev, ...updates }));
67
+ }, []);
68
+ const handleStateChange = useCallback((newState) => {
69
+ updateState({ state: newState });
70
+ }, [updateState]);
71
+ const handleResize = useCallback(async (size) => {
72
+ updateState({ dimensions: size });
73
+ onResize?.(size.cols, size.rows);
74
+ if (!sessionId) {
75
+ return;
76
+ }
77
+ try {
78
+ await transport.resize(sessionId, size.cols, size.rows);
79
+ }
80
+ catch (error) {
81
+ logger.warn('[useTerminalInstance] Resize request failed', { error });
82
+ }
83
+ }, [updateState, onResize, transport, sessionId, logger]);
84
+ const handleError = useCallback((error) => {
85
+ updateState({ error, state: TerminalState.ERROR });
86
+ onError?.(error);
87
+ }, [updateState, onError]);
88
+ const handleUserInput = useCallback((data) => {
89
+ if (!sessionId) {
90
+ return;
91
+ }
92
+ transport.sendInput(sessionId, data).catch(error => {
93
+ logger.warn('[useTerminalInstance] sendInput failed', { error });
94
+ });
95
+ }, [transport, sessionId, logger]);
96
+ const waitForTerminalReady = useCallback(async () => {
97
+ while (terminalCoreRef.current) {
98
+ const terminalState = terminalCoreRef.current.getState();
99
+ if (terminalState === TerminalState.READY || terminalState === TerminalState.CONNECTED) {
100
+ return;
101
+ }
102
+ await new Promise(resolve => setTimeout(resolve, 50));
103
+ }
104
+ }, []);
105
+ const scheduleFocus = useCallback(() => {
106
+ if (!autoFocus) {
107
+ return;
108
+ }
109
+ // Defer focus until after the terminal is visible/opened and React has flushed updates.
110
+ requestAnimationFrame(() => {
111
+ requestAnimationFrame(() => {
112
+ terminalCoreRef.current?.focus();
113
+ });
114
+ });
115
+ }, [autoFocus]);
116
+ const loadHistoryAfterReady = useCallback(async (currentSessionId, retry = 0) => {
117
+ const maxRetries = 2;
118
+ const retryDelay = 1000;
119
+ try {
120
+ setLoadingState(LoadingState.PROCESSING_HISTORY);
121
+ setLoadingMessage('Loading terminal history...');
122
+ await waitForTerminalReady();
123
+ const history = await transport.history(currentSessionId, 0, -1);
124
+ if (history.length === 0) {
125
+ setLoadingState(LoadingState.READY);
126
+ setLoadingMessage('');
127
+ scheduleFocus();
128
+ return;
129
+ }
130
+ const sorted = [...history].sort((a, b) => a.sequence - b.sequence);
131
+ const decodedChunks = sorted.map(chunk => chunk.data);
132
+ const merged = concatChunks(decodedChunks);
133
+ const container = containerRef.current;
134
+ if (container) {
135
+ container.style.visibility = 'hidden';
136
+ }
137
+ terminalCoreRef.current?.startHistoryReplay(5000);
138
+ terminalCoreRef.current?.write(merged, () => {
139
+ requestAnimationFrame(() => {
140
+ requestAnimationFrame(() => {
141
+ if (container) {
142
+ container.style.visibility = 'visible';
143
+ }
144
+ scheduleFocus();
145
+ });
146
+ });
147
+ });
148
+ setLoadingState(LoadingState.READY);
149
+ setLoadingMessage('');
150
+ }
151
+ catch (error) {
152
+ logger.warn('[useTerminalInstance] History load failed', { error, retry });
153
+ if (retry < maxRetries) {
154
+ setTimeout(() => {
155
+ loadHistoryAfterReady(currentSessionId, retry + 1);
156
+ }, retryDelay * Math.pow(2, retry));
157
+ }
158
+ else {
159
+ setLoadingState(LoadingState.READY);
160
+ setLoadingMessage('');
161
+ scheduleFocus();
162
+ }
163
+ }
164
+ }, [transport, waitForTerminalReady, logger, scheduleFocus]);
165
+ const cleanupTerminal = useCallback(() => {
166
+ if (terminalCoreRef.current) {
167
+ terminalCoreRef.current.dispose();
168
+ terminalCoreRef.current = null;
169
+ }
170
+ dataQueueRef.current = [];
171
+ isProcessingRef.current = false;
172
+ }, []);
173
+ const processDataQueue = useCallback(async () => {
174
+ const generation = queueGenerationRef.current;
175
+ if (isProcessingRef.current || !terminalCoreRef.current || dataQueueRef.current.length === 0) {
176
+ return;
177
+ }
178
+ const terminalState = terminalCoreRef.current.getState();
179
+ if (terminalState !== TerminalState.READY && terminalState !== TerminalState.CONNECTED) {
180
+ setTimeout(() => {
181
+ if (queueGenerationRef.current !== generation) {
182
+ return;
183
+ }
184
+ processDataQueue();
185
+ }, 100);
186
+ return;
187
+ }
188
+ isProcessingRef.current = true;
189
+ try {
190
+ const batch = dataQueueRef.current.splice(0, 10);
191
+ for (const chunk of batch) {
192
+ if (queueGenerationRef.current !== generation) {
193
+ return;
194
+ }
195
+ terminalCoreRef.current.write(chunk.data);
196
+ }
197
+ if (dataQueueRef.current.length > 0) {
198
+ requestAnimationFrame(() => {
199
+ if (queueGenerationRef.current !== generation) {
200
+ return;
201
+ }
202
+ processDataQueue();
203
+ });
204
+ }
205
+ }
206
+ finally {
207
+ isProcessingRef.current = false;
208
+ if (dataQueueRef.current.length > 0) {
209
+ requestAnimationFrame(() => {
210
+ if (queueGenerationRef.current !== generation) {
211
+ return;
212
+ }
213
+ processDataQueue();
214
+ });
215
+ }
216
+ }
217
+ }, []);
218
+ const addChunkToQueue = useCallback((chunk) => {
219
+ const ready = sequenceBufferRef.current.push(chunk);
220
+ if (ready.length === 0) {
221
+ return;
222
+ }
223
+ dataQueueRef.current.push(...ready);
224
+ if (!isProcessingRef.current) {
225
+ const generation = queueGenerationRef.current;
226
+ requestAnimationFrame(() => {
227
+ if (queueGenerationRef.current !== generation) {
228
+ return;
229
+ }
230
+ processDataQueue();
231
+ });
232
+ }
233
+ }, [processDataQueue]);
234
+ const initializeTerminal = useCallback(async () => {
235
+ if (!containerRef.current || isInitializingRef.current || terminalCoreRef.current) {
236
+ return;
237
+ }
238
+ isInitializingRef.current = true;
239
+ setLoadingState(LoadingState.INITIALIZING_TERMINAL);
240
+ setLoadingMessage('Initializing terminal...');
241
+ try {
242
+ const configOverrides = { ...(customConfig ?? {}), ...(fontSize ? { fontSize } : {}) };
243
+ const config = getDefaultTerminalConfig(themeName, configOverrides);
244
+ const CoreCtor = coreConstructor ?? TerminalCore;
245
+ terminalCoreRef.current = new CoreCtor(containerRef.current, config, {
246
+ onData: handleUserInput,
247
+ onResize: handleResize,
248
+ onStateChange: handleStateChange,
249
+ onError: handleError
250
+ }, logger ?? noopLogger);
251
+ await terminalCoreRef.current.initialize();
252
+ if (sessionId) {
253
+ const dimensions = terminalCoreRef.current.getDimensions();
254
+ await transport.resize(sessionId, dimensions.cols, dimensions.rows);
255
+ }
256
+ processDataQueue();
257
+ setLoadingState(LoadingState.READY);
258
+ setLoadingMessage('');
259
+ }
260
+ catch (error) {
261
+ handleError(error instanceof Error ? error : new Error(String(error)));
262
+ setLoadingState(LoadingState.READY);
263
+ setLoadingMessage('');
264
+ }
265
+ finally {
266
+ isInitializingRef.current = false;
267
+ }
268
+ }, [customConfig, fontSize, themeName, handleUserInput, handleResize, handleStateChange, handleError, transport, sessionId, logger, processDataQueue]);
269
+ const connectToSession = useCallback(async () => {
270
+ if (!sessionId) {
271
+ return;
272
+ }
273
+ setConnectionState(ConnectionState.CONNECTING);
274
+ setConnectionError(null);
275
+ setLoadingState(LoadingState.ATTACHING);
276
+ setLoadingMessage('Attaching to session...');
277
+ try {
278
+ const dims = state.dimensions || { cols: 80, rows: 24 };
279
+ await transport.attach(sessionId, dims.cols, dims.rows);
280
+ setConnectionState(ConnectionState.CONNECTED);
281
+ setRetryCount(0);
282
+ setLoadingState(LoadingState.READY);
283
+ setLoadingMessage('');
284
+ }
285
+ catch (error) {
286
+ const terminalError = createTerminalError('transport', error);
287
+ setConnectionState(ConnectionState.FAILED);
288
+ setConnectionError(terminalError);
289
+ setLoadingState(LoadingState.READY);
290
+ setLoadingMessage('');
291
+ }
292
+ }, [sessionId, transport, state.dimensions]);
293
+ useEffect(() => {
294
+ if (!isActive) {
295
+ return;
296
+ }
297
+ if (!terminalCoreRef.current && !isInitializingRef.current) {
298
+ const timeoutId = setTimeout(() => {
299
+ initializeTerminal();
300
+ }, 100);
301
+ return () => clearTimeout(timeoutId);
302
+ }
303
+ }, [isActive, initializeTerminal]);
304
+ useEffect(() => {
305
+ if (!sessionId) {
306
+ return;
307
+ }
308
+ const unsubscribe = eventSource.onTerminalData(sessionId, (payload) => {
309
+ const chunk = {
310
+ data: payload.data,
311
+ sequence: payload.sequence ?? 0,
312
+ timestampMs: payload.timestampMs ?? Date.now()
313
+ };
314
+ addChunkToQueue(chunk);
315
+ });
316
+ return () => {
317
+ unsubscribe();
318
+ };
319
+ }, [eventSource, sessionId, addChunkToQueue]);
320
+ useEffect(() => {
321
+ if (!isActive || !terminalCoreRef.current || !sessionId) {
322
+ return;
323
+ }
324
+ connectToSession();
325
+ }, [isActive, sessionId, connectToSession]);
326
+ useEffect(() => {
327
+ if (!terminalCoreRef.current || !sessionId || historyLoadedRef.current) {
328
+ return;
329
+ }
330
+ if (state.state === TerminalState.READY) {
331
+ historyLoadedRef.current = true;
332
+ loadHistoryAfterReady(sessionId);
333
+ }
334
+ }, [state.state, sessionId, loadHistoryAfterReady]);
335
+ useEffect(() => {
336
+ return () => {
337
+ cleanupTerminal();
338
+ if (retryTimeoutRef.current) {
339
+ clearTimeout(retryTimeoutRef.current);
340
+ }
341
+ };
342
+ }, [cleanupTerminal]);
343
+ useEffect(() => {
344
+ if (connectionState !== ConnectionState.FAILED) {
345
+ return;
346
+ }
347
+ const delay = Math.min(5000, 1000 * Math.pow(2, retryCount));
348
+ if (retryTimeoutRef.current) {
349
+ clearTimeout(retryTimeoutRef.current);
350
+ }
351
+ retryTimeoutRef.current = setTimeout(() => {
352
+ setRetryCount(prev => prev + 1);
353
+ setConnectionState(ConnectionState.RETRYING);
354
+ connectToSession();
355
+ }, delay);
356
+ }, [connectionState, retryCount, connectToSession]);
357
+ useEffect(() => {
358
+ if (terminalCoreRef.current) {
359
+ terminalCoreRef.current.setConnected(connectionState === ConnectionState.CONNECTED);
360
+ }
361
+ }, [connectionState]);
362
+ const actions = {
363
+ write: data => {
364
+ const chunk = {
365
+ data: new TextEncoder().encode(data),
366
+ sequence: 0,
367
+ timestampMs: Date.now()
368
+ };
369
+ addChunkToQueue(chunk);
370
+ },
371
+ clear: () => {
372
+ terminalCoreRef.current?.clear();
373
+ dataQueueRef.current = [];
374
+ if (sessionId) {
375
+ // Use a best-effort sequence:
376
+ // 1) clear server-side history so future reconnects don't replay old output
377
+ // 2) send an "empty Enter" to the PTY so the shell redraws the prompt immediately
378
+ transport.clear(sessionId)
379
+ .catch(error => logger.warn('[useTerminalInstance] Clear history failed', { error }))
380
+ .finally(() => {
381
+ transport.sendInput(sessionId, '\r').catch(error => logger.warn('[useTerminalInstance] Clear redraw failed', { error }));
382
+ });
383
+ }
384
+ },
385
+ findNext: (term, options) => terminalCoreRef.current?.findNext(term, options) ?? false,
386
+ findPrevious: (term, options) => terminalCoreRef.current?.findPrevious(term, options) ?? false,
387
+ clearSearch: () => terminalCoreRef.current?.clearSearch(),
388
+ serialize: () => terminalCoreRef.current?.serialize() ?? '',
389
+ getSelectionText: () => terminalCoreRef.current?.getSelectionText() ?? '',
390
+ setConnected: connected => terminalCoreRef.current?.setConnected(connected),
391
+ forceResize: () => terminalCoreRef.current?.forceResize(),
392
+ setSearchResultsCallback: callback => terminalCoreRef.current?.setSearchResultsCallback(callback),
393
+ focus: () => terminalCoreRef.current?.focus(),
394
+ getTerminalInfo: () => terminalCoreRef.current?.getTerminalInfo() ?? null,
395
+ sendInput: data => handleUserInput(data),
396
+ setTheme: theme => {
397
+ const colors = getThemeColors(theme);
398
+ terminalCoreRef.current?.setTheme(colors);
399
+ },
400
+ setFontSize: size => terminalCoreRef.current?.setFontSize(size),
401
+ reinitialize: async () => {
402
+ cleanupTerminal();
403
+ historyLoadedRef.current = false;
404
+ await initializeTerminal();
405
+ }
406
+ };
407
+ const connection = {
408
+ state: connectionState,
409
+ error: connectionError,
410
+ retryCount,
411
+ connect: connectToSession,
412
+ disconnect: () => setConnectionState(ConnectionState.ABORTED),
413
+ retry: () => {
414
+ setRetryCount(0);
415
+ setConnectionError(null);
416
+ setConnectionState(ConnectionState.IDLE);
417
+ connectToSession();
418
+ },
419
+ clearError: () => setConnectionError(null)
420
+ };
421
+ return {
422
+ containerRef,
423
+ state: {
424
+ ...state,
425
+ get isReady() {
426
+ return state.state === TerminalState.READY || state.state === TerminalState.CONNECTED;
427
+ },
428
+ get isConnected() {
429
+ return state.state === TerminalState.CONNECTED;
430
+ },
431
+ get hasError() {
432
+ return state.state === TerminalState.ERROR;
433
+ },
434
+ get isInitializing() {
435
+ return state.state === TerminalState.INITIALIZING;
436
+ },
437
+ get isIdle() {
438
+ return state.state === TerminalState.IDLE;
439
+ }
440
+ },
441
+ actions,
442
+ connection: {
443
+ ...connection,
444
+ get isConnecting() {
445
+ return connection.state === 'connecting';
446
+ },
447
+ get isConnected() {
448
+ return connection.state === 'connected';
449
+ }
450
+ },
451
+ loadingState,
452
+ loadingMessage
453
+ };
454
+ };
455
+ //# sourceMappingURL=useTerminalInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalInstance.js","sourceRoot":"","sources":["../../src/hooks/useTerminalInstance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { TerminalCore } from './core/TerminalCore';
2
+ export { useTerminalInstance } from './hooks/useTerminalInstance';
3
+ export type { Logger, TerminalConfig, TerminalEventHandlers, TerminalState, TerminalID, TerminalSessionInfo, TerminalDataChunk, TerminalDataEvent, TerminalNameUpdateEvent, TerminalTransport, TerminalEventSource, TerminalManagerOptions, TerminalManagerReturn, TerminalManagerActions, TerminalManagerState, TerminalError, TerminalThemeName } from './types';
4
+ export { getThemeColors, getDefaultTerminalConfig } from './utils/config';
5
+ export { filterXtermAutoResponses } from './utils/xtermAutoResponseFilter';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,YAAY,EACV,MAAM,EACN,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { TerminalCore } from './core/TerminalCore';
2
+ export { useTerminalInstance } from './hooks/useTerminalInstance';
3
+ export { getThemeColors, getDefaultTerminalConfig } from './utils/config';
4
+ export { filterXtermAutoResponses } from './utils/xtermAutoResponseFilter';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAsBlE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { TerminalDataChunk } from '../types';
2
+ interface SequenceBufferConfig {
3
+ maxPendingChunks: number;
4
+ maxSequenceGap: number;
5
+ cleanupIntervalMs: number;
6
+ forceCleanupThreshold: number;
7
+ maxStallMs: number;
8
+ }
9
+ export declare class SequenceBuffer {
10
+ private expectedSequence;
11
+ private pending;
12
+ private pendingInsertedAt;
13
+ private lastCleanupMs;
14
+ private config;
15
+ constructor(config?: Partial<SequenceBufferConfig>);
16
+ reset(startSequence: number): void;
17
+ push(chunk: TerminalDataChunk, now?: number): TerminalDataChunk[];
18
+ private flushIfStalled;
19
+ private cleanupIfNeeded;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=SequenceBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceBuffer.d.ts","sourceRoot":"","sources":["../../src/internal/SequenceBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,UAAU,oBAAoB;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAaD,qBAAa,cAAc;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAOlC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,SAAa,GAAG,iBAAiB,EAAE;IAgDrE,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,eAAe;CAsBxB"}
@@ -0,0 +1,116 @@
1
+ const defaultConfig = {
2
+ maxPendingChunks: 40,
3
+ maxSequenceGap: 32,
4
+ cleanupIntervalMs: 5000,
5
+ forceCleanupThreshold: 60,
6
+ // If we keep seeing chunks ahead of the expected sequence for too long, assume a missing
7
+ // chunk was dropped (e.g. transient websocket loss) and advance to keep the UI responsive.
8
+ maxStallMs: 500
9
+ };
10
+ // SequenceBuffer reorders chunks based on sequence numbers while limiting memory growth.
11
+ export class SequenceBuffer {
12
+ constructor(config = {}) {
13
+ this.expectedSequence = 1;
14
+ this.pending = new Map();
15
+ this.pendingInsertedAt = new Map();
16
+ this.lastCleanupMs = Date.now();
17
+ this.config = { ...defaultConfig, ...config };
18
+ }
19
+ reset(startSequence) {
20
+ this.expectedSequence = Math.max(1, startSequence);
21
+ this.pending.clear();
22
+ this.pendingInsertedAt.clear();
23
+ this.lastCleanupMs = Date.now();
24
+ }
25
+ push(chunk, now = Date.now()) {
26
+ const sequence = chunk.sequence;
27
+ const ready = [];
28
+ if (!Number.isInteger(sequence) || sequence < 1) {
29
+ ready.push(chunk);
30
+ return ready;
31
+ }
32
+ this.cleanupIfNeeded(now);
33
+ ready.push(...this.flushIfStalled(now));
34
+ if (sequence === this.expectedSequence) {
35
+ ready.push(chunk);
36
+ this.expectedSequence += 1;
37
+ while (this.pending.has(this.expectedSequence)) {
38
+ const next = this.pending.get(this.expectedSequence);
39
+ if (next) {
40
+ ready.push(next);
41
+ }
42
+ this.pending.delete(this.expectedSequence);
43
+ this.pendingInsertedAt.delete(this.expectedSequence);
44
+ this.expectedSequence += 1;
45
+ }
46
+ return ready;
47
+ }
48
+ const withinGap = sequence > this.expectedSequence && sequence <= this.expectedSequence + this.config.maxSequenceGap;
49
+ if (withinGap && this.pending.size < this.config.maxPendingChunks) {
50
+ this.pending.set(sequence, chunk);
51
+ if (!this.pendingInsertedAt.has(sequence)) {
52
+ this.pendingInsertedAt.set(sequence, now);
53
+ }
54
+ return ready;
55
+ }
56
+ if (sequence > this.expectedSequence) {
57
+ this.expectedSequence = sequence + 1;
58
+ this.pending.clear();
59
+ this.pendingInsertedAt.clear();
60
+ }
61
+ ready.push(chunk);
62
+ return ready;
63
+ }
64
+ flushIfStalled(now) {
65
+ if (this.pending.size === 0) {
66
+ return [];
67
+ }
68
+ let minPendingSeq = Number.POSITIVE_INFINITY;
69
+ let minPendingInsertedAt = Number.POSITIVE_INFINITY;
70
+ for (const seq of this.pending.keys()) {
71
+ if (seq < minPendingSeq) {
72
+ minPendingSeq = seq;
73
+ minPendingInsertedAt = this.pendingInsertedAt.get(seq) ?? now;
74
+ }
75
+ }
76
+ if (!Number.isFinite(minPendingSeq) || minPendingSeq <= this.expectedSequence) {
77
+ return [];
78
+ }
79
+ const ageMs = now - minPendingInsertedAt;
80
+ if (ageMs < this.config.maxStallMs) {
81
+ return [];
82
+ }
83
+ this.expectedSequence = minPendingSeq;
84
+ const ready = [];
85
+ while (this.pending.has(this.expectedSequence)) {
86
+ const next = this.pending.get(this.expectedSequence);
87
+ if (next) {
88
+ ready.push(next);
89
+ }
90
+ this.pending.delete(this.expectedSequence);
91
+ this.pendingInsertedAt.delete(this.expectedSequence);
92
+ this.expectedSequence += 1;
93
+ }
94
+ return ready;
95
+ }
96
+ cleanupIfNeeded(now) {
97
+ if (this.pending.size >= this.config.forceCleanupThreshold) {
98
+ this.pending.clear();
99
+ this.pendingInsertedAt.clear();
100
+ this.lastCleanupMs = now;
101
+ return;
102
+ }
103
+ if (now - this.lastCleanupMs < this.config.cleanupIntervalMs) {
104
+ return;
105
+ }
106
+ const cutoff = this.expectedSequence + this.config.maxSequenceGap;
107
+ for (const seq of this.pending.keys()) {
108
+ if (seq < this.expectedSequence || seq > cutoff) {
109
+ this.pending.delete(seq);
110
+ this.pendingInsertedAt.delete(seq);
111
+ }
112
+ }
113
+ this.lastCleanupMs = now;
114
+ }
115
+ }
116
+ //# sourceMappingURL=SequenceBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SequenceBuffer.js","sourceRoot":"","sources":["../../src/internal/SequenceBuffer.ts"],"names":[],"mappings":"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"}