green-screen-proxy 1.3.8 → 1.4.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.
Files changed (54) hide show
  1. package/dist/controller.d.ts +14 -2
  2. package/dist/controller.d.ts.map +1 -1
  3. package/dist/controller.js +19 -0
  4. package/dist/controller.js.map +1 -1
  5. package/dist/protocols/tn5250-handler.d.ts +12 -0
  6. package/dist/protocols/tn5250-handler.d.ts.map +1 -1
  7. package/dist/protocols/tn5250-handler.js +27 -1
  8. package/dist/protocols/tn5250-handler.js.map +1 -1
  9. package/dist/protocols/types.d.ts +30 -1
  10. package/dist/protocols/types.d.ts.map +1 -1
  11. package/dist/protocols/types.js +26 -0
  12. package/dist/protocols/types.js.map +1 -1
  13. package/dist/routes.d.ts.map +1 -1
  14. package/dist/routes.js +229 -60
  15. package/dist/routes.js.map +1 -1
  16. package/dist/session-keys.d.ts +16 -0
  17. package/dist/session-keys.d.ts.map +1 -0
  18. package/dist/session-keys.js +77 -0
  19. package/dist/session-keys.js.map +1 -0
  20. package/dist/session.d.ts +71 -2
  21. package/dist/session.d.ts.map +1 -1
  22. package/dist/session.js +198 -7
  23. package/dist/session.js.map +1 -1
  24. package/dist/structural-signature.d.ts +18 -0
  25. package/dist/structural-signature.d.ts.map +1 -0
  26. package/dist/structural-signature.js +73 -0
  27. package/dist/structural-signature.js.map +1 -0
  28. package/dist/tn5250/connection.d.ts +29 -1
  29. package/dist/tn5250/connection.d.ts.map +1 -1
  30. package/dist/tn5250/connection.js +74 -4
  31. package/dist/tn5250/connection.js.map +1 -1
  32. package/dist/tn5250/constants.d.ts.map +1 -1
  33. package/dist/tn5250/constants.js +14 -7
  34. package/dist/tn5250/constants.js.map +1 -1
  35. package/dist/tn5250/ebcdic.d.ts +15 -3
  36. package/dist/tn5250/ebcdic.d.ts.map +1 -1
  37. package/dist/tn5250/ebcdic.js +63 -3
  38. package/dist/tn5250/ebcdic.js.map +1 -1
  39. package/dist/tn5250/parser.d.ts.map +1 -1
  40. package/dist/tn5250/parser.js +30 -11
  41. package/dist/tn5250/parser.js.map +1 -1
  42. package/dist/tn5250/screen-id.d.ts +26 -0
  43. package/dist/tn5250/screen-id.d.ts.map +1 -0
  44. package/dist/tn5250/screen-id.js +183 -0
  45. package/dist/tn5250/screen-id.js.map +1 -0
  46. package/dist/tn5250/screen.d.ts +13 -11
  47. package/dist/tn5250/screen.d.ts.map +1 -1
  48. package/dist/tn5250/screen.js +76 -18
  49. package/dist/tn5250/screen.js.map +1 -1
  50. package/dist/websocket.d.ts +10 -0
  51. package/dist/websocket.d.ts.map +1 -1
  52. package/dist/websocket.js +110 -12
  53. package/dist/websocket.js.map +1 -1
  54. package/package.json +1 -1
package/dist/routes.js CHANGED
@@ -1,72 +1,156 @@
1
1
  import { Router } from 'express';
2
- import { createSession, getSession, getDefaultSession, getAllSessions, destroySession, gracefullyDestroySession, } from './session.js';
2
+ import { createSession, getSession, getDefaultSession, getAllSessions, gracefullyDestroySession, } from './session.js';
3
3
  import { TN5250Handler } from './protocols/index.js';
