@floegence/floeterm-terminal-web 0.5.10 → 0.5.12
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 +35 -0
- package/dist/core/PagedTerminalOutputCoordinator.d.ts +59 -0
- package/dist/core/PagedTerminalOutputCoordinator.d.ts.map +1 -0
- package/dist/core/PagedTerminalOutputCoordinator.js +282 -0
- package/dist/core/PagedTerminalOutputCoordinator.js.map +1 -0
- package/dist/core/TerminalCore.d.ts +4 -1
- package/dist/core/TerminalCore.d.ts.map +1 -1
- package/dist/core/TerminalCore.js +80 -1
- package/dist/core/TerminalCore.js.map +1 -1
- package/dist/core/TerminalOutputPipeline.d.ts +6 -0
- package/dist/core/TerminalOutputPipeline.d.ts.map +1 -1
- package/dist/core/TerminalOutputPipeline.js +110 -25
- package/dist/core/TerminalOutputPipeline.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,41 @@ await core.initialize();
|
|
|
61
61
|
- `TerminalCore` exposes runtime appearance updates, shell bell/title events, custom terminal link providers, buffer line reads, and touch-scroll helpers without requiring consumers to reach into private runtime objects.
|
|
62
62
|
- Multiple live `TerminalCore` instances share one render scheduler, so large terminal grids coalesce demand-driven canvas work into browser frames.
|
|
63
63
|
|
|
64
|
+
## Paged History And Live Recovery
|
|
65
|
+
|
|
66
|
+
Hosts with cursor-paged history APIs can use the framework-neutral coordinator instead of maintaining a second live-output queue:
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const output = createPagedTerminalOutputCoordinator({
|
|
70
|
+
fetchPage: ({ startSequence, cursor, signal }) =>
|
|
71
|
+
transport.historyPage(sessionId, startSequence, cursor, signal),
|
|
72
|
+
write: data => core.write(data),
|
|
73
|
+
clear: () => core.clear(),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
await output.attach(1);
|
|
77
|
+
events.onData(sessionId, chunk => output.pushLive(chunk));
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The coordinator understands sparse sequence coverage, retains live output while history is loading, catches up gaps, retries transient failures, and reports history truncation before rebasing. Background catch-up does not block terminal input.
|
|
81
|
+
|
|
82
|
+
## Restorable In-Memory Snapshots
|
|
83
|
+
|
|
84
|
+
Adaptive host worksets can release inactive renderers without closing their PTY sessions:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const snapshot = core.captureRestorableSnapshot({
|
|
88
|
+
coveredThroughSequence: output.getSnapshot().coveredThroughSequence,
|
|
89
|
+
});
|
|
90
|
+
const estimate = core.getResourceEstimate();
|
|
91
|
+
|
|
92
|
+
core.dispose(); // The host-owned PTY and output coordinator remain alive.
|
|
93
|
+
|
|
94
|
+
const restored = await nextCore.restoreSnapshot(snapshot);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Snapshots are versioned opaque values intended for memory-only storage. They are bounded to 2 MiB by default and include sequence coverage so the host can fetch only newer output. Floeterm does not write snapshots to persistent browser storage.
|
|
98
|
+
|
|
64
99
|
## Responsive Resize
|
|
65
100
|
|
|
66
101
|
When the same remote terminal session can be displayed in multiple views, enable responsive options so the focused terminal re-syncs cols/rows to the remote PTY:
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type TerminalOutputPipelineChunk, type TerminalOutputPipelineScheduler } from './TerminalOutputPipeline';
|
|
2
|
+
export type PagedTerminalOutputState = 'idle' | 'initial-replay' | 'live' | 'catching-up' | 'retry-wait' | 'failed' | 'disposed';
|
|
3
|
+
export interface PagedTerminalHistoryRequest {
|
|
4
|
+
startSequence: number;
|
|
5
|
+
cursor?: string | number;
|
|
6
|
+
signal: AbortSignal;
|
|
7
|
+
}
|
|
8
|
+
export interface PagedTerminalHistoryPage {
|
|
9
|
+
chunks: readonly TerminalOutputPipelineChunk[];
|
|
10
|
+
hasMore: boolean;
|
|
11
|
+
nextCursor?: string | number;
|
|
12
|
+
firstAvailableSequence?: number;
|
|
13
|
+
coveredThroughSequence: number;
|
|
14
|
+
coveredBytes?: number;
|
|
15
|
+
totalBytes?: number;
|
|
16
|
+
}
|
|
17
|
+
export type PagedTerminalHistoryTruncationReason = 'history-evicted' | 'retained-live-overflow';
|
|
18
|
+
export interface PagedTerminalOutputPolicy {
|
|
19
|
+
maxRetainedLiveChunks: number;
|
|
20
|
+
maxRetainedLiveBytes: number;
|
|
21
|
+
retryDelaysMs: readonly number[];
|
|
22
|
+
}
|
|
23
|
+
export interface PagedTerminalOutputScheduler extends TerminalOutputPipelineScheduler {
|
|
24
|
+
setTimer(callback: () => void, delayMs: number): ReturnType<typeof setTimeout>;
|
|
25
|
+
clearTimer(handle: ReturnType<typeof setTimeout>): void;
|
|
26
|
+
}
|
|
27
|
+
export interface PagedTerminalOutputSnapshot {
|
|
28
|
+
state: PagedTerminalOutputState;
|
|
29
|
+
active: boolean;
|
|
30
|
+
coveredThroughSequence: number;
|
|
31
|
+
retainedLiveChunks: number;
|
|
32
|
+
retainedLiveBytes: number;
|
|
33
|
+
retryAttempt: number;
|
|
34
|
+
retryScheduled: boolean;
|
|
35
|
+
lastError: unknown;
|
|
36
|
+
disposed: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface PagedTerminalOutputCoordinatorOptions {
|
|
39
|
+
fetchPage(request: PagedTerminalHistoryRequest): Promise<PagedTerminalHistoryPage>;
|
|
40
|
+
write(data: Uint8Array, chunks: readonly TerminalOutputPipelineChunk[]): void;
|
|
41
|
+
clear?: () => void;
|
|
42
|
+
transformChunk?: (chunk: TerminalOutputPipelineChunk) => Uint8Array | null;
|
|
43
|
+
isInteractive?: () => boolean;
|
|
44
|
+
onStateChange?: (snapshot: PagedTerminalOutputSnapshot) => void;
|
|
45
|
+
onHistoryTruncated?: (reason: PagedTerminalHistoryTruncationReason) => void;
|
|
46
|
+
policy?: Partial<PagedTerminalOutputPolicy>;
|
|
47
|
+
scheduler?: Partial<PagedTerminalOutputScheduler>;
|
|
48
|
+
}
|
|
49
|
+
export interface PagedTerminalOutputCoordinatorHandle {
|
|
50
|
+
attach(startSequence?: number): Promise<void>;
|
|
51
|
+
pushLive(chunk: TerminalOutputPipelineChunk): void;
|
|
52
|
+
setActive(active: boolean): void;
|
|
53
|
+
clear(startSequence?: number): void;
|
|
54
|
+
retry(): void;
|
|
55
|
+
getSnapshot(): PagedTerminalOutputSnapshot;
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
export declare const createPagedTerminalOutputCoordinator: (options: PagedTerminalOutputCoordinatorOptions) => PagedTerminalOutputCoordinatorHandle;
|
|
59
|
+
//# sourceMappingURL=PagedTerminalOutputCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagedTerminalOutputCoordinator.d.ts","sourceRoot":"","sources":["../../src/core/PagedTerminalOutputCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { createTerminalOutputPipeline, } from './TerminalOutputPipeline';
|
|
2
|
+
const DEFAULT_POLICY = {
|
|
3
|
+
maxRetainedLiveChunks: 2048,
|
|
4
|
+
maxRetainedLiveBytes: 8 * 1024 * 1024,
|
|
5
|
+
retryDelaysMs: [250, 1000, 4000],
|
|
6
|
+
};
|
|
7
|
+
const normalizePositiveInteger = (value, fallback) => (typeof value === 'number' && Number.isFinite(value) && value > 0
|
|
8
|
+
? Math.floor(value)
|
|
9
|
+
: fallback);
|
|
10
|
+
const concatData = (chunks) => {
|
|
11
|
+
const total = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
|
|
12
|
+
const result = new Uint8Array(total);
|
|
13
|
+
let offset = 0;
|
|
14
|
+
for (const chunk of chunks) {
|
|
15
|
+
result.set(chunk, offset);
|
|
16
|
+
offset += chunk.byteLength;
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
class PagedTerminalOutputCoordinator {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.active = true;
|
|
23
|
+
this.state = 'idle';
|
|
24
|
+
this.coveredThroughSequence = 0;
|
|
25
|
+
this.retainedLive = [];
|
|
26
|
+
this.retainedLiveBytes = 0;
|
|
27
|
+
this.retryAttempt = 0;
|
|
28
|
+
this.retryTimer = null;
|
|
29
|
+
this.abortController = null;
|
|
30
|
+
this.generation = 0;
|
|
31
|
+
this.disposed = false;
|
|
32
|
+
this.lastError = null;
|
|
33
|
+
this.recoveryStartSequence = 1;
|
|
34
|
+
this.recoveryKind = 'initial';
|
|
35
|
+
this.needsRebase = false;
|
|
36
|
+
this.options = options;
|
|
37
|
+
this.policy = {
|
|
38
|
+
maxRetainedLiveChunks: normalizePositiveInteger(options.policy?.maxRetainedLiveChunks, DEFAULT_POLICY.maxRetainedLiveChunks),
|
|
39
|
+
maxRetainedLiveBytes: normalizePositiveInteger(options.policy?.maxRetainedLiveBytes, DEFAULT_POLICY.maxRetainedLiveBytes),
|
|
40
|
+
retryDelaysMs: options.policy?.retryDelaysMs !== undefined
|
|
41
|
+
? options.policy.retryDelaysMs.map(delay => Math.max(0, Math.floor(delay)))
|
|
42
|
+
: DEFAULT_POLICY.retryDelaysMs,
|
|
43
|
+
};
|
|
44
|
+
const pipelinePolicy = {
|
|
45
|
+
maxInactiveChunks: this.policy.maxRetainedLiveChunks,
|
|
46
|
+
maxInactiveBytes: this.policy.maxRetainedLiveBytes,
|
|
47
|
+
};
|
|
48
|
+
this.pipeline = createTerminalOutputPipeline({
|
|
49
|
+
write: (_data, chunks) => this.writeAcceptedChunks(chunks),
|
|
50
|
+
isInteractive: () => this.active && (this.options.isInteractive?.() ?? true),
|
|
51
|
+
requestCatchUp: request => this.beginCatchUp(request.startSequence),
|
|
52
|
+
policy: pipelinePolicy,
|
|
53
|
+
scheduler: options.scheduler,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async attach(startSequence = 1) {
|
|
57
|
+
if (this.disposed)
|
|
58
|
+
return;
|
|
59
|
+
this.cancelRecovery();
|
|
60
|
+
this.retainedLive = [];
|
|
61
|
+
this.retainedLiveBytes = 0;
|
|
62
|
+
this.coveredThroughSequence = Math.max(0, Math.floor(startSequence) - 1);
|
|
63
|
+
this.pipeline.reset({ startSequence: this.coveredThroughSequence + 1 });
|
|
64
|
+
this.recoveryKind = 'initial';
|
|
65
|
+
this.recoveryStartSequence = Math.max(0, Math.floor(startSequence));
|
|
66
|
+
this.retryAttempt = 0;
|
|
67
|
+
await this.runRecovery();
|
|
68
|
+
}
|
|
69
|
+
pushLive(chunk) {
|
|
70
|
+
if (this.disposed)
|
|
71
|
+
return;
|
|
72
|
+
if (this.recoveryKind === 'initial' && this.state !== 'live' && this.state !== 'idle') {
|
|
73
|
+
this.retainLive(chunk);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.pipeline.enqueue(chunk);
|
|
77
|
+
}
|
|
78
|
+
setActive(active) {
|
|
79
|
+
if (this.disposed)
|
|
80
|
+
return;
|
|
81
|
+
this.active = active;
|
|
82
|
+
if (active)
|
|
83
|
+
this.pipeline.flush();
|
|
84
|
+
this.emitState();
|
|
85
|
+
}
|
|
86
|
+
clear(startSequence = 1) {
|
|
87
|
+
if (this.disposed)
|
|
88
|
+
return;
|
|
89
|
+
this.cancelRecovery();
|
|
90
|
+
this.options.clear?.();
|
|
91
|
+
this.retainedLive = [];
|
|
92
|
+
this.retainedLiveBytes = 0;
|
|
93
|
+
this.coveredThroughSequence = Math.max(0, Math.floor(startSequence) - 1);
|
|
94
|
+
this.pipeline.reset({ startSequence: this.coveredThroughSequence + 1 });
|
|
95
|
+
this.retryAttempt = 0;
|
|
96
|
+
this.lastError = null;
|
|
97
|
+
this.setState('idle');
|
|
98
|
+
}
|
|
99
|
+
retry() {
|
|
100
|
+
if (this.disposed || this.state !== 'failed')
|
|
101
|
+
return;
|
|
102
|
+
this.retryAttempt = 0;
|
|
103
|
+
void this.runRecovery();
|
|
104
|
+
}
|
|
105
|
+
getSnapshot() {
|
|
106
|
+
return {
|
|
107
|
+
state: this.state,
|
|
108
|
+
active: this.active,
|
|
109
|
+
coveredThroughSequence: this.coveredThroughSequence,
|
|
110
|
+
retainedLiveChunks: this.retainedLive.length + this.pipeline.getStats().catchUpChunks,
|
|
111
|
+
retainedLiveBytes: this.retainedLiveBytes + this.pipeline.getStats().catchUpBytes,
|
|
112
|
+
retryAttempt: this.retryAttempt,
|
|
113
|
+
retryScheduled: this.retryTimer !== null,
|
|
114
|
+
lastError: this.lastError,
|
|
115
|
+
disposed: this.disposed,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
dispose() {
|
|
119
|
+
if (this.disposed)
|
|
120
|
+
return;
|
|
121
|
+
this.disposed = true;
|
|
122
|
+
this.cancelRecovery();
|
|
123
|
+
this.retainedLive = [];
|
|
124
|
+
this.retainedLiveBytes = 0;
|
|
125
|
+
this.pipeline.dispose();
|
|
126
|
+
this.setState('disposed');
|
|
127
|
+
}
|
|
128
|
+
beginCatchUp(startSequence) {
|
|
129
|
+
if (this.disposed || this.state === 'initial-replay')
|
|
130
|
+
return;
|
|
131
|
+
this.recoveryKind = 'catch-up';
|
|
132
|
+
this.recoveryStartSequence = Math.max(0, Math.floor(startSequence));
|
|
133
|
+
this.retryAttempt = 0;
|
|
134
|
+
void this.runRecovery();
|
|
135
|
+
}
|
|
136
|
+
async runRecovery() {
|
|
137
|
+
if (this.disposed)
|
|
138
|
+
return;
|
|
139
|
+
this.cancelRecovery(false);
|
|
140
|
+
const generation = ++this.generation;
|
|
141
|
+
const controller = new AbortController();
|
|
142
|
+
this.abortController = controller;
|
|
143
|
+
this.lastError = null;
|
|
144
|
+
this.setState(this.recoveryKind === 'initial' ? 'initial-replay' : 'catching-up');
|
|
145
|
+
try {
|
|
146
|
+
let cursor;
|
|
147
|
+
let startSequence = this.recoveryStartSequence;
|
|
148
|
+
let firstPage = true;
|
|
149
|
+
do {
|
|
150
|
+
const page = await this.options.fetchPage({
|
|
151
|
+
startSequence,
|
|
152
|
+
cursor,
|
|
153
|
+
signal: controller.signal,
|
|
154
|
+
});
|
|
155
|
+
if (this.disposed || generation !== this.generation)
|
|
156
|
+
return;
|
|
157
|
+
const firstAvailable = page.firstAvailableSequence;
|
|
158
|
+
if (firstPage && firstAvailable && startSequence > 0 && firstAvailable > startSequence) {
|
|
159
|
+
this.options.clear?.();
|
|
160
|
+
this.options.onHistoryTruncated?.('history-evicted');
|
|
161
|
+
this.coveredThroughSequence = firstAvailable - 1;
|
|
162
|
+
this.pipeline.reset({ startSequence: firstAvailable });
|
|
163
|
+
}
|
|
164
|
+
firstPage = false;
|
|
165
|
+
this.writeAcceptedChunks(page.chunks.filter(chunk => (!chunk.sequence || chunk.sequence > this.coveredThroughSequence)));
|
|
166
|
+
this.coveredThroughSequence = Math.max(this.coveredThroughSequence, Math.floor(page.coveredThroughSequence || 0));
|
|
167
|
+
cursor = page.nextCursor;
|
|
168
|
+
startSequence = this.coveredThroughSequence + 1;
|
|
169
|
+
if (!page.hasMore)
|
|
170
|
+
break;
|
|
171
|
+
} while (!controller.signal.aborted);
|
|
172
|
+
if (this.disposed || generation !== this.generation)
|
|
173
|
+
return;
|
|
174
|
+
if (this.needsRebase) {
|
|
175
|
+
this.needsRebase = false;
|
|
176
|
+
this.options.clear?.();
|
|
177
|
+
this.pipeline.reset({ startSequence: 1 });
|
|
178
|
+
this.coveredThroughSequence = 0;
|
|
179
|
+
this.recoveryStartSequence = 0;
|
|
180
|
+
this.options.onHistoryTruncated?.('retained-live-overflow');
|
|
181
|
+
await this.runRecovery();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.pipeline.reset({
|
|
185
|
+
startSequence: this.coveredThroughSequence + 1,
|
|
186
|
+
resumeCatchUp: this.recoveryKind === 'catch-up',
|
|
187
|
+
allowSequenceSkipOnResume: true,
|
|
188
|
+
});
|
|
189
|
+
if (this.recoveryKind === 'initial') {
|
|
190
|
+
const retained = this.retainedLive;
|
|
191
|
+
this.retainedLive = [];
|
|
192
|
+
this.retainedLiveBytes = 0;
|
|
193
|
+
for (const chunk of retained) {
|
|
194
|
+
if (!chunk.sequence || chunk.sequence > this.coveredThroughSequence) {
|
|
195
|
+
this.pipeline.enqueue(chunk);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
this.retryAttempt = 0;
|
|
200
|
+
this.lastError = null;
|
|
201
|
+
this.setState('live');
|
|
202
|
+
this.pipeline.flush();
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
if (controller.signal.aborted || this.disposed || generation !== this.generation)
|
|
206
|
+
return;
|
|
207
|
+
this.lastError = error;
|
|
208
|
+
this.scheduleRetry();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
scheduleRetry() {
|
|
212
|
+
const delay = this.policy.retryDelaysMs[this.retryAttempt];
|
|
213
|
+
if (delay === undefined) {
|
|
214
|
+
this.setState('failed');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.retryAttempt += 1;
|
|
218
|
+
this.setState('retry-wait');
|
|
219
|
+
const setTimer = this.options.scheduler?.setTimer ?? setTimeout;
|
|
220
|
+
this.retryTimer = setTimer(() => {
|
|
221
|
+
this.retryTimer = null;
|
|
222
|
+
void this.runRecovery();
|
|
223
|
+
}, delay);
|
|
224
|
+
this.emitState();
|
|
225
|
+
}
|
|
226
|
+
retainLive(chunk) {
|
|
227
|
+
this.retainedLive.push(chunk);
|
|
228
|
+
this.retainedLiveBytes += chunk.data.byteLength;
|
|
229
|
+
while (this.retainedLive.length > this.policy.maxRetainedLiveChunks
|
|
230
|
+
|| this.retainedLiveBytes > this.policy.maxRetainedLiveBytes) {
|
|
231
|
+
const removed = this.retainedLive.shift();
|
|
232
|
+
if (!removed)
|
|
233
|
+
break;
|
|
234
|
+
this.retainedLiveBytes -= removed.data.byteLength;
|
|
235
|
+
this.needsRebase = true;
|
|
236
|
+
}
|
|
237
|
+
this.emitState();
|
|
238
|
+
}
|
|
239
|
+
writeAcceptedChunks(chunks) {
|
|
240
|
+
if (chunks.length === 0)
|
|
241
|
+
return;
|
|
242
|
+
const acceptedChunks = [];
|
|
243
|
+
const data = [];
|
|
244
|
+
for (const chunk of chunks) {
|
|
245
|
+
const transformed = this.options.transformChunk
|
|
246
|
+
? this.options.transformChunk(chunk)
|
|
247
|
+
: chunk.data;
|
|
248
|
+
if (transformed === null)
|
|
249
|
+
continue;
|
|
250
|
+
acceptedChunks.push({ ...chunk, data: transformed });
|
|
251
|
+
data.push(transformed);
|
|
252
|
+
}
|
|
253
|
+
if (acceptedChunks.length > 0) {
|
|
254
|
+
this.options.write(concatData(data), acceptedChunks);
|
|
255
|
+
for (const chunk of acceptedChunks) {
|
|
256
|
+
if (chunk.sequence) {
|
|
257
|
+
this.coveredThroughSequence = Math.max(this.coveredThroughSequence, chunk.sequence);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
cancelRecovery(incrementGeneration = true) {
|
|
263
|
+
this.abortController?.abort();
|
|
264
|
+
this.abortController = null;
|
|
265
|
+
if (this.retryTimer !== null) {
|
|
266
|
+
const clearTimer = this.options.scheduler?.clearTimer ?? clearTimeout;
|
|
267
|
+
clearTimer(this.retryTimer);
|
|
268
|
+
this.retryTimer = null;
|
|
269
|
+
}
|
|
270
|
+
if (incrementGeneration)
|
|
271
|
+
this.generation += 1;
|
|
272
|
+
}
|
|
273
|
+
setState(state) {
|
|
274
|
+
this.state = state;
|
|
275
|
+
this.emitState();
|
|
276
|
+
}
|
|
277
|
+
emitState() {
|
|
278
|
+
this.options.onStateChange?.(this.getSnapshot());
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
export const createPagedTerminalOutputCoordinator = (options) => new PagedTerminalOutputCoordinator(options);
|
|
282
|
+
//# sourceMappingURL=PagedTerminalOutputCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PagedTerminalOutputCoordinator.js","sourceRoot":"","sources":["../../src/core/PagedTerminalOutputCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TerminalState, type Logger, type TerminalConfig, type TerminalCopySelectionResult, type TerminalCopySelectionSource, type TerminalDimensions, type TerminalEventHandlers, type TerminalFocusOptions, type TerminalAppearance, type TerminalLinkProvider, type TerminalRuntimeLineSnapshot, type TerminalTouchScrollRuntime, type TerminalVisualSuspendHandle, type TerminalVisualSuspendOptions } from '../types';
|
|
1
|
+
import { TerminalState, type Logger, type TerminalConfig, type TerminalCopySelectionResult, type TerminalCopySelectionSource, type TerminalDimensions, type TerminalEventHandlers, type TerminalFocusOptions, type TerminalAppearance, type TerminalLinkProvider, type TerminalRuntimeLineSnapshot, type TerminalRestorableSnapshot, type TerminalRestorableSnapshotOptions, type TerminalResourceEstimate, type TerminalTouchScrollRuntime, type TerminalVisualSuspendHandle, type TerminalVisualSuspendOptions } from '../types';
|
|
2
2
|
export declare class TerminalCore {
|
|
3
3
|
private container;
|
|
4
4
|
private config;
|
|
@@ -118,6 +118,9 @@ export declare class TerminalCore {
|
|
|
118
118
|
write(data: string | Uint8Array, callback?: () => void): void;
|
|
119
119
|
clear(): void;
|
|
120
120
|
serialize(): string;
|
|
121
|
+
captureRestorableSnapshot(options?: TerminalRestorableSnapshotOptions): TerminalRestorableSnapshot | null;
|
|
122
|
+
restoreSnapshot(snapshot: TerminalRestorableSnapshot): Promise<boolean>;
|
|
123
|
+
getResourceEstimate(): TerminalResourceEstimate;
|
|
121
124
|
getSelectionText(): string;
|
|
122
125
|
hasSelection(): boolean;
|
|
123
126
|
copySelection(source?: TerminalCopySelectionSource): Promise<TerminalCopySelectionResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerminalCore.d.ts","sourceRoot":"","sources":["../../src/core/TerminalCore.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,aAAa,EACb,KAAK,MAAM,EAEX,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAE1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAGzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAElC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"TerminalCore.d.ts","sourceRoot":"","sources":["../../src/core/TerminalCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,12 @@ import { TerminalState, } from '../types';
|
|
|
6
6
|
import { resolveTerminalInputElement, TerminalInputBridge } from './TerminalInputBridge';
|
|
7
7
|
import { terminalRenderScheduler } from './TerminalRenderScheduler';
|
|
8
8
|
import { scheduleUiTurn } from '../internal/scheduleUiTurn';
|
|
9
|
+
const TERMINAL_SNAPSHOT_VERSION = 1;
|
|
10
|
+
const DEFAULT_TERMINAL_SNAPSHOT_MAX_BYTES = 2 * 1024 * 1024;
|
|
11
|
+
const ESTIMATED_RENDERER_BYTES = 4 * 1024 * 1024;
|
|
12
|
+
const ESTIMATED_CELL_BYTES = 16;
|
|
13
|
+
const SNAPSHOT_RESET_PREFIX = '\x1bc\x1b[2J\x1b[H';
|
|
14
|
+
const encodedByteLength = (value) => new TextEncoder().encode(value).byteLength;
|
|
9
15
|
const TERMINAL_SEARCH_MAX_RESULTS = 5000;
|
|
10
16
|
const PRESENTATION_SCALE_EPSILON = 0.0001;
|
|
11
17
|
const GHOSTTY_DEFAULT_SCROLLBAR_RESERVE_PX = 15;
|
|
@@ -1584,7 +1590,80 @@ export class TerminalCore {
|
|
|
1584
1590
|
this.forceFullRender();
|
|
1585
1591
|
}
|
|
1586
1592
|
serialize() {
|
|
1587
|
-
return '';
|
|
1593
|
+
return this.captureRestorableSnapshot()?.data ?? '';
|
|
1594
|
+
}
|
|
1595
|
+
captureRestorableSnapshot(options = {}) {
|
|
1596
|
+
if (!this.terminal || !this.isReady()) {
|
|
1597
|
+
return null;
|
|
1598
|
+
}
|
|
1599
|
+
const maxBytes = Number.isFinite(options.maxBytes) && Number(options.maxBytes) > 0
|
|
1600
|
+
? Math.floor(Number(options.maxBytes))
|
|
1601
|
+
: DEFAULT_TERMINAL_SNAPSHOT_MAX_BYTES;
|
|
1602
|
+
const info = this.getTerminalInfo();
|
|
1603
|
+
if (!info) {
|
|
1604
|
+
return null;
|
|
1605
|
+
}
|
|
1606
|
+
const lines = [];
|
|
1607
|
+
for (let row = 0; row < info.bufferLength; row += 1) {
|
|
1608
|
+
lines.push(this.readBufferLine(row, { trimRight: true }));
|
|
1609
|
+
}
|
|
1610
|
+
const suffix = '\x1b[0m';
|
|
1611
|
+
let selected = lines;
|
|
1612
|
+
let data = SNAPSHOT_RESET_PREFIX + selected.join('\r\n') + suffix;
|
|
1613
|
+
let partial = false;
|
|
1614
|
+
while (selected.length > Math.max(1, info.rows) && encodedByteLength(data) > maxBytes) {
|
|
1615
|
+
partial = true;
|
|
1616
|
+
selected = selected.slice(Math.max(1, Math.floor(selected.length / 4)));
|
|
1617
|
+
data = SNAPSHOT_RESET_PREFIX + selected.join('\r\n') + suffix;
|
|
1618
|
+
}
|
|
1619
|
+
if (encodedByteLength(data) > maxBytes) {
|
|
1620
|
+
partial = true;
|
|
1621
|
+
const availableBytes = Math.max(0, maxBytes - encodedByteLength(SNAPSHOT_RESET_PREFIX + suffix));
|
|
1622
|
+
const encoded = new TextEncoder().encode(selected.join('\r\n'));
|
|
1623
|
+
const tail = encoded.slice(Math.max(0, encoded.byteLength - availableBytes));
|
|
1624
|
+
data = SNAPSHOT_RESET_PREFIX + new TextDecoder().decode(tail) + suffix;
|
|
1625
|
+
}
|
|
1626
|
+
return {
|
|
1627
|
+
version: TERMINAL_SNAPSHOT_VERSION,
|
|
1628
|
+
data,
|
|
1629
|
+
byteLength: encodedByteLength(data),
|
|
1630
|
+
partial,
|
|
1631
|
+
coveredThroughSequence: Math.max(0, Math.floor(options.coveredThroughSequence ?? 0)),
|
|
1632
|
+
cols: info.cols,
|
|
1633
|
+
rows: info.rows,
|
|
1634
|
+
createdAtMs: options.now?.() ?? Date.now(),
|
|
1635
|
+
};
|
|
1636
|
+
}
|
|
1637
|
+
async restoreSnapshot(snapshot) {
|
|
1638
|
+
if (!this.terminal || !this.isReady() || snapshot.version !== TERMINAL_SNAPSHOT_VERSION) {
|
|
1639
|
+
return false;
|
|
1640
|
+
}
|
|
1641
|
+
if (!Number.isFinite(snapshot.coveredThroughSequence) || snapshot.coveredThroughSequence < 0) {
|
|
1642
|
+
return false;
|
|
1643
|
+
}
|
|
1644
|
+
this.startHistoryReplay();
|
|
1645
|
+
return new Promise(resolve => {
|
|
1646
|
+
this.write(snapshot.data, () => {
|
|
1647
|
+
this.endHistoryReplay();
|
|
1648
|
+
resolve(true);
|
|
1649
|
+
});
|
|
1650
|
+
});
|
|
1651
|
+
}
|
|
1652
|
+
getResourceEstimate() {
|
|
1653
|
+
const info = this.getTerminalInfo();
|
|
1654
|
+
const cellCount = info ? Math.max(0, info.cols * info.bufferLength) : 0;
|
|
1655
|
+
let bufferBytes = 0;
|
|
1656
|
+
if (info) {
|
|
1657
|
+
for (let row = 0; row < info.bufferLength; row += 1) {
|
|
1658
|
+
bufferBytes += encodedByteLength(this.readBufferLine(row));
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
return {
|
|
1662
|
+
bufferBytes,
|
|
1663
|
+
cellCount,
|
|
1664
|
+
estimatedBytes: ESTIMATED_RENDERER_BYTES + bufferBytes + cellCount * ESTIMATED_CELL_BYTES,
|
|
1665
|
+
rendererType: this.config.rendererType ?? 'canvas',
|
|
1666
|
+
};
|
|
1588
1667
|
}
|
|
1589
1668
|
getSelectionText() {
|
|
1590
1669
|
if (!this.terminal) {
|