@linkshell/gateway 0.5.3 → 0.6.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 (109) hide show
  1. package/Dockerfile +8 -22
  2. package/README.md +99 -44
  3. package/dist/gateway/src/accounts.js.map +1 -0
  4. package/dist/gateway/src/index.d.ts +4 -1
  5. package/dist/gateway/src/index.js +4 -863
  6. package/dist/gateway/src/index.js.map +1 -1
  7. package/dist/gateway/src/main.js +57 -0
  8. package/dist/gateway/src/main.js.map +1 -0
  9. package/dist/gateway/src/rate-limit.d.ts +22 -0
  10. package/dist/gateway/src/rate-limit.js +66 -0
  11. package/dist/gateway/src/rate-limit.js.map +1 -0
  12. package/dist/gateway/src/relay.d.ts +84 -5
  13. package/dist/gateway/src/relay.js +402 -529
  14. package/dist/gateway/src/relay.js.map +1 -1
  15. package/dist/gateway/src/serve.d.ts +34 -0
  16. package/dist/gateway/src/serve.js +102 -0
  17. package/dist/gateway/src/serve.js.map +1 -0
  18. package/dist/{gateway-v2 → gateway}/src/store.d.ts +5 -0
  19. package/dist/{gateway-v2 → gateway}/src/store.js +7 -0
  20. package/dist/gateway/src/store.js.map +1 -0
  21. package/dist/gateway/src/subscription.d.ts +18 -0
  22. package/dist/gateway/src/subscription.js +46 -0
  23. package/dist/gateway/src/subscription.js.map +1 -0
  24. package/dist/gateway/tsconfig.tsbuildinfo +1 -1
  25. package/dist/wire/src/direct.d.ts +22 -0
  26. package/dist/wire/src/direct.js +37 -0
  27. package/dist/wire/src/direct.js.map +1 -0
  28. package/dist/wire/src/index.d.ts +1 -0
  29. package/dist/wire/src/index.js +1 -0
  30. package/dist/wire/src/index.js.map +1 -1
  31. package/dist/wire/src/model.d.ts +287 -6
  32. package/dist/wire/src/model.js +33 -0
  33. package/dist/wire/src/model.js.map +1 -1
  34. package/dist/wire/src/relay.d.ts +8 -8
  35. package/dist/wire/src/rpc.d.ts +1780 -44
  36. package/dist/wire/src/rpc.js +48 -3
  37. package/dist/wire/src/rpc.js.map +1 -1
  38. package/dist/wire/src/updates.d.ts +356 -0
  39. package/dist/wire/src/updates.js +11 -1
  40. package/dist/wire/src/updates.js.map +1 -1
  41. package/package.json +12 -12
  42. package/src/accounts.ts +32 -0
  43. package/src/index.ts +4 -997
  44. package/src/main.ts +65 -0
  45. package/src/rate-limit.ts +72 -0
  46. package/src/relay.ts +435 -620
  47. package/src/serve.ts +130 -0
  48. package/src/store.ts +135 -0
  49. package/src/subscription.ts +51 -0
  50. package/dist/gateway/src/auth-middleware.d.ts +0 -44
  51. package/dist/gateway/src/auth-middleware.js +0 -204
  52. package/dist/gateway/src/auth-middleware.js.map +0 -1
  53. package/dist/gateway/src/cors.d.ts +0 -2
  54. package/dist/gateway/src/cors.js +0 -7
  55. package/dist/gateway/src/cors.js.map +0 -1
  56. package/dist/gateway/src/embedded.d.ts +0 -21
  57. package/dist/gateway/src/embedded.js +0 -438
  58. package/dist/gateway/src/embedded.js.map +0 -1
  59. package/dist/gateway/src/host-auth.d.ts +0 -32
  60. package/dist/gateway/src/host-auth.js +0 -78
  61. package/dist/gateway/src/host-auth.js.map +0 -1
  62. package/dist/gateway/src/pairings.d.ts +0 -38
  63. package/dist/gateway/src/pairings.js +0 -119
  64. package/dist/gateway/src/pairings.js.map +0 -1
  65. package/dist/gateway/src/presence.d.ts +0 -28
  66. package/dist/gateway/src/presence.js +0 -92
  67. package/dist/gateway/src/presence.js.map +0 -1
  68. package/dist/gateway/src/sessions.d.ts +0 -113
  69. package/dist/gateway/src/sessions.js +0 -352
  70. package/dist/gateway/src/sessions.js.map +0 -1
  71. package/dist/gateway/src/state-store.d.ts +0 -21
  72. package/dist/gateway/src/state-store.js +0 -103
  73. package/dist/gateway/src/state-store.js.map +0 -1
  74. package/dist/gateway/src/static-web.d.ts +0 -15
  75. package/dist/gateway/src/static-web.js +0 -129
  76. package/dist/gateway/src/static-web.js.map +0 -1
  77. package/dist/gateway/src/tokens.d.ts +0 -19
  78. package/dist/gateway/src/tokens.js +0 -151
  79. package/dist/gateway/src/tokens.js.map +0 -1
  80. package/dist/gateway/src/tunnel.d.ts +0 -61
  81. package/dist/gateway/src/tunnel.js +0 -576
  82. package/dist/gateway/src/tunnel.js.map +0 -1
  83. package/dist/gateway-v2/src/accounts.js.map +0 -1
  84. package/dist/gateway-v2/src/index.d.ts +0 -3
  85. package/dist/gateway-v2/src/index.js +0 -4
  86. package/dist/gateway-v2/src/index.js.map +0 -1
  87. package/dist/gateway-v2/src/main.js +0 -17
  88. package/dist/gateway-v2/src/main.js.map +0 -1
  89. package/dist/gateway-v2/src/server.d.ts +0 -84
  90. package/dist/gateway-v2/src/server.js +0 -426
  91. package/dist/gateway-v2/src/server.js.map +0 -1
  92. package/dist/gateway-v2/src/store.js.map +0 -1
  93. package/dist/shared-protocol/src/index.d.ts +0 -17029
  94. package/dist/shared-protocol/src/index.js +0 -1064
  95. package/dist/shared-protocol/src/index.js.map +0 -1
  96. package/src/auth-middleware.ts +0 -266
  97. package/src/cors.ts +0 -8
  98. package/src/embedded.ts +0 -526
  99. package/src/host-auth.ts +0 -88
  100. package/src/pairings.ts +0 -133
  101. package/src/presence.ts +0 -118
  102. package/src/sessions.ts +0 -432
  103. package/src/state-store.ts +0 -140
  104. package/src/static-web.ts +0 -133
  105. package/src/tokens.ts +0 -159
  106. package/src/tunnel.ts +0 -644
  107. /package/dist/{gateway-v2 → gateway}/src/accounts.d.ts +0 -0
  108. /package/dist/{gateway-v2 → gateway}/src/accounts.js +0 -0
  109. /package/dist/{gateway-v2 → gateway}/src/main.d.ts +0 -0
