@erfan_bahramali/tping 1.0.0 → 1.1.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 (98) hide show
  1. package/README.md +76 -55
  2. package/dist/crypto/x25519.d.ts +10 -0
  3. package/dist/crypto/x25519.d.ts.map +1 -0
  4. package/dist/crypto/x25519.js +51 -0
  5. package/dist/crypto/x25519.js.map +1 -0
  6. package/dist/index.js +82 -39
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/attempt.d.ts +31 -0
  9. package/dist/lib/attempt.d.ts.map +1 -0
  10. package/dist/lib/attempt.js +94 -0
  11. package/dist/lib/attempt.js.map +1 -0
  12. package/dist/lib/checker.d.ts +21 -3
  13. package/dist/lib/checker.d.ts.map +1 -1
  14. package/dist/lib/checker.js +133 -49
  15. package/dist/lib/checker.js.map +1 -1
  16. package/dist/lib/datacenters.d.ts +15 -0
  17. package/dist/lib/datacenters.d.ts.map +1 -0
  18. package/dist/lib/datacenters.js +20 -0
  19. package/dist/lib/datacenters.js.map +1 -0
  20. package/dist/lib/parser.d.ts +18 -3
  21. package/dist/lib/parser.d.ts.map +1 -1
  22. package/dist/lib/parser.js +174 -78
  23. package/dist/lib/parser.js.map +1 -1
  24. package/dist/lib/ping.d.ts +13 -6
  25. package/dist/lib/ping.d.ts.map +1 -1
  26. package/dist/lib/ping.js +44 -44
  27. package/dist/lib/ping.js.map +1 -1
  28. package/dist/mtproto/exchange.d.ts +10 -0
  29. package/dist/mtproto/exchange.d.ts.map +1 -0
  30. package/dist/mtproto/exchange.js +20 -0
  31. package/dist/mtproto/exchange.js.map +1 -0
  32. package/dist/mtproto/fake-tls.d.ts +36 -44
  33. package/dist/mtproto/fake-tls.d.ts.map +1 -1
  34. package/dist/mtproto/fake-tls.js +174 -148
  35. package/dist/mtproto/fake-tls.js.map +1 -1
  36. package/dist/mtproto/messages.d.ts +23 -36
  37. package/dist/mtproto/messages.d.ts.map +1 -1
  38. package/dist/mtproto/messages.js +64 -90
  39. package/dist/mtproto/messages.js.map +1 -1
  40. package/dist/mtproto/obfuscation.d.ts +23 -20
  41. package/dist/mtproto/obfuscation.d.ts.map +1 -1
  42. package/dist/mtproto/obfuscation.js +64 -64
  43. package/dist/mtproto/obfuscation.js.map +1 -1
  44. package/dist/mtproto/secret.d.ts +28 -0
  45. package/dist/mtproto/secret.d.ts.map +1 -0
  46. package/dist/mtproto/secret.js +68 -0
  47. package/dist/mtproto/secret.js.map +1 -0
  48. package/dist/mtproto/transport.d.ts +28 -0
  49. package/dist/mtproto/transport.d.ts.map +1 -0
  50. package/dist/mtproto/transport.js +78 -0
  51. package/dist/mtproto/transport.js.map +1 -0
  52. package/dist/net/http-client.d.ts +37 -0
  53. package/dist/net/http-client.d.ts.map +1 -0
  54. package/dist/net/http-client.js +93 -0
  55. package/dist/net/http-client.js.map +1 -0
  56. package/dist/net/http-proxy.d.ts +26 -0
  57. package/dist/net/http-proxy.d.ts.map +1 -0
  58. package/dist/net/http-proxy.js +71 -0
  59. package/dist/net/http-proxy.js.map +1 -0
  60. package/dist/net/socks5.d.ts +15 -0
  61. package/dist/net/socks5.d.ts.map +1 -0
  62. package/dist/net/socks5.js +112 -0
  63. package/dist/net/socks5.js.map +1 -0
  64. package/dist/net/stream.d.ts +54 -0
  65. package/dist/net/stream.d.ts.map +1 -0
  66. package/dist/net/stream.js +142 -0
  67. package/dist/net/stream.js.map +1 -0
  68. package/dist/net/websocket.d.ts +19 -0
  69. package/dist/net/websocket.d.ts.map +1 -0
  70. package/dist/net/websocket.js +123 -0
  71. package/dist/net/websocket.js.map +1 -0
  72. package/dist/types/index.d.ts +40 -17
  73. package/dist/types/index.d.ts.map +1 -1
  74. package/dist/utils/format.d.ts +7 -14
  75. package/dist/utils/format.d.ts.map +1 -1
  76. package/dist/utils/format.js +101 -87
  77. package/dist/utils/format.js.map +1 -1
  78. package/dist/webproxy/check.d.ts +15 -0
  79. package/dist/webproxy/check.d.ts.map +1 -0
  80. package/dist/webproxy/check.js +423 -0
  81. package/dist/webproxy/check.js.map +1 -0
  82. package/dist/webproxy/frames.d.ts +30 -0
  83. package/dist/webproxy/frames.d.ts.map +1 -0
  84. package/dist/webproxy/frames.js +59 -0
  85. package/dist/webproxy/frames.js.map +1 -0
  86. package/dist/webproxy/link.d.ts +27 -0
  87. package/dist/webproxy/link.d.ts.map +1 -0
  88. package/dist/webproxy/link.js +107 -0
  89. package/dist/webproxy/link.js.map +1 -0
  90. package/package.json +16 -11
  91. package/dist/mtproto/connection.d.ts +0 -59
  92. package/dist/mtproto/connection.d.ts.map +0 -1
  93. package/dist/mtproto/connection.js +0 -198
  94. package/dist/mtproto/connection.js.map +0 -1
  95. package/dist/mtproto/socks5.d.ts +0 -36
  96. package/dist/mtproto/socks5.d.ts.map +0 -1
  97. package/dist/mtproto/socks5.js +0 -148
  98. package/dist/mtproto/socks5.js.map +0 -1
