@push.rocks/smartproxy 27.12.7 → 27.13.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 +12 -7
- package/dist_rust/rustproxy_linux_amd64 +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/plugins.d.ts +4 -2
- package/dist_ts/plugins.js +5 -3
- package/dist_ts/proxies/smart-proxy/challenge-provider-relay-server.d.ts +31 -0
- package/dist_ts/proxies/smart-proxy/challenge-provider-relay-server.js +297 -0
- package/dist_ts/proxies/smart-proxy/models/index.d.ts +1 -1
- package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +14 -2
- package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +11 -0
- package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
- package/dist_ts/proxies/smart-proxy/models/rust-types.d.ts +5 -3
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +2 -1
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +4 -1
- package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +19 -0
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +339 -89
- package/dist_ts/proxies/smart-proxy/utils/route-validator.d.ts +3 -0
- package/dist_ts/proxies/smart-proxy/utils/route-validator.js +81 -1
- package/dist_ts/proxies/smart-proxy/utils/rust-config.d.ts +3 -2
- package/dist_ts/proxies/smart-proxy/utils/rust-config.js +20 -4
- package/package.json +2 -1
- package/readme.hints.md +2 -2
- package/readme.md +87 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +1 -1
- package/ts/plugins.ts +4 -1
- package/ts/proxies/smart-proxy/challenge-provider-relay-server.ts +338 -0
- package/ts/proxies/smart-proxy/models/index.ts +1 -1
- package/ts/proxies/smart-proxy/models/interfaces.ts +17 -2
- package/ts/proxies/smart-proxy/models/route-types.ts +17 -0
- package/ts/proxies/smart-proxy/models/rust-types.ts +8 -3
- package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +6 -0
- package/ts/proxies/smart-proxy/smart-proxy.ts +400 -94
- package/ts/proxies/smart-proxy/utils/route-validator.ts +84 -1
- package/ts/proxies/smart-proxy/utils/rust-config.ts +22 -2
package/changelog.md
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
## 2026-06-05 - 27.13.0
|
|
10
4
|
|
|
5
|
+
### Features
|
|
11
6
|
|
|
7
|
+
- add route challenge enforcement (challenge)
|
|
8
|
+
- Add smartchallenge provider registration and relay wiring between TypeScript and the Rust proxy runtime
|
|
9
|
+
- Enforce route-level browser challenges with pending and clearance cookies plus reserved verification endpoints
|
|
10
|
+
- Document challenge configuration and add integration tests for protected routes
|
|
12
11
|
|
|
12
|
+
## 2026-06-05 - 27.12.8
|
|
13
13
|
|
|
14
|
+
### BREAKING CHANGES
|
|
14
15
|
|
|
16
|
+
- require explicit inbound PROXY protocol listener policies (proxy-protocol)
|
|
17
|
+
- Replace global inbound `proxyIPs`/`acceptProxyProtocol` config with exact `trustedProxyIPs` trust lists and listener-scoped `match.inboundProxyProtocol` policies.
|
|
18
|
+
- Default listeners now reject inbound PROXY protocol unless `mode: 'optional'` or `mode: 'required'` is declared.
|
|
19
|
+
- Apply explicit inbound policy resolution, validation, and TCP/UDP/QUIC handling while keeping outbound `sendProxyProtocol` separate.
|
|
15
20
|
|
|
16
21
|
## 2026-06-04 - 27.12.7
|
|
17
22
|
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartproxy',
|
|
6
|
-
version: '27.
|
|
6
|
+
version: '27.13.0',
|
|
7
7
|
description: 'A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHFQQUFxUDtDQUNuUSxDQUFBIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { SmartProxy } from './proxies/smart-proxy/index.js';
|
|
5
5
|
export { SharedRouteManager as RouteManager } from './core/routing/route-manager.js';
|
|
6
|
-
export type { ISmartProxyOptions, ISmartProxySecurityPolicy, IConnectionRecord, IRouteConfig, IRouteMatch, IRouteAction, IRouteTls, IRouteContext, TDatagramHandler, IDatagramInfo, IActiveConnectionSnapshot, IActiveConnectionSnapshotOptions } from './proxies/smart-proxy/models/index.js';
|
|
6
|
+
export type { ISmartProxyOptions, ISmartProxySecurityPolicy, ISmartProxyChallengeOptions, IConnectionRecord, IRouteConfig, IRouteMatch, IRouteAction, IRouteTls, IRouteContext, TDatagramHandler, IDatagramInfo, IActiveConnectionSnapshot, IActiveConnectionSnapshotOptions } from './proxies/smart-proxy/models/index.js';
|
|
7
7
|
export type { TSmartProxyCertProvisionObject, ICertProvisionEventComms, ICertificateIssuedEvent, ICertificateFailedEvent } from './proxies/smart-proxy/models/interfaces.js';
|
|
8
8
|
export * from './proxies/smart-proxy/utils/index.js';
|
|
9
9
|
export * from './core/models/common-types.js';
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
|
+
import * as crypto from 'node:crypto';
|
|
2
3
|
import * as fs from 'node:fs';
|
|
3
4
|
import * as http from 'node:http';
|
|
4
5
|
import * as net from 'node:net';
|
|
@@ -6,14 +7,15 @@ import * as path from 'node:path';
|
|
|
6
7
|
import * as tls from 'node:tls';
|
|
7
8
|
import * as url from 'node:url';
|
|
8
9
|
import * as http2 from 'node:http2';
|
|
9
|
-
export { EventEmitter, fs, http, net, path, tls, url, http2 };
|
|
10
|
+
export { EventEmitter, crypto, fs, http, net, path, tls, url, http2 };
|
|
10
11
|
import * as tsclass from '@tsclass/tsclass';
|
|
11
12
|
export { tsclass };
|
|
12
13
|
import * as smartcrypto from '@push.rocks/smartcrypto';
|
|
13
14
|
import * as smartlog from '@push.rocks/smartlog';
|
|
14
15
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog/destination-local';
|
|
16
|
+
import * as smartchallenge from '@push.rocks/smartchallenge';
|
|
15
17
|
import * as smartnftables from '@push.rocks/smartnftables';
|
|
16
18
|
import * as smartrust from '@push.rocks/smartrust';
|
|
17
|
-
export { smartcrypto, smartlog, smartlogDestinationLocal, smartnftables, smartrust, };
|
|
19
|
+
export { smartcrypto, smartchallenge, smartlog, smartlogDestinationLocal, smartnftables, smartrust, };
|
|
18
20
|
import { minimatch } from 'minimatch';
|
|
19
21
|
export { minimatch };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// node native scope
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
+
import * as crypto from 'node:crypto';
|
|
3
4
|
import * as fs from 'node:fs';
|
|
4
5
|
import * as http from 'node:http';
|
|
5
6
|
import * as net from 'node:net';
|
|
@@ -7,7 +8,7 @@ import * as path from 'node:path';
|
|
|
7
8
|
import * as tls from 'node:tls';
|
|
8
9
|
import * as url from 'node:url';
|
|
9
10
|
import * as http2 from 'node:http2';
|
|
10
|
-
export { EventEmitter, fs, http, net, path, tls, url, http2 };
|
|
11
|
+
export { EventEmitter, crypto, fs, http, net, path, tls, url, http2 };
|
|
11
12
|
// tsclass scope
|
|
12
13
|
import * as tsclass from '@tsclass/tsclass';
|
|
13
14
|
export { tsclass };
|
|
@@ -15,10 +16,11 @@ export { tsclass };
|
|
|
15
16
|
import * as smartcrypto from '@push.rocks/smartcrypto';
|
|
16
17
|
import * as smartlog from '@push.rocks/smartlog';
|
|
17
18
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog/destination-local';
|
|
19
|
+
import * as smartchallenge from '@push.rocks/smartchallenge';
|
|
18
20
|
import * as smartnftables from '@push.rocks/smartnftables';
|
|
19
21
|
import * as smartrust from '@push.rocks/smartrust';
|
|
20
|
-
export { smartcrypto, smartlog, smartlogDestinationLocal, smartnftables, smartrust, };
|
|
22
|
+
export { smartcrypto, smartchallenge, smartlog, smartlogDestinationLocal, smartnftables, smartrust, };
|
|
21
23
|
// third party scope
|
|
22
24
|
import { minimatch } from 'minimatch';
|
|
23
25
|
export { minimatch };
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFFdEUsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRW5CLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxjQUFjLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxXQUFXLEVBQ1gsY0FBYyxFQUNkLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsYUFBYSxFQUNiLFNBQVMsR0FDVixDQUFDO0FBRUYsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
export interface IChallengeProviderRelayServerOptions {
|
|
3
|
+
providerTimeoutMs?: number;
|
|
4
|
+
maxActiveProviderOperations?: number;
|
|
5
|
+
maxUnsettledProviderOperations?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class ChallengeProviderRelayServer {
|
|
8
|
+
private providers;
|
|
9
|
+
private providerTimeoutMs;
|
|
10
|
+
private maxActiveProviderOperations;
|
|
11
|
+
private maxUnsettledProviderOperations;
|
|
12
|
+
private activeProviderOperations;
|
|
13
|
+
private unsettledProviderOperations;
|
|
14
|
+
private server;
|
|
15
|
+
private socketPath;
|
|
16
|
+
private activeSockets;
|
|
17
|
+
private startPromise?;
|
|
18
|
+
constructor(providers: Map<string, plugins.smartchallenge.IChallengeProvider>, optionsArg?: IChallengeProviderRelayServerOptions);
|
|
19
|
+
getSocketPath(): string;
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
private startInternal;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
private handleConnection;
|
|
24
|
+
private dispatchLine;
|
|
25
|
+
private withProviderTimeout;
|
|
26
|
+
private writeResponse;
|
|
27
|
+
private createErrorResponse;
|
|
28
|
+
private estimateJsonByteLength;
|
|
29
|
+
private estimateJsonByteLengthInternal;
|
|
30
|
+
private estimateJsonStringByteLength;
|
|
31
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { logger } from '../../core/utils/logger.js';
|
|
3
|
+
const maxChallengeRelayMessageBytes = 1024 * 1024;
|
|
4
|
+
const maxChallengeRelayIdBytes = 256;
|
|
5
|
+
export class ChallengeProviderRelayServer {
|
|
6
|
+
providers;
|
|
7
|
+
providerTimeoutMs;
|
|
8
|
+
maxActiveProviderOperations;
|
|
9
|
+
maxUnsettledProviderOperations;
|
|
10
|
+
activeProviderOperations = 0;
|
|
11
|
+
unsettledProviderOperations = 0;
|
|
12
|
+
server = null;
|
|
13
|
+
socketPath;
|
|
14
|
+
activeSockets = new Set();
|
|
15
|
+
startPromise;
|
|
16
|
+
constructor(providers, optionsArg = {}) {
|
|
17
|
+
this.providers = providers;
|
|
18
|
+
this.socketPath = `/tmp/smartproxy-challenge-relay-${process.pid}-${plugins.crypto.randomBytes(8).toString('hex')}.sock`;
|
|
19
|
+
this.providerTimeoutMs = Math.max(1, optionsArg.providerTimeoutMs ?? 5_000);
|
|
20
|
+
this.maxActiveProviderOperations = Math.max(1, optionsArg.maxActiveProviderOperations ?? 1024);
|
|
21
|
+
this.maxUnsettledProviderOperations = Math.max(1, optionsArg.maxUnsettledProviderOperations ?? this.maxActiveProviderOperations);
|
|
22
|
+
}
|
|
23
|
+
getSocketPath() {
|
|
24
|
+
return this.socketPath;
|
|
25
|
+
}
|
|
26
|
+
async start() {
|
|
27
|
+
if (this.server)
|
|
28
|
+
return;
|
|
29
|
+
if (this.startPromise)
|
|
30
|
+
return this.startPromise;
|
|
31
|
+
this.startPromise = this.startInternal();
|
|
32
|
+
try {
|
|
33
|
+
await this.startPromise;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
this.startPromise = undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async startInternal() {
|
|
40
|
+
try {
|
|
41
|
+
await plugins.fs.promises.unlink(this.socketPath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Ignore stale socket cleanup failures for missing files.
|
|
45
|
+
}
|
|
46
|
+
const server = plugins.net.createServer((socket) => {
|
|
47
|
+
this.activeSockets.add(socket);
|
|
48
|
+
socket.once('close', () => this.activeSockets.delete(socket));
|
|
49
|
+
this.handleConnection(socket);
|
|
50
|
+
});
|
|
51
|
+
server.on('error', (err) => {
|
|
52
|
+
logger.log('error', `ChallengeProviderRelayServer error: ${err.message}`, { component: 'challenge-provider-relay-server' });
|
|
53
|
+
});
|
|
54
|
+
await new Promise((resolve, reject) => {
|
|
55
|
+
const handleError = (err) => reject(err);
|
|
56
|
+
server.once('error', handleError);
|
|
57
|
+
server.listen(this.socketPath, () => {
|
|
58
|
+
server.off('error', handleError);
|
|
59
|
+
this.server = server;
|
|
60
|
+
logger.log('info', `ChallengeProviderRelayServer listening on ${this.socketPath}`, { component: 'challenge-provider-relay-server' });
|
|
61
|
+
resolve();
|
|
62
|
+
});
|
|
63
|
+
}).catch((err) => {
|
|
64
|
+
server.close();
|
|
65
|
+
throw err;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async stop() {
|
|
69
|
+
if (this.startPromise && !this.server) {
|
|
70
|
+
await this.startPromise.catch(() => undefined);
|
|
71
|
+
}
|
|
72
|
+
for (const socket of this.activeSockets) {
|
|
73
|
+
socket.destroy();
|
|
74
|
+
}
|
|
75
|
+
this.activeSockets.clear();
|
|
76
|
+
const server = this.server;
|
|
77
|
+
if (!server)
|
|
78
|
+
return;
|
|
79
|
+
this.server = null;
|
|
80
|
+
await new Promise((resolve) => {
|
|
81
|
+
server.close(() => {
|
|
82
|
+
plugins.fs.unlink(this.socketPath, () => resolve());
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
handleConnection(socket) {
|
|
87
|
+
let buffer = Buffer.alloc(0);
|
|
88
|
+
socket.setTimeout(Math.max(10_000, this.providerTimeoutMs + 1_000));
|
|
89
|
+
socket.on('timeout', () => socket.destroy());
|
|
90
|
+
socket.on('error', (err) => {
|
|
91
|
+
logger.log('warn', `Challenge relay socket error: ${err.message}`, { component: 'challenge-provider-relay-server' });
|
|
92
|
+
});
|
|
93
|
+
socket.on('data', (chunk) => {
|
|
94
|
+
buffer = buffer.length === 0 ? chunk : Buffer.concat([buffer, chunk], buffer.length + chunk.length);
|
|
95
|
+
if (buffer.length > maxChallengeRelayMessageBytes) {
|
|
96
|
+
socket.removeAllListeners('data');
|
|
97
|
+
this.writeResponse(socket, { success: false, error: 'Challenge relay request exceeds maximum size' });
|
|
98
|
+
buffer = Buffer.alloc(0);
|
|
99
|
+
socket.end();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const newlineIndex = buffer.indexOf(0x0a);
|
|
103
|
+
if (newlineIndex === -1)
|
|
104
|
+
return;
|
|
105
|
+
const line = buffer.subarray(0, newlineIndex).toString('utf8');
|
|
106
|
+
socket.removeAllListeners('data');
|
|
107
|
+
this.dispatchLine(line)
|
|
108
|
+
.then((response) => this.writeResponse(socket, response))
|
|
109
|
+
.catch((err) => this.writeResponse(socket, { success: false, error: err.message }))
|
|
110
|
+
.finally(() => socket.end());
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async dispatchLine(lineArg) {
|
|
114
|
+
let request;
|
|
115
|
+
try {
|
|
116
|
+
request = JSON.parse(lineArg);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return { success: false, error: 'Invalid challenge relay JSON' };
|
|
120
|
+
}
|
|
121
|
+
const provider = this.providers.get(request.providerId);
|
|
122
|
+
if (!provider) {
|
|
123
|
+
return {
|
|
124
|
+
id: request.id,
|
|
125
|
+
success: false,
|
|
126
|
+
error: `Challenge provider '${request.providerId}' is not registered`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
switch (request.operation) {
|
|
130
|
+
case 'assess':
|
|
131
|
+
return { id: request.id, success: true, result: await this.withProviderTimeout(() => provider.assess(request.request), 'assess') };
|
|
132
|
+
case 'render':
|
|
133
|
+
return { id: request.id, success: true, result: await this.withProviderTimeout(() => provider.render(request.request), 'render') };
|
|
134
|
+
case 'verify':
|
|
135
|
+
return { id: request.id, success: true, result: await this.withProviderTimeout(() => provider.verify(request.request), 'verify') };
|
|
136
|
+
default:
|
|
137
|
+
const operationValue = request.operation;
|
|
138
|
+
return { id: request.id, success: false, error: `Unsupported challenge relay operation '${String(operationValue)}'` };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async withProviderTimeout(operationArg, operationNameArg) {
|
|
142
|
+
if (this.activeProviderOperations >= this.maxActiveProviderOperations) {
|
|
143
|
+
throw new Error(`Challenge provider ${operationNameArg} rejected because too many operations are active`);
|
|
144
|
+
}
|
|
145
|
+
if (this.unsettledProviderOperations >= this.maxUnsettledProviderOperations) {
|
|
146
|
+
throw new Error(`Challenge provider ${operationNameArg} rejected because too many timed-out operations are still settling`);
|
|
147
|
+
}
|
|
148
|
+
let timer;
|
|
149
|
+
let activeReleased = false;
|
|
150
|
+
let unsettledReleased = false;
|
|
151
|
+
const releaseActive = () => {
|
|
152
|
+
if (!activeReleased) {
|
|
153
|
+
activeReleased = true;
|
|
154
|
+
this.activeProviderOperations -= 1;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const releaseUnsettled = () => {
|
|
158
|
+
if (!unsettledReleased) {
|
|
159
|
+
unsettledReleased = true;
|
|
160
|
+
this.unsettledProviderOperations -= 1;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
this.activeProviderOperations += 1;
|
|
164
|
+
this.unsettledProviderOperations += 1;
|
|
165
|
+
const providerPromise = Promise.resolve().then(operationArg);
|
|
166
|
+
const trackedProviderPromise = providerPromise.then((result) => {
|
|
167
|
+
releaseActive();
|
|
168
|
+
releaseUnsettled();
|
|
169
|
+
return result;
|
|
170
|
+
}, (err) => {
|
|
171
|
+
releaseActive();
|
|
172
|
+
releaseUnsettled();
|
|
173
|
+
throw err;
|
|
174
|
+
});
|
|
175
|
+
trackedProviderPromise.catch(() => undefined);
|
|
176
|
+
try {
|
|
177
|
+
return await Promise.race([
|
|
178
|
+
trackedProviderPromise,
|
|
179
|
+
new Promise((_resolve, reject) => {
|
|
180
|
+
timer = setTimeout(() => {
|
|
181
|
+
releaseActive();
|
|
182
|
+
reject(new Error(`Challenge provider ${operationNameArg} timed out after ${this.providerTimeoutMs}ms`));
|
|
183
|
+
}, this.providerTimeoutMs);
|
|
184
|
+
}),
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
if (timer)
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
writeResponse(socket, responseArg) {
|
|
193
|
+
let response = responseArg;
|
|
194
|
+
if (this.estimateJsonByteLength(response, maxChallengeRelayMessageBytes) === undefined) {
|
|
195
|
+
response = this.createErrorResponse(responseArg.id, 'Challenge relay response exceeds maximum size');
|
|
196
|
+
}
|
|
197
|
+
let serializedResponse;
|
|
198
|
+
try {
|
|
199
|
+
serializedResponse = JSON.stringify(response);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
serializedResponse = JSON.stringify(this.createErrorResponse(responseArg.id, 'Challenge relay response is not serializable'));
|
|
203
|
+
}
|
|
204
|
+
if (Buffer.byteLength(serializedResponse, 'utf8') > maxChallengeRelayMessageBytes) {
|
|
205
|
+
serializedResponse = JSON.stringify({
|
|
206
|
+
success: false,
|
|
207
|
+
error: 'Challenge relay response exceeds maximum size',
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
socket.write(`${serializedResponse}\n`);
|
|
211
|
+
}
|
|
212
|
+
createErrorResponse(idArg, errorArg) {
|
|
213
|
+
const response = {
|
|
214
|
+
success: false,
|
|
215
|
+
error: errorArg,
|
|
216
|
+
};
|
|
217
|
+
if (idArg && Buffer.byteLength(idArg, 'utf8') <= maxChallengeRelayIdBytes) {
|
|
218
|
+
response.id = idArg;
|
|
219
|
+
}
|
|
220
|
+
return response;
|
|
221
|
+
}
|
|
222
|
+
estimateJsonByteLength(valueArg, maxBytesArg, seenArg = new Set()) {
|
|
223
|
+
const bytes = this.estimateJsonByteLengthInternal(valueArg, maxBytesArg, seenArg);
|
|
224
|
+
return bytes !== undefined && bytes <= maxBytesArg ? bytes : undefined;
|
|
225
|
+
}
|
|
226
|
+
estimateJsonByteLengthInternal(valueArg, maxBytesArg, seenArg) {
|
|
227
|
+
if (valueArg === null)
|
|
228
|
+
return 4;
|
|
229
|
+
if (typeof valueArg === 'string')
|
|
230
|
+
return this.estimateJsonStringByteLength(valueArg, maxBytesArg);
|
|
231
|
+
if (typeof valueArg === 'number')
|
|
232
|
+
return Number.isFinite(valueArg) ? String(valueArg).length : 4;
|
|
233
|
+
if (typeof valueArg === 'boolean')
|
|
234
|
+
return valueArg ? 4 : 5;
|
|
235
|
+
if (typeof valueArg === 'undefined')
|
|
236
|
+
return 4;
|
|
237
|
+
if (typeof valueArg === 'bigint' || typeof valueArg === 'symbol' || typeof valueArg === 'function')
|
|
238
|
+
return undefined;
|
|
239
|
+
if (typeof valueArg !== 'object')
|
|
240
|
+
return undefined;
|
|
241
|
+
if (seenArg.has(valueArg))
|
|
242
|
+
return undefined;
|
|
243
|
+
seenArg.add(valueArg);
|
|
244
|
+
try {
|
|
245
|
+
let totalBytes = 2;
|
|
246
|
+
if (Array.isArray(valueArg)) {
|
|
247
|
+
for (let i = 0; i < valueArg.length; i++) {
|
|
248
|
+
const childBytes = this.estimateJsonByteLengthInternal(valueArg[i], maxBytesArg, seenArg);
|
|
249
|
+
if (childBytes === undefined)
|
|
250
|
+
return undefined;
|
|
251
|
+
totalBytes += childBytes + (i > 0 ? 1 : 0);
|
|
252
|
+
if (totalBytes > maxBytesArg)
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return totalBytes;
|
|
256
|
+
}
|
|
257
|
+
let propertyCount = 0;
|
|
258
|
+
for (const [key, value] of Object.entries(valueArg)) {
|
|
259
|
+
if (typeof value === 'undefined' || typeof value === 'function' || typeof value === 'symbol')
|
|
260
|
+
continue;
|
|
261
|
+
const keyBytes = this.estimateJsonStringByteLength(key, maxBytesArg);
|
|
262
|
+
const valueBytes = this.estimateJsonByteLengthInternal(value, maxBytesArg, seenArg);
|
|
263
|
+
if (keyBytes === undefined || valueBytes === undefined)
|
|
264
|
+
return undefined;
|
|
265
|
+
totalBytes += keyBytes + valueBytes + 1 + (propertyCount > 0 ? 1 : 0);
|
|
266
|
+
propertyCount += 1;
|
|
267
|
+
if (totalBytes > maxBytesArg)
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
return totalBytes;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
seenArg.delete(valueArg);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
estimateJsonStringByteLength(valueArg, maxBytesArg) {
|
|
277
|
+
let bytes = Buffer.byteLength(valueArg, 'utf8') + 2;
|
|
278
|
+
if (bytes > maxBytesArg)
|
|
279
|
+
return undefined;
|
|
280
|
+
for (let i = 0; i < valueArg.length; i++) {
|
|
281
|
+
const code = valueArg.charCodeAt(i);
|
|
282
|
+
if (code === 0x22 || code === 0x5c) {
|
|
283
|
+
bytes += 1;
|
|
284
|
+
}
|
|
285
|
+
else if (code === 0x08 || code === 0x09 || code === 0x0a || code === 0x0c || code === 0x0d) {
|
|
286
|
+
bytes += 1;
|
|
287
|
+
}
|
|
288
|
+
else if (code < 0x20) {
|
|
289
|
+
bytes += 5;
|
|
290
|
+
}
|
|
291
|
+
if (bytes > maxBytesArg)
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
return bytes;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlLXByb3ZpZGVyLXJlbGF5LXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvY2hhbGxlbmdlLXByb3ZpZGVyLXJlbGF5LXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWtCcEQsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0FBUXJDLE1BQU0sT0FBTyw0QkFBNEI7SUFZN0I7SUFYRixpQkFBaUIsQ0FBUztJQUMxQiwyQkFBMkIsQ0FBUztJQUNwQyw4QkFBOEIsQ0FBUztJQUN2Qyx3QkFBd0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sR0FBOEIsSUFBSSxDQUFDO0lBQ3pDLFVBQVUsQ0FBUztJQUNuQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7SUFDOUMsWUFBWSxDQUFpQjtJQUVyQyxZQUNVLFNBQWlFLEVBQ3pFLGFBQW1ELEVBQUU7UUFEN0MsY0FBUyxHQUFULFNBQVMsQ0FBd0Q7UUFHekUsSUFBSSxDQUFDLFVBQVUsR0FBRyxtQ0FBbUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN6SCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsMkJBQTJCLElBQUksSUFBSSxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyw4QkFBOEIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUNuSSxDQUFDO0lBRU0sYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzFCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWE7UUFDekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwwREFBMEQ7UUFDNUQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLHVDQUF1QyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDO1FBQzlILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7Z0JBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNkNBQTZDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JJLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNmLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDaEIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBMEI7UUFDakQsSUFBSSxNQUFNLEdBQTRCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsNkJBQTZCLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDhDQUE4QyxFQUFFLENBQUMsQ0FBQztnQkFDdEcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFFaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztpQkFDcEIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDeEQsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFHLEdBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ3hDLElBQUksT0FBK0IsQ0FBQztRQUNwQyxJQUFJLENBQUM7WUFDSCxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQTJCLENBQUM7UUFDMUQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSw4QkFBOEIsRUFBRSxDQUFDO1FBQ25FLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTztnQkFDTCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLHVCQUF1QixPQUFPLENBQUMsVUFBVSxxQkFBcUI7YUFDdEUsQ0FBQztRQUNKLENBQUM7UUFFRCxRQUFRLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQXlELENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3ZMLEtBQUssUUFBUTtnQkFDWCxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBeUQsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkwsS0FBSyxRQUFRO2dCQUNYLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUF5RCxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2TDtnQkFDRSxNQUFNLGNBQWMsR0FBSSxPQUFtQyxDQUFDLFNBQVMsQ0FBQztnQkFDdEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDBDQUEwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFILENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFJLFlBQThCLEVBQUUsZ0JBQTBDO1FBQzdHLElBQUksSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLGdCQUFnQixrREFBa0QsQ0FBQyxDQUFDO1FBQzVHLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQywyQkFBMkIsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixnQkFBZ0Isb0VBQW9FLENBQUMsQ0FBQztRQUM5SCxDQUFDO1FBRUQsSUFBSSxLQUFnRCxDQUFDO1FBQ3JELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDdkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsMkJBQTJCLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQywyQkFBMkIsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQ2pELENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDVCxhQUFhLEVBQUUsQ0FBQztZQUNoQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sYUFBYSxFQUFFLENBQUM7WUFDaEIsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO1FBQ0Ysc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUN4QixzQkFBc0I7Z0JBQ3RCLElBQUksT0FBTyxDQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUNsQyxLQUFLLEdBQUcsVUFBVSxDQUNoQixHQUFHLEVBQUU7d0JBQ0gsYUFBYSxFQUFFLENBQUM7d0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsZ0JBQWdCLG9CQUFvQixJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQzFHLENBQUMsRUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxLQUFLO2dCQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFdBQW9DO1FBQ3BGLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2RixRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsK0NBQStDLENBQUMsQ0FBQztRQUN2RyxDQUFDO1FBRUQsSUFBSSxrQkFBMEIsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLDhDQUE4QyxDQUFDLENBQUMsQ0FBQztRQUNoSSxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxHQUFHLDZCQUE2QixFQUFFLENBQUM7WUFDbEYsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLCtDQUErQzthQUN2RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLGtCQUFrQixJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBeUIsRUFBRSxRQUFnQjtRQUNyRSxNQUFNLFFBQVEsR0FBNEI7WUFDeEMsT0FBTyxFQUFFLEtBQUs7WUFDZCxLQUFLLEVBQUUsUUFBUTtTQUNoQixDQUFDO1FBQ0YsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUMxRSxRQUFRLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixRQUFpQixFQUNqQixXQUFtQixFQUNuQixVQUFVLElBQUksR0FBRyxFQUFVO1FBRTNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xGLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sOEJBQThCLENBQ3BDLFFBQWlCLEVBQ2pCLFdBQW1CLEVBQ25CLE9BQW9CO1FBRXBCLElBQUksUUFBUSxLQUFLLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEcsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1lBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakcsSUFBSSxPQUFPLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksT0FBTyxRQUFRLEtBQUssV0FBVztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDckgsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbkQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDMUYsSUFBSSxVQUFVLEtBQUssU0FBUzt3QkFBRSxPQUFPLFNBQVMsQ0FBQztvQkFDL0MsVUFBVSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNDLElBQUksVUFBVSxHQUFHLFdBQVc7d0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUVELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztZQUN0QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFtQyxDQUFDLEVBQUUsQ0FBQztnQkFDL0UsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7b0JBQUUsU0FBUztnQkFDdkcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDckUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssU0FBUztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDekUsVUFBVSxJQUFJLFFBQVEsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsYUFBYSxJQUFJLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxVQUFVLEdBQUcsV0FBVztvQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDeEUsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksS0FBSyxHQUFHLFdBQVc7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUUxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNiLENBQUM7aUJBQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDN0YsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNiLENBQUM7aUJBQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDYixDQUFDO1lBQ0QsSUFBSSxLQUFLLEdBQUcsV0FBVztnQkFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SmartProxy models
|
|
3
3
|
*/
|
|
4
|
-
export type { ISmartProxyOptions, ISmartProxySecurityPolicy, ISmartProxyCertStore, IConnectionRecord, TSmartProxyCertProvisionObject, ICertProvisionEventComms, ICertificateIssuedEvent, ICertificateFailedEvent, IActiveConnectionSnapshot, IActiveConnectionSnapshotOptions } from './interfaces.js';
|
|
4
|
+
export type { ISmartProxyOptions, ISmartProxySecurityPolicy, ISmartProxyChallengeOptions, ISmartProxyCertStore, IConnectionRecord, TChallengeProviderRegistry, TSmartProxyCertProvisionObject, ICertProvisionEventComms, ICertificateIssuedEvent, ICertificateFailedEvent, IActiveConnectionSnapshot, IActiveConnectionSnapshotOptions } from './interfaces.js';
|
|
5
5
|
export * from './route-types.js';
|
|
6
6
|
export * from './metrics-types.js';
|
|
@@ -35,6 +35,16 @@ export interface ISmartProxySecurityPolicy {
|
|
|
35
35
|
blockedIps?: string[];
|
|
36
36
|
blockedCidrs?: string[];
|
|
37
37
|
}
|
|
38
|
+
export interface ISmartProxyChallengeOptions {
|
|
39
|
+
/** Runtime-only cookie signing key. If omitted, SmartProxy generates an ephemeral key. */
|
|
40
|
+
cookieSigningKey?: string;
|
|
41
|
+
pendingCookieName?: string;
|
|
42
|
+
clearanceCookieName?: string;
|
|
43
|
+
reservedPathPrefix?: string;
|
|
44
|
+
relaySocketPath?: string;
|
|
45
|
+
relayTimeoutMs?: number;
|
|
46
|
+
pendingTtlSeconds?: number;
|
|
47
|
+
}
|
|
38
48
|
/**
|
|
39
49
|
* Provision object for static or HTTP-01 certificate
|
|
40
50
|
*/
|
|
@@ -99,8 +109,7 @@ export interface IActiveConnectionSnapshot {
|
|
|
99
109
|
export interface ISmartProxyOptions {
|
|
100
110
|
routes: IRouteConfig[];
|
|
101
111
|
preserveSourceIP?: boolean;
|
|
102
|
-
|
|
103
|
-
acceptProxyProtocol?: boolean;
|
|
112
|
+
trustedProxyIPs?: string[];
|
|
104
113
|
sendProxyProtocol?: boolean;
|
|
105
114
|
defaults?: {
|
|
106
115
|
target?: {
|
|
@@ -145,6 +154,8 @@ export interface ISmartProxyOptions {
|
|
|
145
154
|
maxConnectionsPerIP?: number;
|
|
146
155
|
connectionRateLimitPerMinute?: number;
|
|
147
156
|
securityPolicy?: ISmartProxySecurityPolicy;
|
|
157
|
+
/** Runtime-only challenge enforcement settings. Never store this in route configs. */
|
|
158
|
+
challenge?: ISmartProxyChallengeOptions;
|
|
148
159
|
keepAliveTreatment?: 'standard' | 'extended' | 'immortal';
|
|
149
160
|
keepAliveInactivityMultiplier?: number;
|
|
150
161
|
extendedKeepAliveLifetime?: number;
|
|
@@ -211,6 +222,7 @@ export interface ISmartProxyOptions {
|
|
|
211
222
|
*/
|
|
212
223
|
rustBinaryPath?: string;
|
|
213
224
|
}
|
|
225
|
+
export type TChallengeProviderRegistry = Map<string, plugins.smartchallenge.IChallengeProvider>;
|
|
214
226
|
/**
|
|
215
227
|
* Enhanced connection record
|
|
216
228
|
*/
|
|
@@ -17,6 +17,14 @@ export type TTlsMode = 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
|
|
|
17
17
|
* Transport protocol for route matching
|
|
18
18
|
*/
|
|
19
19
|
export type TTransportProtocol = 'tcp' | 'udp' | 'all';
|
|
20
|
+
/**
|
|
21
|
+
* Inbound PROXY protocol handling for a listener.
|
|
22
|
+
*/
|
|
23
|
+
export type TInboundProxyProtocolMode = 'reject' | 'optional' | 'required';
|
|
24
|
+
export interface IInboundProxyProtocolPolicy {
|
|
25
|
+
mode: TInboundProxyProtocolMode;
|
|
26
|
+
trustedProxyIPs?: string[];
|
|
27
|
+
}
|
|
20
28
|
/**
|
|
21
29
|
* Port range specification format.
|
|
22
30
|
* Supports: single number, array of numbers, array of ranges, or mixed arrays.
|
|
@@ -31,6 +39,7 @@ export type TPortRange = number | Array<number | {
|
|
|
31
39
|
export interface IRouteMatch {
|
|
32
40
|
ports: TPortRange;
|
|
33
41
|
transport?: TTransportProtocol;
|
|
42
|
+
inboundProxyProtocol?: IInboundProxyProtocolPolicy;
|
|
34
43
|
domains?: string | string[];
|
|
35
44
|
path?: string;
|
|
36
45
|
clientIp?: string[];
|
|
@@ -149,6 +158,8 @@ export interface IRouteSecurity {
|
|
|
149
158
|
/** Allowed VPN tunnel IPs, kept for compatibility. Prefer allowedClients. */
|
|
150
159
|
allowedAssignedIps?: string[];
|
|
151
160
|
};
|
|
161
|
+
/** Browser-facing challenge policy. SmartProxy enforces this in the HTTP path. */
|
|
162
|
+
challenge?: plugins.smartchallenge.IRouteChallengeConfig;
|
|
152
163
|
}
|
|
153
164
|
/**
|
|
154
165
|
* Static file server configuration
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import * as plugins from '../../../plugins.js';
|
|
2
2
|
// Configuration moved to models/interfaces.ts as ISmartProxyOptions
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L21vZGVscy9yb3V0ZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBZ2QvQyxvRUFBb0UifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IProtocolCacheEntry, IProtocolDistribution } from './metrics-types.js';
|
|
2
|
-
import type { IAcmeOptions, ISmartProxyOptions, ISmartProxySecurityPolicy } from './interfaces.js';
|
|
2
|
+
import type { IAcmeOptions, ISmartProxyChallengeOptions, ISmartProxyOptions, ISmartProxySecurityPolicy } from './interfaces.js';
|
|
3
3
|
import type { IRouteAction, IRouteConfig, IRouteMatch, IRouteTarget, ITargetMatch, IRouteUdp } from './route-types.js';
|
|
4
4
|
export type TRustHeaderMatchers = Record<string, string>;
|
|
5
5
|
export interface IRustRouteMatch extends Omit<IRouteMatch, 'headers'> {
|
|
@@ -29,11 +29,12 @@ export interface IRustRouteConfig extends Omit<IRouteConfig, 'match' | 'action'>
|
|
|
29
29
|
}
|
|
30
30
|
export interface IRustAcmeOptions extends Omit<IAcmeOptions, 'routeForwards'> {
|
|
31
31
|
}
|
|
32
|
+
export interface IRustChallengeOptions extends Required<Pick<ISmartProxyChallengeOptions, 'cookieSigningKey' | 'pendingCookieName' | 'clearanceCookieName' | 'reservedPathPrefix' | 'relaySocketPath' | 'relayTimeoutMs' | 'pendingTtlSeconds'>> {
|
|
33
|
+
}
|
|
32
34
|
export interface IRustProxyOptions {
|
|
33
35
|
routes: IRustRouteConfig[];
|
|
34
36
|
preserveSourceIp?: boolean;
|
|
35
|
-
|
|
36
|
-
acceptProxyProtocol?: boolean;
|
|
37
|
+
trustedProxyIPs?: string[];
|
|
37
38
|
sendProxyProtocol?: boolean;
|
|
38
39
|
defaults?: IRustDefaultConfig;
|
|
39
40
|
connectionTimeout?: number;
|
|
@@ -59,6 +60,7 @@ export interface IRustProxyOptions {
|
|
|
59
60
|
extendedKeepAliveLifetime?: number;
|
|
60
61
|
metrics?: ISmartProxyOptions['metrics'];
|
|
61
62
|
securityPolicy?: ISmartProxySecurityPolicy;
|
|
63
|
+
challenge?: IRustChallengeOptions;
|
|
62
64
|
acme?: IRustAcmeOptions;
|
|
63
65
|
}
|
|
64
66
|
export interface IRustStatistics {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
|
-
import type { IRustCertificateStatus, IRustMetricsSnapshot, IRustProxyOptions, IRustRouteConfig, IRustStatistics } from './models/rust-types.js';
|
|
2
|
+
import type { IRustCertificateStatus, IRustChallengeOptions, IRustMetricsSnapshot, IRustProxyOptions, IRustRouteConfig, IRustStatistics } from './models/rust-types.js';
|
|
3
3
|
import type { IActiveConnectionSnapshot, IActiveConnectionSnapshotOptions, ISmartProxySecurityPolicy } from './models/interfaces.js';
|
|
4
4
|
/**
|
|
5
5
|
* Bridge between TypeScript SmartProxy and the Rust binary.
|
|
@@ -33,6 +33,7 @@ export declare class RustProxyBridge extends plugins.EventEmitter {
|
|
|
33
33
|
getCertificateStatus(routeName: string): Promise<IRustCertificateStatus | null>;
|
|
34
34
|
getListeningPorts(): Promise<number[]>;
|
|
35
35
|
setSocketHandlerRelay(socketPath: string): Promise<void>;
|
|
36
|
+
setChallengeProviderRelay(socketPath: string, options?: IRustChallengeOptions): Promise<void>;
|
|
36
37
|
addListeningPort(port: number): Promise<void>;
|
|
37
38
|
removeListeningPort(port: number): Promise<void>;
|
|
38
39
|
loadCertificate(domain: string, cert: string, key: string, ca?: string): Promise<void>;
|