@@ -1,576 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { createEnvelope, serializeEnvelope, } from "@linkshell/protocol";
3
- import { AUTH_REQUIRED } from "./auth-middleware.js";
4
- const TUNNEL_TIMEOUT = 30_000;
5
- const MAX_TUNNEL_BODY = 10 * 1024 * 1024; // 10MB
6
- // Module-level maps keyed by requestId
7
- const pendingRequests = new Map();
8
- const pendingWsSockets = new Map();
9
- // Track requestIds per session for cleanup on host disconnect
10
- const sessionRequests = new Map();
11
- function trackRequest(sessionId, requestId) {
12
- let set = sessionRequests.get(sessionId);
13
- if (!set) {
14
- set = new Set();
15
- sessionRequests.set(sessionId, set);
16
- }
17
- set.add(requestId);
18
- }
19
- function untrackRequest(sessionId, requestId) {
20
- const set = sessionRequests.get(sessionId);
21
- if (set) {
22
- set.delete(requestId);
23
- if (set.size === 0)
24
- sessionRequests.delete(sessionId);
25
- }
26
- }
27
- function extractToken(req, url) {
28
- // Check Authorization header
29
- const auth = req.headers.authorization;
30
- if (auth) {
31
- const match = auth.match(/^Bearer\s+(.+)$/i);
32
- if (match?.[1])
33
- return match[1];
34
- }
35
- // Check query param
36
- const qToken = url.searchParams.get("token");
37
- if (qToken)
38
- return qToken;
39
- // Check cookie (token-only cookie)
40
- const cookie = req.headers.cookie;
41
- if (cookie) {
42
- const match = cookie.match(/lsh_token=([^;]+)/);
43
- if (match?.[1])
44
- return match[1];
45
- }
46
- return null;
47
- }
48
- function stripGatewayCookies(cookie) {
49
- const kept = cookie
50
- .split(";")
51
- .map((part) => part.trim())
52
- .filter((part) => {
53
- const name = part.split("=", 1)[0]?.trim();
54
- return name !== "lsh_tunnel" && name !== "lsh_token";
55
- });
56
- return kept.length > 0 ? kept.join("; ") : null;
57
- }
58
- function bindExplicitDeviceToken(tokens, sessionId, url, preAuthToken) {
59
- // Cookie fallback may pass a JWT as preAuthToken. Only bind the explicit
60
- // browser/device token from the original tunnel URL after JWT ownership has
61
- // been proven.
62
- if (preAuthToken)
63
- return null;
64
- const deviceToken = url.searchParams.get("token");
65
- if (!deviceToken)
66
- return null;
67
- const token = tokens.register(deviceToken);
68
- return tokens.bind(token, sessionId) ? token : null;
69
- }
70
- function forwardedUrl(path, url) {
71
- const params = new URLSearchParams(url.searchParams);
72
- params.delete("token");
73
- params.delete("auth_token");
74
- const query = params.toString();
75
- return query ? `${path}?${query}` : path;
76
- }
77
- function stripGatewayAuthParams(pathname, searchParams, hash = "") {
78
- const params = new URLSearchParams(searchParams);
79
- params.delete("token");
80
- params.delete("auth_token");
81
- const query = params.toString();
82
- return `${pathname}${query ? `?${query}` : ""}${hash}`;
83
- }
84
- function rewriteTunnelLocation(location, input) {
85
- try {
86
- const parsed = new URL(location, `http://127.0.0.1:${input.port}${input.requestPath}`);
87
- const isLocal = parsed.hostname === "127.0.0.1" ||
88
- parsed.hostname === "localhost" ||
89
- parsed.hostname === "::1";
90
- if (!isLocal || parsed.port !== String(input.port))
91
- return location;
92
- const target = stripGatewayAuthParams(parsed.pathname, parsed.searchParams, parsed.hash);
93
- return `/tunnel/${encodeURIComponent(input.sessionId)}/${input.port}${target}`;
94
- }
95
- catch {
96
- return location;
97
- }
98
- }
99
- function rewriteTunnelResponseHeaders(headers, input) {
100
- const rewritten = { ...headers };
101
- const locationKey = Object.keys(rewritten).find((key) => key.toLowerCase() === "location");
102
- if (!locationKey)
103
- return rewritten;
104
- const location = rewritten[locationKey];
105
- if (typeof location === "string") {
106
- rewritten[locationKey] = rewriteTunnelLocation(location, input);
107
- }
108
- return rewritten;
109
- }
110
- export function tokenFromTunnelCookie(req, sessionId, port) {
111
- const tunnelCookie = parseTunnelCookie(req);
112
- if (!tunnelCookie)
113
- return null;
114
- if (tunnelCookie.sessionId !== sessionId || tunnelCookie.port !== port)
115
- return null;
116
- return tunnelCookie.token;
117
- }
118
- /** Parse lsh_tunnel cookie: "sessionId:port:token" */
119
- export function parseTunnelCookie(req) {
120
- const cookie = req.headers.cookie;
121
- if (!cookie)
122
- return null;
123
- const match = cookie.match(/lsh_tunnel=([^;]+)/);
124
- if (!match?.[1])
125
- return null;
126
- const parts = decodeURIComponent(match[1]).split(":");
127
- if (parts.length < 3)
128
- return null;
129
- const sessionId = parts[0];
130
- const port = Number(parts[1]);
131
- const token = parts.slice(2).join(":"); // token may contain colons
132
- if (!sessionId || isNaN(port) || port < 1 || port > 65535 || !token)
133
- return null;
134
- return { sessionId, port, token };
135
- }
136
- function errorResponse(res, status, message, diagnostic) {
137
- if (res.headersSent)
138
- return;
139
- res.writeHead(status, {
140
- "content-type": "text/plain",
141
- "cache-control": "no-store, private",
142
- "cdn-cache-control": "no-store",
143
- "surrogate-control": "no-store",
144
- "vary": "authorization, cookie",
145
- "access-control-allow-origin": "*",
146
- ...(diagnostic ? { "x-linkshell-tunnel-error": diagnostic } : {}),
147
- });
148
- res.end(message);
149
- }
150
- function isSecureRequest(req) {
151
- if (req.socket.encrypted)
152
- return true;
153
- const proto = req.headers["x-forwarded-proto"];
154
- if (typeof proto === "string") {
155
- return proto.split(",")[0]?.trim().toLowerCase() === "https";
156
- }
157
- return false;
158
- }
159
- export function parseTunnelPath(pathname) {
160
- const match = pathname.match(/^\/tunnel\/([^/]+)\/(\d+)(\/.*)?$/);
161
- if (!match)
162
- return null;
163
- const port = Number(match[2]);
164
- if (port < 1 || port > 65535)
165
- return null;
166
- return {
167
- sessionId: match[1],
168
- port,
169
- path: match[3] || "/",
170
- };
171
- }
172
- export function hasTunnelReferer(req) {
173
- const referer = req.headers.referer;
174
- if (typeof referer !== "string")
175
- return false;
176
- try {
177
- const ref = new URL(referer);
178
- return ref.pathname.startsWith("/tunnel/");
179
- }
180
- catch {
181
- return false;
182
- }
183
- }
184
- export function shouldUseTunnelCookieFallback(req, pathname, isReservedPath = () => false) {
185
- if (pathname === "/" || isReservedPath(pathname))
186
- return false;
187
- // A stale Path=/ tunnel cookie must not hijack normal top-level document
188
- // visits to the LinkShell web app. Subresources are allowed through the
189
- // cookie fallback even when Referrer-Policy strips the /tunnel/... path; the
190
- // real LinkShell shell clears this HttpOnly cookie on index.html responses,
191
- // and concrete LinkShell assets are served before fallback.
192
- const dest = req.headers["sec-fetch-dest"];
193
- if (hasTunnelReferer(req))
194
- return true;
195
- if (!dest)
196
- return true;
197
- if (dest === "iframe")
198
- return true;
199
- if (dest !== "document")
200
- return true;
201
- return false;
202
- }
203
- export function mergeTunnelSetCookie(headers, tunnelCookie) {
204
- if (!tunnelCookie)
205
- return headers;
206
- const merged = { ...headers };
207
- const setCookieKey = Object.keys(merged).find((key) => key.toLowerCase() === "set-cookie");
208
- const upstreamSetCookie = setCookieKey ? merged[setCookieKey] : undefined;
209
- if (setCookieKey)
210
- delete merged[setCookieKey];
211
- merged["set-cookie"] = upstreamSetCookie
212
- ? Array.isArray(upstreamSetCookie)
213
- ? [...upstreamSetCookie, tunnelCookie]
214
- : [upstreamSetCookie, tunnelCookie]
215
- : tunnelCookie;
216
- return merged;
217
- }
218
- export async function handleTunnelRequest(req, res, sessions, tokens, parsed, url, preAuthToken) {
219
- const { sessionId, port, path } = parsed;
220
- // Auth: device token OR Supabase JWT (userId owns session)
221
- let token = preAuthToken || extractToken(req, url) || tokenFromTunnelCookie(req, sessionId, port);
222
- let tokenOwns = Boolean(token && await tokens.ownsFresh(token, sessionId));
223
- let authOwns = false;
224
- let authJwt = null;
225
- let authDiagnostic = token ? "token_not_bound" : "missing_token";
226
- if (!tokenOwns && AUTH_REQUIRED) {
227
- // Try preAuthToken as JWT first (from cookie fallback), then from request headers/params
228
- const jwtCandidate = preAuthToken || url.searchParams.get("auth_token") || (() => {
229
- const auth = req.headers.authorization;
230
- if (auth) {
231
- const m = auth.match(/^Bearer\s+(.+)$/i);
232
- if (m?.[1])
233
- return m[1];
234
- }
235
- return null;
236
- })();
237
- if (jwtCandidate) {
238
- try {
239
- const SUPABASE_URL = process.env.SUPABASE_URL ?? "";
240
- const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY ?? "";
241
- if (SUPABASE_URL && SUPABASE_ANON_KEY) {
242
- const userRes = await fetch(`${SUPABASE_URL}/auth/v1/user`, {
243
- headers: { Authorization: `Bearer ${jwtCandidate}`, apikey: SUPABASE_ANON_KEY },
244
- signal: AbortSignal.timeout(5_000),
245
- });
246
- if (userRes.ok) {
247
- const user = (await userRes.json());
248
- const session = sessions.get(sessionId);
249
- if (user.id && session?.userId && user.id === session.userId) {
250
- authOwns = true;
251
- authJwt = jwtCandidate;
252
- }
253
- else if (!session) {
254
- authDiagnostic = "session_not_local";
255
- }
256
- else if (!session.userId) {
257
- authDiagnostic = "session_user_missing";
258
- }
259
- else {
260
- authDiagnostic = "session_user_mismatch";
261
- }
262
- }
263
- else {
264
- authDiagnostic = "invalid_jwt";
265
- }
266
- }
267
- }
268
- catch {
269
- authDiagnostic = "jwt_check_failed";
270
- }
271
- }
272
- }
273
- if (!tokenOwns && authOwns) {
274
- const boundToken = bindExplicitDeviceToken(tokens, sessionId, url, preAuthToken);
275
- if (boundToken) {
276
- token = boundToken;
277
- tokenOwns = true;
278
- }
279
- }
280
- if (!tokenOwns && !authOwns) {
281
- errorResponse(res, 401, "Unauthorized", authDiagnostic);
282
- return;
283
- }
284
- // Set auth cookie for subsequent sub-resource requests
285
- let tunnelCookie;
286
- const cookieToken = tokenOwns ? token : authJwt;
287
- if (cookieToken) {
288
- const cookieVal = encodeURIComponent(`${sessionId}:${port}:${cookieToken}`);
289
- const secure = isSecureRequest(req) ? "; Secure" : "";
290
- tunnelCookie = `lsh_tunnel=${cookieVal}; Path=/; Max-Age=600; HttpOnly${secure}; SameSite=Lax`;
291
- }
292
- // Validate session & host
293
- const session = sessions.get(sessionId);
294
- if (!session || !session.host || session.host.socket.readyState !== session.host.socket.OPEN) {
295
- errorResponse(res, 502, "Host not connected", !session ? "session_not_local" : "host_not_connected");
296
- return;
297
- }
298
- const requestId = randomUUID();
299
- const method = req.method ?? "GET";
300
- // Read request body
301
- let body = null;
302
- if (method !== "GET" && method !== "HEAD") {
303
- const chunks = [];
304
- let size = 0;
305
- for await (const chunk of req) {
306
- const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
307
- size += buf.length;
308
- if (size > MAX_TUNNEL_BODY) {
309
- errorResponse(res, 413, "Request body too large");
310
- return;
311
- }
312
- chunks.push(buf);
313
- }
314
- if (chunks.length > 0) {
315
- body = Buffer.concat(chunks).toString("base64");
316
- }
317
- }
318
- // Build forwarded headers (strip hop-by-hop)
319
- const headers = {};
320
- const skipHeaders = new Set(["host", "connection", "upgrade", "transfer-encoding", "keep-alive"]);
321
- for (const [key, val] of Object.entries(req.headers)) {
322
- if (!skipHeaders.has(key) && typeof val === "string") {
323
- if (key === "cookie") {
324
- const cookie = stripGatewayCookies(val);
325
- if (cookie)
326
- headers[key] = cookie;
327
- }
328
- else {
329
- headers[key] = val;
330
- }
331
- }
332
- }
333
- // Reconstruct URL with query string. The gateway authenticates fallback
334
- // subresources with lsh_tunnel; it must not mutate host-facing URLs with
335
- // auth query params because that leaks credentials and poisons cache keys.
336
- const fullUrl = forwardedUrl(path, url);
337
- // Register pending request
338
- const pending = {
339
- res,
340
- headersSent: false,
341
- timeout: setTimeout(() => {
342
- pendingRequests.delete(requestId);
343
- untrackRequest(sessionId, requestId);
344
- errorResponse(res, 504, "Tunnel request timed out");
345
- }, TUNNEL_TIMEOUT),
346
- tunnelCookie,
347
- sessionId,
348
- port,
349
- requestPath: path,
350
- };
351
- pendingRequests.set(requestId, pending);
352
- trackRequest(sessionId, requestId);
353
- // Send tunnel.request to host
354
- const envelope = createEnvelope({
355
- type: "tunnel.request",
356
- sessionId,
357
- payload: {
358
- requestId,
359
- method,
360
- url: fullUrl,
361
- headers,
362
- body,
363
- port,
364
- },
365
- });
366
- session.host.socket.send(serializeEnvelope(envelope));
367
- // Handle client disconnect
368
- req.on("close", () => {
369
- const p = pendingRequests.get(requestId);
370
- if (p) {
371
- clearTimeout(p.timeout);
372
- pendingRequests.delete(requestId);
373
- untrackRequest(sessionId, requestId);
374
- }
375
- });
376
- }
377
- export function handleTunnelResponse(payload) {
378
- try {
379
- const pending = pendingRequests.get(payload.requestId);
380
- if (!pending)
381
- return;
382
- if (!pending.headersSent) {
383
- const responseHeaders = {
384
- ...rewriteTunnelResponseHeaders(payload.headers, pending),
385
- "cache-control": "no-store, private",
386
- "cdn-cache-control": "no-store",
387
- "surrogate-control": "no-store",
388
- "vary": "authorization, cookie",
389
- "access-control-allow-origin": "*",
390
- };
391
- pending.res.writeHead(payload.statusCode, mergeTunnelSetCookie(responseHeaders, pending.tunnelCookie));
392
- pending.headersSent = true;
393
- }
394
- if (payload.body) {
395
- pending.res.write(Buffer.from(payload.body, "base64"));
396
- }
397
- if (payload.isFinal) {
398
- clearTimeout(pending.timeout);
399
- pendingRequests.delete(payload.requestId);
400
- pending.res.end();
401
- }
402
- }
403
- catch { }
404
- }
405
- export function handleTunnelWsData(payload) {
406
- try {
407
- const pending = pendingWsSockets.get(payload.requestId);
408
- if (!pending || pending.ws.readyState !== 1)
409
- return;
410
- const buf = Buffer.from(payload.data, "base64");
411
- pending.ws.send(payload.isBinary ? buf : buf.toString("utf8"));
412
- }
413
- catch { }
414
- }
415
- export function handleTunnelWsClose(payload) {
416
- try {
417
- const pending = pendingWsSockets.get(payload.requestId);
418
- if (!pending)
419
- return;
420
- pendingWsSockets.delete(payload.requestId);
421
- if (pending.ws.readyState === 1) {
422
- const code = typeof payload.code === "number" && payload.code >= 1000 && payload.code <= 4999 ? payload.code : 1000;
423
- pending.ws.close(code, payload.reason ?? "");
424
- }
425
- }
426
- catch { }
427
- }
428
- export function registerTunnelWs(requestId, ws) {
429
- pendingWsSockets.set(requestId, { ws });
430
- }
431
- export function removeTunnelWs(requestId) {
432
- pendingWsSockets.delete(requestId);
433
- }
434
- export function cleanupSessionTunnels(sessionId) {
435
- const requestIds = sessionRequests.get(sessionId);
436
- if (!requestIds)
437
- return;
438
- for (const rid of requestIds) {
439
- const pending = pendingRequests.get(rid);
440
- if (pending) {
441
- clearTimeout(pending.timeout);
442
- errorResponse(pending.res, 502, "Host disconnected");
443
- pendingRequests.delete(rid);
444
- }
445
- const ws = pendingWsSockets.get(rid);
446
- if (ws) {
447
- ws.ws.close(1001, "Host disconnected");
448
- pendingWsSockets.delete(rid);
449
- }
450
- }
451
- sessionRequests.delete(sessionId);
452
- }
453
- export async function handleTunnelWsUpgrade(ws, parsed, url, sessions, tokens, preAuthToken) {
454
- const { sessionId, port, path } = parsed;
455
- // Auth: device token OR Supabase JWT (userId owns session)
456
- let token = preAuthToken || url.searchParams.get("token");
457
- let tokenOwns = Boolean(token && await tokens.ownsFresh(token, sessionId));
458
- let authOwns = false;
459
- let authDiagnostic = token ? "token_not_bound" : "missing_token";
460
- if (!tokenOwns && AUTH_REQUIRED) {
461
- // Try auth_token param first, then fall back to token param (cookie fallback stores JWT there)
462
- const authToken = url.searchParams.get("auth_token") || token;
463
- if (authToken) {
464
- try {
465
- const SUPABASE_URL = process.env.SUPABASE_URL ?? "";
466
- const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY ?? "";
467
- if (SUPABASE_URL && SUPABASE_ANON_KEY) {
468
- const userRes = await fetch(`${SUPABASE_URL}/auth/v1/user`, {
469
- headers: { Authorization: `Bearer ${authToken}`, apikey: SUPABASE_ANON_KEY },
470
- signal: AbortSignal.timeout(5_000),
471
- });
472
- if (userRes.ok) {
473
- const user = (await userRes.json());
474
- const session = sessions.get(sessionId);
475
- if (user.id && session?.userId && user.id === session.userId) {
476
- authOwns = true;
477
- }
478
- else if (!session) {
479
- authDiagnostic = "session_not_local";
480
- }
481
- else if (!session.userId) {
482
- authDiagnostic = "session_user_missing";
483
- }
484
- else {
485
- authDiagnostic = "session_user_mismatch";
486
- }
487
- }
488
- else {
489
- authDiagnostic = "invalid_jwt";
490
- }
491
- }
492
- }
493
- catch {
494
- authDiagnostic = "jwt_check_failed";
495
- }
496
- }
497
- }
498
- if (!tokenOwns && authOwns) {
499
- const boundToken = bindExplicitDeviceToken(tokens, sessionId, url, preAuthToken);
500
- if (boundToken) {
501
- token = boundToken;
502
- tokenOwns = true;
503
- }
504
- }
505
- if (!tokenOwns && !authOwns) {
506
- ws.close(4001, `Unauthorized:${authDiagnostic}`);
507
- return;
508
- }
509
- const session = sessions.get(sessionId);
510
- if (!session || !session.host || session.host.socket.readyState !== session.host.socket.OPEN) {
511
- ws.close(4002, "Host not connected");
512
- return;
513
- }
514
- const requestId = randomUUID();
515
- const fullUrl = forwardedUrl(path, url);
516
- // Register this WS so host responses route here
517
- registerTunnelWs(requestId, ws);
518
- trackRequest(sessionId, requestId);
519
- // Send tunnel.request with upgrade header to host
520
- const envelope = createEnvelope({
521
- type: "tunnel.request",
522
- sessionId,
523
- payload: {
524
- requestId,
525
- method: "GET",
526
- url: fullUrl,
527
- headers: { "upgrade": "websocket" },
528
- body: null,
529
- port,
530
- },
531
- });
532
- session.host.socket.send(serializeEnvelope(envelope));
533
- // Forward data from browser WS to host
534
- ws.on("message", (data) => {
535
- try {
536
- const s = sessions.get(sessionId);
537
- if (!s?.host || s.host.socket.readyState !== s.host.socket.OPEN)
538
- return;
539
- const isBinary = typeof data !== "string";
540
- const buf = typeof data === "string" ? Buffer.from(data) : data;
541
- const fwd = createEnvelope({
542
- type: "tunnel.ws.data",
543
- sessionId,
544
- payload: {
545
- requestId,
546
- data: buf.toString("base64"),
547
- isBinary,
548
- },
549
- });
550
- s.host.socket.send(serializeEnvelope(fwd));
551
- }
552
- catch { }
553
- });
554
- ws.on("close", (code, reason) => {
555
- try {
556
- removeTunnelWs(requestId);
557
- untrackRequest(sessionId, requestId);
558
- const s = sessions.get(sessionId);
559
- if (!s?.host || s.host.socket.readyState !== s.host.socket.OPEN)
560
- return;
561
- const safeCode = typeof code === "number" && code >= 1000 && code <= 4999 ? code : 1000;
562
- const fwd = createEnvelope({
563
- type: "tunnel.ws.close",
564
- sessionId,
565
- payload: {
566
- requestId,
567
- code: safeCode,
568
- reason: reason?.toString() || "",
569
- },
570
- });
571
- s.host.socket.send(serializeEnvelope(fwd));
572
- }
573
- catch { }
574
- });
575
- }
576
- //# sourceMappingURL=tunnel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../../src/tunnel.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../gateway-v2/src/accounts.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sDAAsD;AAStD,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAe;IAC3D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;IACrE,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,eAAe,EAAE;gBAClD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;gBAC9D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YAC/B,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI;gBAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK;oBAAE,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;wBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzG,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- export { Gateway, type GatewayOptions } from "./server.js";
2
- export { supabaseVerifier, type Account, type VerifyToken } from "./accounts.js";
3
- export { GatewayStore } from "./store.js";
@@ -1,4 +0,0 @@
1
- export { Gateway } from "./server.js";
2
- export { supabaseVerifier } from "./accounts.js";
3
- export { GatewayStore } from "./store.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../gateway-v2/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAkC,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -1,17 +0,0 @@
1
- import { mkdirSync } from "node:fs";
2
- import { dirname } from "node:path";
3
- import { supabaseVerifier } from "./accounts.js";
4
- import { Gateway } from "./server.js";
5
- // `PORT`, `DATA_PATH` (sqlite), and optionally SUPABASE_URL + SUPABASE_ANON_KEY for accounts.
6
- const databasePath = process.env.DATA_PATH ?? "./data/gateway-v2.db";
7
- mkdirSync(dirname(databasePath), { recursive: true });
8
- const verifyToken = process.env.SUPABASE_URL && process.env.SUPABASE_ANON_KEY
9
- ? supabaseVerifier(process.env.SUPABASE_URL, process.env.SUPABASE_ANON_KEY)
10
- : undefined;
11
- const gateway = new Gateway({ port: Number(process.env.PORT ?? 8788), databasePath, verifyToken });
12
- const port = await gateway.start();
13
- process.stderr.write(`LinkShell gateway v2 on :${port}${verifyToken ? " (accounts on)" : ""}\n`);
14
- for (const signal of ["SIGINT", "SIGTERM"]) {
15
- process.on(signal, () => void gateway.stop().then(() => process.exit(0)));
16
- }
17
- //# sourceMappingURL=main.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../gateway-v2/src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,8FAA8F;AAC9F,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,sBAAsB,CAAC;AACrE,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvD,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC3E,CAAC,CAAC,SAAS,CAAC;AAChB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;AACnG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACjG,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}