4
- import { broadcastScreenToSession, destroyWsSession } from './websocket.js';
4
+ import { broadcastScreenToSession, cancelOrphanReapOnRestActivity, destroyWsSession, } from './websocket.js';
5
+ import { getKeyedSessionId, bindKey, withKeyLock } from './session-keys.js';
5
6
  const router = Router();
6
- /** Resolve session from header, query param, or default. Resets idle timer on access. */
7
+ /** Build the success payload for a connected session: its id, whether it was
8
+ * reused (vs freshly opened), the host's signed-on state, and the current
9
+ * screen. ``authenticated`` lets a connect-by-key caller tell "the proxy
10
+ * re-handed-me the existing signed-on session" from "I need to drive
11
+ * post-sign-on myself". */
12
+ function sessionConnectPayload(session, reused) {
13
+ return {
14
+ success: true,
15
+ sessionId: session.id,
16
+ reused,
17
+ authenticated: session.status.status === 'authenticated',
18
+ ...session.getScreenData(),
19
+ };
20
+ }
21
+ /** Create a session and open its TCP connection (no sign-on). */
22
+ async function freshConnectSession(opts) {
23
+ const session = createSession(opts.protocol);
24
+ console.log(`[connect] Created session ${session.id.slice(0, 8)} for ${opts.host}:${opts.port}`);
25
+ if (typeof opts.screenTimeout === 'number' && opts.screenTimeout > 0) {
26
+ session.screenTimeout = opts.screenTimeout;
27
+ }
28
+ const connectOptions = {};
29
+ if (opts.terminalType)
30
+ connectOptions.terminalType = opts.terminalType;
31
+ if (opts.codePage)
32
+ connectOptions.codePage = opts.codePage;
33
+ if (typeof opts.connectTimeout === 'number' && opts.connectTimeout > 0)
34
+ connectOptions.connectTimeout = opts.connectTimeout;
35
+ if (opts.deviceName)
36
+ connectOptions.deviceName = opts.deviceName;
37
+ if (opts.autoReconnect)
38
+ connectOptions.autoReconnect = true;
39
+ await session.connect(opts.host, opts.port, Object.keys(connectOptions).length > 0 ? connectOptions : undefined);
40
+ return session;
41
+ }
42
+ /** Auto-sign-on if credentials were supplied and the session isn't already
43
+ * authenticated (the reuse path may hand back an already-signed-on session).
44
+ * Mirrors the legacy inline behaviour: failed sign-on leaves status as
45
+ * 'connected' so the screen (with its CPF error) still reaches the caller. */
46
+ async function ensureSignedOn(session, username, password) {
47
+ if (!username || !password) {
48
+ // No creds — give the host a beat to paint the initial screen.
49
+ await new Promise((r) => setTimeout(r, session.screenTimeout));
50
+ return;
51
+ }
52
+ if (session.status.status === 'authenticated')
53
+ return;
54
+ if (!(session.handler instanceof TN5250Handler))
55
+ return;
56
+ const result = await session.handler.performAutoSignIn(username, password);
57
+ if (result?.authenticated)
58
+ session.markAuthenticated(username);
59
+ }
60
+ /** Resolve session from header, query param, or default. Resets idle
61
+ * timer on access AND cancels any pending orphan-reap — REST activity
62
+ * proves the client is still around, even if its WebSocket dropped. */
7
63
  function resolveSession(req) {
8
64
  const sessionId = req.headers['x-session-id'] ||
9
65
  req.query.sessionId;
10
66
  const session = sessionId ? getSession(sessionId) : getDefaultSession();
11
- if (session)
67
+ if (session) {
12
68
  session.touch();
69
+ cancelOrphanReapOnRestActivity(session.id);
70
+ }
13
71
  return session;
14
72
  }