@@ -0,0 +1,423 @@
1
+ import { AbortedError, Attempt, STAGE_WAITING, describeError } from '../lib/attempt.js';
2
+ import { HttpConnection, openTls } from '../net/http-client.js';
3
+ import { WebSocketConnection } from '../net/websocket.js';
4
+ import { createObfuscation, ObfuscatedPipe } from '../mtproto/obfuscation.js';
5
+ import { exchangeReqPq } from '../mtproto/exchange.js';
6
+ import { basePrefix, deriveCapability } from './link.js';
7
+ import { FRAME, decodeWebFrames, encodeDataFrames, encodeWebFrame } from './frames.js';
8
+ /**
9
+ * WEB proxy check (telegramdesktop/tproxy-server, protocol v1). TPing plays
10
+ * both the Telegram app and the bridge page:
11
+ *
12
+ * GET /?bridge=<capability> -> bridge page with a bootstrap token and carrier mode
13
+ * POST /api/v1/session (HELLO) -> session token (WELCOME)
14
+ * one stream per DC: OPEN + DATA carrying the normal MTProxy bytes
15
+ * (obfuscation with the secret), over the carrier the relay selected,
16
+ * until the Telegram DC answers req_pq_multi with resPQ.
17
+ */
18
+ const CARRIER_MODES = ['https', 'https-lanes', 'websocket', 'websocket-lanes'];
19
+ const BRIDGE_PATTERN = /const relayBase=("(?:[^"\\]|\\.)*"),bootstrap=("(?:[^"\\]|\\.)*"),carrierMode=("(?:[^"\\]|\\.)*")/;
20
+ const TOKEN_PATTERN = /^[A-Za-z0-9_-]{43}$/;
21
+ const DELETE_BUDGET_MS = 2000;
22
+ const USER_AGENT = 'Mozilla/5.0 (compatible; tping)';
23
+ const BINARY = 'application/octet-stream';
24
+ export class WebProxyError extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = 'WebProxyError';
28
+ }
29
+ }
30
+ class StreamClosedByRelayError extends WebProxyError {
31
+ constructor() {
32
+ super("Relay closed the stream before Telegram answered (the relay's MTProxy backend rejected the secret or cannot reach Telegram)");
33
+ }
34
+ }
35
+ /**
36
+ * One logical stream: the Telegram side writes MTProxy bytes into it, the carrier
37
+ * turns them into OPEN/DATA frames and feeds relay DATA back.
38
+ */
39
+ class StreamPipe {
40
+ id;
41
+ onWrite;
42
+ incoming = Buffer.alloc(0);
43
+ outgoing = [];
44
+ opened = false;
45
+ waiter = null;
46
+ error = null;
47
+ constructor(id, onWrite) {
48
+ this.id = id;
49
+ this.onWrite = onWrite;
50
+ }
51
+ write(data) {
52
+ this.outgoing.push(data);
53
+ this.onWrite();
54
+ }
55
+ takeFrames() {
56
+ const frames = [];
57
+ if (this.outgoing.length === 0) {
58
+ return frames;
59
+ }
60
+ if (!this.opened) {
61
+ frames.push(encodeWebFrame(FRAME.OPEN, this.id));
62
+ this.opened = true;
63
+ }
64
+ for (const data of this.outgoing) {
65
+ frames.push(...encodeDataFrames(this.id, data));
66
+ }
67
+ this.outgoing = [];
68
+ return frames;
69
+ }
70
+ deliver(frame) {
71
+ if (frame.type === FRAME.DATA) {
72
+ this.incoming = Buffer.concat([this.incoming, frame.payload]);
73
+ this.waiter?.();
74
+ }
75
+ else if (frame.type === FRAME.CLOSE) {
76
+ this.fail(new StreamClosedByRelayError());
77
+ }
78
+ }
79
+ fail(err) {
80
+ this.error ??= err;
81
+ this.waiter?.();
82
+ }
83
+ read(length) {
84
+ return new Promise((resolve, reject) => {
85
+ const tick = () => {
86
+ if (this.incoming.length >= length) {
87
+ this.waiter = null;
88
+ const out = this.incoming.subarray(0, length);
89
+ this.incoming = this.incoming.subarray(length);
90
+ resolve(out);
91
+ }
92
+ else if (this.error) {
93
+ this.waiter = null;
94
+ reject(this.error);
95
+ }
96
+ };
97
+ this.waiter = tick;
98
+ tick();
99
+ });
100
+ }
101
+ }
102
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
103
+ const retryDelay = (response) => {
104
+ const seconds = Number(response.headers.get('retry-after'));
105
+ return Number.isFinite(seconds) && seconds >= 0 ? Math.min(seconds * 1000, 30000) : 1000;
106
+ };
107
+ /**
108
+ * Send a request, honouring 503 + Retry-After with a byte-identical retry (as the bridge does).
109
+ */
110
+ const requestWithRetry = async (http, deadline, method, path, headers, body) => {
111
+ for (;;) {
112
+ const response = await http.request(method, path, headers, body);
113
+ if (response.status !== 503) {
114
+ return response;
115
+ }
116
+ const wait = retryDelay(response);
117
+ if (Date.now() + wait >= deadline) {
118
+ throw new WebProxyError('Relay is overloaded (HTTP 503)');
119
+ }
120
+ await sleep(wait);
121
+ }
122
+ };
123
+ const parseBridgePage = (page, expectedBase) => {
124
+ if (page.status !== 200) {
125
+ throw new WebProxyError(`Bridge page returned HTTP ${page.status} (wrong secret, hostname or base path)`);
126
+ }
127
+ const match = BRIDGE_PATTERN.exec(page.body.toString('utf8'));
128
+ if (!match) {
129
+ throw new WebProxyError('Server returned a normal website instead of the WEB proxy bridge (wrong secret, hostname or base path)');
130
+ }
131
+ const [relayBase, bootstrap, carrier] = match.slice(1).map((json) => JSON.parse(json));
132
+ if (relayBase !== expectedBase) {
133
+ throw new WebProxyError('Bridge page points to a different relay address');
134
+ }
135
+ if (!TOKEN_PATTERN.test(bootstrap)) {
136
+ throw new WebProxyError('Bridge page has an invalid bootstrap token');
137
+ }
138
+ if (!CARRIER_MODES.includes(carrier)) {
139
+ throw new WebProxyError(`Bridge page uses an unknown carrier mode "${carrier}"`);
140
+ }
141
+ return { bootstrap, carrier: carrier };
142
+ };
143
+ const createSession = async (http, base, origin, bridge, deadline) => {
144
+ const response = await requestWithRetry(http, deadline, 'POST', `${base}api/v1/session`, {
145
+ Authorization: `Bearer ${bridge.bootstrap}`,
146
+ 'Content-Type': BINARY,
147
+ Origin: origin,
148
+ }, encodeWebFrame(FRAME.HELLO, 0, Buffer.from([0x01])));
149
+ if (response.status !== 200) {
150
+ throw new WebProxyError(`Relay refused to create a session (HTTP ${response.status})`);
151
+ }
152
+ const token = response.headers.get('x-session-token') ?? '';
153
+ if (!TOKEN_PATTERN.test(token)) {
154
+ throw new WebProxyError('Relay returned an invalid session token');
155
+ }
156
+ if (response.headers.get('x-carrier-mode') !== bridge.carrier) {
157
+ throw new WebProxyError('Relay carrier mode does not match the bridge page');
158
+ }
159
+ if (!decodeWebFrames(response.body).some((frame) => frame.type === FRAME.WELCOME)) {
160
+ throw new WebProxyError('Relay did not answer HELLO with WELCOME');
161
+ }
162
+ return { token, cursor: response.headers.get('x-down-cursor') ?? '0' };
163
+ };
164
+ /**
165
+ * Shared state between streams and carrier loops.
166
+ */
167
+ class Mux {
168
+ onFailure;
169
+ finished = false;
170
+ wakers = [];
171
+ streams = [];
172
+ constructor(onFailure) {
173
+ this.onFailure = onFailure;
174
+ }
175
+ add(id) {
176
+ const stream = new StreamPipe(id, () => this.wakers.splice(0).forEach((wake) => wake()));
177
+ this.streams.push(stream);
178
+ return stream;
179
+ }
180
+ byId(id) {
181
+ return this.streams.find((s) => s.id === id);
182
+ }
183
+ dispatch(frames, onPing) {
184
+ for (const frame of frames) {
185
+ if (frame.streamId === 0) {
186
+ if (frame.type === FRAME.BYE) {
187
+ this.failAll(new WebProxyError(`Relay ended the session${frame.payload.length ? `: ${frame.payload.toString('utf8')}` : ''}`));
188
+ }
189
+ else if (frame.type === FRAME.PING) {
190
+ onPing?.(frame);
191
+ }
192
+ }
193
+ else {
194
+ this.byId(frame.streamId)?.deliver(frame);
195
+ }
196
+ }
197
+ }
198
+ /** Resolves on the next write from any stream. */
199
+ waitForWrite() {
200
+ return new Promise((resolve) => {
201
+ this.wakers.push(resolve);
202
+ });
203
+ }
204
+ failAll(err) {
205
+ if (!this.finished) {
206
+ this.streams.forEach((stream) => stream.fail(err));
207
+ this.onFailure(err);
208
+ }
209
+ }
210
+ /** Run a carrier loop; its failure fails every stream it serves. */
211
+ run(loop, streams = this.streams) {
212
+ loop().catch((err) => {
213
+ if (!this.finished) {
214
+ streams.forEach((stream) => stream.fail(err));
215
+ }
216
+ });
217
+ }
218
+ }
219
+ /**
220
+ * Serialized HTTPS carrier (`https`), or one lane of `https-lanes`.
221
+ */
222
+ const runHttpLane = (mux, http, base, origin, session, deadline, streams, laneId) => async () => {
223
+ let sequence = 1;
224
+ let cursor = laneId === undefined ? session.cursor : '0';
225
+ const pongs = [];
226
+ const lane = laneId === undefined ? {} : { 'X-Lane-ID': String(laneId) };
227
+ const auth = { Authorization: `Bearer ${session.token}` };
228
+ while (!mux.finished) {
229
+ const frames = [...pongs.splice(0), ...streams.flatMap((stream) => stream.takeFrames())];
230
+ if (frames.length > 0) {
231
+ const ack = String(sequence);
232
+ const response = await requestWithRetry(http, deadline, 'POST', `${base}api/v1/up`, {
233
+ ...auth, 'Content-Type': BINARY, Origin: origin, 'X-Up-Seq': ack, ...lane,
234
+ }, Buffer.concat(frames));
235
+ if (response.status !== 204 || response.headers.get('x-up-ack') !== ack) {
236
+ throw new WebProxyError(`Relay rejected the uplink (HTTP ${response.status})`);
237
+ }
238
+ sequence++;
239
+ continue;
240
+ }
241
+ const response = await requestWithRetry(http, deadline, 'POST', `${base}api/v1/down`, {
242
+ ...auth, Origin: origin, 'X-Down-Cursor': cursor, ...lane,
243
+ });
244
+ if (response.status === 204) {
245
+ if (response.headers.get('x-lane-closed') === '1') {
246
+ streams.forEach((stream) => stream.fail(new StreamClosedByRelayError()));
247
+ return;
248
+ }
249
+ continue;
250
+ }
251
+ const next = response.headers.get('x-down-cursor');
252
+ if (response.status !== 200 || !next || response.body.length === 0) {
253
+ throw new WebProxyError(`Relay rejected the downlink poll (HTTP ${response.status})`);
254
+ }
255
+ cursor = next;
256
+ mux.dispatch(decodeWebFrames(response.body), (ping) => pongs.push(encodeWebFrame(FRAME.PONG, 0, ping.payload)));
257
+ }
258
+ };
259
+ /**
260
+ * WebSocket carrier (`websocket`), or one lane of `websocket-lanes`.
261
+ */
262
+ const runWebSocket = (mux, socket, streams) => {
263
+ const flush = () => {
264
+ const frames = streams.flatMap((stream) => stream.takeFrames());
265
+ if (frames.length > 0) {
266
+ socket.send(Buffer.concat(frames));
267
+ }
268
+ };
269
+ return async () => {
270
+ flush();
271
+ const sender = (async () => {
272
+ while (!mux.finished) {
273
+ await mux.waitForWrite();
274
+ flush();
275
+ }
276
+ })();
277
+ void sender;
278
+ while (!mux.finished) {
279
+ mux.dispatch(decodeWebFrames(await socket.receive()));
280
+ }
281
+ };
282
+ };
283
+ const pendingCleanups = new Set();
284
+ /**
285
+ * Wait for background session deletes (each bounded to 2s), so a short run does not
286
+ * exit before the relay has freed its session slots.
287
+ */
288
+ export const waitForWebProxyCleanup = async () => {
289
+ await Promise.all([...pendingCleanups]);
290
+ };
291
+ const deleteSession = async (hostname, endpoint, base, origin, token) => {
292
+ const cleanup = new Attempt(Date.now() + DELETE_BUDGET_MS);
293
+ try {
294
+ const connection = new HttpConnection((await openTls(cleanup, hostname, endpoint)).stream, hostname);
295
+ await connection.request('DELETE', `${base}api/v1/session`, { Authorization: `Bearer ${token}`, Origin: origin });
296
+ }
297
+ catch {
298
+ // Best effort: the relay also expires idle sessions.
299
+ }
300
+ finally {
301
+ cleanup.close();
302
+ }
303
+ };
304
+ /**
305
+ * Check a WEB proxy through one relay session, with one stream per DC.
306
+ */
307
+ export const checkWebProxy = async (proxy, dcs, options) => {
308
+ const secret = Buffer.from(proxy.secret, 'hex');
309
+ const secure = secret.length === 17;
310
+ const key = secure ? secret.subarray(1) : secret;
311
+ const mode = secure ? 'padded' : 'intermediate';
312
+ const hostname = proxy.server;
313
+ const base = basePrefix(proxy.basePath);
314
+ const origin = `https://${hostname}`;
315
+ const endpoint = options.webProxyEndpoint ?? {};
316
+ const deadline = Date.now() + options.timeout;
317
+ const attempt = new Attempt(deadline, options.signal);
318
+ let sessionError = null;
319
+ const mux = new Mux((err) => {
320
+ sessionError ??= err;
321
+ });
322
+ let session;
323
+ try {
324
+ const start = Date.now();
325
+ const main = await openTls(attempt, hostname, endpoint);
326
+ const connected = Date.now();
327
+ const http = new HttpConnection(main.stream, hostname);
328
+ attempt.stage = 'loading the bridge page';
329
+ const page = await http.request('GET', `${base}?bridge=${deriveCapability({ host: hostname, basePath: proxy.basePath }, secret)}`, {
330
+ Accept: 'text/html',
331
+ 'User-Agent': USER_AGENT,
332
+ });
333
+ const bridge = parseBridgePage(page, `${origin}${base}`);
334
+ attempt.stage = 'creating the relay session';
335
+ session = await createSession(http, base, origin, bridge, deadline);
336
+ const activeSession = session;
337
+ const streams = dcs.map((_, index) => mux.add(index + 1));
338
+ const lanes = [];
339
+ const laneSockets = [];
340
+ let socket;
341
+ attempt.stage = `opening the ${bridge.carrier} carrier`;
342
+ const openConnection = async () => new HttpConnection((await openTls(attempt, hostname, endpoint)).stream, hostname);
343
+ switch (bridge.carrier) {
344
+ case 'https':
345
+ break;
346
+ case 'https-lanes':
347
+ for (const stream of streams) {
348
+ lanes.push({ stream, http: await openConnection() });
349
+ }
350
+ break;
351
+ case 'websocket':
352
+ socket = await WebSocketConnection.open(await openConnection(), `${base}api/v1/ws`, `tproxy-v1.${activeSession.token}`, origin);
353
+ break;
354
+ case 'websocket-lanes':
355
+ // A lane that cannot be established fails the whole carrier, as in the bridge.
356
+ for (const stream of streams) {
357
+ const protocol = `tproxy-lane-v1.${activeSession.token}.${stream.id}`;
358
+ laneSockets.push({ stream, socket: await WebSocketConnection.open(await openConnection(), `${base}api/v1/ws`, protocol, origin) });
359
+ }
360
+ break;
361
+ }
362
+ const negotiated = Date.now();
363
+ attempt.stage = STAGE_WAITING;
364
+ // Streams write their MTProxy bytes synchronously here, before any carrier loop runs.
365
+ const results = Promise.all(dcs.map(async (dc, index) => {
366
+ const stream = streams[index];
367
+ const streamStart = Date.now();
368
+ try {
369
+ await exchangeReqPq(new ObfuscatedPipe(stream, createObfuscation(dc, mode, key)), mode);
370
+ const end = Date.now();
371
+ const timings = { connect: connected - start, handshake: negotiated - connected, rtt: end - streamStart };
372
+ return { dc, success: true, latency: end - start, timings, via: bridge.carrier };
373
+ }
374
+ catch (err) {
375
+ if (err instanceof AbortedError) {
376
+ throw err;
377
+ }
378
+ return { dc, success: false, error: describeError(sessionError ?? err, attempt.stage), via: bridge.carrier };
379
+ }
380
+ }));
381
+ switch (bridge.carrier) {
382
+ case 'https':
383
+ mux.run(runHttpLane(mux, http, base, origin, activeSession, deadline, streams));
384
+ break;
385
+ case 'https-lanes':
386
+ for (const lane of lanes) {
387
+ mux.run(runHttpLane(mux, lane.http, base, origin, activeSession, deadline, [lane.stream], lane.stream.id), [lane.stream]);
388
+ }
389
+ break;
390
+ case 'websocket':
391
+ mux.run(runWebSocket(mux, socket, streams));
392
+ break;
393
+ case 'websocket-lanes':
394
+ for (const lane of laneSockets) {
395
+ mux.run(runWebSocket(mux, lane.socket, [lane.stream]), [lane.stream]);
396
+ }
397
+ break;
398
+ }
399
+ // Failures of individual streams are reported per DC; abort fails all of them.
400
+ const settled = await results;
401
+ mux.finished = true;
402
+ return settled;
403
+ }
404
+ catch (err) {
405
+ mux.finished = true;
406
+ if (err instanceof AbortedError) {
407
+ throw err;
408
+ }
409
+ const error = describeError(err, attempt.stage);
410
+ return dcs.map((dc) => ({ dc, success: false, error }));
411
+ }
412
+ finally {
413
+ mux.finished = true;
414
+ attempt.close();
415
+ if (session) {
416
+ // Free the relay's session slot right away; not part of the measurement.
417
+ const cleanup = deleteSession(hostname, endpoint, base, origin, session.token)
418
+ .finally(() => pendingCleanups.delete(cleanup));
419
+ pendingCleanups.add(cleanup);
420
+ }
421
+ }
422
+ };
423
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/webproxy/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * WEB proxy shared frames: type:u8 | stream_id:u24 | payload_length:u32 | payload (big-endian).
3
+ */
4
+ export declare const FRAME: {
5
+ readonly OPEN: 1;
6
+ readonly DATA: 2;
7
+ readonly CLOSE: 3;
8
+ readonly WINDOW: 4;
9
+ readonly PING: 5;
10
+ readonly PONG: 6;
11
+ readonly HELLO: 16;
12
+ readonly WELCOME: 17;
13
+ readonly BYE: 31;
14
+ };
15
+ export declare const MAX_FRAME_PAYLOAD: number;
16
+ export declare const MAX_DATA_CHUNK: number;
17
+ export interface WebFrame {
18
+ readonly type: number;
19
+ readonly streamId: number;
20
+ readonly payload: Buffer;
21
+ }
22
+ export declare class FrameError extends Error {
23
+ constructor(message: string);
24
+ }
25
+ export declare const encodeWebFrame: (type: number, streamId: number, payload?: Buffer) => Buffer;
26
+ /** DATA frames for `data`, split into relay-sized chunks. */
27
+ export declare const encodeDataFrames: (streamId: number, data: Buffer) => Buffer[];
28
+ /** Split a carrier body into complete frames. */
29
+ export declare const decodeWebFrames: (batch: Buffer) => WebFrame[];
30
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/webproxy/frames.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;CAUR,CAAC;AAEX,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAC7C,eAAO,MAAM,cAAc,QAAY,CAAC;AAGxC,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,UAAS,MAAwB,KAAG,MAMlG,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,MAAM,EAMvE,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,QAAQ,EAkBvD,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * WEB proxy shared frames: type:u8 | stream_id:u24 | payload_length:u32 | payload (big-endian).
3
+ */
4
+ export const FRAME = {
5
+ OPEN: 0x01,
6
+ DATA: 0x02,
7
+ CLOSE: 0x03,
8
+ WINDOW: 0x04,
9
+ PING: 0x05,
10
+ PONG: 0x06,
11
+ HELLO: 0x10,
12
+ WELCOME: 0x11,
13
+ BYE: 0x1f,
14
+ };
15
+ export const MAX_FRAME_PAYLOAD = 1024 * 1024;
16
+ export const MAX_DATA_CHUNK = 64 * 1024;
17
+ const MAX_FRAMES_PER_BATCH = 4096;
18
+ export class FrameError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = 'FrameError';
22
+ }
23
+ }
24
+ export const encodeWebFrame = (type, streamId, payload = Buffer.alloc(0)) => {
25
+ const header = Buffer.alloc(8);
26
+ header[0] = type;
27
+ header.writeUIntBE(streamId, 1, 3);
28
+ header.writeUInt32BE(payload.length, 4);
29
+ return Buffer.concat([header, payload]);
30
+ };
31
+ /** DATA frames for `data`, split into relay-sized chunks. */
32
+ export const encodeDataFrames = (streamId, data) => {
33
+ const frames = [];
34
+ for (let offset = 0; offset < data.length; offset += MAX_DATA_CHUNK) {
35
+ frames.push(encodeWebFrame(FRAME.DATA, streamId, data.subarray(offset, offset + MAX_DATA_CHUNK)));
36
+ }
37
+ return frames;
38
+ };
39
+ /** Split a carrier body into complete frames. */
40
+ export const decodeWebFrames = (batch) => {
41
+ const frames = [];
42
+ let offset = 0;
43
+ while (offset < batch.length) {
44
+ if (batch.length - offset < 8 || frames.length >= MAX_FRAMES_PER_BATCH) {
45
+ throw new FrameError('Invalid frame batch from relay');
46
+ }
47
+ const type = batch[offset];
48
+ const streamId = batch.readUIntBE(offset + 1, 3);
49
+ const size = batch.readUInt32BE(offset + 4);
50
+ const end = offset + 8 + size;
51
+ if (size > MAX_FRAME_PAYLOAD || end > batch.length || (type === FRAME.DATA && size === 0)) {
52
+ throw new FrameError('Invalid frame from relay');
53
+ }
54
+ frames.push({ type, streamId, payload: batch.subarray(offset + 8, end) });
55
+ offset = end;
56
+ }
57
+ return frames;
58
+ };
59
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/webproxy/frames.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,IAAI;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AACxC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAQlC,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,UAAkB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAU,EAAE;IAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjB,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAY,EAAE;IAC3E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,cAAc,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAc,EAAE;IAC3D,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;YACvE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,GAAG,iBAAiB,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1F,MAAM,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface WebProxyAddress {
2
+ /** Lowercase ASCII (IDNA A-label) hostname. */
3
+ readonly host: string;
4
+ /** Base path without leading/trailing slash; empty for a root deployment. */
5
+ readonly basePath: string;
6
+ }
7
+ export declare const validateHostname: (host: string) => string | null;
8
+ export declare const validateBasePath: (path: string) => string | null;
9
+ /**
10
+ * Parse the `server` field: `host` or `host/base/path`.
11
+ */
12
+ export declare const parseWebProxyServer: (value: string) => WebProxyAddress | string;
13
+ /**
14
+ * Decode a WEB proxy secret. A link with a base path must carry the marked
15
+ * form (0x70 || secret, base64url); the marker is stripped.
16
+ *
17
+ * @returns the MTProxy secret bytes (16, or 17 starting with 0xdd), or an error message
18
+ */
19
+ export declare const decodeWebSecret: (value: string, hasBasePath: boolean) => Buffer | string;
20
+ /**
21
+ * Bridge capability: base64url(HMAC-SHA256(secret, context)), where context
22
+ * binds the hostname (v1) or the hostname and base path (v2).
23
+ */
24
+ export declare const deriveCapability: (address: WebProxyAddress, secret: Buffer) => string;
25
+ /** Path prefix of every relay endpoint: "/" or "/<base>/". */
26
+ export declare const basePrefix: (basePath: string) => string;
27
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/webproxy/link.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAID,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAaxD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAUxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,eAAe,GAAG,MAgBrE,CAAC;AAcF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,aAAa,OAAO,KAAG,MAAM,GAAG,MAsB9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,eAAe,EAAE,QAAQ,MAAM,KAAG,MAK3E,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,KAAG,MAAmD,CAAC"}