@tapflowio/relay 0.18.0 → 0.20.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/README.md +1 -1
- package/dist/RelayServer.d.ts +299 -2
- package/dist/RelayServer.d.ts.map +1 -1
- package/dist/RelayServer.js +1050 -177
- package/dist/RelayServer.js.map +1 -1
- package/dist/SessionManager.d.ts +83 -17
- package/dist/SessionManager.d.ts.map +1 -1
- package/dist/SessionManager.js +111 -14
- package/dist/SessionManager.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/cert/index.d.ts +1 -1
- package/dist/lib/cert/index.d.ts.map +1 -1
- package/dist/lib/cert/index.js +1 -1
- package/dist/lib/cert/index.js.map +1 -1
- package/dist/lib/cert/parseCert.d.ts +4 -0
- package/dist/lib/cert/parseCert.d.ts.map +1 -1
- package/dist/lib/cert/parseCert.js +68 -0
- package/dist/lib/cert/parseCert.js.map +1 -1
- package/dist/lib/trailingRequester.d.ts +23 -0
- package/dist/lib/trailingRequester.d.ts.map +1 -0
- package/dist/lib/trailingRequester.js +56 -0
- package/dist/lib/trailingRequester.js.map +1 -0
- package/dist/server.js +4 -2
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +2 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -1
- package/package.json +8 -8
- package/public/assets/{AppCenter-B3FO67aw.js → AppCenter-Dg4dscW-.js} +6 -6
- package/public/assets/AppCenter-Dg4dscW-.js.br +0 -0
- package/public/assets/Default-Dxi8aZ1t.js +1 -0
- package/public/assets/Default-Dxi8aZ1t.js.br +0 -0
- package/public/assets/Invite-0EwoClX6.js +1 -0
- package/public/assets/Invite-0EwoClX6.js.br +0 -0
- package/public/assets/MacResources-Dy1M3EqK.js +1 -0
- package/public/assets/MacResources-Dy1M3EqK.js.br +0 -0
- package/public/assets/NotFound-BoDDivK5.js +1 -0
- package/public/assets/NotFound-BoDDivK5.js.br +0 -0
- package/public/assets/QASession-DqMj8JL1.js +140 -0
- package/public/assets/QASession-DqMj8JL1.js.br +0 -0
- package/public/assets/ResetPassword-CXU2bRry.js +1 -0
- package/public/assets/ResetPassword-CXU2bRry.js.br +0 -0
- package/public/assets/Setup-XXChRxeL.js +1 -0
- package/public/assets/Setup-XXChRxeL.js.br +0 -0
- package/public/assets/{Team-CBsjuUwh.js → Team-D0bXpmEY.js} +3 -3
- package/public/assets/Team-D0bXpmEY.js.br +0 -0
- package/public/assets/Tokens-D0YNHS5e.js +1 -0
- package/public/assets/Tokens-D0YNHS5e.js.br +0 -0
- package/public/assets/alert-dialog-CgatMXjB.js +1 -0
- package/public/assets/alert-dialog-CgatMXjB.js.br +0 -0
- package/public/assets/badge-B6Nf3A0Y.js +1 -0
- package/public/assets/badge-B6Nf3A0Y.js.br +0 -0
- package/public/assets/{build-format-B78hbKY9.js → build-format-BFC8gLoh.js} +5 -5
- package/public/assets/build-format-BFC8gLoh.js.br +0 -0
- package/public/assets/{dialog-BxC9v2BL.js → dialog-DK9a3b4z.js} +5 -5
- package/public/assets/dialog-DK9a3b4z.js.br +0 -0
- package/public/assets/index-9vdYIm7s.js +210 -0
- package/public/assets/index-9vdYIm7s.js.br +0 -0
- package/public/assets/index-ClHUQm-F.css +1 -0
- package/public/assets/index-ClHUQm-F.css.br +0 -0
- package/public/assets/{pencil-Cq64I9LV.js → pencil-BeLNLEKe.js} +2 -2
- package/public/assets/pencil-BeLNLEKe.js.br +0 -0
- package/public/assets/table-DW57-o1p.js +1 -0
- package/public/assets/table-DW57-o1p.js.br +0 -0
- package/public/assets/tabs-Xlttuqxh.js +1 -0
- package/public/assets/tabs-Xlttuqxh.js.br +0 -0
- package/public/assets/{trash-2-CszwJHEh.js → trash-2-CGxISX8x.js} +3 -3
- package/public/assets/trash-2-CGxISX8x.js.br +0 -0
- package/public/assets/vendor-charts-DyX5CBcf.js +5 -0
- package/public/assets/vendor-charts-DyX5CBcf.js.br +0 -0
- package/public/assets/vendor-react-AJpf4YZ0.js +49 -0
- package/public/assets/vendor-react-AJpf4YZ0.js.br +0 -0
- package/public/assets/vendor-router-ChFy8CZ1.js +12 -0
- package/public/assets/vendor-router-ChFy8CZ1.js.br +0 -0
- package/public/index.html +4 -2
- package/public/index.html.br +0 -0
- package/public/assets/AppCenter-B3FO67aw.js.br +0 -0
- package/public/assets/Default-BlNUv5dw.js +0 -1
- package/public/assets/Default-BlNUv5dw.js.br +0 -0
- package/public/assets/Invite-CKYFmy7S.js +0 -1
- package/public/assets/Invite-CKYFmy7S.js.br +0 -0
- package/public/assets/MacResources-BK4VQnFc.js +0 -5
- package/public/assets/MacResources-BK4VQnFc.js.br +0 -0
- package/public/assets/NotFound-BMmi1paB.js +0 -1
- package/public/assets/NotFound-BMmi1paB.js.br +0 -0
- package/public/assets/QASession-CVTlqW3d.js +0 -125
- package/public/assets/QASession-CVTlqW3d.js.br +0 -0
- package/public/assets/ResetPassword-VPPBWzSI.js +0 -1
- package/public/assets/ResetPassword-VPPBWzSI.js.br +0 -0
- package/public/assets/Setup-CRdnCl41.js +0 -1
- package/public/assets/Setup-CRdnCl41.js.br +0 -0
- package/public/assets/Team-CBsjuUwh.js.br +0 -0
- package/public/assets/Tokens-CU9HB9WD.js +0 -1
- package/public/assets/Tokens-CU9HB9WD.js.br +0 -0
- package/public/assets/alert-dialog-DWqGDQTB.js +0 -1
- package/public/assets/alert-dialog-DWqGDQTB.js.br +0 -0
- package/public/assets/badge-OToVq1dK.js +0 -1
- package/public/assets/badge-OToVq1dK.js.br +0 -0
- package/public/assets/build-format-B78hbKY9.js.br +0 -3
- package/public/assets/dialog-BxC9v2BL.js.br +0 -0
- package/public/assets/index-DXjMx9hQ.js +0 -274
- package/public/assets/index-DXjMx9hQ.js.br +0 -0
- package/public/assets/index-uGJGo6ac.css +0 -1
- package/public/assets/index-uGJGo6ac.css.br +0 -0
- package/public/assets/pencil-Cq64I9LV.js.br +0 -0
- package/public/assets/table-CbATN5Pi.js +0 -1
- package/public/assets/table-CbATN5Pi.js.br +0 -0
- package/public/assets/tabs-BVumgDA4.js +0 -1
- package/public/assets/tabs-BVumgDA4.js.br +0 -0
- package/public/assets/trash-2-CszwJHEh.js.br +0 -0
package/dist/SessionManager.js
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import { randomUUID } from 'crypto';
|
|
2
2
|
import { WebSocket } from 'ws';
|
|
3
|
-
import { ValidationError } from '@tapflowio/agent-core';
|
|
4
3
|
const DEFAULT_IDLE_TIMEOUT_MS = parseInt(process.env['IDLE_TIMEOUT_MS'] ?? String(5 * 60 * 1000));
|
|
5
4
|
export class SessionManager {
|
|
6
5
|
sessions = new Map();
|
|
7
6
|
agentResources = new Map();
|
|
8
7
|
agentSocketIndex = new Map();
|
|
9
8
|
streamSocketIndex = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Which sessions a browser socket holds. **A set, because the relation is one-to-many** — and it was a
|
|
11
|
+
* single `Session` until #507 was diagnosed, which is the whole of that defect.
|
|
12
|
+
*
|
|
13
|
+
* `mcp-server` opens exactly one socket (`client.ts`, one `new WebSocket`) and sends a `session:start`
|
|
14
|
+
* per device, because an LLM can hold several sessions at once and its waiters are keyed per session.
|
|
15
|
+
* With one slot per socket, the second join silently overwrote the first — `A.browserSocket` still
|
|
16
|
+
* pointed at the socket, so *commands* kept working, and only the reverse lookup lost A. The close
|
|
17
|
+
* handler resolves through that lookup, so **A was never released**: `busy: true` for the life of the
|
|
18
|
+
* relay, no idle timer, and a device left booted with nobody watching it.
|
|
19
|
+
*
|
|
20
|
+
* That is also why the obvious reading of #507 — "release the previous session when a socket joins
|
|
21
|
+
* another" — is a regression rather than a fix. Two independent design reviews reached it separately.
|
|
22
|
+
*/
|
|
10
23
|
browserSocketIndex = new Map();
|
|
11
24
|
idleTimeoutMs;
|
|
12
25
|
constructor(options = {}) {
|
|
@@ -42,6 +55,9 @@ export class SessionManager {
|
|
|
42
55
|
...SessionManager.agentFields(agent, d),
|
|
43
56
|
agentSocket,
|
|
44
57
|
browserSocket: null,
|
|
58
|
+
owner: null,
|
|
59
|
+
ownerMinted: false,
|
|
60
|
+
ownerUser: null,
|
|
45
61
|
streamSocket: null,
|
|
46
62
|
deviceId: d.id,
|
|
47
63
|
readySent: false,
|
|
@@ -86,24 +102,78 @@ export class SessionManager {
|
|
|
86
102
|
getByStreamSocket(ws) {
|
|
87
103
|
return this.streamSocketIndex.get(ws);
|
|
88
104
|
}
|
|
105
|
+
/** Every session this socket holds. **Plural**, and the caller must treat it as such — the close
|
|
106
|
+
* handler releasing only the first is the defect the index comment above describes. */
|
|
89
107
|
getByBrowserSocket(ws) {
|
|
90
|
-
return this.browserSocketIndex.get(ws);
|
|
108
|
+
return [...(this.browserSocketIndex.get(ws) ?? [])];
|
|
109
|
+
}
|
|
110
|
+
/** Drop `session` from its browser socket's set, and the key with it when the set empties. Leaving an
|
|
111
|
+
* empty `Set` behind would keep a closed socket referenced for the life of the relay. */
|
|
112
|
+
unindexBrowser(session) {
|
|
113
|
+
const ws = session.browserSocket;
|
|
114
|
+
if (!ws)
|
|
115
|
+
return;
|
|
116
|
+
const held = this.browserSocketIndex.get(ws);
|
|
117
|
+
if (!held)
|
|
118
|
+
return;
|
|
119
|
+
held.delete(session);
|
|
120
|
+
if (held.size === 0)
|
|
121
|
+
this.browserSocketIndex.delete(ws);
|
|
91
122
|
}
|
|
92
|
-
|
|
123
|
+
/**
|
|
124
|
+
* @returns `not-found` and `held-by-another` rather than throwing them, **so an unexpected failure and
|
|
125
|
+
* an expected one stop sharing a channel.** `session:start` answered both from one `catch`, and
|
|
126
|
+
* the comment there said reaching it meant something the handler did not anticipate — while the
|
|
127
|
+
* most common way to reach it was a socket re-joining the session it already holds (#515). An
|
|
128
|
+
* expected failure that travels as an exception is indistinguishable from a bug by the time it
|
|
129
|
+
* is caught, and the handler then has to guess a `reason`.
|
|
130
|
+
*/
|
|
131
|
+
join(sessionId, browserSocket, owner, isAlive) {
|
|
93
132
|
const session = this.sessions.get(sessionId);
|
|
94
133
|
if (!session)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
134
|
+
return { ok: false, failure: 'not-found' };
|
|
135
|
+
// **Three conditions, and each one is an issue.** A session is occupied only when someone *else* holds
|
|
136
|
+
// it, on a socket that is open, and that socket is answering.
|
|
137
|
+
//
|
|
138
|
+
// - `owner !== owner` is #527 and #515: a re-join by the same client is idempotent whether or not the
|
|
139
|
+
// socket is the same one, which is what makes a tab's four sockets one holder and an automatic
|
|
140
|
+
// reconnect a takeover rather than a refusal.
|
|
141
|
+
// - `readyState === OPEN` was the whole test, and it is not a liveness signal. A laptop that went to
|
|
142
|
+
// sleep leaves it OPEN until TCP or the heartbeat notices.
|
|
143
|
+
// - `isAlive` is that signal, passed in because liveness lives on the server rather than here — as a
|
|
144
|
+
// predicate over the socket rather than a thunk, so it is applied to *this* session's holder and
|
|
145
|
+
// cannot be closed over a stale one. `list()` below takes the same shape for the same reason.
|
|
146
|
+
// #579 is the gap between `readyState` and this.
|
|
147
|
+
if (session.browserSocket &&
|
|
148
|
+
session.owner !== null &&
|
|
149
|
+
session.owner !== owner.key &&
|
|
150
|
+
session.browserSocket.readyState === WebSocket.OPEN &&
|
|
151
|
+
isAlive(session.browserSocket)) {
|
|
152
|
+
return { ok: false, failure: 'held-by-another' };
|
|
98
153
|
}
|
|
99
154
|
if (session.idleTimer) {
|
|
100
155
|
clearTimeout(session.idleTimer);
|
|
101
156
|
session.idleTimer = null;
|
|
102
157
|
}
|
|
103
|
-
|
|
104
|
-
|
|
158
|
+
// Unconditional, and **the order is what makes it safe**: this releases the session from whichever
|
|
159
|
+
// socket held it, which on a re-join is the socket joining. Removing and re-adding the same entry is a
|
|
160
|
+
// no-op; doing it *after* the add below would delete the entry this join just made, leaving the
|
|
161
|
+
// session bound for commands and invisible to the close handler — #507 rebuilt one method over.
|
|
162
|
+
//
|
|
163
|
+
// A guard reading `!== browserSocket` stood here with that reasoning written as its justification. It
|
|
164
|
+
// was dead: mutation testing removed the guard and every test still passed, because the add follows.
|
|
165
|
+
this.unindexBrowser(session);
|
|
105
166
|
session.browserSocket = browserSocket;
|
|
106
|
-
|
|
167
|
+
session.owner = owner.key;
|
|
168
|
+
session.ownerMinted = owner.minted;
|
|
169
|
+
session.ownerUser = owner.user;
|
|
170
|
+
let held = this.browserSocketIndex.get(browserSocket);
|
|
171
|
+
if (!held) {
|
|
172
|
+
held = new Set();
|
|
173
|
+
this.browserSocketIndex.set(browserSocket, held);
|
|
174
|
+
}
|
|
175
|
+
held.add(session);
|
|
176
|
+
return { ok: true };
|
|
107
177
|
}
|
|
108
178
|
remove(sessionId) {
|
|
109
179
|
const session = this.sessions.get(sessionId);
|
|
@@ -115,8 +185,7 @@ export class SessionManager {
|
|
|
115
185
|
}
|
|
116
186
|
if (session.streamSocket)
|
|
117
187
|
this.streamSocketIndex.delete(session.streamSocket);
|
|
118
|
-
|
|
119
|
-
this.browserSocketIndex.delete(session.browserSocket);
|
|
188
|
+
this.unindexBrowser(session);
|
|
120
189
|
const agentIds = this.agentSocketIndex.get(session.agentSocket);
|
|
121
190
|
agentIds?.delete(sessionId);
|
|
122
191
|
if (agentIds?.size === 0)
|
|
@@ -128,9 +197,12 @@ export class SessionManager {
|
|
|
128
197
|
if (!session)
|
|
129
198
|
return;
|
|
130
199
|
if (session.browserSocket) {
|
|
131
|
-
this.
|
|
200
|
+
this.unindexBrowser(session);
|
|
132
201
|
session.browserSocket = null;
|
|
133
202
|
}
|
|
203
|
+
session.owner = null;
|
|
204
|
+
session.ownerMinted = false;
|
|
205
|
+
session.ownerUser = null;
|
|
134
206
|
if (session.idleTimer) {
|
|
135
207
|
clearTimeout(session.idleTimer);
|
|
136
208
|
session.idleTimer = null;
|
|
@@ -247,7 +319,20 @@ export class SessionManager {
|
|
|
247
319
|
if (session)
|
|
248
320
|
session.deviceStatus = status;
|
|
249
321
|
}
|
|
250
|
-
|
|
322
|
+
/**
|
|
323
|
+
* @param asker the owner key of the socket that asked, so `busy` can mean *busy for you*.
|
|
324
|
+
* @param isAlive whether a holder's socket is answering — the same predicate occupancy uses.
|
|
325
|
+
*
|
|
326
|
+
* **`busy` has to agree with the occupancy test or the UI locks a tester out of their own session.**
|
|
327
|
+
* `browserSocket !== null` said "someone holds it", which is a different question from "you cannot have
|
|
328
|
+
* it": `QASession` renders `disabled={isBusy}`, so a tester whose socket reconnected automatically found
|
|
329
|
+
* their own device greyed out with no way to reach the takeover that would have worked. And a holder
|
|
330
|
+
* that has stopped answering keeps the card locked for everyone until the sweep notices.
|
|
331
|
+
*
|
|
332
|
+
* Passing the same `isAlive` rather than a second liveness rule is the point — two predicates that
|
|
333
|
+
* disagree would flash a device as free while a join for it is still refused.
|
|
334
|
+
*/
|
|
335
|
+
list(asker, isAlive) {
|
|
251
336
|
// Group sessions by agentSocket
|
|
252
337
|
const agentMap = new Map();
|
|
253
338
|
for (const session of this.sessions.values()) {
|
|
@@ -268,6 +353,10 @@ export class SessionManager {
|
|
|
268
353
|
agentName: group[0].agentName,
|
|
269
354
|
platform: group[0].agentPlatform,
|
|
270
355
|
resources: this.agentResources.get(group[0].agentSocket),
|
|
356
|
+
// `?? []` rather than passing the absence through: an agent that predates the field means
|
|
357
|
+
// "advertises nothing", and the viewer gates on membership. Leaving it undefined would make
|
|
358
|
+
// every consumer repeat the same fallback, and one of them would forget.
|
|
359
|
+
capabilities: group[0].agentCapabilities ?? [],
|
|
271
360
|
devices: group.map((s) => ({
|
|
272
361
|
id: s.deviceId,
|
|
273
362
|
name: s.deviceName,
|
|
@@ -275,7 +364,15 @@ export class SessionManager {
|
|
|
275
364
|
status: s.deviceStatus,
|
|
276
365
|
osVersion: s.deviceOsVersion,
|
|
277
366
|
sessionId: s.id,
|
|
278
|
-
busy: s.
|
|
367
|
+
busy: s.owner !== null &&
|
|
368
|
+
s.owner !== asker &&
|
|
369
|
+
s.browserSocket !== null &&
|
|
370
|
+
// The clause that was missing, and its absence was the mirror of the failure the docstring warns
|
|
371
|
+
// about: a socket in CLOSING has not fired `close` yet, so `isAlive` is still true — the card
|
|
372
|
+
// read `busy` while a join for it would have succeeded, locking every other tester out of a
|
|
373
|
+
// device the relay was ready to hand them.
|
|
374
|
+
s.browserSocket.readyState === WebSocket.OPEN &&
|
|
375
|
+
isAlive(s.browserSocket),
|
|
279
376
|
})),
|
|
280
377
|
}));
|
|
281
378
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../src/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAoE9B,MAAM,uBAAuB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAEjG,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IACrC,cAAc,GAAG,IAAI,GAAG,EAA6B,CAAA;IACrD,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAA;IACpD,iBAAiB,GAAG,IAAI,GAAG,EAAsB,CAAA;IACzD;;;;;;;;;;;;;OAaG;IACK,kBAAkB,GAAG,IAAI,GAAG,EAA2B,CAAA;IAC9C,aAAa,CAAQ;IAEtC,YAAY,UAAsC,EAAE;QAClD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAA;IACvE,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,WAAW,CACxB,KAAoB,EACpB,MAAoB;QAEpB,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,cAAc,EAAE,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,MAAM,CAAC,MAAsB;YAC3C,eAAe,EAAE,MAAM,CAAC,SAAS;SAClC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,WAAsB,EAAE,UAA0B,EAAE,EAAE,SAAkB,EAAE,aAAsB,EAAE,OAAgB,EAAE,iBAA4B;QACrJ,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;QAC5E,MAAM,KAAK,GAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA;QACrF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;YACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;gBACpB,EAAE;gBACF,GAAG,cAAc,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvC,WAAW;gBACX,aAAa,EAAE,IAAI;gBACnB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,CAAC,EAAE;gBACd,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAA;YACF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;YAChD,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAED,mBAAmB,CAAC,EAAa;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAA;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;IACxG,CAAC;IAED;;;;;;;;OAQG;IACH,yBAAyB,CAAC,QAAgB,EAAE,QAA4B;QACtE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa,CAAA;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QACzG,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;iDAC6C;IAC7C,gBAAgB,CAAC,QAAgB;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;IAClF,CAAC;IAED,iBAAiB,CAAC,EAAa;QAC7B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC;IAED;4FACwF;IACxF,kBAAkB,CAAC,EAAa;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACrD,CAAC;IAED;8FAC0F;IAClF,cAAc,CAAC,OAAgB;QACrC,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAA;QAChC,IAAI,CAAC,EAAE;YAAE,OAAM;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CACF,SAAiB,EACjB,aAAwB,EACxB,KAAqD,EACrD,OAAmC;QAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;QACxD,uGAAuG;QACvG,8DAA8D;QAC9D,EAAE;QACF,sGAAsG;QACtG,iGAAiG;QACjG,gDAAgD;QAChD,qGAAqG;QACrG,6DAA6D;QAC7D,qGAAqG;QACrG,mGAAmG;QACnG,gGAAgG;QAChG,mDAAmD;QACnD,IACE,OAAO,CAAC,aAAa;YACrB,OAAO,CAAC,KAAK,KAAK,IAAI;YACtB,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG;YAC3B,OAAO,CAAC,aAAa,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;YACnD,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAC9B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAA;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;QAAC,CAAC;QACpF,mGAAmG;QACnG,uGAAuG;QACvG,gGAAgG;QAChG,gGAAgG;QAChG,EAAE;QACF,sGAAsG;QACtG,qGAAqG;QACrG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC5B,OAAO,CAAC,aAAa,GAAG,aAAa,CAAA;QACrC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAA;QACzB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAA;QAClC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;QAC9B,IAAI,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAAC,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;QAAC,CAAC;QACpF,IAAI,OAAO,CAAC,YAAY;YAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAC7E,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC/D,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;QAC3B,IAAI,QAAQ,EAAE,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC3E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,SAAsB;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAA;QAC9B,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;QACpB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAA;QAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;QACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;QAAC,CAAC;QACpF,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAClC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;gBACxB,SAAS,EAAE,CAAA;YACb,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,SAAiB,EAAE,WAAsB,EAAE,MAAoB,EAAE,KAAoB;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAA;QAE/B,+FAA+F;QAC/F,8FAA8F;QAC9F,0FAA0F;QAC1F,kEAAkE;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;QACzB,IAAI,MAAM,EAAE,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAEzD,OAAO,CAAC,WAAW,GAAG,WAAW,CAAA;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;QACvE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QAE3C,6FAA6F;QAC7F,iCAAiC;QACjC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACjC,2FAA2F;QAC3F,0DAA0D;QAC1D,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;QACzB,gGAAgG;QAChG,uFAAuF;QACvF,0FAA0F;QAC1F,8EAA8E;QAC9E,OAAO,CAAC,UAAU,GAAG,SAAS,CAAA;QAC9B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAA;QAE9B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;QAEjE,8FAA8F;QAC9F,2EAA2E;QAC3E,8FAA8F;QAC9F,6FAA6F;QAC7F,wFAAwF;QACxF,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,YAAY,CAAC,WAAsB,EAAE,SAAyB;QAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IACjD,CAAC;IAED,YAAY,CAAC,WAAsB;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC7C,CAAC;IAED,eAAe,CAAC,WAAsB;QACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAA;QAC9B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAA;QAC9B,OAAO,CAAC,YAAY,GAAG,UAAU,CAAA;QACjC,+FAA+F;QAC/F,mFAAmF;QACnF,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IAC3B,CAAC;IAED,eAAe,CAAC,SAAiB,EAAE,EAAa;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,OAAO,CAAC,YAAY;YAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QAC7E,OAAO,CAAC,YAAY,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAED;;uFAEmF;IACnF,iBAAiB,CAAC,SAAiB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,EAAE,YAAY;YAAE,OAAM;QAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACnD,OAAO,CAAC,YAAY,GAAG,IAAI,CAAA;QAC3B,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IAC3B,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,IAAmB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAA;IACxC,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,IAAmB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAA;IACxC,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,KAAc;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAE,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IACxC,CAAC;IAED,kBAAkB,CAAC,SAAiB,EAAE,MAAoB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,OAAO;YAAE,OAAO,CAAC,YAAY,GAAG,MAAM,CAAA;IAC5C,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,KAAa,EAAE,OAAmC;QACrD,gCAAgC;QAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAA;QAChD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,2FAA2F;YAC3F,4FAA4F;YAC5F,4FAA4F;YAC5F,4FAA4F;YAC5F,0FAA0F;YAC1F,4FAA4F;YAC5F,wFAAwF;YACxF,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,SAAQ;YAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;YACrD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnD,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7B,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YACxD,0FAA0F;YAC1F,4FAA4F;YAC5F,yEAAyE;YACzE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE;YAC9C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,CAAC,CAAC,QAAQ;gBACd,IAAI,EAAE,CAAC,CAAC,UAAU;gBAClB,QAAQ,EAAE,CAAC,CAAC,cAAc;gBAC1B,MAAM,EAAE,CAAC,CAAC,YAAY;gBACtB,SAAS,EAAE,CAAC,CAAC,eAAe;gBAC5B,SAAS,EAAE,CAAC,CAAC,EAAE;gBACf,IAAI,EACF,CAAC,CAAC,KAAK,KAAK,IAAI;oBAChB,CAAC,CAAC,KAAK,KAAK,KAAK;oBACjB,CAAC,CAAC,aAAa,KAAK,IAAI;oBACxB,iGAAiG;oBACjG,8FAA8F;oBAC9F,4FAA4F;oBAC5F,2CAA2C;oBAC3C,CAAC,CAAC,aAAa,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;oBAC7C,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;aAC3B,CAAC,CAAC;SACJ,CAAC,CAAC,CAAA;IACL,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,10 +6,9 @@ export type { TapflowConfig } from './lib/config.js';
|
|
|
6
6
|
export { buildCorsOrigins, proxyWithoutPublicUrlWarning } from './lib/proxyConfig.js';
|
|
7
7
|
export type { CertProvider, CertMaterial, CertStrategy } from './lib/cert/index.js';
|
|
8
8
|
export type { DnsProvider } from './lib/cert/index.js';
|
|
9
|
-
export { createCertProvider, startCertRenewal, startAddressPublisher, dnsProviders } from './lib/cert/index.js';
|
|
9
|
+
export { createCertProvider, startCertRenewal, startAddressPublisher, dnsProviders, resolveRelayDisplayHost } from './lib/cert/index.js';
|
|
10
10
|
export { startTlsBackgroundTasks } from './lib/tlsTasks.js';
|
|
11
11
|
export type { DnsProviderEntry } from './lib/cert/index.js';
|
|
12
12
|
export type { TlsConfig } from './lib/cert/index.js';
|
|
13
13
|
export type { Session } from './SessionManager.js';
|
|
14
|
-
export type { RelayMessage, MessageType } from './types.js';
|
|
15
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACnF,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACnF,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,6 @@ export { SessionManager } from './SessionManager.js';
|
|
|
3
3
|
export { initDb, getDb, closeDb } from './db.js';
|
|
4
4
|
export { config, loadedEnvPath } from './lib/config.js';
|
|
5
5
|
export { buildCorsOrigins, proxyWithoutPublicUrlWarning } from './lib/proxyConfig.js';
|
|
6
|
-
export { createCertProvider, startCertRenewal, startAddressPublisher, dnsProviders } from './lib/cert/index.js';
|
|
6
|
+
export { createCertProvider, startCertRenewal, startAddressPublisher, dnsProviders, resolveRelayDisplayHost } from './lib/cert/index.js';
|
|
7
7
|
export { startTlsBackgroundTasks } from './lib/tlsTasks.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAGrF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAGrF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/lib/cert/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { AcmeClientIssuer } from './AcmeClientIssuer.js';
|
|
|
10
10
|
export type { AcmeClientIssuerOptions } from './AcmeClientIssuer.js';
|
|
11
11
|
export { ImportCertProvider } from './ImportCertProvider.js';
|
|
12
12
|
export type { ImportCertProviderOptions } from './ImportCertProvider.js';
|
|
13
|
-
export { parseCertNotAfter } from './parseCert.js';
|
|
13
|
+
export { parseCertNotAfter, resolveRelayDisplayHost } from './parseCert.js';
|
|
14
14
|
export { DiskCertStore } from './DiskCertStore.js';
|
|
15
15
|
export { startCertRenewal, renewalTick } from './renewal.js';
|
|
16
16
|
export type { CertRenewalOptions } from './renewal.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/cert/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACzF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC5E,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACvG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/cert/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACzF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC5E,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACvG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC5E,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA"}
|
package/dist/lib/cert/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export { VercelDnsProvider, vercelDnsFromEnv } from './VercelDnsProvider.js';
|
|
|
3
3
|
export { AcmeCertProvider, InMemoryCertStore } from './AcmeCertProvider.js';
|
|
4
4
|
export { AcmeClientIssuer } from './AcmeClientIssuer.js';
|
|
5
5
|
export { ImportCertProvider } from './ImportCertProvider.js';
|
|
6
|
-
export { parseCertNotAfter } from './parseCert.js';
|
|
6
|
+
export { parseCertNotAfter, resolveRelayDisplayHost } from './parseCert.js';
|
|
7
7
|
export { DiskCertStore } from './DiskCertStore.js';
|
|
8
8
|
export { startCertRenewal, renewalTick } from './renewal.js';
|
|
9
9
|
export { startAddressPublisher, detectLanIPv4 } from './addressPublisher.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/cert/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAExF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/cert/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAExF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE5D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import type { TlsConfig } from './createCertProvider.js';
|
|
1
2
|
/** PEM 인증서에서 notAfter(만료 시각)를 파싱한다. 잘못된 PEM이면 throw. */
|
|
2
3
|
export declare function parseCertNotAfter(certPem: string): Date;
|
|
4
|
+
/** Return one concrete DNS host the certificate can identify, or localhost when it has none. */
|
|
5
|
+
export declare function parseCertDisplayHost(certPem: string): string;
|
|
6
|
+
export declare function resolveRelayDisplayHost(tls: TlsConfig | null, certPem?: string, warn?: (message: string) => void): string;
|
|
3
7
|
//# sourceMappingURL=parseCert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCert.d.ts","sourceRoot":"","sources":["../../../src/lib/cert/parseCert.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEvD"}
|
|
1
|
+
{"version":3,"file":"parseCert.d.ts","sourceRoot":"","sources":["../../../src/lib/cert/parseCert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AA0BxD,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEvD;AAiCD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,SAAS,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC/B,MAAM,CAQR"}
|
|
@@ -1,6 +1,74 @@
|
|
|
1
1
|
import { X509Certificate } from 'crypto';
|
|
2
|
+
import { isIP } from 'net';
|
|
3
|
+
const FALLBACK_HOST = 'localhost';
|
|
4
|
+
const IMPORT_CERT_FALLBACK_WARNING = 'Imported certificate has DNS SANs, but none can be advertised to teammates; using localhost. ' +
|
|
5
|
+
'Add a concrete non-localhost DNS SAN to advertise its URL.';
|
|
6
|
+
function concreteDnsHost(value) {
|
|
7
|
+
if (!value || value !== value.trim() || isIP(value) !== 0 || value.length > 253)
|
|
8
|
+
return null;
|
|
9
|
+
const labels = value.split('.');
|
|
10
|
+
if (labels.some((label) => !/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(label)))
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
// WHATWG URLs accept legacy IPv4 spellings such as 127.1 and 0x7f000001.
|
|
14
|
+
// Do not advertise them as DNS names: browsers normalize them to an IP address.
|
|
15
|
+
if (isIP(new URL(`https://${value}`).hostname) !== 0)
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
2
23
|
/** PEM 인증서에서 notAfter(만료 시각)를 파싱한다. 잘못된 PEM이면 throw. */
|
|
3
24
|
export function parseCertNotAfter(certPem) {
|
|
4
25
|
return new Date(new X509Certificate(certPem).validTo);
|
|
5
26
|
}
|
|
27
|
+
function parseCertDisplayHostResult(certPem) {
|
|
28
|
+
try {
|
|
29
|
+
const cert = new X509Certificate(certPem);
|
|
30
|
+
if (cert.subjectAltName !== undefined) {
|
|
31
|
+
let hasDnsSan = false;
|
|
32
|
+
// Node JSON-quotes and escapes ambiguous SAN values, including commas. A real DNS host uses
|
|
33
|
+
// none of those characters, so strict label validation can safely reject the whole value.
|
|
34
|
+
for (const entry of cert.subjectAltName.split(', ')) {
|
|
35
|
+
if (!entry.startsWith('DNS:'))
|
|
36
|
+
continue;
|
|
37
|
+
hasDnsSan = true;
|
|
38
|
+
const host = concreteDnsHost(entry.slice(4));
|
|
39
|
+
if (host && host.toLowerCase() !== FALLBACK_HOST) {
|
|
40
|
+
return { host, warnAboutFallback: false };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { host: FALLBACK_HOST, warnAboutFallback: hasDnsSan };
|
|
44
|
+
}
|
|
45
|
+
const commonName = cert.subject
|
|
46
|
+
.split('\n')
|
|
47
|
+
.find((entry) => entry.startsWith('CN='))
|
|
48
|
+
?.slice(3);
|
|
49
|
+
return {
|
|
50
|
+
host: commonName ? concreteDnsHost(commonName) ?? FALLBACK_HOST : FALLBACK_HOST,
|
|
51
|
+
warnAboutFallback: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { host: FALLBACK_HOST, warnAboutFallback: false };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Return one concrete DNS host the certificate can identify, or localhost when it has none. */
|
|
59
|
+
export function parseCertDisplayHost(certPem) {
|
|
60
|
+
return parseCertDisplayHostResult(certPem).host;
|
|
61
|
+
}
|
|
62
|
+
export function resolveRelayDisplayHost(tls, certPem, warn) {
|
|
63
|
+
if (!tls)
|
|
64
|
+
return FALLBACK_HOST;
|
|
65
|
+
if (tls.mode === 'byo-api-token')
|
|
66
|
+
return tls.domain;
|
|
67
|
+
if (!certPem)
|
|
68
|
+
return FALLBACK_HOST;
|
|
69
|
+
const result = parseCertDisplayHostResult(certPem);
|
|
70
|
+
if (result.warnAboutFallback)
|
|
71
|
+
warn?.(IMPORT_CERT_FALLBACK_WARNING);
|
|
72
|
+
return result.host;
|
|
73
|
+
}
|
|
6
74
|
//# sourceMappingURL=parseCert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCert.js","sourceRoot":"","sources":["../../../src/lib/cert/parseCert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"parseCert.js","sourceRoot":"","sources":["../../../src/lib/cert/parseCert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** A clock and timer boundary for a trailing-edge requester. */
|
|
2
|
+
export interface TimerScheduler<Timer> {
|
|
3
|
+
now(): number;
|
|
4
|
+
schedule(callback: () => void, delayMs: number): Timer;
|
|
5
|
+
cancel(timer: Timer): void;
|
|
6
|
+
}
|
|
7
|
+
/** A callable requester whose delayed edge can be cancelled when its owner goes away. */
|
|
8
|
+
export type TrailingRequester = (() => void) & {
|
|
9
|
+
dispose(): void;
|
|
10
|
+
};
|
|
11
|
+
/** The production scheduler. `unref` keeps a pending request from keeping the relay process alive. */
|
|
12
|
+
export declare const systemTimerScheduler: TimerScheduler<ReturnType<typeof setTimeout>>;
|
|
13
|
+
/**
|
|
14
|
+
* Calls `fire` immediately at the leading edge, then coalesces calls inside `windowMs` onto one
|
|
15
|
+
* trailing edge. The scheduler is injected so the timing policy can be tested without faking the
|
|
16
|
+
* relay's WebSocket or heartbeat timers.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTrailingRequester<Timer>(options: {
|
|
19
|
+
scheduler: TimerScheduler<Timer>;
|
|
20
|
+
windowMs: number;
|
|
21
|
+
fire: () => void;
|
|
22
|
+
}): TrailingRequester;
|
|
23
|
+
//# sourceMappingURL=trailingRequester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trailingRequester.d.ts","sourceRoot":"","sources":["../../src/lib/trailingRequester.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,GAAG,IAAI,MAAM,CAAA;IACb,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA;IACtD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC3B;AAED,yFAAyF;AACzF,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG;IAAE,OAAO,IAAI,IAAI,CAAA;CAAE,CAAA;AAElE,sGAAsG;AACtG,eAAO,MAAM,oBAAoB,EAAE,cAAc,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAQ9E,CAAA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE;IACtD,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB,GAAG,iBAAiB,CA4CpB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** The production scheduler. `unref` keeps a pending request from keeping the relay process alive. */
|
|
2
|
+
export const systemTimerScheduler = {
|
|
3
|
+
now: () => Date.now(),
|
|
4
|
+
schedule(callback, delayMs) {
|
|
5
|
+
const timer = setTimeout(callback, delayMs);
|
|
6
|
+
timer.unref();
|
|
7
|
+
return timer;
|
|
8
|
+
},
|
|
9
|
+
cancel(timer) { clearTimeout(timer); },
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Calls `fire` immediately at the leading edge, then coalesces calls inside `windowMs` onto one
|
|
13
|
+
* trailing edge. The scheduler is injected so the timing policy can be tested without faking the
|
|
14
|
+
* relay's WebSocket or heartbeat timers.
|
|
15
|
+
*/
|
|
16
|
+
export function createTrailingRequester(options) {
|
|
17
|
+
const { scheduler, windowMs, fire } = options;
|
|
18
|
+
let lastAt = null;
|
|
19
|
+
let pending = null;
|
|
20
|
+
const fireNow = () => {
|
|
21
|
+
lastAt = scheduler.now();
|
|
22
|
+
fire();
|
|
23
|
+
};
|
|
24
|
+
const requester = (() => {
|
|
25
|
+
if (lastAt === null) {
|
|
26
|
+
fireNow();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const wait = windowMs - (scheduler.now() - lastAt);
|
|
30
|
+
if (wait <= 0) {
|
|
31
|
+
// A timer that became due while another callback was running must not fire after this leading
|
|
32
|
+
// edge as well. Node normally runs due timers first, but that ordering is not a second budget.
|
|
33
|
+
if (pending !== null) {
|
|
34
|
+
scheduler.cancel(pending);
|
|
35
|
+
pending = null;
|
|
36
|
+
}
|
|
37
|
+
fireNow();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Already coalesced. A second timer here would be the double send the window is for.
|
|
41
|
+
if (pending !== null)
|
|
42
|
+
return;
|
|
43
|
+
pending = scheduler.schedule(() => {
|
|
44
|
+
pending = null;
|
|
45
|
+
fireNow();
|
|
46
|
+
}, wait);
|
|
47
|
+
});
|
|
48
|
+
requester.dispose = () => {
|
|
49
|
+
if (pending !== null) {
|
|
50
|
+
scheduler.cancel(pending);
|
|
51
|
+
pending = null;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
return requester;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=trailingRequester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trailingRequester.js","sourceRoot":"","sources":["../../src/lib/trailingRequester.ts"],"names":[],"mappings":"AAUA,sGAAsG;AACtG,MAAM,CAAC,MAAM,oBAAoB,GAAkD;IACjF,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC3C,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;CACtC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAQ,OAI9C;IACC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAC7C,IAAI,MAAM,GAAkB,IAAI,CAAA;IAChC,IAAI,OAAO,GAAiB,IAAI,CAAA;IAEhC,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,CAAA;QACxB,IAAI,EAAE,CAAA;IACR,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;QACtB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,CAAA;YACT,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAA;QAClD,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,8FAA8F;YAC9F,+FAA+F;YAC/F,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACzB,OAAO,GAAG,IAAI,CAAA;YAChB,CAAC;YACD,OAAO,EAAE,CAAA;YACT,OAAM;QACR,CAAC;QAED,qFAAqF;QACrF,IAAI,OAAO,KAAK,IAAI;YAAE,OAAM;QAC5B,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;YAChC,OAAO,GAAG,IAAI,CAAA;YACd,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,CAAsB,CAAA;IAEvB,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;QACvB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACzB,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC,CAAA;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,7 @@ import { initDb } from './db.js';
|
|
|
3
3
|
import { RelayServer } from './RelayServer.js';
|
|
4
4
|
import { config, loadedEnvPath } from './lib/config.js';
|
|
5
5
|
import { buildCorsOrigins, proxyWithoutPublicUrlWarning } from './lib/proxyConfig.js';
|
|
6
|
-
import { createCertProvider } from './lib/cert/index.js';
|
|
6
|
+
import { createCertProvider, resolveRelayDisplayHost } from './lib/cert/index.js';
|
|
7
7
|
import { startTlsBackgroundTasks } from './lib/tlsTasks.js';
|
|
8
8
|
import { createLogger } from '@tapflowio/agent-core';
|
|
9
9
|
const logger = createLogger('relay');
|
|
@@ -21,10 +21,12 @@ if (proxyWarning)
|
|
|
21
21
|
async function main() {
|
|
22
22
|
let tls;
|
|
23
23
|
let provider = null;
|
|
24
|
+
let displayHost = 'localhost';
|
|
24
25
|
if (config.tls) {
|
|
25
26
|
provider = createCertProvider(config.tls, { dataDir });
|
|
26
27
|
const material = await provider.ensureCert();
|
|
27
28
|
tls = { cert: material.cert, key: material.key };
|
|
29
|
+
displayHost = resolveRelayDisplayHost(config.tls, material.cert, (message) => logger.warn(message));
|
|
28
30
|
}
|
|
29
31
|
else {
|
|
30
32
|
logger.info('TLS disabled — serving HTTP. Secure-context features (e.g. WebCodecs hardware decode) require HTTPS; ' +
|
|
@@ -32,7 +34,7 @@ async function main() {
|
|
|
32
34
|
}
|
|
33
35
|
const server = new RelayServer({ port, uploadsDir, wsBackpressureBytes: config.local.wsBackpressureBytes, trustedProxies: config.local.trustedProxies, corsOrigins, tls });
|
|
34
36
|
await server.start();
|
|
35
|
-
logger.info(`tapflow relay running
|
|
37
|
+
logger.info(`tapflow relay running at ${tls ? 'https' : 'http'}://${displayHost}:${port}`);
|
|
36
38
|
const stopTls = provider ? startTlsBackgroundTasks(provider, server, config.tls) : null;
|
|
37
39
|
const shutdown = () => {
|
|
38
40
|
stopTls?.();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,42 +1,6 @@
|
|
|
1
|
-
export type MessageType = 'agent:register' | 'agent:registered' | 'agent:resources' | 'agents:list' | 'agents:listed' | 'session:start' | 'session:joined' | 'session:chrome' | 'session:deviceInfo' | 'session:end' | 'session:leave' | 'session:terminated' | 'session:agent-away' | 'session:rebound' | 'stream:register' | 'stream:registered' | 'device:boot' | 'device:booting' | 'device:ready' | 'device:boot-error' | 'device:shutdown' | 'device:shutdown-done' | 'app:install' | 'app:install-done' | 'app:install-error' | 'app:launch' | 'app:launch-done' | 'app:launch-error' | 'open-url' | 'open-url:done' | 'open-url:error' | 'app:clear-state' | 'app:clear-state-done' | 'app:clear-state-error' | 'input:touch:start' | 'input:touch:move' | 'input:touch:end' | 'input:pinch:start' | 'input:pinch:move' | 'input:pinch:end' | 'input:key' | 'input:type' | 'input:type-done' | 'input:type-error' | 'input:done' | 'input:error' | 'input:button' | 'input:rotate' | 'input:keyboard:toggle' | 'keyboard:toggled' | 'screenshot:request' | 'screenshot:done' | 'screenshot:error' | 'ui:tree:request' | 'ui:tree:response' | 'ui:tree:error' | 'clipboard:read' | 'clipboard:write' | 'clipboard:data' | 'clipboard:write-done' | 'clipboard:error' | 'error';
|
|
2
1
|
import type { AgentResources, UIElement } from '@tapflowio/agent-core';
|
|
3
2
|
export type { AgentResources, UIElement };
|
|
4
|
-
import type { DeviceSummary
|
|
5
|
-
export type { DeviceReport, DeviceSummary, SessionTerminatedReason } from '@tapflowio/protocol';
|
|
3
|
+
import type { DeviceSummary } from '@tapflowio/protocol';
|
|
4
|
+
export type { DeviceDetails, DeviceReport, DeviceSummary, SessionInfo, SessionTerminatedReason } from '@tapflowio/protocol';
|
|
6
5
|
export type DeviceInfo = DeviceSummary;
|
|
7
|
-
export interface SessionInfo {
|
|
8
|
-
agentName?: string;
|
|
9
|
-
platform?: string;
|
|
10
|
-
resources?: AgentResources;
|
|
11
|
-
devices: DeviceInfo[];
|
|
12
|
-
}
|
|
13
|
-
export interface RelayMessage {
|
|
14
|
-
type: MessageType;
|
|
15
|
-
sessionId?: string;
|
|
16
|
-
payload?: unknown;
|
|
17
|
-
message?: string;
|
|
18
|
-
agentName?: string;
|
|
19
|
-
agentId?: string;
|
|
20
|
-
devices?: Array<{
|
|
21
|
-
id: string;
|
|
22
|
-
name: string;
|
|
23
|
-
platform: string;
|
|
24
|
-
status: string;
|
|
25
|
-
osVersion?: string;
|
|
26
|
-
}>;
|
|
27
|
-
platform?: string;
|
|
28
|
-
capabilities?: string[];
|
|
29
|
-
sessions?: SessionInfo[];
|
|
30
|
-
registeredSessions?: Array<{
|
|
31
|
-
deviceId: string;
|
|
32
|
-
sessionId: string;
|
|
33
|
-
}>;
|
|
34
|
-
buildId?: number;
|
|
35
|
-
resources?: AgentResources;
|
|
36
|
-
requestId?: string;
|
|
37
|
-
data?: string;
|
|
38
|
-
format?: 'png' | 'jpeg';
|
|
39
|
-
elements?: UIElement[];
|
|
40
|
-
reason?: SessionTerminatedReason;
|
|
41
|
-
}
|
|
42
6
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,CAAA;AAIzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAE3H,MAAM,MAAM,UAAU,GAAG,aAAa,CAAA"}
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
|
+
// The wire contract lives in @tapflowio/protocol. This file holds what the relay adds on top of it —
|
|
2
|
+
// today only the re-exports and aliases below.
|
|
3
|
+
//
|
|
4
|
+
// **`RelayMessage` and `MessageType` were removed here (#550).** They were a flat interface where
|
|
5
|
+
// `type` was the only required member and a hand-copied union of 63 literals beside it, and they were
|
|
6
|
+
// the relay's *inbound* type: `route` took a `RelayMessage`, so every field it read was optional by
|
|
7
|
+
// construction and every one it needed came with a `!`. That is why the two type systems could
|
|
8
|
+
// disagree about the same wire field — `format?` here against a required `format` in the protocol —
|
|
9
|
+
// with nothing to report it.
|
|
10
|
+
//
|
|
11
|
+
// What replaced them is not another declaration but a parse: `@tapflowio/protocol/validate` turns an
|
|
12
|
+
// inbound frame into a discriminated union at the door, and the relay's own membership assertions
|
|
13
|
+
// went with the literal list they were holding, because there is no longer a second copy to hold.
|
|
1
14
|
export {};
|
|
2
15
|
//# sourceMappingURL=types.js.map
|