@relayplane/proxy 1.2.0 → 1.3.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/dist/circuit-breaker.d.ts +39 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +97 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli.js +13 -3
- package/dist/cli.js.map +1 -1
- package/dist/health.d.ts +16 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +80 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts +10 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +73 -0
- package/dist/launcher.js.map +1 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +13 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware.d.ts +60 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +254 -0
- package/dist/middleware.js.map +1 -0
- package/dist/process-manager.d.ts +61 -0
- package/dist/process-manager.d.ts.map +1 -0
- package/dist/process-manager.js +173 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/relay-config.d.ts +19 -0
- package/dist/relay-config.d.ts.map +1 -0
- package/dist/relay-config.js +32 -0
- package/dist/relay-config.js.map +1 -0
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +98 -7
- package/dist/standalone-proxy.js.map +1 -1
- package/dist/stats.d.ts +49 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +72 -0
- package/dist/stats.js.map +1 -0
- package/dist/status.d.ts +46 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +78 -0
- package/dist/status.js.map +1 -0
- package/dist/telemetry.d.ts +6 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +14 -2
- package/dist/telemetry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RelayPlane Proxy Middleware
|
|
4
|
+
*
|
|
5
|
+
* Wraps provider requests: tries proxy first (when circuit is healthy),
|
|
6
|
+
* falls back to direct on failure. This is the key integration point.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.RelayPlaneMiddleware = void 0;
|
|
45
|
+
const http = __importStar(require("node:http"));
|
|
46
|
+
const circuit_breaker_js_1 = require("./circuit-breaker.js");
|
|
47
|
+
const health_js_1 = require("./health.js");
|
|
48
|
+
const relay_config_js_1 = require("./relay-config.js");
|
|
49
|
+
const process_manager_js_1 = require("./process-manager.js");
|
|
50
|
+
const stats_js_1 = require("./stats.js");
|
|
51
|
+
const status_js_1 = require("./status.js");
|
|
52
|
+
const logger_js_1 = require("./logger.js");
|
|
53
|
+
class RelayPlaneMiddleware {
|
|
54
|
+
circuitBreaker;
|
|
55
|
+
stats;
|
|
56
|
+
statusReporter;
|
|
57
|
+
proxyUrl;
|
|
58
|
+
enabled;
|
|
59
|
+
autoStart;
|
|
60
|
+
logger;
|
|
61
|
+
probeInterval = null;
|
|
62
|
+
processManager = null;
|
|
63
|
+
constructor(configOrOpts) {
|
|
64
|
+
let config;
|
|
65
|
+
let pm;
|
|
66
|
+
let pmOpts;
|
|
67
|
+
let logger;
|
|
68
|
+
if (configOrOpts && 'config' in configOrOpts) {
|
|
69
|
+
const opts = configOrOpts;
|
|
70
|
+
config = opts.config;
|
|
71
|
+
pm = opts.processManager;
|
|
72
|
+
pmOpts = opts.processManagerOptions;
|
|
73
|
+
logger = opts.logger;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
config = configOrOpts;
|
|
77
|
+
}
|
|
78
|
+
const resolved = (0, relay_config_js_1.resolveConfig)(config);
|
|
79
|
+
this.enabled = resolved.enabled;
|
|
80
|
+
this.proxyUrl = resolved.proxyUrl;
|
|
81
|
+
this.autoStart = resolved.autoStart;
|
|
82
|
+
this.logger = logger ?? logger_js_1.defaultLogger;
|
|
83
|
+
this.circuitBreaker = new circuit_breaker_js_1.CircuitBreaker(resolved.circuitBreaker);
|
|
84
|
+
this.stats = new stats_js_1.StatsCollector();
|
|
85
|
+
// Set up process manager
|
|
86
|
+
if (pm) {
|
|
87
|
+
this.processManager = pm;
|
|
88
|
+
}
|
|
89
|
+
else if (this.autoStart && this.enabled) {
|
|
90
|
+
this.processManager = new process_manager_js_1.ProcessManager({
|
|
91
|
+
...pmOpts,
|
|
92
|
+
circuitBreaker: this.circuitBreaker,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Status reporter
|
|
96
|
+
this.statusReporter = new status_js_1.StatusReporter({
|
|
97
|
+
enabled: this.enabled,
|
|
98
|
+
proxyUrl: this.proxyUrl,
|
|
99
|
+
circuitBreaker: this.circuitBreaker,
|
|
100
|
+
statsCollector: this.stats,
|
|
101
|
+
processManager: this.processManager,
|
|
102
|
+
});
|
|
103
|
+
// Wire circuit breaker state changes → stats + logging + probing
|
|
104
|
+
this.circuitBreaker.on('stateChange', ({ from, to }) => {
|
|
105
|
+
this.stats.recordStateTransition(from, to);
|
|
106
|
+
if (to === 'OPEN') {
|
|
107
|
+
this.logger.error(`Circuit breaker tripped OPEN (was ${from})`);
|
|
108
|
+
this.startProbing();
|
|
109
|
+
}
|
|
110
|
+
else if (to === 'CLOSED') {
|
|
111
|
+
this.logger.info(`Circuit breaker recovered: ${from} → CLOSED`);
|
|
112
|
+
this.stopProbing();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.stopProbing();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// Wire process manager events
|
|
119
|
+
if (this.processManager) {
|
|
120
|
+
this.processManager.on('crash', ({ code, signal }) => {
|
|
121
|
+
this.statusReporter.incrementRestarts();
|
|
122
|
+
this.statusReporter.setLastError(`Process crashed (code=${code}, signal=${signal})`);
|
|
123
|
+
});
|
|
124
|
+
this.processManager.on('error', (err) => {
|
|
125
|
+
this.statusReporter.setLastError(err.message);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Auto-start
|
|
129
|
+
if (this.processManager && this.autoStart && this.enabled) {
|
|
130
|
+
this.processManager.start();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getProcessManager() {
|
|
134
|
+
return this.processManager;
|
|
135
|
+
}
|
|
136
|
+
getStatus() {
|
|
137
|
+
return this.statusReporter.getStatus();
|
|
138
|
+
}
|
|
139
|
+
formatStatus() {
|
|
140
|
+
return this.statusReporter.formatStatus();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Route a request: proxy if healthy, direct otherwise.
|
|
144
|
+
*/
|
|
145
|
+
async route(req, directSend) {
|
|
146
|
+
if (!this.enabled || !this.circuitBreaker.isHealthy()) {
|
|
147
|
+
const reason = !this.enabled ? 'proxy disabled' : 'circuit breaker OPEN';
|
|
148
|
+
this.logger.warn(`Falling back to direct: ${reason}`);
|
|
149
|
+
const start = Date.now();
|
|
150
|
+
const resp = await directSend(req);
|
|
151
|
+
this.stats.recordRequest({
|
|
152
|
+
timestamp: start,
|
|
153
|
+
latencyMs: Date.now() - start,
|
|
154
|
+
viaProxy: false,
|
|
155
|
+
success: resp.status < 500,
|
|
156
|
+
});
|
|
157
|
+
return resp;
|
|
158
|
+
}
|
|
159
|
+
const start = Date.now();
|
|
160
|
+
try {
|
|
161
|
+
const resp = await this.sendViaProxy(req);
|
|
162
|
+
this.circuitBreaker.recordSuccess();
|
|
163
|
+
this.stats.recordRequest({
|
|
164
|
+
timestamp: start,
|
|
165
|
+
latencyMs: Date.now() - start,
|
|
166
|
+
viaProxy: true,
|
|
167
|
+
success: true,
|
|
168
|
+
});
|
|
169
|
+
return resp;
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
this.circuitBreaker.recordFailure();
|
|
173
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
174
|
+
this.logger.warn(`Falling back to direct: proxy error (${errMsg})`);
|
|
175
|
+
this.statusReporter.setLastError(errMsg);
|
|
176
|
+
const directStart = Date.now();
|
|
177
|
+
const resp = await directSend(req);
|
|
178
|
+
this.stats.recordRequest({
|
|
179
|
+
timestamp: start,
|
|
180
|
+
latencyMs: Date.now() - start,
|
|
181
|
+
viaProxy: false,
|
|
182
|
+
success: resp.status < 500,
|
|
183
|
+
});
|
|
184
|
+
return resp;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
sendViaProxy(req) {
|
|
188
|
+
const url = new URL(req.path, this.proxyUrl);
|
|
189
|
+
const timeoutMs = this.circuitBreaker.requestTimeoutMs;
|
|
190
|
+
return new Promise((resolve, reject) => {
|
|
191
|
+
const proxyReq = http.request(url, {
|
|
192
|
+
method: req.method,
|
|
193
|
+
headers: req.headers,
|
|
194
|
+
timeout: timeoutMs,
|
|
195
|
+
}, (res) => {
|
|
196
|
+
let data = '';
|
|
197
|
+
res.on('data', (chunk) => (data += chunk));
|
|
198
|
+
res.on('end', () => {
|
|
199
|
+
if (res.statusCode && res.statusCode >= 500) {
|
|
200
|
+
reject(new Error(`Proxy returned ${res.statusCode}`));
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const headers = {};
|
|
204
|
+
for (const [k, v] of Object.entries(res.headers)) {
|
|
205
|
+
if (typeof v === 'string')
|
|
206
|
+
headers[k] = v;
|
|
207
|
+
}
|
|
208
|
+
resolve({ status: res.statusCode ?? 200, headers, body: data, viaProxy: true });
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
proxyReq.on('error', reject);
|
|
212
|
+
proxyReq.on('timeout', () => {
|
|
213
|
+
proxyReq.destroy();
|
|
214
|
+
reject(new Error('Proxy request timeout'));
|
|
215
|
+
});
|
|
216
|
+
if (req.body)
|
|
217
|
+
proxyReq.write(req.body);
|
|
218
|
+
proxyReq.end();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
startProbing() {
|
|
222
|
+
this.stopProbing();
|
|
223
|
+
this.probeInterval = setInterval(async () => {
|
|
224
|
+
if (this.circuitBreaker.getState() !== 'OPEN') {
|
|
225
|
+
this.stopProbing();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const ok = await (0, health_js_1.probeHealth)(this.proxyUrl);
|
|
229
|
+
if (ok) {
|
|
230
|
+
this.logger.info('Health probe succeeded, transitioning to HALF-OPEN');
|
|
231
|
+
this.circuitBreaker.recordSuccess();
|
|
232
|
+
}
|
|
233
|
+
}, 15_000);
|
|
234
|
+
if (this.probeInterval && typeof this.probeInterval === 'object' && 'unref' in this.probeInterval) {
|
|
235
|
+
this.probeInterval.unref();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
stopProbing() {
|
|
239
|
+
if (this.probeInterval) {
|
|
240
|
+
clearInterval(this.probeInterval);
|
|
241
|
+
this.probeInterval = null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
destroy() {
|
|
245
|
+
this.stopProbing();
|
|
246
|
+
if (this.processManager) {
|
|
247
|
+
this.processManager.destroy();
|
|
248
|
+
this.processManager = null;
|
|
249
|
+
}
|
|
250
|
+
this.circuitBreaker.destroy();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.RelayPlaneMiddleware = RelayPlaneMiddleware;
|
|
254
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Manager for RelayPlane Proxy
|
|
3
|
+
*
|
|
4
|
+
* Spawns the proxy as a child process, monitors health,
|
|
5
|
+
* handles crashes with exponential backoff restarts.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'node:events';
|
|
10
|
+
import { type CircuitBreaker } from './circuit-breaker.js';
|
|
11
|
+
export interface ProcessManagerOptions {
|
|
12
|
+
/** Command to spawn (default: process.execPath) */
|
|
13
|
+
command?: string;
|
|
14
|
+
/** Arguments for the command (default: launcher path) */
|
|
15
|
+
args?: string[];
|
|
16
|
+
/** Environment variables for the child process */
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
/** Initial restart delay in ms (default: 60000) */
|
|
19
|
+
restartDelayMs?: number;
|
|
20
|
+
/** Max restart delay in ms (default: 300000 = 5 min) */
|
|
21
|
+
maxRestartDelayMs?: number;
|
|
22
|
+
/** Max restart attempts within the window (default: 5) */
|
|
23
|
+
maxRestartAttempts?: number;
|
|
24
|
+
/** Window for counting restart attempts in ms (default: 600000 = 10 min) */
|
|
25
|
+
restartWindowMs?: number;
|
|
26
|
+
/** Circuit breaker instance to mark OPEN on crash */
|
|
27
|
+
circuitBreaker?: CircuitBreaker;
|
|
28
|
+
}
|
|
29
|
+
export declare class ProcessManager extends EventEmitter {
|
|
30
|
+
private child;
|
|
31
|
+
private readonly command;
|
|
32
|
+
private readonly args;
|
|
33
|
+
private readonly env;
|
|
34
|
+
private readonly restartDelayMs;
|
|
35
|
+
private readonly maxRestartDelayMs;
|
|
36
|
+
private readonly maxRestartAttempts;
|
|
37
|
+
private readonly restartWindowMs;
|
|
38
|
+
private readonly circuitBreaker?;
|
|
39
|
+
private restartTimestamps;
|
|
40
|
+
private currentDelay;
|
|
41
|
+
private restartTimer;
|
|
42
|
+
private stopping;
|
|
43
|
+
private started;
|
|
44
|
+
constructor(opts?: ProcessManagerOptions);
|
|
45
|
+
/** Start the proxy child process. */
|
|
46
|
+
start(): void;
|
|
47
|
+
/** Stop the proxy child process. */
|
|
48
|
+
stop(): void;
|
|
49
|
+
/** Restart the proxy (stop then start). */
|
|
50
|
+
restart(): void;
|
|
51
|
+
/** Whether the child process is currently running. */
|
|
52
|
+
isRunning(): boolean;
|
|
53
|
+
/** Get the PID of the child process, or null if not running. */
|
|
54
|
+
getPid(): number | null;
|
|
55
|
+
/** Clean up resources. */
|
|
56
|
+
destroy(): void;
|
|
57
|
+
private spawnChild;
|
|
58
|
+
private scheduleRestart;
|
|
59
|
+
private clearRestartTimer;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IAEjD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,GAAE,qBAA0B;IAa5C,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAOb,oCAAoC;IACpC,IAAI,IAAI,IAAI;IAYZ,2CAA2C;IAC3C,OAAO,IAAI,IAAI;IAKf,sDAAsD;IACtD,SAAS,IAAI,OAAO;IAIpB,gEAAgE;IAChE,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB,0BAA0B;IAC1B,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,UAAU;IA4DlB,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,iBAAiB;CAQ1B"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Process Manager for RelayPlane Proxy
|
|
4
|
+
*
|
|
5
|
+
* Spawns the proxy as a child process, monitors health,
|
|
6
|
+
* handles crashes with exponential backoff restarts.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ProcessManager = void 0;
|
|
15
|
+
const node_child_process_1 = require("node:child_process");
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
const node_events_1 = require("node:events");
|
|
18
|
+
class ProcessManager extends node_events_1.EventEmitter {
|
|
19
|
+
child = null;
|
|
20
|
+
command;
|
|
21
|
+
args;
|
|
22
|
+
env;
|
|
23
|
+
restartDelayMs;
|
|
24
|
+
maxRestartDelayMs;
|
|
25
|
+
maxRestartAttempts;
|
|
26
|
+
restartWindowMs;
|
|
27
|
+
circuitBreaker;
|
|
28
|
+
restartTimestamps = [];
|
|
29
|
+
currentDelay;
|
|
30
|
+
restartTimer = null;
|
|
31
|
+
stopping = false;
|
|
32
|
+
started = false;
|
|
33
|
+
constructor(opts = {}) {
|
|
34
|
+
super();
|
|
35
|
+
this.command = opts.command ?? process.execPath;
|
|
36
|
+
this.args = opts.args ?? [node_path_1.default.join(__dirname, 'launcher.js')];
|
|
37
|
+
this.env = opts.env ?? {};
|
|
38
|
+
this.restartDelayMs = opts.restartDelayMs ?? 60_000;
|
|
39
|
+
this.maxRestartDelayMs = opts.maxRestartDelayMs ?? 300_000;
|
|
40
|
+
this.maxRestartAttempts = opts.maxRestartAttempts ?? 5;
|
|
41
|
+
this.restartWindowMs = opts.restartWindowMs ?? 600_000;
|
|
42
|
+
this.circuitBreaker = opts.circuitBreaker;
|
|
43
|
+
this.currentDelay = this.restartDelayMs;
|
|
44
|
+
}
|
|
45
|
+
/** Start the proxy child process. */
|
|
46
|
+
start() {
|
|
47
|
+
if (this.child)
|
|
48
|
+
return;
|
|
49
|
+
this.stopping = false;
|
|
50
|
+
this.started = true;
|
|
51
|
+
this.spawnChild();
|
|
52
|
+
}
|
|
53
|
+
/** Stop the proxy child process. */
|
|
54
|
+
stop() {
|
|
55
|
+
this.stopping = true;
|
|
56
|
+
this.started = false;
|
|
57
|
+
this.clearRestartTimer();
|
|
58
|
+
if (this.child) {
|
|
59
|
+
this.child.removeAllListeners();
|
|
60
|
+
this.child.kill('SIGTERM');
|
|
61
|
+
this.child = null;
|
|
62
|
+
}
|
|
63
|
+
this.emit('stopped');
|
|
64
|
+
}
|
|
65
|
+
/** Restart the proxy (stop then start). */
|
|
66
|
+
restart() {
|
|
67
|
+
this.stop();
|
|
68
|
+
this.start();
|
|
69
|
+
}
|
|
70
|
+
/** Whether the child process is currently running. */
|
|
71
|
+
isRunning() {
|
|
72
|
+
return this.child !== null && this.child.exitCode === null && !this.child.killed;
|
|
73
|
+
}
|
|
74
|
+
/** Get the PID of the child process, or null if not running. */
|
|
75
|
+
getPid() {
|
|
76
|
+
return this.child?.pid ?? null;
|
|
77
|
+
}
|
|
78
|
+
/** Clean up resources. */
|
|
79
|
+
destroy() {
|
|
80
|
+
this.stop();
|
|
81
|
+
this.removeAllListeners();
|
|
82
|
+
}
|
|
83
|
+
spawnChild() {
|
|
84
|
+
try {
|
|
85
|
+
const child = (0, node_child_process_1.spawn)(this.command, this.args, {
|
|
86
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
87
|
+
env: { ...process.env, ...this.env },
|
|
88
|
+
});
|
|
89
|
+
// Handle spawn error (command not found, etc.)
|
|
90
|
+
child.on('error', (err) => {
|
|
91
|
+
console.error(`[relayplane] Failed to spawn proxy: ${err.message}`);
|
|
92
|
+
this.child = null;
|
|
93
|
+
this.circuitBreaker?.recordFailure();
|
|
94
|
+
this.emit('error', err);
|
|
95
|
+
if (!this.stopping) {
|
|
96
|
+
this.scheduleRestart();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// Pipe stdout with prefix
|
|
100
|
+
child.stdout?.on('data', (chunk) => {
|
|
101
|
+
const lines = chunk.toString().split('\n').filter(Boolean);
|
|
102
|
+
for (const line of lines) {
|
|
103
|
+
console.log(`[relayplane] ${line}`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// Pipe stderr with prefix
|
|
107
|
+
child.stderr?.on('data', (chunk) => {
|
|
108
|
+
const lines = chunk.toString().split('\n').filter(Boolean);
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
console.error(`[relayplane] ${line}`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// Handle exit
|
|
114
|
+
child.on('exit', (code, signal) => {
|
|
115
|
+
this.child = null;
|
|
116
|
+
if (this.stopping)
|
|
117
|
+
return;
|
|
118
|
+
console.error(`[relayplane] Proxy exited (code=${code}, signal=${signal})`);
|
|
119
|
+
// Mark circuit breaker OPEN on crash
|
|
120
|
+
this.circuitBreaker?.recordFailure();
|
|
121
|
+
this.emit('crash', { code, signal });
|
|
122
|
+
this.scheduleRestart();
|
|
123
|
+
});
|
|
124
|
+
this.child = child;
|
|
125
|
+
this.emit('started', { pid: child.pid });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
129
|
+
console.error(`[relayplane] Failed to spawn proxy: ${error.message}`);
|
|
130
|
+
this.child = null;
|
|
131
|
+
this.circuitBreaker?.recordFailure();
|
|
132
|
+
this.emit('error', error);
|
|
133
|
+
if (!this.stopping) {
|
|
134
|
+
this.scheduleRestart();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
scheduleRestart() {
|
|
139
|
+
if (this.stopping)
|
|
140
|
+
return;
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
// Prune old timestamps outside the window
|
|
143
|
+
this.restartTimestamps = this.restartTimestamps.filter((t) => now - t < this.restartWindowMs);
|
|
144
|
+
if (this.restartTimestamps.length >= this.maxRestartAttempts) {
|
|
145
|
+
console.error(`[relayplane] Max restart attempts (${this.maxRestartAttempts}) reached within ${this.restartWindowMs / 1000}s window. Giving up.`);
|
|
146
|
+
this.emit('maxRestartsExceeded');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this.restartTimestamps.push(now);
|
|
150
|
+
console.log(`[relayplane] Scheduling restart in ${this.currentDelay / 1000}s`);
|
|
151
|
+
this.restartTimer = setTimeout(() => {
|
|
152
|
+
this.restartTimer = null;
|
|
153
|
+
if (!this.stopping) {
|
|
154
|
+
this.spawnChild();
|
|
155
|
+
}
|
|
156
|
+
}, this.currentDelay);
|
|
157
|
+
if (this.restartTimer && typeof this.restartTimer === 'object' && 'unref' in this.restartTimer) {
|
|
158
|
+
this.restartTimer.unref();
|
|
159
|
+
}
|
|
160
|
+
// Exponential backoff
|
|
161
|
+
this.currentDelay = Math.min(this.currentDelay * 2, this.maxRestartDelayMs);
|
|
162
|
+
}
|
|
163
|
+
clearRestartTimer() {
|
|
164
|
+
if (this.restartTimer) {
|
|
165
|
+
clearTimeout(this.restartTimer);
|
|
166
|
+
this.restartTimer = null;
|
|
167
|
+
}
|
|
168
|
+
// Reset backoff on manual stop/restart
|
|
169
|
+
this.currentDelay = this.restartDelayMs;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.ProcessManager = ProcessManager;
|
|
173
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RelayPlane integration configuration types.
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export interface RelayPlaneConfig {
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
/** Proxy URL (default: http://127.0.0.1:4100) */
|
|
8
|
+
proxyUrl?: string;
|
|
9
|
+
circuitBreaker?: {
|
|
10
|
+
failureThreshold?: number;
|
|
11
|
+
resetTimeoutMs?: number;
|
|
12
|
+
requestTimeoutMs?: number;
|
|
13
|
+
};
|
|
14
|
+
/** Auto-start proxy process (Phase 2, default: true) */
|
|
15
|
+
autoStart?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare const DEFAULT_RELAY_CONFIG: Required<RelayPlaneConfig>;
|
|
18
|
+
export declare function resolveConfig(partial?: Partial<RelayPlaneConfig>): Required<RelayPlaneConfig>;
|
|
19
|
+
//# sourceMappingURL=relay-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-config.d.ts","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,gBAAgB,CAS3D,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAW7F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RelayPlane integration configuration types.
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DEFAULT_RELAY_CONFIG = void 0;
|
|
8
|
+
exports.resolveConfig = resolveConfig;
|
|
9
|
+
exports.DEFAULT_RELAY_CONFIG = {
|
|
10
|
+
enabled: false,
|
|
11
|
+
proxyUrl: 'http://127.0.0.1:4100',
|
|
12
|
+
circuitBreaker: {
|
|
13
|
+
failureThreshold: 3,
|
|
14
|
+
resetTimeoutMs: 30_000,
|
|
15
|
+
requestTimeoutMs: 3_000,
|
|
16
|
+
},
|
|
17
|
+
autoStart: true,
|
|
18
|
+
};
|
|
19
|
+
function resolveConfig(partial) {
|
|
20
|
+
if (!partial)
|
|
21
|
+
return { ...exports.DEFAULT_RELAY_CONFIG };
|
|
22
|
+
return {
|
|
23
|
+
enabled: partial.enabled ?? exports.DEFAULT_RELAY_CONFIG.enabled,
|
|
24
|
+
proxyUrl: partial.proxyUrl ?? exports.DEFAULT_RELAY_CONFIG.proxyUrl,
|
|
25
|
+
circuitBreaker: {
|
|
26
|
+
...exports.DEFAULT_RELAY_CONFIG.circuitBreaker,
|
|
27
|
+
...partial.circuitBreaker,
|
|
28
|
+
},
|
|
29
|
+
autoStart: partial.autoStart ?? exports.DEFAULT_RELAY_CONFIG.autoStart,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=relay-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-config.js","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA0BH,sCAWC;AAtBY,QAAA,oBAAoB,GAA+B;IAC9D,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,uBAAuB;IACjC,cAAc,EAAE;QACd,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM;QACtB,gBAAgB,EAAE,KAAK;KACxB;IACD,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,SAAgB,aAAa,CAAC,OAAmC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,4BAAoB,EAAE,CAAC;IACjD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,4BAAoB,CAAC,OAAO;QACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,4BAAoB,CAAC,QAAQ;QAC3D,cAAc,EAAE;YACd,GAAG,4BAAoB,CAAC,cAAc;YACtC,GAAG,OAAO,CAAC,cAAc;SAC1B;QACD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,4BAAoB,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AAI3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAqB9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ/E,CAAC;
|
|
1
|
+
{"version":3,"file":"standalone-proxy.d.ts","sourceRoot":"","sources":["../src/standalone-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AAI3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAqB9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ/E,CAAC;AAiCF;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAWjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAkBD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAcD,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC;CACxB;AAmBD,KAAK,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AA6EpD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;CAChD;AAqOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAe3D;AAuDD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,UAAU,CAiBrF;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,OAAO,CAIlG;AAo1CD;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAk9B/E"}
|