@sentropic/h2a-runtime 0.98.1 → 0.98.2
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/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -8
- package/dist/index.js.map +1 -1
- package/dist/native-host.d.ts +1 -1
- package/dist/native-host.d.ts.map +1 -1
- package/dist/native-host.js +84 -21
- package/dist/native-host.js.map +1 -1
- package/dist/native-terminal/attach-recovery.d.ts +9 -0
- package/dist/native-terminal/attach-recovery.d.ts.map +1 -0
- package/dist/native-terminal/attach-recovery.js +54 -0
- package/dist/native-terminal/attach-recovery.js.map +1 -0
- package/dist/native-terminal/fleet.d.ts +2 -1
- package/dist/native-terminal/fleet.d.ts.map +1 -1
- package/dist/native-terminal/fleet.js +10 -1
- package/dist/native-terminal/fleet.js.map +1 -1
- package/dist/native-terminal/host.d.ts +1 -0
- package/dist/native-terminal/host.d.ts.map +1 -1
- package/dist/native-terminal/host.js +5 -2
- package/dist/native-terminal/host.js.map +1 -1
- package/dist/native-terminal/journal.d.ts +48 -0
- package/dist/native-terminal/journal.d.ts.map +1 -0
- package/dist/native-terminal/journal.js +305 -0
- package/dist/native-terminal/journal.js.map +1 -0
- package/dist/native-terminal/op.d.ts +3 -0
- package/dist/native-terminal/op.d.ts.map +1 -1
- package/dist/native-terminal/op.js +148 -33
- package/dist/native-terminal/op.js.map +1 -1
- package/dist/native-terminal/process.d.ts.map +1 -1
- package/dist/native-terminal/process.js +134 -46
- package/dist/native-terminal/process.js.map +1 -1
- package/dist/native-terminal/replay-buffer.d.ts +3 -0
- package/dist/native-terminal/replay-buffer.d.ts.map +1 -1
- package/dist/native-terminal/replay-buffer.js +11 -0
- package/dist/native-terminal/replay-buffer.js.map +1 -1
- package/dist/native-terminal/reset-relay.d.ts +11 -0
- package/dist/native-terminal/reset-relay.d.ts.map +1 -0
- package/dist/native-terminal/reset-relay.js +38 -0
- package/dist/native-terminal/reset-relay.js.map +1 -0
- package/dist/native-terminal/server.d.ts +8 -0
- package/dist/native-terminal/server.d.ts.map +1 -1
- package/dist/native-terminal/server.js +535 -58
- package/dist/native-terminal/server.js.map +1 -1
- package/dist/native-terminal/terminal-modes.d.ts +15 -0
- package/dist/native-terminal/terminal-modes.d.ts.map +1 -0
- package/dist/native-terminal/terminal-modes.js +180 -0
- package/dist/native-terminal/terminal-modes.js.map +1 -0
- package/dist/tmux.d.ts +17 -1
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +10 -4
- package/dist/tmux.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import {
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
import { NativeTerminalHost, readProcessStartTime } from "./host.js";
|
|
6
|
+
import { createHostJournalWriter, getRuntimeVersion } from "./journal.js";
|
|
4
7
|
import { nodePtySpawner } from "../pty.js";
|
|
5
8
|
import { NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS, NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION, NATIVE_TERMINAL_MAX_SESSIONS, } from "./protocol.js";
|
|
6
9
|
import { startNativeTerminalHostServer } from "./server.js";
|
|
@@ -88,60 +91,145 @@ export function parseNativeTerminalHostArgs(argv) {
|
|
|
88
91
|
};
|
|
89
92
|
}
|
|
90
93
|
export async function runNativeTerminalHostProcess(argv) {
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
const startTime = readProcessStartTime(process.pid) ?? "unknown";
|
|
95
|
+
const codePath = process.argv[1] ?? fileURLToPath(import.meta.url);
|
|
96
|
+
let options;
|
|
97
|
+
let cause = "unknown";
|
|
98
|
+
const identity = () => ({ pid: process.pid, startTime, generation: options?.generation ?? "unknown" });
|
|
99
|
+
const journal = createHostJournalWriter();
|
|
100
|
+
// Exit callbacks only enqueue observations. The independent writer has its
|
|
101
|
+
// own bounded drain; the monitor preserves Node's fatal behavior.
|
|
102
|
+
process.on("exit", (exitCode) => {
|
|
103
|
+
journal.write({ event: "exit", ...identity(), exitCode, cause });
|
|
99
104
|
});
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
105
|
+
process.on("uncaughtExceptionMonitor", (error, origin) => {
|
|
106
|
+
cause = origin === "unhandledRejection" ? "unhandledRejection" : "uncaughtException";
|
|
107
|
+
journal.write({ event: cause, ...identity(), error: error.message, stack: error.stack, codePath });
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
options = parseNativeTerminalHostArgs(argv);
|
|
111
|
+
journal.write({
|
|
112
|
+
event: "start",
|
|
113
|
+
...identity(),
|
|
114
|
+
version: getRuntimeVersion(),
|
|
115
|
+
codePath,
|
|
116
|
+
socket: options.socketPath,
|
|
117
|
+
});
|
|
118
|
+
const host = new NativeTerminalHost({
|
|
119
|
+
generation: options.generation,
|
|
120
|
+
replayBytesPerSession: options.replayBytesPerSession,
|
|
121
|
+
maxSessions: options.maxSessions,
|
|
122
|
+
spawner: nodePtySpawner,
|
|
123
|
+
socketPath: options.socketPath,
|
|
124
|
+
...(options.registryPath !== undefined ? { registryPath: options.registryPath } : {}),
|
|
125
|
+
});
|
|
126
|
+
const initialization = new AbortController();
|
|
127
|
+
const serverReady = startNativeTerminalHostServer({
|
|
128
|
+
socketPath: options.socketPath, host, signal: initialization.signal,
|
|
129
|
+
});
|
|
130
|
+
let shutdown;
|
|
131
|
+
const stop = (signal) => {
|
|
132
|
+
journal.write({
|
|
133
|
+
event: "signal",
|
|
134
|
+
...identity(),
|
|
135
|
+
signal,
|
|
136
|
+
});
|
|
137
|
+
if (shutdown !== undefined)
|
|
138
|
+
return;
|
|
139
|
+
cause = "signal";
|
|
140
|
+
shutdown = (async () => {
|
|
141
|
+
initialization.abort();
|
|
142
|
+
let gracefulError;
|
|
143
|
+
// Begin terminal shutdown independently of publication/rollback.
|
|
119
144
|
try {
|
|
120
|
-
|
|
145
|
+
host.stopAll("SIGTERM");
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
gracefulError = error;
|
|
121
149
|
}
|
|
122
|
-
catch {
|
|
123
|
-
|
|
124
|
-
|
|
150
|
+
const closeServer = serverReady.then(server => server.close()).catch((error) => {
|
|
151
|
+
if (error !== initialization.signal.reason)
|
|
152
|
+
gracefulError = error;
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
if (!await waitForTerminalDrain(host, GRACEFUL_DRAIN_MS)) {
|
|
156
|
+
try {
|
|
157
|
+
await host.forceStopAll("SIGKILL");
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// The post-kill drain check below is authoritative: a raced exit may
|
|
161
|
+
// make node-pty report an error even though no terminal remains.
|
|
162
|
+
}
|
|
163
|
+
if (!await waitForTerminalDrain(host, FORCED_DRAIN_MS)) {
|
|
164
|
+
throw new Error("terminal sessions did not exit after forced shutdown");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
125
167
|
}
|
|
126
|
-
|
|
127
|
-
|
|
168
|
+
finally {
|
|
169
|
+
await closeServer;
|
|
128
170
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
171
|
+
if (gracefulError !== undefined)
|
|
172
|
+
throw gracefulError;
|
|
173
|
+
})();
|
|
174
|
+
void shutdown.then(async () => {
|
|
175
|
+
cause = "clean-stop";
|
|
176
|
+
journal.write({
|
|
177
|
+
event: "stop",
|
|
178
|
+
...identity(),
|
|
179
|
+
clean: true,
|
|
180
|
+
});
|
|
181
|
+
process.exitCode = 0;
|
|
182
|
+
await journal.flush();
|
|
183
|
+
}, (error) => {
|
|
184
|
+
journal.write({
|
|
185
|
+
event: "stop",
|
|
186
|
+
...identity(),
|
|
187
|
+
clean: false,
|
|
188
|
+
});
|
|
189
|
+
process.stderr.write(`[h2a-pty-host] shutdown failed after ${signal}: ${String(error)}\n`);
|
|
190
|
+
process.exitCode = 1;
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
process.once("SIGINT", () => stop("SIGINT"));
|
|
194
|
+
process.once("SIGTERM", () => stop("SIGTERM"));
|
|
195
|
+
process.once("SIGHUP", () => stop("SIGHUP"));
|
|
196
|
+
// The socket can be visible before its owner record has finished. Install
|
|
197
|
+
// termination handlers before that asynchronous publication window.
|
|
198
|
+
const server = await serverReady.catch((error) => {
|
|
199
|
+
if (shutdown !== undefined && error === initialization.signal.reason)
|
|
200
|
+
return undefined;
|
|
201
|
+
throw error;
|
|
136
202
|
});
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
203
|
+
if (shutdown !== undefined) {
|
|
204
|
+
await shutdown;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
process.stdout.write(`${JSON.stringify({
|
|
208
|
+
kind: "h2a.native-terminal.ready",
|
|
209
|
+
version: 1,
|
|
210
|
+
generation: host.generation,
|
|
211
|
+
pid: process.pid,
|
|
212
|
+
socketPath: server.socketPath,
|
|
213
|
+
})}\n`);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
cause = "startupError";
|
|
217
|
+
journal.write({ event: "startupError", ...identity(), error: "[REDACTED]",
|
|
218
|
+
stack: error instanceof Error ? error.stack : undefined, codePath });
|
|
219
|
+
await journal.flush();
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
141
222
|
}
|
|
142
223
|
function isEntryPoint() {
|
|
143
224
|
const argv1 = process.argv[1];
|
|
144
|
-
|
|
225
|
+
if (argv1 === undefined)
|
|
226
|
+
return false;
|
|
227
|
+
try {
|
|
228
|
+
return import.meta.url === pathToFileURL(resolve(argv1)).href;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
145
233
|
}
|
|
146
234
|
if (isEntryPoint()) {
|
|
147
235
|
runNativeTerminalHostProcess(process.argv).catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/native-terminal/process.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/native-terminal/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ export type TerminalReplay = Readonly<{
|
|
|
10
10
|
chunks: ReadonlyArray<TerminalOutputChunk>;
|
|
11
11
|
gap: TerminalReplayGap | null;
|
|
12
12
|
latestSeq: number;
|
|
13
|
+
/** State and parser prefix immediately before the retained chunks. */
|
|
14
|
+
terminalModePrefix?: string;
|
|
13
15
|
}>;
|
|
14
16
|
export declare const NATIVE_TERMINAL_MAX_REPLAY_CHUNKS_PER_SESSION = 65536;
|
|
15
17
|
export declare const NATIVE_TERMINAL_MAX_REPLAY_WIRE_BYTES_PER_SESSION: number;
|
|
@@ -21,6 +23,7 @@ export declare class TerminalReplayBuffer {
|
|
|
21
23
|
});
|
|
22
24
|
get latestSeq(): number;
|
|
23
25
|
append(data: string): TerminalOutputChunk;
|
|
26
|
+
resetSequence(): string;
|
|
24
27
|
readAfter(afterSeq: number): TerminalReplay;
|
|
25
28
|
}
|
|
26
29
|
//# sourceMappingURL=replay-buffer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay-buffer.d.ts","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replay-buffer.d.ts","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3C,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC,CAAC;AAQH,eAAO,MAAM,6CAA6C,QAAS,CAAC;AAGpE,eAAO,MAAM,iDAAiD,QAC5C,CAAC;AAEnB,qBAAa,oBAAoB;;gBAa7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAqB5D,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAoCzC,aAAa,IAAI,MAAM;IAIvB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;CA0B5C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TerminalModeTracker } from "./terminal-modes.js";
|
|
1
2
|
export const NATIVE_TERMINAL_MAX_REPLAY_CHUNKS_PER_SESSION = 65_536;
|
|
2
3
|
// Leaves 8 MiB of the 32 MiB protocol frame for the response envelope and
|
|
3
4
|
// bounded identities, while charging the actual JSON-escaped chunk encoding.
|
|
@@ -11,6 +12,8 @@ export class TerminalReplayBuffer {
|
|
|
11
12
|
#bytes = 0;
|
|
12
13
|
#wireBytes = 0;
|
|
13
14
|
#latestSeq = 0;
|
|
15
|
+
#evictedModes = new TerminalModeTracker();
|
|
16
|
+
#currentModes = new TerminalModeTracker();
|
|
14
17
|
constructor(maxBytes, limits = {}) {
|
|
15
18
|
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
|
|
16
19
|
throw new RangeError("maxBytes must be a positive safe integer");
|
|
@@ -36,6 +39,7 @@ export class TerminalReplayBuffer {
|
|
|
36
39
|
throw new RangeError("terminal output chunks must not be empty");
|
|
37
40
|
}
|
|
38
41
|
const chunk = Object.freeze({ seq: ++this.#latestSeq, data });
|
|
42
|
+
this.#currentModes.feed(data);
|
|
39
43
|
const entry = Object.freeze({
|
|
40
44
|
chunk,
|
|
41
45
|
bytes: Buffer.byteLength(data, "utf8"),
|
|
@@ -51,6 +55,7 @@ export class TerminalReplayBuffer {
|
|
|
51
55
|
this.#head < this.#chunks.length) {
|
|
52
56
|
const evicted = this.#chunks[this.#head++];
|
|
53
57
|
if (evicted) {
|
|
58
|
+
this.#evictedModes.feed(evicted.chunk.data);
|
|
54
59
|
this.#bytes -= evicted.bytes;
|
|
55
60
|
this.#wireBytes -= evicted.wireBytes;
|
|
56
61
|
}
|
|
@@ -61,6 +66,9 @@ export class TerminalReplayBuffer {
|
|
|
61
66
|
}
|
|
62
67
|
return chunk;
|
|
63
68
|
}
|
|
69
|
+
resetSequence() {
|
|
70
|
+
return this.#currentModes.resetSequence();
|
|
71
|
+
}
|
|
64
72
|
readAfter(afterSeq) {
|
|
65
73
|
if (!Number.isSafeInteger(afterSeq) ||
|
|
66
74
|
afterSeq < 0 ||
|
|
@@ -71,6 +79,8 @@ export class TerminalReplayBuffer {
|
|
|
71
79
|
const gap = afterSeq < oldestAvailable - 1
|
|
72
80
|
? Object.freeze({ fromSeq: afterSeq + 1, toSeq: oldestAvailable - 1 })
|
|
73
81
|
: null;
|
|
82
|
+
const terminalModePrefix = gap === null ? "" :
|
|
83
|
+
this.#evictedModes.restoreSequence() + this.#evictedModes.replayPrefix();
|
|
74
84
|
return Object.freeze({
|
|
75
85
|
chunks: this.#chunks
|
|
76
86
|
.slice(this.#head)
|
|
@@ -78,6 +88,7 @@ export class TerminalReplayBuffer {
|
|
|
78
88
|
.map(({ chunk }) => chunk),
|
|
79
89
|
gap,
|
|
80
90
|
latestSeq: this.#latestSeq,
|
|
91
|
+
...(terminalModePrefix ? { terminalModePrefix } : {}),
|
|
81
92
|
});
|
|
82
93
|
}
|
|
83
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay-buffer.js","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replay-buffer.js","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Native-only wrapper request. The host replaces it with selective VT resets. */
|
|
2
|
+
export declare const NATIVE_TERMINAL_RESET_MARKER = "\u001B]777;h2a-reset\u0007";
|
|
3
|
+
export declare class TerminalResetRelay {
|
|
4
|
+
#private;
|
|
5
|
+
readonly emit: (data: string) => void;
|
|
6
|
+
readonly reset: () => string;
|
|
7
|
+
constructor(emit: (data: string) => void, reset: () => string);
|
|
8
|
+
feed(data: string): void;
|
|
9
|
+
flush(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=reset-relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-relay.d.ts","sourceRoot":"","sources":["../../src/native-terminal/reset-relay.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,+BAA2B,CAAC;AAErE,qBAAa,kBAAkB;;IAI3B,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM;gBADnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC5B,KAAK,EAAE,MAAM,MAAM;IAG9B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiBxB,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Native-only wrapper request. The host replaces it with selective VT resets. */
|
|
2
|
+
export const NATIVE_TERMINAL_RESET_MARKER = "\x1b]777;h2a-reset\x07";
|
|
3
|
+
export class TerminalResetRelay {
|
|
4
|
+
emit;
|
|
5
|
+
reset;
|
|
6
|
+
#pending = "";
|
|
7
|
+
constructor(emit, reset) {
|
|
8
|
+
this.emit = emit;
|
|
9
|
+
this.reset = reset;
|
|
10
|
+
}
|
|
11
|
+
feed(data) {
|
|
12
|
+
let remaining = this.#pending + data;
|
|
13
|
+
this.#pending = "";
|
|
14
|
+
for (;;) {
|
|
15
|
+
const index = remaining.indexOf(NATIVE_TERMINAL_RESET_MARKER);
|
|
16
|
+
if (index < 0)
|
|
17
|
+
break;
|
|
18
|
+
if (index > 0)
|
|
19
|
+
this.emit(remaining.slice(0, index));
|
|
20
|
+
const reset = this.reset();
|
|
21
|
+
if (reset)
|
|
22
|
+
this.emit(reset);
|
|
23
|
+
remaining = remaining.slice(index + NATIVE_TERMINAL_RESET_MARKER.length);
|
|
24
|
+
}
|
|
25
|
+
let carry = Math.min(remaining.length, NATIVE_TERMINAL_RESET_MARKER.length - 1);
|
|
26
|
+
while (carry > 0 && !NATIVE_TERMINAL_RESET_MARKER.startsWith(remaining.slice(-carry)))
|
|
27
|
+
carry--;
|
|
28
|
+
if (remaining.length > carry)
|
|
29
|
+
this.emit(remaining.slice(0, remaining.length - carry));
|
|
30
|
+
this.#pending = carry > 0 ? remaining.slice(-carry) : "";
|
|
31
|
+
}
|
|
32
|
+
flush() {
|
|
33
|
+
if (this.#pending)
|
|
34
|
+
this.emit(this.#pending);
|
|
35
|
+
this.#pending = "";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=reset-relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-relay.js","sourceRoot":"","sources":["../../src/native-terminal/reset-relay.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAErE,MAAM,OAAO,kBAAkB;IAIlB;IACA;IAJX,QAAQ,GAAG,EAAE,CAAC;IAEd,YACW,IAA4B,EAC5B,KAAmB;QADnB,SAAI,GAAJ,IAAI,CAAwB;QAC5B,UAAK,GAAL,KAAK,CAAc;IAC3B,CAAC;IAEJ,IAAI,CAAC,IAAY;QACf,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAC9D,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM;YACrB,IAAI,KAAK,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,4BAA4B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChF,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;QAC/F,IAAI,SAAS,CAAC,MAAM,GAAG,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { NativeTerminalHost } from "./host.js";
|
|
2
|
+
/**
|
|
3
|
+
* ENOENT/ECONNREFUSED are candidates, never proof by themselves. Serialize
|
|
4
|
+
* with publication and re-read both the socket and its durable process
|
|
5
|
+
* identity. A live or unreadable owner keeps the endpoint unknown.
|
|
6
|
+
* No socket is removed by an inventory; publication owns reclamation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function proveNativeTerminalEndpointAbsent(socketPath: string, failure: unknown): Promise<boolean>;
|
|
2
9
|
export type NativeTerminalHostServer = Readonly<{
|
|
3
10
|
socketPath: string;
|
|
4
11
|
close(options?: {
|
|
@@ -9,5 +16,6 @@ export type NativeTerminalHostServer = Readonly<{
|
|
|
9
16
|
export declare function startNativeTerminalHostServer(options: {
|
|
10
17
|
socketPath: string;
|
|
11
18
|
host: NativeTerminalHost;
|
|
19
|
+
signal?: AbortSignal;
|
|
12
20
|
}): Promise<NativeTerminalHostServer>;
|
|
13
21
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/native-terminal/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/native-terminal/server.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,kBAAkB,EAMnB,MAAM,WAAW,CAAC;AAgoBnB;;;;;GAKG;AACH,wBAAsB,iCAAiC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9G;AAmWD,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E,CAAC,CAAC;AAEH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAQpC"}
|