73
+ /** Delay between keystrokes when typing a field char-by-char. */
74
+ const KEYSTROKE_DELAY_MS = 15;
75
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
76
+ /**
77
+ * Type `text` into the current field one character at a time, broadcasting a
78
+ * screen frame after each keystroke so WS-attached dashboards render genuine
79
+ * per-keystroke "typing" instead of the whole value snapping in at once.
80
+ *
81
+ * The cursor/field is validated per character: `sendText` (→ `insertText`)
82
+ * returns false at a non-writable position, so a misplaced cursor fails fast
83
+ * and the caller can abort the batch rather than silently dropping the value.
84
+ * Keystrokes are KEYSTROKE_DELAY_MS apart with no trailing delay.
85
+ *
86
+ * Returns false if a character could not be written (nothing more is typed).
87
+ */
88
+ async function typeTextAnimated(session, text) {
89
+ const chars = [...text];
90
+ for (let i = 0; i < chars.length; i++) {
91
+ const ok = session.sendText(chars[i]);
92
+ if (!ok)
93
+ return false;
94
+ broadcastScreenToSession(session.id, session.getScreenData());
95
+ if (i < chars.length - 1)
96
+ await delay(KEYSTROKE_DELAY_MS);
97
+ }
98
+ return true;
99
+ }
15
100
  // POST /connect
