@limrun/api 0.47.2 → 0.48.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/CHANGELOG.md +13 -0
- package/destination-tunnel-dialer.d.mts +22 -0
- package/destination-tunnel-dialer.d.mts.map +1 -0
- package/destination-tunnel-dialer.d.ts +22 -0
- package/destination-tunnel-dialer.d.ts.map +1 -0
- package/destination-tunnel-dialer.js +491 -0
- package/destination-tunnel-dialer.js.map +1 -0
- package/destination-tunnel-dialer.mjs +486 -0
- package/destination-tunnel-dialer.mjs.map +1 -0
- package/destination-tunnel.d.mts +77 -0
- package/destination-tunnel.d.mts.map +1 -0
- package/destination-tunnel.d.ts +77 -0
- package/destination-tunnel.d.ts.map +1 -0
- package/destination-tunnel.js +249 -0
- package/destination-tunnel.js.map +1 -0
- package/destination-tunnel.mjs +236 -0
- package/destination-tunnel.mjs.map +1 -0
- package/internal/destination-tunnel-management.d.mts +23 -0
- package/internal/destination-tunnel-management.d.mts.map +1 -0
- package/internal/destination-tunnel-management.d.ts +23 -0
- package/internal/destination-tunnel-management.d.ts.map +1 -0
- package/internal/destination-tunnel-management.js +122 -0
- package/internal/destination-tunnel-management.js.map +1 -0
- package/internal/destination-tunnel-management.mjs +117 -0
- package/internal/destination-tunnel-management.mjs.map +1 -0
- package/internal/destination-tunnel-url.d.mts +4 -0
- package/internal/destination-tunnel-url.d.mts.map +1 -0
- package/internal/destination-tunnel-url.d.ts +4 -0
- package/internal/destination-tunnel-url.d.ts.map +1 -0
- package/internal/destination-tunnel-url.js +28 -0
- package/internal/destination-tunnel-url.js.map +1 -0
- package/internal/destination-tunnel-url.mjs +23 -0
- package/internal/destination-tunnel-url.mjs.map +1 -0
- package/ios-client.d.mts +22 -0
- package/ios-client.d.mts.map +1 -1
- package/ios-client.d.ts +22 -0
- package/ios-client.d.ts.map +1 -1
- package/ios-client.js +18 -0
- package/ios-client.js.map +1 -1
- package/ios-client.mjs +18 -0
- package/ios-client.mjs.map +1 -1
- package/package.json +21 -1
- package/resources/android-instances.d.mts +1 -1
- package/resources/android-instances.d.ts +1 -1
- package/src/destination-tunnel-dialer.ts +554 -0
- package/src/destination-tunnel.ts +354 -0
- package/src/internal/destination-tunnel-management.ts +154 -0
- package/src/internal/destination-tunnel-url.ts +25 -0
- package/src/ios-client.ts +48 -0
- package/src/resources/android-instances.ts +1 -1
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export declare const DESTINATION_TUNNEL_VERSION = 1;
|
|
2
|
+
export declare const DESTINATION_TUNNEL_MAX_ROUTES = 10;
|
|
3
|
+
export declare const DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES = 4;
|
|
4
|
+
export interface DestinationTunnelRoute {
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
}
|
|
8
|
+
export type DestinationTunnelOpenFailureReason = 'dns_not_found' | 'dns_temporary_failure' | 'connection_refused' | 'connection_reset' | 'connection_timed_out' | 'unreachable' | 'permission_denied' | 'resource_exhausted' | 'route_not_allowed' | 'cancelled' | 'internal' | (string & {});
|
|
9
|
+
export type DestinationTunnelResetReason = 'cancelled' | 'connection_error' | 'protocol_error' | 'resource_exhausted' | 'internal' | (string & {});
|
|
10
|
+
export type DestinationTunnelSessionErrorCode = 'unsupported_version' | 'invalid_message' | 'invalid_route' | 'route_capacity' | 'already_active' | 'unavailable' | 'internal' | (string & {});
|
|
11
|
+
export type DestinationTunnelClientMessage = {
|
|
12
|
+
type: 'start';
|
|
13
|
+
version: number;
|
|
14
|
+
routes: DestinationTunnelRoute[];
|
|
15
|
+
} | {
|
|
16
|
+
type: 'openOk';
|
|
17
|
+
connId: number;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'openFail';
|
|
20
|
+
connId: number;
|
|
21
|
+
reason: DestinationTunnelOpenFailureReason;
|
|
22
|
+
osCode?: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'fin';
|
|
25
|
+
connId: number;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'reset';
|
|
28
|
+
connId: number;
|
|
29
|
+
reason: DestinationTunnelResetReason;
|
|
30
|
+
osCode?: string;
|
|
31
|
+
};
|
|
32
|
+
export type DestinationTunnelServerMessage = {
|
|
33
|
+
type: 'ready';
|
|
34
|
+
version: number;
|
|
35
|
+
tunnelId: string;
|
|
36
|
+
} | {
|
|
37
|
+
type: 'open';
|
|
38
|
+
connId: number;
|
|
39
|
+
routeId: string;
|
|
40
|
+
host: string;
|
|
41
|
+
port: number;
|
|
42
|
+
proto: 'tcp';
|
|
43
|
+
} | {
|
|
44
|
+
type: 'fin';
|
|
45
|
+
connId: number;
|
|
46
|
+
} | {
|
|
47
|
+
type: 'reset';
|
|
48
|
+
connId: number;
|
|
49
|
+
reason: DestinationTunnelResetReason;
|
|
50
|
+
osCode?: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'error';
|
|
53
|
+
code: DestinationTunnelSessionErrorCode;
|
|
54
|
+
};
|
|
55
|
+
export type DestinationTunnelRouteErrorCode = 'empty' | 'too_many' | 'invalid_host' | 'invalid_port' | 'duplicate';
|
|
56
|
+
export declare class DestinationTunnelRouteError extends Error {
|
|
57
|
+
readonly code: DestinationTunnelRouteErrorCode;
|
|
58
|
+
constructor(code: DestinationTunnelRouteErrorCode, message: string);
|
|
59
|
+
}
|
|
60
|
+
export declare class DestinationTunnelProtocolError extends Error {
|
|
61
|
+
constructor(message: string);
|
|
62
|
+
}
|
|
63
|
+
export declare function encodeDestinationTunnelDataFrame(connId: number, payload: Buffer): Buffer;
|
|
64
|
+
export declare function decodeDestinationTunnelDataFrame(frame: Buffer): {
|
|
65
|
+
connId: number;
|
|
66
|
+
payload: Buffer;
|
|
67
|
+
};
|
|
68
|
+
export declare function validateDestinationTunnelRoutes(routes: readonly DestinationTunnelRoute[]): DestinationTunnelRoute[];
|
|
69
|
+
export declare function assertDestinationTunnelOpenAllowed(message: Extract<DestinationTunnelServerMessage, {
|
|
70
|
+
type: 'open';
|
|
71
|
+
}>, routes: readonly DestinationTunnelRoute[]): void;
|
|
72
|
+
export declare function assertDestinationTunnelReady(message: Extract<DestinationTunnelServerMessage, {
|
|
73
|
+
type: 'ready';
|
|
74
|
+
}>): void;
|
|
75
|
+
export declare function encodeDestinationTunnelClientMessage(message: DestinationTunnelClientMessage): string;
|
|
76
|
+
export declare function decodeDestinationTunnelServerMessage(value: unknown): DestinationTunnelServerMessage;
|
|
77
|
+
//# sourceMappingURL=destination-tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination-tunnel.d.ts","sourceRoot":"","sources":["src/destination-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DestinationTunnelProtocolError = exports.DestinationTunnelRouteError = exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES = exports.DESTINATION_TUNNEL_MAX_ROUTES = exports.DESTINATION_TUNNEL_VERSION = void 0;
|
|
4
|
+
exports.encodeDestinationTunnelDataFrame = encodeDestinationTunnelDataFrame;
|
|
5
|
+
exports.decodeDestinationTunnelDataFrame = decodeDestinationTunnelDataFrame;
|
|
6
|
+
exports.validateDestinationTunnelRoutes = validateDestinationTunnelRoutes;
|
|
7
|
+
exports.assertDestinationTunnelOpenAllowed = assertDestinationTunnelOpenAllowed;
|
|
8
|
+
exports.assertDestinationTunnelReady = assertDestinationTunnelReady;
|
|
9
|
+
exports.encodeDestinationTunnelClientMessage = encodeDestinationTunnelClientMessage;
|
|
10
|
+
exports.decodeDestinationTunnelServerMessage = decodeDestinationTunnelServerMessage;
|
|
11
|
+
const tslib_1 = require("./internal/tslib.js");
|
|
12
|
+
const net_1 = tslib_1.__importDefault(require("net"));
|
|
13
|
+
exports.DESTINATION_TUNNEL_VERSION = 1;
|
|
14
|
+
exports.DESTINATION_TUNNEL_MAX_ROUTES = 10;
|
|
15
|
+
exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES = 4;
|
|
16
|
+
class DestinationTunnelRouteError extends Error {
|
|
17
|
+
constructor(code, message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.name = 'DestinationTunnelRouteError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.DestinationTunnelRouteError = DestinationTunnelRouteError;
|
|
24
|
+
class DestinationTunnelProtocolError extends Error {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'DestinationTunnelProtocolError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DestinationTunnelProtocolError = DestinationTunnelProtocolError;
|
|
31
|
+
function encodeDestinationTunnelDataFrame(connId, payload) {
|
|
32
|
+
validateConnectionId(connId);
|
|
33
|
+
if (payload.length === 0) {
|
|
34
|
+
throw new DestinationTunnelProtocolError('tunnel data frame must include a payload');
|
|
35
|
+
}
|
|
36
|
+
const frame = Buffer.allocUnsafe(exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES + payload.length);
|
|
37
|
+
frame.writeUInt32BE(connId, 0);
|
|
38
|
+
payload.copy(frame, exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES);
|
|
39
|
+
return frame;
|
|
40
|
+
}
|
|
41
|
+
function decodeDestinationTunnelDataFrame(frame) {
|
|
42
|
+
if (frame.length <= exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES) {
|
|
43
|
+
throw new DestinationTunnelProtocolError('tunnel data frame must include a payload');
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
connId: frame.readUInt32BE(0),
|
|
47
|
+
payload: frame.subarray(exports.DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function validateDestinationTunnelRoutes(routes) {
|
|
51
|
+
if (routes.length === 0) {
|
|
52
|
+
throw new DestinationTunnelRouteError('empty', 'at least one tunnel route is required');
|
|
53
|
+
}
|
|
54
|
+
if (routes.length > exports.DESTINATION_TUNNEL_MAX_ROUTES) {
|
|
55
|
+
throw new DestinationTunnelRouteError('too_many', `at most ${exports.DESTINATION_TUNNEL_MAX_ROUTES} tunnel routes are allowed`);
|
|
56
|
+
}
|
|
57
|
+
const canonicalRoutes = [];
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
for (const route of routes) {
|
|
60
|
+
const canonical = canonicalizeDestinationTunnelRoute(route);
|
|
61
|
+
const key = `${canonical.host}\0${canonical.port}`;
|
|
62
|
+
if (seen.has(key)) {
|
|
63
|
+
throw new DestinationTunnelRouteError('duplicate', `duplicate tunnel route ${canonical.host}:${canonical.port}`);
|
|
64
|
+
}
|
|
65
|
+
seen.add(key);
|
|
66
|
+
canonicalRoutes.push(canonical);
|
|
67
|
+
}
|
|
68
|
+
return canonicalRoutes;
|
|
69
|
+
}
|
|
70
|
+
function assertDestinationTunnelOpenAllowed(message, routes) {
|
|
71
|
+
const index = parseRouteId(message.routeId);
|
|
72
|
+
const route = routes[index];
|
|
73
|
+
if (!route || message.host !== route.host || message.port !== route.port || message.proto !== 'tcp') {
|
|
74
|
+
throw new DestinationTunnelProtocolError(`server requested undeclared route ${message.routeId} ${message.host}:${message.port}/${message.proto}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function assertDestinationTunnelReady(message) {
|
|
78
|
+
if (message.version !== exports.DESTINATION_TUNNEL_VERSION) {
|
|
79
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel version ${message.version}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function encodeDestinationTunnelClientMessage(message) {
|
|
83
|
+
const record = readRecord(message, 'tunnel control message');
|
|
84
|
+
const type = readString(record, 'type');
|
|
85
|
+
switch (type) {
|
|
86
|
+
case 'start': {
|
|
87
|
+
const version = readInteger(record, 'version');
|
|
88
|
+
if (version !== exports.DESTINATION_TUNNEL_VERSION) {
|
|
89
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel version ${version}`);
|
|
90
|
+
}
|
|
91
|
+
const routes = validateDestinationTunnelRoutes(readArray(record, 'routes').map(readRoute));
|
|
92
|
+
return JSON.stringify({ type, version, routes });
|
|
93
|
+
}
|
|
94
|
+
case 'openOk':
|
|
95
|
+
case 'fin':
|
|
96
|
+
return JSON.stringify({ type, connId: readConnectionId(record) });
|
|
97
|
+
case 'openFail':
|
|
98
|
+
case 'reset':
|
|
99
|
+
return JSON.stringify({
|
|
100
|
+
type,
|
|
101
|
+
connId: readConnectionId(record),
|
|
102
|
+
reason: readString(record, 'reason'),
|
|
103
|
+
...readOptionalString(record, 'osCode'),
|
|
104
|
+
});
|
|
105
|
+
default:
|
|
106
|
+
throw new DestinationTunnelProtocolError(`unknown tunnel control message type ${type}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function decodeDestinationTunnelServerMessage(value) {
|
|
110
|
+
const message = readRecord(value, 'tunnel control message');
|
|
111
|
+
const type = readString(message, 'type');
|
|
112
|
+
switch (type) {
|
|
113
|
+
case 'ready':
|
|
114
|
+
return {
|
|
115
|
+
type,
|
|
116
|
+
version: readInteger(message, 'version'),
|
|
117
|
+
tunnelId: readString(message, 'tunnelId'),
|
|
118
|
+
};
|
|
119
|
+
case 'open':
|
|
120
|
+
return {
|
|
121
|
+
type,
|
|
122
|
+
connId: readConnectionId(message),
|
|
123
|
+
routeId: readString(message, 'routeId'),
|
|
124
|
+
host: readString(message, 'host'),
|
|
125
|
+
port: readPort(message, 'port'),
|
|
126
|
+
proto: readTCP(message),
|
|
127
|
+
};
|
|
128
|
+
case 'fin':
|
|
129
|
+
return { type, connId: readConnectionId(message) };
|
|
130
|
+
case 'reset':
|
|
131
|
+
return {
|
|
132
|
+
type,
|
|
133
|
+
connId: readConnectionId(message),
|
|
134
|
+
reason: readString(message, 'reason'),
|
|
135
|
+
...readOptionalString(message, 'osCode'),
|
|
136
|
+
};
|
|
137
|
+
case 'error':
|
|
138
|
+
return { type, code: readString(message, 'code') };
|
|
139
|
+
default:
|
|
140
|
+
throw new DestinationTunnelProtocolError(`unknown tunnel control message type ${type}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function canonicalizeDestinationTunnelRoute(route) {
|
|
144
|
+
if (!Number.isInteger(route.port) || route.port < 1 || route.port > 65535 || route.port === 53) {
|
|
145
|
+
throw new DestinationTunnelRouteError('invalid_port', `invalid tunnel route port ${route.port}`);
|
|
146
|
+
}
|
|
147
|
+
const asciiHost = Buffer.byteLength(route.host, 'utf8') === route.host.length;
|
|
148
|
+
if (asciiHost && route.host.toLowerCase() === 'localhost') {
|
|
149
|
+
return { host: 'localhost', port: route.port };
|
|
150
|
+
}
|
|
151
|
+
const ipVersion = net_1.default.isIP(route.host);
|
|
152
|
+
if (ipVersion === 4) {
|
|
153
|
+
return { host: route.host, port: route.port };
|
|
154
|
+
}
|
|
155
|
+
if (ipVersion === 6) {
|
|
156
|
+
const hostname = new URL(`http://[${route.host}]/`).hostname;
|
|
157
|
+
const canonical = hostname.slice(1, -1);
|
|
158
|
+
if (canonical !== '::1' && /^::(?:[0-9a-f]{1,4}:)?[0-9a-f]{1,4}$/.test(canonical)) {
|
|
159
|
+
throw new DestinationTunnelRouteError('invalid_host', `invalid tunnel route host ${route.host}`);
|
|
160
|
+
}
|
|
161
|
+
return { host: canonicalizeIPv6(canonical), port: route.port };
|
|
162
|
+
}
|
|
163
|
+
throw new DestinationTunnelRouteError('invalid_host', `invalid tunnel route host ${route.host}`);
|
|
164
|
+
}
|
|
165
|
+
function canonicalizeIPv6(host) {
|
|
166
|
+
const mappedIPv4 = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(host);
|
|
167
|
+
if (!mappedIPv4?.[1] || !mappedIPv4[2]) {
|
|
168
|
+
return host;
|
|
169
|
+
}
|
|
170
|
+
const high = Number.parseInt(mappedIPv4[1], 16);
|
|
171
|
+
const low = Number.parseInt(mappedIPv4[2], 16);
|
|
172
|
+
return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;
|
|
173
|
+
}
|
|
174
|
+
function parseRouteId(routeId) {
|
|
175
|
+
const match = /^route-([1-9]\d*)$/.exec(routeId);
|
|
176
|
+
if (!match?.[1]) {
|
|
177
|
+
return -1;
|
|
178
|
+
}
|
|
179
|
+
return Number(match[1]) - 1;
|
|
180
|
+
}
|
|
181
|
+
function readRoute(value) {
|
|
182
|
+
const route = readRecord(value, 'tunnel route');
|
|
183
|
+
return {
|
|
184
|
+
host: readString(route, 'host'),
|
|
185
|
+
port: readPort(route, 'port'),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function readRecord(value, name) {
|
|
189
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
190
|
+
throw new DestinationTunnelProtocolError(`${name} must be an object`);
|
|
191
|
+
}
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
function readArray(record, key) {
|
|
195
|
+
const value = record[key];
|
|
196
|
+
if (!Array.isArray(value)) {
|
|
197
|
+
throw new DestinationTunnelProtocolError(`${key} must be an array`);
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
function readString(record, key) {
|
|
202
|
+
const value = record[key];
|
|
203
|
+
if (typeof value !== 'string') {
|
|
204
|
+
throw new DestinationTunnelProtocolError(`${key} must be a string`);
|
|
205
|
+
}
|
|
206
|
+
return value;
|
|
207
|
+
}
|
|
208
|
+
function readOptionalString(record, key) {
|
|
209
|
+
const value = record[key];
|
|
210
|
+
if (value === undefined) {
|
|
211
|
+
return {};
|
|
212
|
+
}
|
|
213
|
+
if (typeof value !== 'string') {
|
|
214
|
+
throw new DestinationTunnelProtocolError(`${key} must be a string`);
|
|
215
|
+
}
|
|
216
|
+
return { [key]: value };
|
|
217
|
+
}
|
|
218
|
+
function readInteger(record, key) {
|
|
219
|
+
const value = record[key];
|
|
220
|
+
if (!Number.isInteger(value)) {
|
|
221
|
+
throw new DestinationTunnelProtocolError(`${key} must be an integer`);
|
|
222
|
+
}
|
|
223
|
+
return value;
|
|
224
|
+
}
|
|
225
|
+
function readPort(record, key) {
|
|
226
|
+
const value = readInteger(record, key);
|
|
227
|
+
if (value < 1 || value > 65535) {
|
|
228
|
+
throw new DestinationTunnelProtocolError(`${key} must be between 1 and 65535`);
|
|
229
|
+
}
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
function readConnectionId(record) {
|
|
233
|
+
const value = readInteger(record, 'connId');
|
|
234
|
+
validateConnectionId(value);
|
|
235
|
+
return value;
|
|
236
|
+
}
|
|
237
|
+
function validateConnectionId(value) {
|
|
238
|
+
if (!Number.isInteger(value) || value < 0 || value > 4294967295) {
|
|
239
|
+
throw new DestinationTunnelProtocolError('connId must be an unsigned 32-bit integer');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function readTCP(record) {
|
|
243
|
+
const value = readString(record, 'proto');
|
|
244
|
+
if (value !== 'tcp') {
|
|
245
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel transport ${value}`);
|
|
246
|
+
}
|
|
247
|
+
return value;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=destination-tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination-tunnel.js","sourceRoot":"","sources":["src/destination-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import net from 'net';
|
|
2
|
+
export const DESTINATION_TUNNEL_VERSION = 1;
|
|
3
|
+
export const DESTINATION_TUNNEL_MAX_ROUTES = 10;
|
|
4
|
+
export const DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES = 4;
|
|
5
|
+
export class DestinationTunnelRouteError extends Error {
|
|
6
|
+
constructor(code, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = 'DestinationTunnelRouteError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class DestinationTunnelProtocolError extends Error {
|
|
13
|
+
constructor(message) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'DestinationTunnelProtocolError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function encodeDestinationTunnelDataFrame(connId, payload) {
|
|
19
|
+
validateConnectionId(connId);
|
|
20
|
+
if (payload.length === 0) {
|
|
21
|
+
throw new DestinationTunnelProtocolError('tunnel data frame must include a payload');
|
|
22
|
+
}
|
|
23
|
+
const frame = Buffer.allocUnsafe(DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES + payload.length);
|
|
24
|
+
frame.writeUInt32BE(connId, 0);
|
|
25
|
+
payload.copy(frame, DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES);
|
|
26
|
+
return frame;
|
|
27
|
+
}
|
|
28
|
+
export function decodeDestinationTunnelDataFrame(frame) {
|
|
29
|
+
if (frame.length <= DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES) {
|
|
30
|
+
throw new DestinationTunnelProtocolError('tunnel data frame must include a payload');
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
connId: frame.readUInt32BE(0),
|
|
34
|
+
payload: frame.subarray(DESTINATION_TUNNEL_CONN_ID_HEADER_BYTES),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function validateDestinationTunnelRoutes(routes) {
|
|
38
|
+
if (routes.length === 0) {
|
|
39
|
+
throw new DestinationTunnelRouteError('empty', 'at least one tunnel route is required');
|
|
40
|
+
}
|
|
41
|
+
if (routes.length > DESTINATION_TUNNEL_MAX_ROUTES) {
|
|
42
|
+
throw new DestinationTunnelRouteError('too_many', `at most ${DESTINATION_TUNNEL_MAX_ROUTES} tunnel routes are allowed`);
|
|
43
|
+
}
|
|
44
|
+
const canonicalRoutes = [];
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
for (const route of routes) {
|
|
47
|
+
const canonical = canonicalizeDestinationTunnelRoute(route);
|
|
48
|
+
const key = `${canonical.host}\0${canonical.port}`;
|
|
49
|
+
if (seen.has(key)) {
|
|
50
|
+
throw new DestinationTunnelRouteError('duplicate', `duplicate tunnel route ${canonical.host}:${canonical.port}`);
|
|
51
|
+
}
|
|
52
|
+
seen.add(key);
|
|
53
|
+
canonicalRoutes.push(canonical);
|
|
54
|
+
}
|
|
55
|
+
return canonicalRoutes;
|
|
56
|
+
}
|
|
57
|
+
export function assertDestinationTunnelOpenAllowed(message, routes) {
|
|
58
|
+
const index = parseRouteId(message.routeId);
|
|
59
|
+
const route = routes[index];
|
|
60
|
+
if (!route || message.host !== route.host || message.port !== route.port || message.proto !== 'tcp') {
|
|
61
|
+
throw new DestinationTunnelProtocolError(`server requested undeclared route ${message.routeId} ${message.host}:${message.port}/${message.proto}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function assertDestinationTunnelReady(message) {
|
|
65
|
+
if (message.version !== DESTINATION_TUNNEL_VERSION) {
|
|
66
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel version ${message.version}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function encodeDestinationTunnelClientMessage(message) {
|
|
70
|
+
const record = readRecord(message, 'tunnel control message');
|
|
71
|
+
const type = readString(record, 'type');
|
|
72
|
+
switch (type) {
|
|
73
|
+
case 'start': {
|
|
74
|
+
const version = readInteger(record, 'version');
|
|
75
|
+
if (version !== DESTINATION_TUNNEL_VERSION) {
|
|
76
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel version ${version}`);
|
|
77
|
+
}
|
|
78
|
+
const routes = validateDestinationTunnelRoutes(readArray(record, 'routes').map(readRoute));
|
|
79
|
+
return JSON.stringify({ type, version, routes });
|
|
80
|
+
}
|
|
81
|
+
case 'openOk':
|
|
82
|
+
case 'fin':
|
|
83
|
+
return JSON.stringify({ type, connId: readConnectionId(record) });
|
|
84
|
+
case 'openFail':
|
|
85
|
+
case 'reset':
|
|
86
|
+
return JSON.stringify({
|
|
87
|
+
type,
|
|
88
|
+
connId: readConnectionId(record),
|
|
89
|
+
reason: readString(record, 'reason'),
|
|
90
|
+
...readOptionalString(record, 'osCode'),
|
|
91
|
+
});
|
|
92
|
+
default:
|
|
93
|
+
throw new DestinationTunnelProtocolError(`unknown tunnel control message type ${type}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function decodeDestinationTunnelServerMessage(value) {
|
|
97
|
+
const message = readRecord(value, 'tunnel control message');
|
|
98
|
+
const type = readString(message, 'type');
|
|
99
|
+
switch (type) {
|
|
100
|
+
case 'ready':
|
|
101
|
+
return {
|
|
102
|
+
type,
|
|
103
|
+
version: readInteger(message, 'version'),
|
|
104
|
+
tunnelId: readString(message, 'tunnelId'),
|
|
105
|
+
};
|
|
106
|
+
case 'open':
|
|
107
|
+
return {
|
|
108
|
+
type,
|
|
109
|
+
connId: readConnectionId(message),
|
|
110
|
+
routeId: readString(message, 'routeId'),
|
|
111
|
+
host: readString(message, 'host'),
|
|
112
|
+
port: readPort(message, 'port'),
|
|
113
|
+
proto: readTCP(message),
|
|
114
|
+
};
|
|
115
|
+
case 'fin':
|
|
116
|
+
return { type, connId: readConnectionId(message) };
|
|
117
|
+
case 'reset':
|
|
118
|
+
return {
|
|
119
|
+
type,
|
|
120
|
+
connId: readConnectionId(message),
|
|
121
|
+
reason: readString(message, 'reason'),
|
|
122
|
+
...readOptionalString(message, 'osCode'),
|
|
123
|
+
};
|
|
124
|
+
case 'error':
|
|
125
|
+
return { type, code: readString(message, 'code') };
|
|
126
|
+
default:
|
|
127
|
+
throw new DestinationTunnelProtocolError(`unknown tunnel control message type ${type}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function canonicalizeDestinationTunnelRoute(route) {
|
|
131
|
+
if (!Number.isInteger(route.port) || route.port < 1 || route.port > 65535 || route.port === 53) {
|
|
132
|
+
throw new DestinationTunnelRouteError('invalid_port', `invalid tunnel route port ${route.port}`);
|
|
133
|
+
}
|
|
134
|
+
const asciiHost = Buffer.byteLength(route.host, 'utf8') === route.host.length;
|
|
135
|
+
if (asciiHost && route.host.toLowerCase() === 'localhost') {
|
|
136
|
+
return { host: 'localhost', port: route.port };
|
|
137
|
+
}
|
|
138
|
+
const ipVersion = net.isIP(route.host);
|
|
139
|
+
if (ipVersion === 4) {
|
|
140
|
+
return { host: route.host, port: route.port };
|
|
141
|
+
}
|
|
142
|
+
if (ipVersion === 6) {
|
|
143
|
+
const hostname = new URL(`http://[${route.host}]/`).hostname;
|
|
144
|
+
const canonical = hostname.slice(1, -1);
|
|
145
|
+
if (canonical !== '::1' && /^::(?:[0-9a-f]{1,4}:)?[0-9a-f]{1,4}$/.test(canonical)) {
|
|
146
|
+
throw new DestinationTunnelRouteError('invalid_host', `invalid tunnel route host ${route.host}`);
|
|
147
|
+
}
|
|
148
|
+
return { host: canonicalizeIPv6(canonical), port: route.port };
|
|
149
|
+
}
|
|
150
|
+
throw new DestinationTunnelRouteError('invalid_host', `invalid tunnel route host ${route.host}`);
|
|
151
|
+
}
|
|
152
|
+
function canonicalizeIPv6(host) {
|
|
153
|
+
const mappedIPv4 = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(host);
|
|
154
|
+
if (!mappedIPv4?.[1] || !mappedIPv4[2]) {
|
|
155
|
+
return host;
|
|
156
|
+
}
|
|
157
|
+
const high = Number.parseInt(mappedIPv4[1], 16);
|
|
158
|
+
const low = Number.parseInt(mappedIPv4[2], 16);
|
|
159
|
+
return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;
|
|
160
|
+
}
|
|
161
|
+
function parseRouteId(routeId) {
|
|
162
|
+
const match = /^route-([1-9]\d*)$/.exec(routeId);
|
|
163
|
+
if (!match?.[1]) {
|
|
164
|
+
return -1;
|
|
165
|
+
}
|
|
166
|
+
return Number(match[1]) - 1;
|
|
167
|
+
}
|
|
168
|
+
function readRoute(value) {
|
|
169
|
+
const route = readRecord(value, 'tunnel route');
|
|
170
|
+
return {
|
|
171
|
+
host: readString(route, 'host'),
|
|
172
|
+
port: readPort(route, 'port'),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function readRecord(value, name) {
|
|
176
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
177
|
+
throw new DestinationTunnelProtocolError(`${name} must be an object`);
|
|
178
|
+
}
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
function readArray(record, key) {
|
|
182
|
+
const value = record[key];
|
|
183
|
+
if (!Array.isArray(value)) {
|
|
184
|
+
throw new DestinationTunnelProtocolError(`${key} must be an array`);
|
|
185
|
+
}
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
function readString(record, key) {
|
|
189
|
+
const value = record[key];
|
|
190
|
+
if (typeof value !== 'string') {
|
|
191
|
+
throw new DestinationTunnelProtocolError(`${key} must be a string`);
|
|
192
|
+
}
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
function readOptionalString(record, key) {
|
|
196
|
+
const value = record[key];
|
|
197
|
+
if (value === undefined) {
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
if (typeof value !== 'string') {
|
|
201
|
+
throw new DestinationTunnelProtocolError(`${key} must be a string`);
|
|
202
|
+
}
|
|
203
|
+
return { [key]: value };
|
|
204
|
+
}
|
|
205
|
+
function readInteger(record, key) {
|
|
206
|
+
const value = record[key];
|
|
207
|
+
if (!Number.isInteger(value)) {
|
|
208
|
+
throw new DestinationTunnelProtocolError(`${key} must be an integer`);
|
|
209
|
+
}
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
function readPort(record, key) {
|
|
213
|
+
const value = readInteger(record, key);
|
|
214
|
+
if (value < 1 || value > 65535) {
|
|
215
|
+
throw new DestinationTunnelProtocolError(`${key} must be between 1 and 65535`);
|
|
216
|
+
}
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
function readConnectionId(record) {
|
|
220
|
+
const value = readInteger(record, 'connId');
|
|
221
|
+
validateConnectionId(value);
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
function validateConnectionId(value) {
|
|
225
|
+
if (!Number.isInteger(value) || value < 0 || value > 4294967295) {
|
|
226
|
+
throw new DestinationTunnelProtocolError('connId must be an unsigned 32-bit integer');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function readTCP(record) {
|
|
230
|
+
const value = readString(record, 'proto');
|
|
231
|
+
if (value !== 'tcp') {
|
|
232
|
+
throw new DestinationTunnelProtocolError(`unsupported tunnel transport ${value}`);
|
|
233
|
+
}
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=destination-tunnel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination-tunnel.mjs","sourceRoot":"","sources":["src/destination-tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DestinationTunnelRoute } from "../destination-tunnel.mjs";
|
|
2
|
+
export interface DestinationTunnelStatus {
|
|
3
|
+
active?: {
|
|
4
|
+
tunnelId: string;
|
|
5
|
+
state: 'starting' | 'ready' | 'stopping';
|
|
6
|
+
routes: DestinationTunnelRoute[];
|
|
7
|
+
};
|
|
8
|
+
lastFailure?: {
|
|
9
|
+
tunnelId: string;
|
|
10
|
+
code: string;
|
|
11
|
+
};
|
|
12
|
+
lastDialFailure?: {
|
|
13
|
+
tunnelId: string;
|
|
14
|
+
connectionId: number;
|
|
15
|
+
routeId: string;
|
|
16
|
+
reason: string;
|
|
17
|
+
osCode?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function getDestinationTunnelStatus(apiUrl: string, token: string): Promise<DestinationTunnelStatus>;
|
|
21
|
+
export declare function stopDestinationTunnel(apiUrl: string, token: string, tunnelId: string): Promise<void>;
|
|
22
|
+
export declare function decodeDestinationTunnelStatus(value: unknown): DestinationTunnelStatus;
|
|
23
|
+
//# sourceMappingURL=destination-tunnel-management.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination-tunnel-management.d.mts","sourceRoot":"","sources":["../src/internal/destination-tunnel-management.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,sBAAsB,EAAE,kCAA8B;AAErG,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;QACzC,MAAM,EAAE,sBAAsB,EAAE,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,uBAAuB,CAAC,CAQlC;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1G;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAarF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DestinationTunnelRoute } from "../destination-tunnel.js";
|
|
2
|
+
export interface DestinationTunnelStatus {
|
|
3
|
+
active?: {
|
|
4
|
+
tunnelId: string;
|
|
5
|
+
state: 'starting' | 'ready' | 'stopping';
|
|
6
|
+
routes: DestinationTunnelRoute[];
|
|
7
|
+
};
|
|
8
|
+
lastFailure?: {
|
|
9
|
+
tunnelId: string;
|
|
10
|
+
code: string;
|
|
11
|
+
};
|
|
12
|
+
lastDialFailure?: {
|
|
13
|
+
tunnelId: string;
|
|
14
|
+
connectionId: number;
|
|
15
|
+
routeId: string;
|
|
16
|
+
reason: string;
|
|
17
|
+
osCode?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function getDestinationTunnelStatus(apiUrl: string, token: string): Promise<DestinationTunnelStatus>;
|
|
21
|
+
export declare function stopDestinationTunnel(apiUrl: string, token: string, tunnelId: string): Promise<void>;
|
|
22
|
+
export declare function decodeDestinationTunnelStatus(value: unknown): DestinationTunnelStatus;
|
|
23
|
+
//# sourceMappingURL=destination-tunnel-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination-tunnel-management.d.ts","sourceRoot":"","sources":["../src/internal/destination-tunnel-management.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,KAAK,sBAAsB,EAAE,iCAA8B;AAErG,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;QACzC,MAAM,EAAE,sBAAsB,EAAE,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,uBAAuB,CAAC,CAQlC;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1G;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAarF"}
|