@monotykamary/localterm-server 2.15.2 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +31 -8
- package/dist/constants.js.map +1 -1
- package/dist/git-dirty-coordinator.d.ts +16 -0
- package/dist/git-dirty-coordinator.d.ts.map +1 -0
- package/dist/git-dirty-coordinator.js +68 -0
- package/dist/git-dirty-coordinator.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +127 -465
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +2 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/schemas.d.ts +35 -10
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +40 -4
- package/dist/schemas.js.map +1 -1
- package/dist/session-manager.d.ts +103 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +563 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/session.d.ts +5 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +29 -1
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/ws-socket.d.ts +8 -0
- package/dist/utils/ws-socket.d.ts.map +1 -0
- package/dist/utils/ws-socket.js +11 -0
- package/dist/utils/ws-socket.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { MAX_CONCURRENT_SESSIONS, MAX_OUTPUT_BYTES, OUTPUT_BATCH_FLUSH_BYTES, OUTPUT_BATCH_WINDOW_MS, SESSION_GRACE_MS, SESSION_PENDING_PROMOTE_TIMEOUT_MS, WS_BACKPRESSURE_THRESHOLD_BYTES, WS_CLOSE_BACKPRESSURE, WS_OUTBOUND_DRAIN_POLL_MS, WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES, WS_OUTBOUND_RESUME_LOW_WATER_BYTES, WS_READY_STATE_OPEN, } from "./constants.js";
|
|
3
|
+
import { GitDiffWatcher, GIT_DIFF_WATCHER_EVENT_NAMES, } from "./git-diff-watcher.js";
|
|
4
|
+
import { GitDirtyCoordinator } from "./git-dirty-coordinator.js";
|
|
5
|
+
import { Session } from "./session.js";
|
|
6
|
+
import { getBufferedAmount } from "./utils/ws-socket.js";
|
|
7
|
+
// Owns every live PTY for the daemon's lifetime. A Session is created on spawn
|
|
8
|
+
// and stays here until its shell exits, it's explicitly killed, or its
|
|
9
|
+
// no-clients grace timer fires — NOT the instant its client disconnects. One
|
|
10
|
+
// authority (the tab that spawned it) keeps a shell alive by subscribing;
|
|
11
|
+
// others join alongside via the session picker. When the last subscriber
|
|
12
|
+
// leaves, the shell gets SESSION_GRACE_MS to be re-attached (a transient drop,
|
|
13
|
+
// a switch in progress) before it's reaped — so there are no zombies, but a
|
|
14
|
+
// shell also survives the brief disconnects that a single-WS-per-PTY model
|
|
15
|
+
// would kill mid-command. Any number of clients may attach to one PTY;
|
|
16
|
+
// output/title/cwd/foreground/exit fan out to all of them, resize is the min
|
|
17
|
+
// dimensions across attached clients (tmux style, so two clients of different
|
|
18
|
+
// sizes don't fight), and a slow receiver pauses the PTY via OS pipe
|
|
19
|
+
// backpressure instead of dropping the connection.
|
|
20
|
+
export class SessionManager {
|
|
21
|
+
sessions = new Map();
|
|
22
|
+
wsToClient = new Map();
|
|
23
|
+
lastOutputAtByPid = new Map();
|
|
24
|
+
coordinatorsByCwd = new Map();
|
|
25
|
+
hooks;
|
|
26
|
+
sendControl;
|
|
27
|
+
graceMs;
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.hooks = options.hooks;
|
|
30
|
+
this.sendControl = options.sendControl;
|
|
31
|
+
this.graceMs = options.graceMs ?? SESSION_GRACE_MS;
|
|
32
|
+
}
|
|
33
|
+
size() {
|
|
34
|
+
return this.sessions.size;
|
|
35
|
+
}
|
|
36
|
+
atCapacity() {
|
|
37
|
+
if (this.sessions.size < MAX_CONCURRENT_SESSIONS)
|
|
38
|
+
return false;
|
|
39
|
+
for (const managed of this.sessions.values()) {
|
|
40
|
+
if (managed.clients.size === 0)
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
// Shell pids of every live session. The keep-awake manager scopes its `ps`
|
|
46
|
+
// tree walk to these so automatic mode only reacts to programs running inside
|
|
47
|
+
// localterm, not anything else on the machine.
|
|
48
|
+
pids() {
|
|
49
|
+
return [...this.sessions.values()].map((managed) => managed.session.pid);
|
|
50
|
+
}
|
|
51
|
+
noteOutput(pid) {
|
|
52
|
+
this.lastOutputAtByPid.set(pid, Date.now());
|
|
53
|
+
}
|
|
54
|
+
hasRecentOutput(pids, withinMs) {
|
|
55
|
+
const cutoff = Date.now() - withinMs;
|
|
56
|
+
for (const pid of pids) {
|
|
57
|
+
const at = this.lastOutputAtByPid.get(pid);
|
|
58
|
+
if (at !== undefined && at >= cutoff)
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
list() {
|
|
64
|
+
return [...this.sessions.values()].map((managed) => ({
|
|
65
|
+
id: managed.id,
|
|
66
|
+
pid: managed.session.pid,
|
|
67
|
+
shell: managed.session.shell,
|
|
68
|
+
shellName: managed.session.shellBaseName,
|
|
69
|
+
cwd: managed.session.lastEmittedCwd || managed.session.cwd,
|
|
70
|
+
title: managed.session.currentTitle || managed.session.initialDocumentTitle,
|
|
71
|
+
createdAt: managed.createdAt,
|
|
72
|
+
clients: managed.clients.size,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
spawn(input, automation) {
|
|
76
|
+
if (this.sessions.size >= MAX_CONCURRENT_SESSIONS)
|
|
77
|
+
this.evictOldestDormant();
|
|
78
|
+
if (this.sessions.size >= MAX_CONCURRENT_SESSIONS)
|
|
79
|
+
return null;
|
|
80
|
+
const session = new Session(input);
|
|
81
|
+
const managed = {
|
|
82
|
+
session,
|
|
83
|
+
id: session.id,
|
|
84
|
+
createdAt: session.createdAt,
|
|
85
|
+
clients: new Set(),
|
|
86
|
+
automation: automation ?? null,
|
|
87
|
+
outputBatch: "",
|
|
88
|
+
outputBatchTimer: null,
|
|
89
|
+
drainPollTimer: null,
|
|
90
|
+
gitWatcher: new GitDiffWatcher(),
|
|
91
|
+
graceTimer: null,
|
|
92
|
+
parkedAt: null,
|
|
93
|
+
};
|
|
94
|
+
this.sessions.set(managed.id, managed);
|
|
95
|
+
this.installSessionListeners(managed);
|
|
96
|
+
this.hooks.onSessionActivity();
|
|
97
|
+
return managed;
|
|
98
|
+
}
|
|
99
|
+
// Spawn a fresh PTY and attach `ws` to it in one step. The route layer's
|
|
100
|
+
// common path (a tab with no `?sid=`). Returns null only when the cap is full
|
|
101
|
+
// with no dormant session to evict — the caller closes the WS with the
|
|
102
|
+
// capacity code.
|
|
103
|
+
spawnAndAttach(ws, input, automation) {
|
|
104
|
+
const spawned = this.spawn(input, automation);
|
|
105
|
+
if (!spawned)
|
|
106
|
+
return null;
|
|
107
|
+
return this.attach(ws, spawned.id);
|
|
108
|
+
}
|
|
109
|
+
// Attach `ws` to a live PTY by id. Returns the session to reattach to, or
|
|
110
|
+
// null when the id is unknown / already exited — the caller spawns fresh.
|
|
111
|
+
attach(ws, id) {
|
|
112
|
+
const managed = this.sessions.get(id);
|
|
113
|
+
if (!managed || managed.session.isExited)
|
|
114
|
+
return null;
|
|
115
|
+
// Re-subscribing cancels the no-clients grace timer (if armed): the shell
|
|
116
|
+
// has a viewer again, so it stays alive.
|
|
117
|
+
this.cancelGrace(managed);
|
|
118
|
+
const coordinator = this.coordinatorForCwd(managed.session.cwd);
|
|
119
|
+
const client = {
|
|
120
|
+
ws,
|
|
121
|
+
pending: true,
|
|
122
|
+
pendingControl: [],
|
|
123
|
+
pendingBytes: [],
|
|
124
|
+
pendingTimer: null,
|
|
125
|
+
cols: 0,
|
|
126
|
+
rows: 0,
|
|
127
|
+
coordinator,
|
|
128
|
+
};
|
|
129
|
+
coordinator.add(ws);
|
|
130
|
+
managed.clients.add(client);
|
|
131
|
+
this.wsToClient.set(ws, { client, session: managed });
|
|
132
|
+
this.recomputeResize(managed);
|
|
133
|
+
// Auto-promote a client that never sends {type:"ready"} — a back-compat
|
|
134
|
+
// client (an older bundled terminal, or any plain WS reader) would otherwise
|
|
135
|
+
// stay pending and never receive output. The localterm client sends ready
|
|
136
|
+
// within milliseconds of the session frame, well before this fires, so its
|
|
137
|
+
// scrollback replay still lands first.
|
|
138
|
+
client.pendingTimer = setTimeout(() => this.promote(ws, false), SESSION_PENDING_PROMOTE_TIMEOUT_MS);
|
|
139
|
+
client.pendingTimer.unref?.();
|
|
140
|
+
this.hooks.onSessionActivity();
|
|
141
|
+
return managed;
|
|
142
|
+
}
|
|
143
|
+
// Promote a pending client to live fan-out. Idempotent (a no-op once the
|
|
144
|
+
// client is already live), so the pending timeout and an explicit {ready}
|
|
145
|
+
// can race safely. When `replay` is true the session's scrollback ring
|
|
146
|
+
// buffer is sent as one binary frame first, then the control messages and
|
|
147
|
+
// output bytes buffered while pending flush in order — so a tab switching
|
|
148
|
+
// to this PTY lands on recent output instead of a blank screen, with no
|
|
149
|
+
// live frame interleaving between replay and the buffered fan-out.
|
|
150
|
+
promote(ws, replay) {
|
|
151
|
+
const entry = this.wsToClient.get(ws);
|
|
152
|
+
if (!entry)
|
|
153
|
+
return;
|
|
154
|
+
const client = entry.client;
|
|
155
|
+
if (!client.pending)
|
|
156
|
+
return;
|
|
157
|
+
if (client.pendingTimer !== null) {
|
|
158
|
+
clearTimeout(client.pendingTimer);
|
|
159
|
+
client.pendingTimer = null;
|
|
160
|
+
}
|
|
161
|
+
if (replay)
|
|
162
|
+
this.sendScrollback(ws, entry.session);
|
|
163
|
+
for (const payload of client.pendingControl)
|
|
164
|
+
this.sendControl(ws, payload);
|
|
165
|
+
for (const bytes of client.pendingBytes)
|
|
166
|
+
this.sendOutputBytes(ws, bytes);
|
|
167
|
+
client.pendingControl = [];
|
|
168
|
+
client.pendingBytes = [];
|
|
169
|
+
client.pending = false;
|
|
170
|
+
}
|
|
171
|
+
writeInput(ws, data) {
|
|
172
|
+
const entry = this.wsToClient.get(ws);
|
|
173
|
+
if (!entry)
|
|
174
|
+
return;
|
|
175
|
+
// A client sending input is clearly live and wants output. Promote it out
|
|
176
|
+
// of the pending hold without a scrollback replay — a back-compat client
|
|
177
|
+
// that never sends {type:"ready"} still unblocks on its first keystroke.
|
|
178
|
+
// The localterm client sends {type:"ready"} before any input, so this is a
|
|
179
|
+
// no-op for it. Promote flushes any buffered output before the input echoes.
|
|
180
|
+
if (entry.client.pending)
|
|
181
|
+
this.promote(ws, false);
|
|
182
|
+
entry.session.session.write(data);
|
|
183
|
+
}
|
|
184
|
+
resize(ws, cols, rows, pixelWidth, pixelHeight) {
|
|
185
|
+
const entry = this.wsToClient.get(ws);
|
|
186
|
+
if (!entry)
|
|
187
|
+
return;
|
|
188
|
+
entry.client.cols = cols;
|
|
189
|
+
entry.client.rows = rows;
|
|
190
|
+
entry.client.pixelWidth = pixelWidth;
|
|
191
|
+
entry.client.pixelHeight = pixelHeight;
|
|
192
|
+
this.recomputeResize(entry.session);
|
|
193
|
+
}
|
|
194
|
+
// Detach a single client. If this was the last subscriber, arm the
|
|
195
|
+
// no-clients grace timer: the PTY stays alive for SESSION_GRACE_MS so a
|
|
196
|
+
// transient drop or a switch can re-attach, then is reaped if nobody does.
|
|
197
|
+
detach(ws) {
|
|
198
|
+
const entry = this.wsToClient.get(ws);
|
|
199
|
+
if (!entry)
|
|
200
|
+
return;
|
|
201
|
+
this.wsToClient.delete(ws);
|
|
202
|
+
const managed = entry.session;
|
|
203
|
+
const client = entry.client;
|
|
204
|
+
if (client.pendingTimer !== null) {
|
|
205
|
+
clearTimeout(client.pendingTimer);
|
|
206
|
+
client.pendingTimer = null;
|
|
207
|
+
}
|
|
208
|
+
client.pendingControl = [];
|
|
209
|
+
client.pendingBytes = [];
|
|
210
|
+
if (client.coordinator) {
|
|
211
|
+
client.coordinator.remove(ws);
|
|
212
|
+
this.releaseCoordinator(client.coordinator);
|
|
213
|
+
}
|
|
214
|
+
managed.clients.delete(client);
|
|
215
|
+
this.recomputeResize(managed);
|
|
216
|
+
if (managed.clients.size === 0 && !managed.session.isExited)
|
|
217
|
+
this.startGrace(managed);
|
|
218
|
+
this.hooks.onSessionActivity();
|
|
219
|
+
}
|
|
220
|
+
kill(id) {
|
|
221
|
+
const managed = this.sessions.get(id);
|
|
222
|
+
if (!managed)
|
|
223
|
+
return false;
|
|
224
|
+
for (const client of managed.clients) {
|
|
225
|
+
this.hooks.onClientExit(client.ws, null);
|
|
226
|
+
this.sendControl(client.ws, { type: "exit", code: null });
|
|
227
|
+
try {
|
|
228
|
+
client.ws.close();
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
/* already closing */
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
this.tearDown(managed);
|
|
235
|
+
this.hooks.onSessionActivity();
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
disposeAll() {
|
|
239
|
+
for (const managed of [...this.sessions.values()])
|
|
240
|
+
this.tearDown(managed);
|
|
241
|
+
this.coordinatorsByCwd.clear();
|
|
242
|
+
this.lastOutputAtByPid.clear();
|
|
243
|
+
}
|
|
244
|
+
sendScrollback(ws, managed) {
|
|
245
|
+
const snapshot = managed.session.snapshotScrollback();
|
|
246
|
+
if (!snapshot)
|
|
247
|
+
return;
|
|
248
|
+
const bytes = Buffer.from(snapshot, "utf8");
|
|
249
|
+
if (bytes.byteLength <= MAX_OUTPUT_BYTES) {
|
|
250
|
+
this.sendOutputBytes(ws, bytes);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
for (let offset = 0; offset < bytes.byteLength; offset += MAX_OUTPUT_BYTES) {
|
|
254
|
+
this.sendOutputBytes(ws, bytes.subarray(offset, offset + MAX_OUTPUT_BYTES));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
sendOutputBytes(ws, bytes) {
|
|
258
|
+
if (ws.readyState !== WS_READY_STATE_OPEN)
|
|
259
|
+
return;
|
|
260
|
+
if (getBufferedAmount(ws) > WS_BACKPRESSURE_THRESHOLD_BYTES) {
|
|
261
|
+
ws.close(WS_CLOSE_BACKPRESSURE, "backpressure");
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
ws.send(bytes);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
/* socket closed between readyState check and send */
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
broadcastBytes(managed, bytes) {
|
|
272
|
+
for (const client of managed.clients) {
|
|
273
|
+
if (client.pending) {
|
|
274
|
+
client.pendingBytes.push(bytes);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
this.sendOutputBytes(client.ws, bytes);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
broadcast(managed, payload) {
|
|
281
|
+
for (const client of managed.clients) {
|
|
282
|
+
if (client.pending) {
|
|
283
|
+
client.pendingControl.push(payload);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
this.sendControl(client.ws, payload);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
onSessionOutput(managed, data) {
|
|
290
|
+
managed.outputBatch += data;
|
|
291
|
+
this.noteOutput(managed.session.pid);
|
|
292
|
+
this.hooks.onOutputActivity();
|
|
293
|
+
if (managed.outputBatch.length >= OUTPUT_BATCH_FLUSH_BYTES) {
|
|
294
|
+
if (managed.outputBatchTimer !== null) {
|
|
295
|
+
clearTimeout(managed.outputBatchTimer);
|
|
296
|
+
managed.outputBatchTimer = null;
|
|
297
|
+
}
|
|
298
|
+
this.flushOutput(managed);
|
|
299
|
+
}
|
|
300
|
+
else if (managed.outputBatchTimer === null) {
|
|
301
|
+
managed.outputBatchTimer = setTimeout(() => {
|
|
302
|
+
managed.outputBatchTimer = null;
|
|
303
|
+
this.flushOutput(managed);
|
|
304
|
+
}, OUTPUT_BATCH_WINDOW_MS);
|
|
305
|
+
managed.outputBatchTimer.unref?.();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
flushOutput(managed) {
|
|
309
|
+
const batch = managed.outputBatch;
|
|
310
|
+
managed.outputBatch = "";
|
|
311
|
+
if (!batch)
|
|
312
|
+
return;
|
|
313
|
+
const bytes = Buffer.from(batch, "utf8");
|
|
314
|
+
if (bytes.byteLength <= MAX_OUTPUT_BYTES) {
|
|
315
|
+
this.broadcastBytes(managed, bytes);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
for (let offset = 0; offset < bytes.byteLength; offset += MAX_OUTPUT_BYTES) {
|
|
319
|
+
this.broadcastBytes(managed, bytes.subarray(offset, offset + MAX_OUTPUT_BYTES));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
this.maybePauseAfterFlush(managed);
|
|
323
|
+
}
|
|
324
|
+
maybePauseAfterFlush(managed) {
|
|
325
|
+
if (managed.session.isPaused)
|
|
326
|
+
return;
|
|
327
|
+
for (const client of managed.clients) {
|
|
328
|
+
if (client.pending)
|
|
329
|
+
continue;
|
|
330
|
+
if (getBufferedAmount(client.ws) >= WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES) {
|
|
331
|
+
managed.session.pause();
|
|
332
|
+
this.ensureDrainPoll(managed);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
ensureDrainPoll(managed) {
|
|
338
|
+
if (managed.drainPollTimer !== null)
|
|
339
|
+
return;
|
|
340
|
+
managed.drainPollTimer = setInterval(() => {
|
|
341
|
+
if (!managed.session.isPaused) {
|
|
342
|
+
this.stopDrainPoll(managed);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
let allLow = true;
|
|
346
|
+
for (const client of managed.clients) {
|
|
347
|
+
if (client.pending)
|
|
348
|
+
continue;
|
|
349
|
+
if (getBufferedAmount(client.ws) > WS_OUTBOUND_RESUME_LOW_WATER_BYTES) {
|
|
350
|
+
allLow = false;
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (allLow) {
|
|
355
|
+
managed.session.resume();
|
|
356
|
+
this.stopDrainPoll(managed);
|
|
357
|
+
}
|
|
358
|
+
}, WS_OUTBOUND_DRAIN_POLL_MS);
|
|
359
|
+
managed.drainPollTimer.unref?.();
|
|
360
|
+
}
|
|
361
|
+
stopDrainPoll(managed) {
|
|
362
|
+
if (managed.drainPollTimer === null)
|
|
363
|
+
return;
|
|
364
|
+
clearInterval(managed.drainPollTimer);
|
|
365
|
+
managed.drainPollTimer = null;
|
|
366
|
+
}
|
|
367
|
+
recomputeResize(managed) {
|
|
368
|
+
const session = managed.session;
|
|
369
|
+
if (session.isExited)
|
|
370
|
+
return;
|
|
371
|
+
let cols = Infinity;
|
|
372
|
+
let rows = Infinity;
|
|
373
|
+
let single = null;
|
|
374
|
+
let count = 0;
|
|
375
|
+
for (const client of managed.clients) {
|
|
376
|
+
count++;
|
|
377
|
+
single = client;
|
|
378
|
+
if (client.cols > 0 && client.cols < cols)
|
|
379
|
+
cols = client.cols;
|
|
380
|
+
if (client.rows > 0 && client.rows < rows)
|
|
381
|
+
rows = client.rows;
|
|
382
|
+
}
|
|
383
|
+
if (count === 0)
|
|
384
|
+
return;
|
|
385
|
+
if (!Number.isFinite(cols) || !Number.isFinite(rows))
|
|
386
|
+
return;
|
|
387
|
+
if (count === 1 && single?.pixelWidth !== undefined && single?.pixelHeight !== undefined) {
|
|
388
|
+
session.resize(cols, rows, single.pixelWidth, single.pixelHeight);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
session.resize(cols, rows);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
installSessionListeners(managed) {
|
|
395
|
+
const session = managed.session;
|
|
396
|
+
session.on("output", (data) => this.onSessionOutput(managed, data));
|
|
397
|
+
session.on("title", (title) => this.broadcast(managed, { type: "title", title }));
|
|
398
|
+
session.on("cwd", (cwd) => {
|
|
399
|
+
this.broadcast(managed, { type: "cwd", cwd });
|
|
400
|
+
managed.gitWatcher.stop();
|
|
401
|
+
managed.gitWatcher.start(cwd);
|
|
402
|
+
for (const client of managed.clients)
|
|
403
|
+
this.moveClientCoordinator(client, cwd);
|
|
404
|
+
if (!managed.automation)
|
|
405
|
+
this.hooks.onSessionEvent("cwd", cwd);
|
|
406
|
+
});
|
|
407
|
+
session.on("foreground", (process) => {
|
|
408
|
+
this.broadcast(managed, { type: "foreground", process });
|
|
409
|
+
this.hooks.onSessionActivity();
|
|
410
|
+
if (!managed.automation && session.lastEmittedCwd) {
|
|
411
|
+
this.hooks.onSessionEvent("foreground", session.lastEmittedCwd);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
session.on("notification", (body) => {
|
|
415
|
+
this.broadcast(managed, { type: "notification", body });
|
|
416
|
+
if (!managed.automation && session.lastEmittedCwd) {
|
|
417
|
+
this.hooks.onSessionEvent("notification", session.lastEmittedCwd);
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
session.on("git-dirty", () => {
|
|
421
|
+
const cwd = session.lastEmittedCwd;
|
|
422
|
+
if (cwd)
|
|
423
|
+
this.coordinatorForCwd(cwd).signal();
|
|
424
|
+
if (!managed.automation && cwd)
|
|
425
|
+
this.hooks.onSessionEvent("git-dirty", cwd);
|
|
426
|
+
});
|
|
427
|
+
session.on("exit", (code) => this.handleExit(managed, code));
|
|
428
|
+
const automation = managed.automation;
|
|
429
|
+
if (automation) {
|
|
430
|
+
session.on("automation-exit", (exitCode) => this.hooks.onAutomationExit(automation.automationId, automation.runId, exitCode));
|
|
431
|
+
}
|
|
432
|
+
managed.gitWatcher.on("git-dirty", () => {
|
|
433
|
+
const cwd = session.lastEmittedCwd;
|
|
434
|
+
if (cwd)
|
|
435
|
+
this.coordinatorForCwd(cwd).signal();
|
|
436
|
+
});
|
|
437
|
+
for (const refEvent of GIT_DIFF_WATCHER_EVENT_NAMES) {
|
|
438
|
+
if (refEvent === "git-dirty")
|
|
439
|
+
continue;
|
|
440
|
+
const eventName = refEvent;
|
|
441
|
+
managed.gitWatcher.on(eventName, () => {
|
|
442
|
+
if (!managed.automation && session.lastEmittedCwd) {
|
|
443
|
+
this.hooks.onSessionEvent(eventName, session.lastEmittedCwd);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
managed.gitWatcher.start(session.cwd);
|
|
448
|
+
}
|
|
449
|
+
moveClientCoordinator(client, cwd) {
|
|
450
|
+
const next = this.coordinatorForCwd(cwd);
|
|
451
|
+
if (client.coordinator === next)
|
|
452
|
+
return;
|
|
453
|
+
if (client.coordinator) {
|
|
454
|
+
client.coordinator.remove(client.ws);
|
|
455
|
+
this.releaseCoordinator(client.coordinator);
|
|
456
|
+
}
|
|
457
|
+
client.coordinator = next;
|
|
458
|
+
next.add(client.ws);
|
|
459
|
+
}
|
|
460
|
+
handleExit(managed, code) {
|
|
461
|
+
this.flushOutput(managed);
|
|
462
|
+
for (const client of managed.clients) {
|
|
463
|
+
this.hooks.onClientExit(client.ws, code);
|
|
464
|
+
this.sendControl(client.ws, { type: "exit", code });
|
|
465
|
+
try {
|
|
466
|
+
client.ws.close();
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
/* already closing */
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
if (!managed.automation && managed.session.lastEmittedCwd) {
|
|
473
|
+
this.hooks.onSessionEvent("exit", managed.session.lastEmittedCwd);
|
|
474
|
+
}
|
|
475
|
+
this.tearDown(managed);
|
|
476
|
+
this.hooks.onSessionActivity();
|
|
477
|
+
}
|
|
478
|
+
tearDown(managed) {
|
|
479
|
+
if (managed.graceTimer !== null) {
|
|
480
|
+
clearTimeout(managed.graceTimer);
|
|
481
|
+
managed.graceTimer = null;
|
|
482
|
+
}
|
|
483
|
+
managed.parkedAt = null;
|
|
484
|
+
if (managed.outputBatchTimer !== null) {
|
|
485
|
+
clearTimeout(managed.outputBatchTimer);
|
|
486
|
+
managed.outputBatchTimer = null;
|
|
487
|
+
}
|
|
488
|
+
this.stopDrainPoll(managed);
|
|
489
|
+
managed.gitWatcher.dispose();
|
|
490
|
+
for (const client of managed.clients) {
|
|
491
|
+
if (client.pendingTimer !== null) {
|
|
492
|
+
clearTimeout(client.pendingTimer);
|
|
493
|
+
client.pendingTimer = null;
|
|
494
|
+
}
|
|
495
|
+
client.pendingControl = [];
|
|
496
|
+
client.pendingBytes = [];
|
|
497
|
+
if (client.coordinator) {
|
|
498
|
+
client.coordinator.remove(client.ws);
|
|
499
|
+
this.releaseCoordinator(client.coordinator);
|
|
500
|
+
}
|
|
501
|
+
this.wsToClient.delete(client.ws);
|
|
502
|
+
}
|
|
503
|
+
managed.clients.clear();
|
|
504
|
+
this.sessions.delete(managed.id);
|
|
505
|
+
this.lastOutputAtByPid.delete(managed.session.pid);
|
|
506
|
+
try {
|
|
507
|
+
managed.session.dispose();
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
/* already torn down */
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
evictOldestDormant() {
|
|
514
|
+
let oldest = null;
|
|
515
|
+
let oldestKey = Infinity;
|
|
516
|
+
for (const managed of this.sessions.values()) {
|
|
517
|
+
if (managed.clients.size > 0)
|
|
518
|
+
continue;
|
|
519
|
+
// Evict the parked session whose grace fires soonest (armed earliest); a
|
|
520
|
+
// parked session with no timer is a fresh spawn nobody attached yet —
|
|
521
|
+
// yield it only after all armed ones.
|
|
522
|
+
const key = managed.parkedAt ?? managed.createdAt;
|
|
523
|
+
if (key < oldestKey) {
|
|
524
|
+
oldestKey = key;
|
|
525
|
+
oldest = managed;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
if (oldest)
|
|
529
|
+
this.tearDown(oldest);
|
|
530
|
+
}
|
|
531
|
+
startGrace(managed) {
|
|
532
|
+
this.cancelGrace(managed);
|
|
533
|
+
managed.parkedAt = Date.now();
|
|
534
|
+
managed.graceTimer = setTimeout(() => {
|
|
535
|
+
managed.graceTimer = null;
|
|
536
|
+
managed.parkedAt = null;
|
|
537
|
+
this.tearDown(managed);
|
|
538
|
+
this.hooks.onSessionActivity();
|
|
539
|
+
}, this.graceMs);
|
|
540
|
+
managed.graceTimer.unref?.();
|
|
541
|
+
}
|
|
542
|
+
cancelGrace(managed) {
|
|
543
|
+
if (managed.graceTimer !== null) {
|
|
544
|
+
clearTimeout(managed.graceTimer);
|
|
545
|
+
managed.graceTimer = null;
|
|
546
|
+
}
|
|
547
|
+
managed.parkedAt = null;
|
|
548
|
+
}
|
|
549
|
+
coordinatorForCwd(cwd) {
|
|
550
|
+
const key = path.resolve(cwd);
|
|
551
|
+
let coordinator = this.coordinatorsByCwd.get(key);
|
|
552
|
+
if (!coordinator) {
|
|
553
|
+
coordinator = new GitDirtyCoordinator(key, this.sendControl);
|
|
554
|
+
this.coordinatorsByCwd.set(key, coordinator);
|
|
555
|
+
}
|
|
556
|
+
return coordinator;
|
|
557
|
+
}
|
|
558
|
+
releaseCoordinator(coordinator) {
|
|
559
|
+
if (coordinator.isEmpty)
|
|
560
|
+
this.coordinatorsByCwd.delete(coordinator.cwd);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare class Session extends EventEmitter<SessionEvents> {
|
|
|
14
14
|
readonly shell: string;
|
|
15
15
|
readonly cwd: string;
|
|
16
16
|
readonly createdAt: number;
|
|
17
|
+
readonly id: string;
|
|
17
18
|
private readonly pty;
|
|
18
19
|
private readonly shellName;
|
|
19
20
|
private currentCols;
|
|
@@ -27,6 +28,8 @@ export declare class Session extends EventEmitter<SessionEvents> {
|
|
|
27
28
|
private pixelResizeSupported;
|
|
28
29
|
private hookCleanupPaths;
|
|
29
30
|
private pendingParse;
|
|
31
|
+
private readonly scrollbackChunks;
|
|
32
|
+
private scrollbackBytes;
|
|
30
33
|
private readonly foregroundWatcher;
|
|
31
34
|
private readonly reportInitialCommandExit;
|
|
32
35
|
private hasEmittedAutomationExit;
|
|
@@ -46,6 +49,8 @@ export declare class Session extends EventEmitter<SessionEvents> {
|
|
|
46
49
|
resize(cols: number, rows: number, pixelWidth?: number, pixelHeight?: number): void;
|
|
47
50
|
kill(signal?: NodeJS.Signals): void;
|
|
48
51
|
dispose(): void;
|
|
52
|
+
snapshotScrollback(): string;
|
|
53
|
+
private appendScrollback;
|
|
49
54
|
private emitInitialMetadata;
|
|
50
55
|
private onPtyOutput;
|
|
51
56
|
private hasIncompleteOsc;
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|