16
101
  router.post('/connect', async (req, res) => {
17
102
  try {
18
- const { host = 'pub400.com', port = 23, protocol = 'tn5250', terminalType, screenTimeout, connectTimeout, username, password } = req.body || {};
19
- // Destroy only the caller's previous session (identified by X-Session-Id),
20
- // NOT all sessions for the same host:port. Multiple agents may legitimately
21
- // maintain concurrent sessions to the same host.
22
- const previousSessionId = req.headers['x-session-id'];
23
- if (previousSessionId) {
24
- const prev = getSession(previousSessionId);
25
- if (prev) {
26
- console.log(`[connect] Destroying caller's previous session ${previousSessionId.slice(0, 8)} for ${host}:${port} before new connect`);
27
- destroySession(previousSessionId);
28
- }
103
+ const { host = 'pub400.com', port = 23, protocol = 'tn5250', terminalType, codePage, screenTimeout, connectTimeout, username, password, key, forceNew, deviceName, autoReconnect } = req.body || {};
104
+ const opts = { host, port, protocol, terminalType, codePage, screenTimeout, connectTimeout, deviceName, autoReconnect };
105
+ // ── Connect-by-key: at most one live session per key ──
106
+ // A burst of reconnects for one logical agent serialises on the per-key
107
+ // mutex; the first opens the session, the rest observe it live and reuse
108
+ // it. This defeats the "N reconnects → N host devices → LMTDEVSSN/CPF1220
109
+ // contention" storm structurally, instead of relying on the integrator to
110
+ // coordinate. The key is opaque — never interpreted here.
111
+ if (typeof key === 'string' && key.length > 0) {
112
+ return await withKeyLock(key, async () => {
113
+ const existingId = forceNew ? undefined : getKeyedSessionId(key);
114
+ const existing = existingId ? getSession(existingId) : undefined;
115
+ let session;
116
+ let reused = false;
117
+ if (existing && existing.status.connected) {
118
+ session = existing;
119
+ reused = true;
120
+ session.touch();
121
+ }
122
+ else {
123
+ // Release any prior keyed session's device (dead, or forceNew) before
124
+ // replacing it, so the host's device pool stays clean.
125
+ const priorId = getKeyedSessionId(key);
126
+ if (priorId && getSession(priorId)) {
127
+ void gracefullyDestroySession(priorId).catch(() => { });
128
+ }
129
+ session = await freshConnectSession(opts);
130
+ bindKey(key, session.id);
131
+ }
132
+ // Sign on if creds were given and the session isn't already
133
+ // authenticated — covers both a fresh session and a reused one that
134
+ // was opened (via connect()) but not yet signed on.
135
+ await ensureSignedOn(session, username, password);
136
+ res.setHeader('X-Session-Id', session.id);
137
+ return res.json(sessionConnectPayload(session, reused));
138
+ });
29
139
  }
30
- const session = createSession(protocol);
31
- console.log(`[connect] Created session ${session.id.slice(0, 8)} for ${host}:${port}`);
32
- if (typeof screenTimeout === 'number' && screenTimeout > 0) {
33
- session.screenTimeout = screenTimeout;
140
+ // ── No key: legacy behaviour — sign off the caller's previous session
141
+ // (by X-Session-Id only; other agents may legitimately hold concurrent
142
+ // sessions to the same host), then open a fresh one. A graceful SIGNOFF
143
+ // releases the IBM i QPADEV device; a hard drop would leave it hanging
144
+ // until QDEVRCYACN reaps it, and under churn those trip QMAXSIGN/QAUTOVRT.
145
+ const previousSessionId = req.headers['x-session-id'];
146
+ if (previousSessionId && getSession(previousSessionId)) {
147
+ console.log(`[connect] Signing off caller's previous session ${previousSessionId.slice(0, 8)} for ${host}:${port} before new connect`);
148
+ void gracefullyDestroySession(previousSessionId).catch(() => { });
34
149
  }
35
- // Store session ID in response header
150
+ const session = await freshConnectSession(opts);
36
151
  res.setHeader('X-Session-Id', session.id);
37
- const options = {};
38
- if (terminalType)
39
- options.terminalType = terminalType;
40
- if (typeof connectTimeout === 'number' && connectTimeout > 0)
41
- options.connectTimeout = connectTimeout;
42
- await session.connect(host, port, Object.keys(options).length > 0 ? options : undefined);
43
- // Auto-sign-in if credentials provided and handler supports it
44
- if (username && password && session.handler instanceof TN5250Handler) {
45
- const result = await session.handler.performAutoSignIn(username, password);
46
- if (result) {
47
- if (result.authenticated) {
48
- session.markAuthenticated(username);
49
- }
50
- // On failed sign-in (host still showing the sign-on screen, e.g.
51
- // wrong password or CPF1220 device-session-limit), DO NOT mark
52
- // as authenticated. The caller still receives the screen so the
53
- // error message is visible to the user, but gracefulDestroy will
54
- // not attempt a futile SIGNOFF on the sign-on screen.
55
- return res.json({
56
- success: true,
57
- sessionId: session.id,
58
- ...result.screen,
59
- });
60
- }
61
- }
62
- // Wait for initial screen data
63
- await new Promise(resolve => setTimeout(resolve, session.screenTimeout));
64
- const screenData = session.getScreenData();
65
- res.json({
66
- success: true,
67
- sessionId: session.id,
68
- ...screenData,
69
- });
152
+ await ensureSignedOn(session, username, password);
153
+ return res.json(sessionConnectPayload(session, false));
70
154
  }
71
155
  catch (err) {
72
156
  res.status(500).json({
@@ -159,16 +243,56 @@ router.post('/reconnect', async (req, res) => {
159
243
  }
160
244
  });
161
245
  // GET /status
246
+ //
247
+ // Two roles, distinguished by whether a session resolves:
248
+ // - With a session (x-session-id / ?sessionId= / a single default session):
249
+ // returns that session's ConnectionStatus. Used by the REST adapter and
250
+ // the Python client.
251
+ // - With no session resolved (the multi-session case — e.g. the Docker
252
+ // healthcheck / integrator readiness probe hitting it bare): the proxy
253
+ // has no single global connection state, so report SERVER liveness plus
254
+ // the live session count instead of a misleading per-session
255
+ // 'disconnected' stub. Callers wanting per-session state must pass a
256
+ // session id (or use /sessions).
162
257
  router.get('/status', (req, res) => {
163
258
  const session = resolveSession(req);
164
259
  if (!session) {
165
260
  return res.json({
166
- connected: false,
167
- status: 'disconnected',
261
+ ok: true,
262
+ sessions: getAllSessions().length,
168
263
  });
169
264
  }
170
265
  res.json(session.status);
171
266
  });
267
+ // GET /liveness — unambiguous half-open detection.
268
+ //
269
+ // Returns wall-clock ms timestamps of the most recent byte SENT to the
270
+ // host and the most recent byte RECEIVED from the host. The intended
271
+ // use: after writing an AID at time T, poll this endpoint after a
272
+ // short window and check whether ``lastReceivedAtMs > T``. If yes, the
273
+ // host responded → link alive. If no, the host has been silent since
274
+ // our send → link is half-open, treat as dead.
275
+ //
276
+ // This sidesteps the screen-state heuristic (kbd_locked) entirely.
277
+ // kbd_locked can stay true for legitimate reasons (error message
278
+ // awaiting Reset, host reply that omits CC2 unlock bit, etc.) and
279
+ // confuses any liveness check that reads it.
280
+ //
281
+ // 404 if no session — caller should treat that as "session is gone,
282
+ // reconnect from scratch".
283
+ router.get('/liveness', (req, res) => {
284
+ const session = resolveSession(req);
285
+ if (!session) {
286
+ return res.status(404).json({ error: 'session not found' });
287
+ }
288
+ const liveness = session.handler.getLiveness();
289
+ res.json({
290
+ connected: session.status.connected,
291
+ lastReceivedAtMs: liveness.lastReceivedAtMs,
292
+ lastSentAtMs: liveness.lastSentAtMs,
293
+ nowMs: Date.now(),
294
+ });
295
+ });
172
296
  // GET /screen
173
297
  router.get('/screen', (req, res) => {
174
298
  const session = resolveSession(req);
@@ -231,6 +355,41 @@ router.post('/session/authenticated', (req, res) => {
231
355
  session.markAuthenticated(username);
232
356
  res.json({ success: true, status: session.status });
233
357
  });
358
+ // POST /session/drive-lock — claim exclusive input for an automated driver.
359
+ //
360
+ // Server-side single-writer: while a holder owns the lock, the proxy rejects WS
361
+ // key/text/cursor commands from interactive clients (they become observe-only),
362
+ // so a dashboard operator cannot type into a session mid-run even if a
363
+ // client-side guard fails. The REST drive path (the lock owner itself) is
364
+ // exempt. Body: { holder: string } — opaque, e.g. "agent:<id>".
365
+ router.post('/session/drive-lock', (req, res) => {
366
+ const session = resolveSession(req);
367
+ if (!session) {
368
+ return res.status(404).json({ success: false, error: 'No active session' });
369
+ }
370
+ const { holder } = req.body || {};
371
+ if (!holder || typeof holder !== 'string') {
372
+ return res.status(400).json({ success: false, error: 'holder is required' });
373
+ }
374
+ const ok = session.acquireDrive(holder);
375
+ res.json({
376
+ success: ok,
377
+ driveHolder: session.driveHolder,
378
+ error: ok ? undefined : `drive lock already held by ${session.driveHolder}`,
379
+ });
380
+ });
381
+ // POST /session/drive-unlock — release the input lock (interactive clients may
382
+ // drive again). A holder mismatch is a no-op so a stale releaser can't free a
383
+ // lock it doesn't own; omit holder to force-release.
384
+ router.post('/session/drive-unlock', (req, res) => {
385
+ const session = resolveSession(req);
386
+ if (!session) {
387
+ return res.status(404).json({ success: false, error: 'No active session' });
388
+ }
389
+ const { holder } = req.body || {};
390
+ session.releaseDrive(typeof holder === 'string' ? holder : undefined);
391
+ res.json({ success: true, driveHolder: session.driveHolder });
392
+ });
234
393
  // POST /wait-for-fields — wait until the current screen has at least N
235
394
  // input fields (or timeout). Generic primitive that sign-on cascades use
236
395
  // to robustly wait for a form to appear before typing credentials. Short-
@@ -333,14 +492,22 @@ router.post('/batch', async (req, res) => {
333
492
  }
334
493
  lastRemoteKey = !localKeys.has(op.value);
335
494
  break;
336
- case 'text':
337
- session.sendText(op.value);
495
+ case 'text': {
496
+ const typed = await typeTextAnimated(session, op.value);
497
+ if (!typed) {
498
+ return res.json({ success: false, error: `Cannot type "${op.value}" at current cursor position` });
499
+ }
338
500
  lastRemoteKey = false;
339
501
  break;
502
+ }
340
503
  case 'setCursor':
341
504
  session.setCursor(op.row, op.col);
342
505
  lastRemoteKey = false;
343
506
  break;
507
+ case 'eraseEOF':
508
+ session.eraseEOF();
509
+ lastRemoteKey = false;
510
+ break;
344
511
  default:
345
512
  return res.json({ success: false, error: `Unknown operation type: ${op.type}` });
346
513
  }
@@ -365,7 +532,7 @@ router.post('/batch', async (req, res) => {
365
532
  }
366
533
  });
367
534
  // POST /send-text
368
- router.post('/send-text', (req, res) => {
535
+ router.post('/send-text', async (req, res) => {
369
536
  const session = resolveSession(req);
370
537
  if (!session) {
371
538
  return res.status(404).json({ success: false, error: 'No active session' });
@@ -374,9 +541,11 @@ router.post('/send-text', (req, res) => {
374
541
  if (typeof text !== 'string') {
375
542
  return res.status(400).json({ success: false, error: 'text is required' });
376
543
  }
377
- const ok = session.sendText(text);
544
+ // Type char-by-char (broadcasting each keystroke) so attached dashboards see
545
+ // genuine typing; typeTextAnimated emits the per-keystroke frames itself.
546
+ const ok = await typeTextAnimated(session, text);
378
547
  const screenData = session.getScreenData();
379
- // Broadcast to WebSocket clients so dashboard stays in sync
548
+ // Final authoritative frame after the last keystroke.
380
549
  if (ok) {
381
550
  broadcastScreenToSession(session.id, screenData);
382
551
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** The session id currently bound to `key`, or undefined. */
2
+ export declare function getKeyedSessionId(key: string): string | undefined;
3
+ /** Bind a key to its live session id (called once a keyed connect succeeds). */
4
+ export declare function bindKey(key: string, sessionId: string): void;
5
+ /**
6
+ * Run `fn` under the per-key mutex: keyed connects for the same key execute
7
+ * one-at-a-time, in arrival order. The first caller opens the session; while it
8
+ * runs, the rest wait, then observe the now-live session and reuse it. This is
9
+ * the single-flight guarantee that defeats the reconnect storm without the
10
+ * intent-coalescing hazards of sharing one promise across callers (a no-creds
11
+ * connect and a with-creds login want different end states).
12
+ */
13
+ export declare function withKeyLock<T>(key: string, fn: () => Promise<T>): Promise<T>;
14
+ /** Drop any key bindings pointing at a session (called when it dies). */
15
+ export declare function unbindSession(sessionId: string): void;
16
+ //# sourceMappingURL=session-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-keys.d.ts","sourceRoot":"","sources":["../src/session-keys.ts"],"names":[],"mappings":"AAiCA,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBlF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIrD"}
@@ -0,0 +1,77 @@
1
+ import { sessionLifecycle } from './session-store.js';
2
+ /**
3
+ * Idempotent connect-by-key registry.
4
+ *
5
+ * An integrator that drives one logical terminal (e.g. an automation bound to
6
+ * a specific host user / device) passes a stable opaque `key` on /connect. The
7
+ * proxy then guarantees AT MOST ONE live session per key:
8
+ *
9
+ * - all keyed connects for the same key are SERIALISED by a per-key mutex,
10
+ * so a concurrent burst can't race to open N sockets — the first opens the
11
+ * session, the rest observe it live and reuse it;
12
+ * - a connect for a key that already has a live session returns that session
13
+ * instead of opening another.
14
+ *
15
+ * This makes the classic "N concurrent reconnects → N host devices → device
16
+ * session-limit (LMTDEVSSN/CPF1220) contention" storm structurally impossible
17
+ * rather than merely policy-discouraged in the integrator. The key is opaque —
18
+ * the proxy never interprets it — so this stays protocol-generic.
19
+ *
20
+ * State is process-local (mirrors the default in-memory SessionStore). A
21
+ * multi-process deployment that swaps in a routing store would key the registry
22
+ * the same way at the routing layer.
23
+ */
24
+ /** key → the sessionId of its current live session. Only holds sessions
25
+ * believed connected; cleared on `session.lost` so a dead key reconnects
26
+ * fresh instead of handing back a corpse. */
27
+ const keyToSessionId = new Map();
28
+ /** key → tail of its serialised operation chain (the per-key mutex). */
29
+ const keyLocks = new Map();
30
+ /** The session id currently bound to `key`, or undefined. */
31
+ export function getKeyedSessionId(key) {
32
+ return keyToSessionId.get(key);
33
+ }
34
+ /** Bind a key to its live session id (called once a keyed connect succeeds). */
35
+ export function bindKey(key, sessionId) {
36
+ keyToSessionId.set(key, sessionId);
37
+ }
38
+ /**
39
+ * Run `fn` under the per-key mutex: keyed connects for the same key execute
40
+ * one-at-a-time, in arrival order. The first caller opens the session; while it
41
+ * runs, the rest wait, then observe the now-live session and reuse it. This is
42
+ * the single-flight guarantee that defeats the reconnect storm without the
43
+ * intent-coalescing hazards of sharing one promise across callers (a no-creds
44
+ * connect and a with-creds login want different end states).
45
+ */
46
+ export async function withKeyLock(key, fn) {
47
+ const prev = keyLocks.get(key) ?? Promise.resolve();
48
+ let release;
49
+ const mine = new Promise((r) => { release = r; });
50
+ // Our segment of the chain resolves only after the previous holder released
51
+ // (prev) AND we release (mine). The next caller awaits this as its `prev`.
52
+ const tail = prev.then(() => mine);
53
+ keyLocks.set(key, tail);
54
+ await prev; // wait our turn
55
+ try {
56
+ return await fn();
57
+ }
58
+ finally {
59
+ release();
60
+ // Drop the entry iff no later caller chained on (they'd have replaced the
61
+ // tail), so idle keys don't accumulate.
62
+ if (keyLocks.get(key) === tail)
63
+ keyLocks.delete(key);
64
+ }
65
+ }
66
+ /** Drop any key bindings pointing at a session (called when it dies). */
67
+ export function unbindSession(sessionId) {
68
+ for (const [k, sid] of keyToSessionId) {
69
+ if (sid === sessionId)
70
+ keyToSessionId.delete(k);
71
+ }
72
+ }
73
+ // A lost session must not stay reachable by key — otherwise the next
74
+ // connect-by-key would hand back the dead session id forever. Clearing it
75
+ // here means the next connect for that key opens a fresh session.
76
+ sessionLifecycle.on('session.lost', (sessionId) => unbindSession(sessionId));
77
+ //# sourceMappingURL=session-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-keys.js","sourceRoot":"","sources":["../src/session-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;8CAE8C;AAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEjD,wEAAwE;AACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,SAAiB;IACpD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAI,GAAW,EAAE,EAAoB;IACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACpD,IAAI,OAAoB,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,MAAM,IAAI,CAAC,CAAC,gBAAgB;IAC5B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;QACV,0EAA0E;QAC1E,wCAAwC;QACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS;YAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,0EAA0E;AAC1E,kEAAkE;AAClE,gBAAgB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC"}