@sentropic/h2a-runtime 0.91.0 → 0.91.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.
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/native-terminal/client.d.ts +23 -0
- package/dist/native-terminal/client.d.ts.map +1 -0
- package/dist/native-terminal/client.js +203 -0
- package/dist/native-terminal/client.js.map +1 -0
- package/dist/native-terminal/host.d.ts +78 -0
- package/dist/native-terminal/host.d.ts.map +1 -0
- package/dist/native-terminal/host.js +275 -0
- package/dist/native-terminal/host.js.map +1 -0
- package/dist/native-terminal/process.d.ts +11 -0
- package/dist/native-terminal/process.d.ts.map +1 -0
- package/dist/native-terminal/process.js +137 -0
- package/dist/native-terminal/process.js.map +1 -0
- package/dist/native-terminal/protocol.d.ts +57 -0
- package/dist/native-terminal/protocol.d.ts.map +1 -0
- package/dist/native-terminal/protocol.js +102 -0
- package/dist/native-terminal/protocol.js.map +1 -0
- package/dist/native-terminal/replay-buffer.d.ts +26 -0
- package/dist/native-terminal/replay-buffer.d.ts.map +1 -0
- package/dist/native-terminal/replay-buffer.js +84 -0
- package/dist/native-terminal/replay-buffer.js.map +1 -0
- package/dist/native-terminal/server.d.ts +13 -0
- package/dist/native-terminal/server.d.ts.map +1 -0
- package/dist/native-terminal/server.js +555 -0
- package/dist/native-terminal/server.js.map +1 -0
- package/dist/native-terminal/socket-path.d.ts +8 -0
- package/dist/native-terminal/socket-path.d.ts.map +1 -0
- package/dist/native-terminal/socket-path.js +41 -0
- package/dist/native-terminal/socket-path.js.map +1 -0
- package/dist/native-terminal/supervisor.d.ts +26 -0
- package/dist/native-terminal/supervisor.d.ts.map +1 -0
- package/dist/native-terminal/supervisor.js +273 -0
- package/dist/native-terminal/supervisor.js.map +1 -0
- package/dist/pty.d.ts +1 -0
- package/dist/pty.d.ts.map +1 -1
- package/dist/pty.js +78 -2
- package/dist/pty.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
import { NativeTerminalClient } from "./client.js";
|
|
3
|
+
export type NativeTerminalHostSpawn = (options: {
|
|
4
|
+
socketPath: string;
|
|
5
|
+
generation: string;
|
|
6
|
+
replayBytesPerSession: number;
|
|
7
|
+
maxSessions: number;
|
|
8
|
+
}) => ChildProcess;
|
|
9
|
+
export declare class NativeTerminalHostSupervisor {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
socketPath: string;
|
|
13
|
+
replayBytesPerSession: number;
|
|
14
|
+
maxSessions?: number;
|
|
15
|
+
requestTimeoutMs?: number;
|
|
16
|
+
spawnHost?: NativeTerminalHostSpawn;
|
|
17
|
+
generationFactory?: () => string;
|
|
18
|
+
now?: () => number;
|
|
19
|
+
startupTimeoutMs?: number;
|
|
20
|
+
spawnTerminationGraceMs?: number;
|
|
21
|
+
});
|
|
22
|
+
get spawnedPid(): number | undefined;
|
|
23
|
+
client(): Promise<NativeTerminalClient>;
|
|
24
|
+
disconnect(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/native-terminal/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAiBnD,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,KAAK,YAAY,CAAC;AA6EnB,qBAAa,4BAA4B;;gBAoB3B,OAAO,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,uBAAuB,CAAC;QACpC,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;QACjC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC;IAoDD,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAiB7C,UAAU,IAAI,IAAI;CA8JnB"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { once } from "node:events";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { NativeTerminalClient } from "./client.js";
|
|
6
|
+
import { NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS, NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS, NATIVE_TERMINAL_HEALTH_TIMEOUT_MS, NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION, NATIVE_TERMINAL_MAX_SESSIONS, NATIVE_TERMINAL_PROTOCOL_VERSION, } from "./protocol.js";
|
|
7
|
+
const NATIVE_TERMINAL_SPAWN_BACKOFF_BASE_MS = 250;
|
|
8
|
+
const NATIVE_TERMINAL_SPAWN_BACKOFF_MAX_MS = 5_000;
|
|
9
|
+
const NATIVE_TERMINAL_STARTUP_TIMEOUT_MS = 5_000;
|
|
10
|
+
const NATIVE_TERMINAL_SPAWN_TERMINATION_GRACE_MS = 1_000;
|
|
11
|
+
const NATIVE_TERMINAL_MAX_STARTUP_DIAGNOSTIC_BYTES = 4_096;
|
|
12
|
+
function defaultSpawnHost(options) {
|
|
13
|
+
const entry = fileURLToPath(new URL("./process.js", import.meta.url));
|
|
14
|
+
const child = spawn(process.execPath, [
|
|
15
|
+
entry,
|
|
16
|
+
"--socket",
|
|
17
|
+
options.socketPath,
|
|
18
|
+
"--generation",
|
|
19
|
+
options.generation,
|
|
20
|
+
"--replay-bytes",
|
|
21
|
+
String(options.replayBytesPerSession),
|
|
22
|
+
"--max-sessions",
|
|
23
|
+
String(options.maxSessions),
|
|
24
|
+
], {
|
|
25
|
+
detached: true,
|
|
26
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
27
|
+
env: process.env,
|
|
28
|
+
});
|
|
29
|
+
child.stderr?.unref?.();
|
|
30
|
+
child.unref();
|
|
31
|
+
return child;
|
|
32
|
+
}
|
|
33
|
+
function delay(milliseconds) {
|
|
34
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
35
|
+
}
|
|
36
|
+
function childExited(child) {
|
|
37
|
+
return child.exitCode !== null || child.signalCode !== null;
|
|
38
|
+
}
|
|
39
|
+
async function waitForChildExit(child, timeoutMs) {
|
|
40
|
+
if (childExited(child))
|
|
41
|
+
return true;
|
|
42
|
+
return Promise.race([
|
|
43
|
+
once(child, "exit").then(() => true),
|
|
44
|
+
delay(timeoutMs).then(() => false),
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
async function connectHealthy(socketPath, requestTimeoutMs) {
|
|
48
|
+
const client = await NativeTerminalClient.connect(socketPath, {
|
|
49
|
+
connectTimeoutMs: NATIVE_TERMINAL_HEALTH_TIMEOUT_MS,
|
|
50
|
+
requestTimeoutMs,
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
const ping = await client.ping(NATIVE_TERMINAL_HEALTH_TIMEOUT_MS);
|
|
54
|
+
if (ping.protocolVersion !== NATIVE_TERMINAL_PROTOCOL_VERSION
|
|
55
|
+
|| typeof ping.generation !== "string"
|
|
56
|
+
|| ping.generation.trim().length === 0
|
|
57
|
+
|| !Number.isSafeInteger(ping.hostPid)
|
|
58
|
+
|| ping.hostPid <= 0) {
|
|
59
|
+
throw new Error("native terminal host returned an invalid ping");
|
|
60
|
+
}
|
|
61
|
+
return { client, ping };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
client.close();
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class NativeTerminalHostSupervisor {
|
|
69
|
+
#socketPath;
|
|
70
|
+
#generationFactory;
|
|
71
|
+
#replayBytesPerSession;
|
|
72
|
+
#maxSessions;
|
|
73
|
+
#requestTimeoutMs;
|
|
74
|
+
#spawnHost;
|
|
75
|
+
#now;
|
|
76
|
+
#startupTimeoutMs;
|
|
77
|
+
#spawnTerminationGraceMs;
|
|
78
|
+
#client;
|
|
79
|
+
#connecting;
|
|
80
|
+
#spawned;
|
|
81
|
+
#spawnError;
|
|
82
|
+
#spawnDiagnostic = "";
|
|
83
|
+
#consecutiveSpawnFailures = 0;
|
|
84
|
+
#nextSpawnAllowedAt = 0;
|
|
85
|
+
#lastSpawnFailure;
|
|
86
|
+
#lastSpawnGeneration;
|
|
87
|
+
constructor(options) {
|
|
88
|
+
if (!Number.isSafeInteger(options.replayBytesPerSession)
|
|
89
|
+
|| options.replayBytesPerSession <= 0
|
|
90
|
+
|| options.replayBytesPerSession > NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION) {
|
|
91
|
+
throw new RangeError(`replayBytesPerSession must be between 1 and ${NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION}`);
|
|
92
|
+
}
|
|
93
|
+
const maxSessions = options.maxSessions ?? NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS;
|
|
94
|
+
if (!Number.isSafeInteger(maxSessions) ||
|
|
95
|
+
maxSessions <= 0 ||
|
|
96
|
+
maxSessions > NATIVE_TERMINAL_MAX_SESSIONS) {
|
|
97
|
+
throw new RangeError(`maxSessions must be between 1 and ${NATIVE_TERMINAL_MAX_SESSIONS}`);
|
|
98
|
+
}
|
|
99
|
+
const requestTimeoutMs = options.requestTimeoutMs ?? NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS;
|
|
100
|
+
if (!Number.isSafeInteger(requestTimeoutMs) || requestTimeoutMs <= 0) {
|
|
101
|
+
throw new RangeError("requestTimeoutMs must be a positive safe integer");
|
|
102
|
+
}
|
|
103
|
+
const startupTimeoutMs = options.startupTimeoutMs ?? NATIVE_TERMINAL_STARTUP_TIMEOUT_MS;
|
|
104
|
+
const spawnTerminationGraceMs = options.spawnTerminationGraceMs ??
|
|
105
|
+
NATIVE_TERMINAL_SPAWN_TERMINATION_GRACE_MS;
|
|
106
|
+
for (const [label, value] of [
|
|
107
|
+
["startupTimeoutMs", startupTimeoutMs],
|
|
108
|
+
["spawnTerminationGraceMs", spawnTerminationGraceMs],
|
|
109
|
+
]) {
|
|
110
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
111
|
+
throw new RangeError(`${label} must be a positive safe integer`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.#socketPath = options.socketPath;
|
|
115
|
+
this.#generationFactory = options.generationFactory ?? randomUUID;
|
|
116
|
+
this.#replayBytesPerSession = options.replayBytesPerSession;
|
|
117
|
+
this.#maxSessions = maxSessions;
|
|
118
|
+
this.#requestTimeoutMs = requestTimeoutMs;
|
|
119
|
+
this.#spawnHost = options.spawnHost ?? defaultSpawnHost;
|
|
120
|
+
this.#now = options.now ?? Date.now;
|
|
121
|
+
this.#startupTimeoutMs = startupTimeoutMs;
|
|
122
|
+
this.#spawnTerminationGraceMs = spawnTerminationGraceMs;
|
|
123
|
+
}
|
|
124
|
+
get spawnedPid() {
|
|
125
|
+
return this.#spawned?.pid;
|
|
126
|
+
}
|
|
127
|
+
async client() {
|
|
128
|
+
if (this.#client) {
|
|
129
|
+
try {
|
|
130
|
+
await this.#client.ping(NATIVE_TERMINAL_HEALTH_TIMEOUT_MS);
|
|
131
|
+
return this.#client;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
this.#client.close();
|
|
135
|
+
this.#client = undefined;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
this.#connecting ??= this.#connectOrStart().finally(() => {
|
|
139
|
+
this.#connecting = undefined;
|
|
140
|
+
});
|
|
141
|
+
this.#client = await this.#connecting;
|
|
142
|
+
return this.#client;
|
|
143
|
+
}
|
|
144
|
+
disconnect() {
|
|
145
|
+
this.#client?.close();
|
|
146
|
+
this.#client = undefined;
|
|
147
|
+
}
|
|
148
|
+
async #connectOrStart() {
|
|
149
|
+
try {
|
|
150
|
+
const connected = await connectHealthy(this.#socketPath, this.#requestTimeoutMs);
|
|
151
|
+
return await this.#adoptHealthyConnection(connected);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
if (!this.#spawned || this.#spawned.exitCode !== null || this.#spawned.signalCode !== null) {
|
|
155
|
+
const now = this.#now();
|
|
156
|
+
if (now < this.#nextSpawnAllowedAt) {
|
|
157
|
+
const remaining = this.#nextSpawnAllowedAt - now;
|
|
158
|
+
throw new Error(`native terminal host restart backoff active for ${remaining}ms after: ${this.#lastSpawnFailure?.message ?? "startup failure"}`);
|
|
159
|
+
}
|
|
160
|
+
const generation = this.#generationFactory();
|
|
161
|
+
if (generation.trim().length === 0) {
|
|
162
|
+
throw new Error("native terminal host generation must not be empty");
|
|
163
|
+
}
|
|
164
|
+
if (generation === this.#lastSpawnGeneration) {
|
|
165
|
+
throw new Error("native terminal host generation must change after a restart");
|
|
166
|
+
}
|
|
167
|
+
this.#lastSpawnGeneration = generation;
|
|
168
|
+
this.#spawnError = undefined;
|
|
169
|
+
this.#spawnDiagnostic = "";
|
|
170
|
+
this.#spawned = this.#spawnHost({
|
|
171
|
+
socketPath: this.#socketPath,
|
|
172
|
+
generation,
|
|
173
|
+
replayBytesPerSession: this.#replayBytesPerSession,
|
|
174
|
+
maxSessions: this.#maxSessions,
|
|
175
|
+
});
|
|
176
|
+
const spawned = this.#spawned;
|
|
177
|
+
spawned.stderr?.setEncoding("utf8");
|
|
178
|
+
spawned.stderr?.on("data", (chunk) => {
|
|
179
|
+
const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
180
|
+
this.#spawnDiagnostic = (this.#spawnDiagnostic + text).slice(-NATIVE_TERMINAL_MAX_STARTUP_DIAGNOSTIC_BYTES);
|
|
181
|
+
});
|
|
182
|
+
spawned.once("error", (error) => {
|
|
183
|
+
if (this.#spawned === spawned)
|
|
184
|
+
this.#spawnError = error;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
let lastError;
|
|
189
|
+
const startupDeadline = Date.now() + this.#startupTimeoutMs;
|
|
190
|
+
while (Date.now() < startupDeadline) {
|
|
191
|
+
try {
|
|
192
|
+
const connected = await connectHealthy(this.#socketPath, this.#requestTimeoutMs);
|
|
193
|
+
return await this.#adoptHealthyConnection(connected);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
lastError = error;
|
|
197
|
+
}
|
|
198
|
+
if (this.#spawnError) {
|
|
199
|
+
const error = new Error(`native terminal host failed to start: ${this.#spawnError.message}`);
|
|
200
|
+
this.#recordSpawnFailure(error);
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
if (this.#spawned?.exitCode !== null || this.#spawned.signalCode !== null) {
|
|
204
|
+
const diagnostic = this.#spawnDiagnostic.trim();
|
|
205
|
+
const error = new Error(`native terminal host exited before accepting connections (${this.#spawned?.exitCode ?? this.#spawned?.signalCode ?? "unknown"})${diagnostic ? `: ${diagnostic}` : ""}`);
|
|
206
|
+
this.#recordSpawnFailure(error);
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
await delay(25);
|
|
210
|
+
}
|
|
211
|
+
const error = new Error(`native terminal host did not become ready: ${String(lastError)}`);
|
|
212
|
+
const spawned = this.#spawned;
|
|
213
|
+
if (spawned && !childExited(spawned)) {
|
|
214
|
+
try {
|
|
215
|
+
await this.#terminateOwnedSpawn(spawned);
|
|
216
|
+
}
|
|
217
|
+
catch (terminationError) {
|
|
218
|
+
const combined = new Error(`${error.message}; failed to reap owned child: ${String(terminationError)}`);
|
|
219
|
+
this.#recordSpawnFailure(combined);
|
|
220
|
+
throw combined;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
this.#recordSpawnFailure(error);
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
async #adoptHealthyConnection(connected) {
|
|
227
|
+
const spawned = this.#spawned;
|
|
228
|
+
if (spawned &&
|
|
229
|
+
!childExited(spawned) &&
|
|
230
|
+
spawned.pid !== connected.ping.hostPid) {
|
|
231
|
+
try {
|
|
232
|
+
await this.#terminateOwnedSpawn(spawned);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
connected.client.close();
|
|
236
|
+
throw new Error(`native terminal host adoption could not reap losing owned child: ${String(error)}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (spawned && childExited(spawned) && this.#spawned === spawned) {
|
|
240
|
+
this.#spawned = undefined;
|
|
241
|
+
}
|
|
242
|
+
this.#resetSpawnBackoff();
|
|
243
|
+
return connected.client;
|
|
244
|
+
}
|
|
245
|
+
async #terminateOwnedSpawn(spawned) {
|
|
246
|
+
if (this.#spawned !== spawned)
|
|
247
|
+
return;
|
|
248
|
+
if (!childExited(spawned)) {
|
|
249
|
+
spawned.kill("SIGTERM");
|
|
250
|
+
if (!await waitForChildExit(spawned, this.#spawnTerminationGraceMs)) {
|
|
251
|
+
spawned.kill("SIGKILL");
|
|
252
|
+
if (!await waitForChildExit(spawned, this.#spawnTerminationGraceMs)) {
|
|
253
|
+
throw new Error("owned native terminal host did not exit after SIGKILL");
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (this.#spawned === spawned)
|
|
258
|
+
this.#spawned = undefined;
|
|
259
|
+
}
|
|
260
|
+
#recordSpawnFailure(error) {
|
|
261
|
+
this.#consecutiveSpawnFailures += 1;
|
|
262
|
+
const delayMs = Math.min(NATIVE_TERMINAL_SPAWN_BACKOFF_BASE_MS *
|
|
263
|
+
2 ** (this.#consecutiveSpawnFailures - 1), NATIVE_TERMINAL_SPAWN_BACKOFF_MAX_MS);
|
|
264
|
+
this.#nextSpawnAllowedAt = this.#now() + delayMs;
|
|
265
|
+
this.#lastSpawnFailure = error;
|
|
266
|
+
}
|
|
267
|
+
#resetSpawnBackoff() {
|
|
268
|
+
this.#consecutiveSpawnFailures = 0;
|
|
269
|
+
this.#nextSpawnAllowedAt = 0;
|
|
270
|
+
this.#lastSpawnFailure = undefined;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/native-terminal/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,oCAAoC,EACpC,0CAA0C,EAC1C,iCAAiC,EACjC,4CAA4C,EAC5C,4BAA4B,EAC5B,gCAAgC,GAEjC,MAAM,eAAe,CAAC;AAEvB,MAAM,qCAAqC,GAAG,GAAG,CAAC;AAClD,MAAM,oCAAoC,GAAG,KAAK,CAAC;AACnD,MAAM,kCAAkC,GAAG,KAAK,CAAC;AACjD,MAAM,0CAA0C,GAAG,KAAK,CAAC;AACzD,MAAM,4CAA4C,GAAG,KAAK,CAAC;AAS3D,SAAS,gBAAgB,CAAC,OAKzB;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;QACpC,KAAK;QACL,UAAU;QACV,OAAO,CAAC,UAAU;QAClB,cAAc;QACd,OAAO,CAAC,UAAU;QAClB,gBAAgB;QAChB,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACrC,gBAAgB;QAChB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;KAC5B,EAAE;QACD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACF,KAAK,CAAC,MAA4D,EAAE,KAAK,EAAE,EAAE,CAAC;IAC/E,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,KAAmB;IACtC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAmB,EACnB,SAAiB;IAEjB,IAAI,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACpC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,UAAkB,EAClB,gBAAwB;IAKxB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE;QAC5D,gBAAgB,EAAE,iCAAiC;QACnD,gBAAgB;KACjB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAClE,IACE,IAAI,CAAC,eAAe,KAAK,gCAAgC;eACtD,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;eACnC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;eACnC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;eACnC,IAAI,CAAC,OAAO,IAAI,CAAC,EACpB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,4BAA4B;IAC9B,WAAW,CAAS;IACpB,kBAAkB,CAAe;IACjC,sBAAsB,CAAS;IAC/B,YAAY,CAAS;IACrB,iBAAiB,CAAS;IAC1B,UAAU,CAA0B;IACpC,IAAI,CAAe;IACnB,iBAAiB,CAAS;IAC1B,wBAAwB,CAAS;IAC1C,OAAO,CAAmC;IAC1C,WAAW,CAA4C;IACvD,QAAQ,CAA2B;IACnC,WAAW,CAAoB;IAC/B,gBAAgB,GAAG,EAAE,CAAC;IACtB,yBAAyB,GAAG,CAAC,CAAC;IAC9B,mBAAmB,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAoB;IACrC,oBAAoB,CAAqB;IAEzC,YAAY,OAUX;QACC,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,qBAAqB,CAAC;eACjD,OAAO,CAAC,qBAAqB,IAAI,CAAC;eAClC,OAAO,CAAC,qBAAqB,GAAG,4CAA4C,EAC/E,CAAC;YACD,MAAM,IAAI,UAAU,CAClB,+CAA+C,4CAA4C,EAAE,CAC9F,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,IAAI,oCAAoC,CAAC;QAC9D,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;YAClC,WAAW,IAAI,CAAC;YAChB,WAAW,GAAG,4BAA4B,EAC1C,CAAC;YACD,MAAM,IAAI,UAAU,CAClB,qCAAqC,4BAA4B,EAAE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GACpB,OAAO,CAAC,gBAAgB,IAAI,0CAA0C,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,UAAU,CAClB,kDAAkD,CACnD,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GACpB,OAAO,CAAC,gBAAgB,IAAI,kCAAkC,CAAC;QACjE,MAAM,uBAAuB,GAC3B,OAAO,CAAC,uBAAuB;YAC/B,0CAA0C,CAAC;QAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;YAC3B,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;YACtC,CAAC,yBAAyB,EAAE,uBAAuB,CAAC;SAC5C,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,IAAI,UAAU,CAAC;QAClE,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;IAC1D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC3D,OAAO,IAAI,CAAC,OAAO,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACvD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,iBAAiB,CACvB,CAAC;YACF,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,GAAG,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;oBACjD,MAAM,IAAI,KAAK,CACb,mDAAmD,SAAS,aAAa,IAAI,CAAC,iBAAiB,EAAE,OAAO,IAAI,iBAAiB,EAAE,CAChI,CAAC;gBACJ,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7C,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBACjF,CAAC;gBACD,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC;gBACvC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC9B,UAAU,EAAE,IAAI,CAAC,WAAW;oBAC5B,UAAU;oBACV,qBAAqB,EAAE,IAAI,CAAC,sBAAsB;oBAClD,WAAW,EAAE,IAAI,CAAC,YAAY;iBAC/B,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC9B,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;oBACpD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACxE,IAAI,CAAC,gBAAgB,GAAG,CACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAC7B,CAAC,KAAK,CAAC,CAAC,4CAA4C,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;wBAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC1D,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,SAAkB,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC5D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,iBAAiB,CACvB,CAAC;gBACF,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,yCAAyC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CACpE,CAAC;gBACF,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,6DAA6D,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACxK,CAAC;gBACF,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,8CAA8C,MAAM,CAAC,SAAS,CAAC,EAAE,CAClE,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,gBAAgB,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,CACxB,GAAG,KAAK,CAAC,OAAO,iCAAiC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAC5E,CAAC;gBACF,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACnC,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,SAG5B;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IACE,OAAO;YACP,CAAC,WAAW,CAAC,OAAO,CAAC;YACrB,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,EACtC,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,oEAAoE,MAAM,CAAC,KAAK,CAAC,EAAE,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAqB;QAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO;QACtC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,IACE,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,EAC/D,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,IACE,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,EAC/D,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;YAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3D,CAAC;IAED,mBAAmB,CAAC,KAAY;QAC9B,IAAI,CAAC,yBAAyB,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,qCAAqC;YACnC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC,EAC3C,oCAAoC,CACrC,CAAC;QACF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACrC,CAAC;CACF"}
|
package/dist/pty.d.ts
CHANGED
package/dist/pty.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AA+EA,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,IAAI,CAAA;KAAE,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG;QACvE,OAAO,IAAI,IAAI,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,SAAS,CAAC;AAEhB,eAAO,MAAM,cAAc,EAAE,UAqD5B,CAAC"}
|
package/dist/pty.js
CHANGED
|
@@ -1,8 +1,76 @@
|
|
|
1
|
+
import { accessSync, constants as fsConstants } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
const LINUX_PARENT_DEATH_SIGNAL = "SIGUSR2";
|
|
5
|
+
const LINUX_FORCE_KILL_SIGNAL = "SIGUSR1";
|
|
6
|
+
const LINUX_PTY_GUARDIAN_SCRIPT = [
|
|
7
|
+
"h2a_expected_parent=$1",
|
|
8
|
+
"shift",
|
|
9
|
+
'[ "$PPID" -eq "$h2a_expected_parent" ] || { builtin kill -KILL -- "-$$"; exit 127; }',
|
|
10
|
+
'h2a_forward() { local h2a_signal=$1; trap "" "$h2a_signal"; builtin kill "-$h2a_signal" -- "-$$" 2>/dev/null || :; trap "h2a_forward $h2a_signal" "$h2a_signal"; }',
|
|
11
|
+
'h2a_force() { trap - USR1 USR2; builtin kill -KILL -- "-$$"; }',
|
|
12
|
+
"trap 'h2a_forward HUP' HUP",
|
|
13
|
+
"trap 'h2a_forward INT' INT",
|
|
14
|
+
"trap 'h2a_forward TERM' TERM",
|
|
15
|
+
"trap h2a_force USR1 USR2",
|
|
16
|
+
'"$@" < /dev/tty &',
|
|
17
|
+
"h2a_child=$!",
|
|
18
|
+
"while true; do",
|
|
19
|
+
' wait "$h2a_child"',
|
|
20
|
+
" h2a_status=$?",
|
|
21
|
+
' kill -0 "$h2a_child" 2>/dev/null || exit "$h2a_status"',
|
|
22
|
+
"done",
|
|
23
|
+
].join("\n");
|
|
24
|
+
function linuxSetprivPath() {
|
|
25
|
+
for (const candidate of ["/usr/bin/setpriv", "/bin/setpriv"]) {
|
|
26
|
+
try {
|
|
27
|
+
accessSync(candidate, fsConstants.X_OK);
|
|
28
|
+
return candidate;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Try the next fixed system path. Never resolve this boundary through PATH.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new Error("native terminal PTY crash containment requires util-linux setpriv");
|
|
35
|
+
}
|
|
36
|
+
function linuxBashPath() {
|
|
37
|
+
for (const candidate of ["/bin/bash", "/usr/bin/bash"]) {
|
|
38
|
+
try {
|
|
39
|
+
accessSync(candidate, fsConstants.X_OK);
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Try the next fixed system path. Never resolve this boundary through PATH.
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw new Error("native terminal PTY crash containment requires bash");
|
|
47
|
+
}
|
|
48
|
+
function guardedSpawnCommand(options) {
|
|
49
|
+
if (process.platform !== "linux") {
|
|
50
|
+
return { command: options.command, args: [...options.args] };
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
command: linuxSetprivPath(),
|
|
54
|
+
args: [
|
|
55
|
+
"--pdeathsig",
|
|
56
|
+
LINUX_PARENT_DEATH_SIGNAL,
|
|
57
|
+
"--",
|
|
58
|
+
linuxBashPath(),
|
|
59
|
+
"-c",
|
|
60
|
+
LINUX_PTY_GUARDIAN_SCRIPT,
|
|
61
|
+
"h2a-pty-guardian",
|
|
62
|
+
String(process.pid),
|
|
63
|
+
options.command,
|
|
64
|
+
...options.args,
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
1
68
|
export const nodePtySpawner = (options) => {
|
|
2
69
|
// Lazy load node-pty so test environments without the native binary still
|
|
3
70
|
// import this module — they substitute a stub spawner.
|
|
4
71
|
const pty = require("node-pty");
|
|
5
|
-
const
|
|
72
|
+
const guarded = guardedSpawnCommand(options);
|
|
73
|
+
const proc = pty.spawn(guarded.command, guarded.args, {
|
|
6
74
|
cwd: options.cwd,
|
|
7
75
|
env: options.env,
|
|
8
76
|
cols: options.cols,
|
|
@@ -10,6 +78,9 @@ export const nodePtySpawner = (options) => {
|
|
|
10
78
|
name: "xterm-256color",
|
|
11
79
|
});
|
|
12
80
|
return {
|
|
81
|
+
get pid() {
|
|
82
|
+
return proc.pid;
|
|
83
|
+
},
|
|
13
84
|
get cols() {
|
|
14
85
|
return options.cols;
|
|
15
86
|
},
|
|
@@ -23,7 +94,12 @@ export const nodePtySpawner = (options) => {
|
|
|
23
94
|
proc.resize(cols, rows);
|
|
24
95
|
},
|
|
25
96
|
kill(signal) {
|
|
26
|
-
|
|
97
|
+
if (process.platform === "linux") {
|
|
98
|
+
proc.kill(signal === "SIGKILL" ? LINUX_FORCE_KILL_SIGNAL : signal);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
proc.kill(signal);
|
|
102
|
+
}
|
|
27
103
|
},
|
|
28
104
|
onData(handler) {
|
|
29
105
|
const subscription = proc.onData(handler);
|
package/dist/pty.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAC5C,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAC1C,MAAM,yBAAyB,GAAG;IAChC,wBAAwB;IACxB,OAAO;IACP,sFAAsF;IACtF,oKAAoK;IACpK,gEAAgE;IAChE,4BAA4B;IAC5B,4BAA4B;IAC5B,8BAA8B;IAC9B,0BAA0B;IAC1B,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;IACrB,iBAAiB;IACjB,0DAA0D;IAC1D,MAAM;CACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,gBAAgB;IACvB,KAAK,MAAM,SAAS,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,4EAA4E;QAC9E,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,KAAK,MAAM,SAAS,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,4EAA4E;QAC9E,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAkC;IAI7D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,OAAO,EAAE,gBAAgB,EAAE;QAC3B,IAAI,EAAE;YACJ,aAAa;YACb,yBAAyB;YACzB,IAAI;YACJ,aAAa,EAAE;YACf,IAAI;YACJ,yBAAyB;YACzB,kBAAkB;YAClB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;YACnB,OAAO,CAAC,OAAO;YACf,GAAG,OAAO,CAAC,IAAI;SAChB;KACF,CAAC;AACJ,CAAC;AAwBD,MAAM,CAAC,MAAM,cAAc,GAAe,CAAC,OAAO,EAAE,EAAE;IACpD,0EAA0E;IAC1E,uDAAuD;IAEvD,MAAM,GAAG,GAAmB,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;QACpD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,gBAAgB;KACvB,CAAC,CAAC;IACH,OAAO;QACL,IAAI,GAAG;YACL,OAAO,IAAI,CAAC,GAAG,CAAC;QAClB,CAAC;QACD,IAAI,IAAI;YACN,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI;YACN,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,IAAI;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM;YACT,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CACP,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CACxD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACzC,MAAM,OAAO,GAA0C;oBACrD,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC;gBACF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC9D,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|