@stanleysun233/oneproxy-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/bin/onep.js +2 -0
  2. package/dist/commands.d.ts +15 -0
  3. package/dist/commands.js +216 -0
  4. package/dist/commands.js.map +1 -0
  5. package/dist/control-plane.d.ts +41 -0
  6. package/dist/control-plane.js +284 -0
  7. package/dist/control-plane.js.map +1 -0
  8. package/dist/daemon/http-proxy.d.ts +11 -0
  9. package/dist/daemon/http-proxy.js +148 -0
  10. package/dist/daemon/http-proxy.js.map +1 -0
  11. package/dist/daemon/lifecycle.d.ts +129 -0
  12. package/dist/daemon/lifecycle.js +350 -0
  13. package/dist/daemon/lifecycle.js.map +1 -0
  14. package/dist/daemon/port-selection.d.ts +9 -0
  15. package/dist/daemon/port-selection.js +61 -0
  16. package/dist/daemon/port-selection.js.map +1 -0
  17. package/dist/daemon/router.d.ts +35 -0
  18. package/dist/daemon/router.js +105 -0
  19. package/dist/daemon/router.js.map +1 -0
  20. package/dist/doctor.d.ts +29 -0
  21. package/dist/doctor.js +178 -0
  22. package/dist/doctor.js.map +1 -0
  23. package/dist/init.d.ts +2 -0
  24. package/dist/init.js +199 -0
  25. package/dist/init.js.map +1 -0
  26. package/dist/main.d.ts +5 -0
  27. package/dist/main.js +130 -0
  28. package/dist/main.js.map +1 -0
  29. package/dist/profile.d.ts +2 -0
  30. package/dist/profile.js +53 -0
  31. package/dist/profile.js.map +1 -0
  32. package/dist/session-env.d.ts +8 -0
  33. package/dist/session-env.js +219 -0
  34. package/dist/session-env.js.map +1 -0
  35. package/dist/shell.d.ts +3 -0
  36. package/dist/shell.js +50 -0
  37. package/dist/shell.js.map +1 -0
  38. package/dist/ssh.d.ts +19 -0
  39. package/dist/ssh.js +83 -0
  40. package/dist/ssh.js.map +1 -0
  41. package/dist/storage.d.ts +115 -0
  42. package/dist/storage.js +224 -0
  43. package/dist/storage.js.map +1 -0
  44. package/package.json +27 -0
@@ -0,0 +1,148 @@
1
+ import * as http from 'node:http';
2
+ import * as net from 'node:net';
3
+ import { closeServer, listenHttpServer, readConfig, readState, readTokens } from "./lifecycle.js";
4
+ import { resolveRoute } from "./router.js";
5
+ export async function startHttpProxyListeners(input, bindings, liveState = false, onProxyActivity) {
6
+ const httpServer = createHttpProxyServer(input, liveState, onProxyActivity);
7
+ const httpsServer = createHttpProxyServer(input, liveState, onProxyActivity);
8
+ await Promise.all([
9
+ listenHttpServer(httpServer, bindings.httpPort),
10
+ listenHttpServer(httpsServer, bindings.httpsPort)
11
+ ]);
12
+ return {
13
+ httpServer,
14
+ httpsServer,
15
+ close: async () => {
16
+ await Promise.all([closeServer(httpServer), closeServer(httpsServer)]);
17
+ }
18
+ };
19
+ }
20
+ export function createHttpProxyServer(input, liveState = false, onProxyActivity) {
21
+ const server = http.createServer((request, response) => {
22
+ onProxyActivity?.();
23
+ proxyHttpRequest(input, liveState, request, response);
24
+ });
25
+ server.on('connect', async (request, clientSocket, head) => {
26
+ onProxyActivity?.();
27
+ const target = parseConnectTarget(request.url ?? '');
28
+ if (!target) {
29
+ clientSocket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
30
+ return;
31
+ }
32
+ const context = await proxyContext(input, liveState);
33
+ const route = resolveRoute({ ...context, target: `${target.host}:${target.port}`, protocol: 'connect' });
34
+ if (route.mode === 'proxy' && !route.topology) {
35
+ clientSocket.end('HTTP/1.1 502 Bad Gateway\r\n\r\n');
36
+ return;
37
+ }
38
+ const token = route.mode === 'proxy' ? await proxyToken() : undefined;
39
+ const upstream = route.mode === 'proxy' && route.topology ? {
40
+ host: route.topology.entryHost,
41
+ port: route.topology.entryPort
42
+ } : target;
43
+ const upstreamSocket = net.connect(upstream.port, upstream.host, () => {
44
+ if (route.mode === 'proxy') {
45
+ upstreamSocket.write(connectRequest(target.host, target.port, token));
46
+ }
47
+ else {
48
+ clientSocket.write('HTTP/1.1 200 Connection Established\r\n\r\n');
49
+ }
50
+ if (head.length > 0) {
51
+ upstreamSocket.write(head);
52
+ }
53
+ clientSocket.pipe(upstreamSocket);
54
+ upstreamSocket.pipe(clientSocket);
55
+ });
56
+ upstreamSocket.on('error', () => clientSocket.destroy());
57
+ clientSocket.on('error', () => upstreamSocket.destroy());
58
+ });
59
+ return server;
60
+ }
61
+ async function proxyHttpRequest(input, liveState, request, response) {
62
+ const target = parseHttpTarget(request);
63
+ if (!target) {
64
+ response.writeHead(400);
65
+ response.end();
66
+ return;
67
+ }
68
+ const context = await proxyContext(input, liveState);
69
+ const route = resolveRoute({ ...context, target: target.url, protocol: target.protocol });
70
+ if (route.mode === 'proxy' && !route.topology) {
71
+ response.writeHead(502);
72
+ response.end();
73
+ return;
74
+ }
75
+ const headers = { ...request.headers };
76
+ delete headers['proxy-connection'];
77
+ if (route.mode === 'proxy') {
78
+ const token = await proxyToken();
79
+ if (token) {
80
+ headers['proxy-authorization'] = `Bearer ${token}`;
81
+ }
82
+ }
83
+ const upstreamRequest = http.request({
84
+ host: route.mode === 'proxy' && route.topology ? route.topology.entryHost : target.host,
85
+ port: route.mode === 'proxy' && route.topology ? route.topology.entryPort : target.port,
86
+ method: request.method,
87
+ path: route.mode === 'proxy' ? target.url : target.path,
88
+ headers
89
+ }, (upstreamResponse) => {
90
+ response.writeHead(upstreamResponse.statusCode ?? 502, upstreamResponse.headers);
91
+ upstreamResponse.pipe(response);
92
+ });
93
+ upstreamRequest.on('error', () => {
94
+ if (!response.headersSent) {
95
+ response.writeHead(502);
96
+ }
97
+ response.end();
98
+ });
99
+ request.pipe(upstreamRequest);
100
+ }
101
+ async function proxyContext(input, liveState) {
102
+ return liveState ? { config: await readConfig(), state: await readState() } : input;
103
+ }
104
+ function parseConnectTarget(value) {
105
+ const index = value.lastIndexOf(':');
106
+ if (index <= 0) {
107
+ return null;
108
+ }
109
+ const host = value.slice(0, index).replace(/^\[|\]$/g, '').toLowerCase();
110
+ const port = Number(value.slice(index + 1));
111
+ if (!host || !Number.isInteger(port) || port < 1 || port > 65535) {
112
+ return null;
113
+ }
114
+ return { host, port };
115
+ }
116
+ function parseHttpTarget(request) {
117
+ const rawUrl = request.url ?? '';
118
+ const hostHeader = Array.isArray(request.headers.host) ? request.headers.host[0] : request.headers.host;
119
+ const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(rawUrl)
120
+ ? new URL(rawUrl)
121
+ : new URL(rawUrl || '/', `http://${hostHeader ?? ''}`);
122
+ const host = url.hostname.toLowerCase();
123
+ const port = url.port ? Number(url.port) : url.protocol === 'https:' ? 443 : 80;
124
+ if (!host || !Number.isInteger(port)) {
125
+ return null;
126
+ }
127
+ return {
128
+ url: url.toString(),
129
+ protocol: url.protocol.replace(':', ''),
130
+ host,
131
+ port,
132
+ path: `${url.pathname}${url.search}`
133
+ };
134
+ }
135
+ function connectRequest(host, port, token) {
136
+ const lines = [
137
+ `CONNECT ${host}:${port} HTTP/1.1`,
138
+ `Host: ${host}:${port}`
139
+ ];
140
+ if (token) {
141
+ lines.push(`Proxy-Authorization: Bearer ${token}`);
142
+ }
143
+ return `${lines.join('\r\n')}\r\n\r\n`;
144
+ }
145
+ async function proxyToken() {
146
+ return (await readTokens())?.proxyToken;
147
+ }
148
+ //# sourceMappingURL=http-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-proxy.js","sourceRoot":"","sources":["../../src/daemon/http-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import * as http from 'node:http';
2
+ import * as net from 'node:net';
3
+ import { type PortSelection } from './port-selection.ts';
4
+ export type LocalOverrides = {
5
+ direct: string[];
6
+ proxy: string[];
7
+ };
8
+ export type OneProxyConfig = {
9
+ schemaVersion: number;
10
+ controlPlaneUrl?: string;
11
+ activeTenantId?: string;
12
+ activeGroupId?: string;
13
+ overrides?: Partial<LocalOverrides>;
14
+ };
15
+ export type EntryNode = {
16
+ id: string;
17
+ host: string;
18
+ port: number;
19
+ protocol: string;
20
+ };
21
+ export type RouteRule = {
22
+ id: string;
23
+ type: 'domain' | 'suffix' | 'cidr' | 'wildcard';
24
+ pattern: string;
25
+ mode: 'direct' | 'proxy';
26
+ };
27
+ export type RouteGroup = {
28
+ id: string;
29
+ tenantId: string;
30
+ name?: string;
31
+ rules: RouteRule[];
32
+ };
33
+ export type OneProxyState = {
34
+ schemaVersion: number;
35
+ bootstrap?: {
36
+ tenantId?: string;
37
+ groupId?: string;
38
+ entryNodes?: EntryNode[];
39
+ };
40
+ policyRevision?: string;
41
+ fetchedAt?: string;
42
+ routeGroups?: RouteGroup[];
43
+ };
44
+ export type OneProxyTokens = {
45
+ schemaVersion: number;
46
+ account?: {
47
+ id: string;
48
+ email: string;
49
+ };
50
+ accessToken?: string;
51
+ refreshToken?: string;
52
+ proxyToken?: string;
53
+ accessTokenExpiresAt?: string;
54
+ refreshTokenExpiresAt?: string;
55
+ proxyTokenExpiresAt?: string;
56
+ };
57
+ export type DaemonBindings = {
58
+ host: string;
59
+ httpPort: number;
60
+ httpsPort: number;
61
+ ipcPort: number;
62
+ };
63
+ export type DaemonMetadata = {
64
+ schemaVersion: number;
65
+ pid: number;
66
+ startedAt: string;
67
+ lastHeartbeatAt: string;
68
+ controlPlaneUrl?: string;
69
+ tenantId?: string;
70
+ groupId?: string;
71
+ policyRevision?: string;
72
+ bindings: DaemonBindings;
73
+ portSelection: PortSelection;
74
+ idleTimeoutSeconds: number;
75
+ };
76
+ export type DaemonHealth = {
77
+ ok: boolean;
78
+ pid: number;
79
+ startedAt: string;
80
+ lastHeartbeatAt: string;
81
+ bindings: DaemonBindings;
82
+ portSelection: PortSelection;
83
+ policyRevision?: string;
84
+ };
85
+ export type DaemonRuntime = {
86
+ metadata: DaemonMetadata;
87
+ ipcServer: http.Server;
88
+ proxyServers?: {
89
+ close: () => Promise<void>;
90
+ };
91
+ close: () => Promise<void>;
92
+ };
93
+ export declare const loopbackHost = "127.0.0.1";
94
+ export declare const envIdleTimeoutSeconds = 600;
95
+ export declare const runIdleTimeoutSeconds = 300;
96
+ export declare function dataRoot(): string;
97
+ export declare function storagePath(name: 'config' | 'state' | 'tokens' | 'daemon' | 'log'): string;
98
+ export declare function ensureDataRoot(): Promise<void>;
99
+ export declare function readJsonFile<T>(filePath: string): Promise<T | null>;
100
+ export declare function writeJsonFile(filePath: string, value: unknown, mode?: number): Promise<void>;
101
+ export declare function normalizeConfig(config: OneProxyConfig | null): OneProxyConfig;
102
+ export declare function readConfig(): Promise<OneProxyConfig>;
103
+ export declare function readState(): Promise<OneProxyState>;
104
+ export declare function readTokens(): Promise<OneProxyTokens | null>;
105
+ export declare function readDaemonMetadata(): Promise<DaemonMetadata | null>;
106
+ export declare function writeDaemonMetadata(metadata: DaemonMetadata): Promise<void>;
107
+ export declare function appendLog(message: string): Promise<void>;
108
+ export declare function allocateLoopbackPort(requestedPort?: number): Promise<number>;
109
+ export type ResolvedBindings = {
110
+ bindings: DaemonBindings;
111
+ portSelection: PortSelection;
112
+ };
113
+ export declare function resolveBindings(config?: OneProxyConfig): Promise<ResolvedBindings>;
114
+ export declare function buildDaemonMetadata(resolved: ResolvedBindings): Promise<DaemonMetadata>;
115
+ export declare function healthFromMetadata(metadata: DaemonMetadata): DaemonHealth;
116
+ export declare function listenHttpServer(server: http.Server, port: number): Promise<void>;
117
+ export declare function closeServer(server: http.Server | net.Server): Promise<void>;
118
+ export declare function createIpcServer(metadata: DaemonMetadata, handlers: Record<string, (body: unknown) => Promise<unknown>>): http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
119
+ export declare function startDaemonRuntime(handlers?: Record<string, (body: unknown) => Promise<unknown>>): Promise<DaemonRuntime>;
120
+ export declare function defaultDaemonHandlers(): Record<string, (body: unknown) => Promise<unknown>>;
121
+ export declare function startDaemonSession(): Promise<{
122
+ metadata: DaemonMetadata;
123
+ end: () => Promise<void>;
124
+ }>;
125
+ export declare function ensureDaemon(): Promise<{
126
+ metadata: DaemonMetadata;
127
+ }>;
128
+ export declare function serveDaemon(): Promise<void>;
129
+ export declare function probeDaemon(metadata?: DaemonMetadata | null): Promise<DaemonHealth | null>;
@@ -0,0 +1,350 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { spawn } from 'node:child_process';
3
+ import * as http from 'node:http';
4
+ import * as net from 'node:net';
5
+ import * as path from 'node:path';
6
+ import { selectProxyPorts } from "./port-selection.js";
7
+ import { profileRoot } from "../storage.js";
8
+ export const loopbackHost = '127.0.0.1';
9
+ export const envIdleTimeoutSeconds = 600;
10
+ export const runIdleTimeoutSeconds = 300;
11
+ export function dataRoot() {
12
+ return profileRoot();
13
+ }
14
+ export function storagePath(name) {
15
+ const filenames = {
16
+ config: 'config.json',
17
+ state: 'state.json',
18
+ tokens: 'tokens.json',
19
+ daemon: 'daemon.json',
20
+ log: 'onep.log'
21
+ };
22
+ return path.join(dataRoot(), filenames[name]);
23
+ }
24
+ export async function ensureDataRoot() {
25
+ await fs.mkdir(dataRoot(), { recursive: true, mode: 0o700 });
26
+ }
27
+ export async function readJsonFile(filePath) {
28
+ try {
29
+ return JSON.parse(await fs.readFile(filePath, 'utf8'));
30
+ }
31
+ catch (error) {
32
+ if (error.code === 'ENOENT') {
33
+ return null;
34
+ }
35
+ throw error;
36
+ }
37
+ }
38
+ export async function writeJsonFile(filePath, value, mode = 0o600) {
39
+ await ensureDataRoot();
40
+ await fs.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, { mode });
41
+ }
42
+ export function normalizeConfig(config) {
43
+ return {
44
+ schemaVersion: 1,
45
+ ...config,
46
+ overrides: {
47
+ direct: (config?.overrides?.direct ?? []).map((host) => host.toLowerCase()),
48
+ proxy: (config?.overrides?.proxy ?? []).map((host) => host.toLowerCase())
49
+ }
50
+ };
51
+ }
52
+ export async function readConfig() {
53
+ return normalizeConfig(await readJsonFile(storagePath('config')));
54
+ }
55
+ export async function readState() {
56
+ return (await readJsonFile(storagePath('state'))) ?? { schemaVersion: 1 };
57
+ }
58
+ export async function readTokens() {
59
+ return await readJsonFile(storagePath('tokens'));
60
+ }
61
+ export async function readDaemonMetadata() {
62
+ return await readJsonFile(storagePath('daemon'));
63
+ }
64
+ export async function writeDaemonMetadata(metadata) {
65
+ await writeJsonFile(storagePath('daemon'), metadata);
66
+ }
67
+ export async function appendLog(message) {
68
+ await ensureDataRoot();
69
+ await fs.appendFile(storagePath('log'), `${new Date().toISOString()} ${message}\n`, { mode: 0o600 });
70
+ }
71
+ export async function allocateLoopbackPort(requestedPort = 0) {
72
+ const server = net.createServer();
73
+ await new Promise((resolve, reject) => {
74
+ server.once('error', reject);
75
+ server.listen(requestedPort, loopbackHost, resolve);
76
+ });
77
+ const address = server.address();
78
+ await new Promise((resolve, reject) => {
79
+ server.close((error) => (error ? reject(error) : resolve()));
80
+ });
81
+ if (!address || typeof address === 'string') {
82
+ throw new Error('Unable to allocate loopback port');
83
+ }
84
+ return address.port;
85
+ }
86
+ export async function resolveBindings(config) {
87
+ const portSelection = await selectProxyPorts();
88
+ return {
89
+ bindings: {
90
+ host: loopbackHost,
91
+ httpPort: portSelection.selectedPair[0],
92
+ httpsPort: portSelection.selectedPair[1],
93
+ ipcPort: await allocateLoopbackPort()
94
+ },
95
+ portSelection
96
+ };
97
+ }
98
+ export async function buildDaemonMetadata(resolved) {
99
+ const [config, state] = await Promise.all([readConfig(), readState()]);
100
+ const now = new Date().toISOString();
101
+ return {
102
+ schemaVersion: 1,
103
+ pid: process.pid,
104
+ startedAt: now,
105
+ lastHeartbeatAt: now,
106
+ controlPlaneUrl: config.controlPlaneUrl,
107
+ tenantId: config.activeTenantId,
108
+ groupId: config.activeGroupId,
109
+ policyRevision: state.policyRevision,
110
+ bindings: resolved.bindings,
111
+ portSelection: resolved.portSelection,
112
+ idleTimeoutSeconds: envIdleTimeoutSeconds
113
+ };
114
+ }
115
+ export function healthFromMetadata(metadata) {
116
+ return {
117
+ ok: true,
118
+ pid: metadata.pid,
119
+ startedAt: metadata.startedAt,
120
+ lastHeartbeatAt: metadata.lastHeartbeatAt,
121
+ bindings: metadata.bindings,
122
+ portSelection: metadata.portSelection,
123
+ policyRevision: metadata.policyRevision
124
+ };
125
+ }
126
+ export async function listenHttpServer(server, port) {
127
+ await new Promise((resolve, reject) => {
128
+ server.once('error', reject);
129
+ server.listen(port, loopbackHost, resolve);
130
+ });
131
+ }
132
+ export async function closeServer(server) {
133
+ await new Promise((resolve, reject) => {
134
+ server.close((error) => (error ? reject(error) : resolve()));
135
+ });
136
+ }
137
+ export function createIpcServer(metadata, handlers) {
138
+ return http.createServer(async (request, response) => {
139
+ const url = new URL(request.url ?? '/', `http://${loopbackHost}`);
140
+ if (request.method === 'GET' && url.pathname === '/v1/health') {
141
+ response.setHeader('content-type', 'application/json');
142
+ response.end(JSON.stringify(healthFromMetadata(metadata)));
143
+ return;
144
+ }
145
+ if (request.method === 'POST' && handlers[url.pathname]) {
146
+ const body = await readRequestJson(request);
147
+ const result = await handlers[url.pathname](body);
148
+ response.setHeader('content-type', 'application/json');
149
+ response.end(JSON.stringify(result));
150
+ return;
151
+ }
152
+ response.statusCode = 404;
153
+ response.end();
154
+ });
155
+ }
156
+ export async function startDaemonRuntime(handlers) {
157
+ const resolved = await resolveBindings();
158
+ const metadata = await buildDaemonMetadata(resolved);
159
+ const [config, state] = await Promise.all([readConfig(), readState()]);
160
+ const { startHttpProxyListeners } = await import("./http-proxy.js");
161
+ let activeSessions = 0;
162
+ let idleTimeoutSeconds = envIdleTimeoutSeconds;
163
+ let lastProxyActivity = Date.now();
164
+ let runtime;
165
+ let shutdownTimer;
166
+ const scheduleIdleCheck = () => {
167
+ if (shutdownTimer) {
168
+ clearTimeout(shutdownTimer);
169
+ }
170
+ shutdownTimer = setTimeout(async () => {
171
+ if (activeSessions > 0) {
172
+ scheduleIdleCheck();
173
+ return;
174
+ }
175
+ const idleFor = Date.now() - lastProxyActivity;
176
+ if (idleFor < idleTimeoutSeconds * 1000) {
177
+ scheduleIdleCheck();
178
+ return;
179
+ }
180
+ await runtime.close();
181
+ process.exit(0);
182
+ }, idleTimeoutSeconds * 1000);
183
+ shutdownTimer.unref();
184
+ };
185
+ const proxyServers = await startHttpProxyListeners({ config, state }, metadata.bindings, true, () => {
186
+ lastProxyActivity = Date.now();
187
+ scheduleIdleCheck();
188
+ });
189
+ const runtimeHandlers = {
190
+ ...defaultDaemonHandlers(),
191
+ ...handlers,
192
+ '/v1/session/start': async () => {
193
+ activeSessions += 1;
194
+ return { activeSessions };
195
+ },
196
+ '/v1/session/end': async () => {
197
+ activeSessions = Math.max(0, activeSessions - 1);
198
+ idleTimeoutSeconds = runIdleTimeoutSeconds;
199
+ metadata.idleTimeoutSeconds = idleTimeoutSeconds;
200
+ await writeDaemonMetadata(metadata);
201
+ scheduleIdleCheck();
202
+ return { activeSessions, idleTimeoutSeconds };
203
+ }
204
+ };
205
+ const ipcServer = createIpcServer(metadata, runtimeHandlers);
206
+ await listenHttpServer(ipcServer, metadata.bindings.ipcPort);
207
+ await writeDaemonMetadata(metadata);
208
+ runtime = {
209
+ metadata,
210
+ ipcServer,
211
+ proxyServers,
212
+ close: async () => {
213
+ if (shutdownTimer) {
214
+ clearTimeout(shutdownTimer);
215
+ }
216
+ await Promise.all([closeServer(ipcServer), proxyServers.close()]);
217
+ }
218
+ };
219
+ scheduleIdleCheck();
220
+ return runtime;
221
+ }
222
+ export function defaultDaemonHandlers() {
223
+ return {
224
+ '/v1/route': async (body) => {
225
+ const request = body;
226
+ const [{ resolveRoute }, config, state] = await Promise.all([
227
+ import("./router.js"),
228
+ readConfig(),
229
+ readState()
230
+ ]);
231
+ return resolveRoute({
232
+ config,
233
+ state,
234
+ target: request.target ?? '',
235
+ protocol: request.protocol
236
+ });
237
+ },
238
+ '/v1/probe': async (body) => {
239
+ const request = body;
240
+ const { probeTarget } = await import("../doctor.js");
241
+ return await probeTarget(request.target ?? '');
242
+ },
243
+ '/v1/shutdown-if-idle': async () => ({ accepted: true })
244
+ };
245
+ }
246
+ export async function startDaemonSession() {
247
+ const { metadata } = await ensureDaemon();
248
+ await postDaemon(metadata, '/v1/session/start');
249
+ return {
250
+ metadata,
251
+ end: async () => {
252
+ await postDaemon(metadata, '/v1/session/end');
253
+ }
254
+ };
255
+ }
256
+ export async function ensureDaemon() {
257
+ const existing = await readDaemonMetadata();
258
+ const health = await probeDaemon(existing);
259
+ if (existing && health) {
260
+ return { metadata: existing };
261
+ }
262
+ if (process.env.ONEPROXY_DAEMON_CHILD === '1') {
263
+ return { metadata: (await startDaemonRuntime()).metadata };
264
+ }
265
+ const entrypoint = process.argv[1];
266
+ if (!entrypoint) {
267
+ throw Object.assign(new Error('Cannot determine CLI entrypoint'), { code: 'DAEMON_UNAVAILABLE' });
268
+ }
269
+ const child = spawn(process.execPath, [entrypoint, 'daemon', 'serve'], {
270
+ detached: true,
271
+ stdio: 'ignore',
272
+ env: {
273
+ ...process.env,
274
+ ONEPROXY_DAEMON_CHILD: '1'
275
+ }
276
+ });
277
+ child.unref();
278
+ const deadline = Date.now() + 3000;
279
+ while (Date.now() < deadline) {
280
+ await new Promise((resolve) => setTimeout(resolve, 100));
281
+ const metadata = await readDaemonMetadata();
282
+ if (metadata && await probeDaemon(metadata)) {
283
+ return { metadata };
284
+ }
285
+ }
286
+ throw Object.assign(new Error('Daemon did not become ready'), { code: 'DAEMON_UNAVAILABLE' });
287
+ }
288
+ export async function serveDaemon() {
289
+ await startDaemonRuntime();
290
+ await new Promise(() => undefined);
291
+ }
292
+ export async function probeDaemon(metadata) {
293
+ const targetMetadata = metadata ?? await readDaemonMetadata();
294
+ if (!targetMetadata) {
295
+ return null;
296
+ }
297
+ return await new Promise((resolve) => {
298
+ const request = http.get({
299
+ host: targetMetadata.bindings.host,
300
+ port: targetMetadata.bindings.ipcPort,
301
+ path: '/v1/health',
302
+ timeout: 1000
303
+ }, (response) => {
304
+ let body = '';
305
+ response.setEncoding('utf8');
306
+ response.on('data', (chunk) => {
307
+ body += chunk;
308
+ });
309
+ response.on('end', () => {
310
+ resolve(response.statusCode === 200 ? JSON.parse(body) : null);
311
+ });
312
+ });
313
+ request.on('error', () => resolve(null));
314
+ request.on('timeout', () => {
315
+ request.destroy();
316
+ resolve(null);
317
+ });
318
+ });
319
+ }
320
+ async function postDaemon(metadata, path) {
321
+ await new Promise((resolve, reject) => {
322
+ const request = http.request({
323
+ host: metadata.bindings.host,
324
+ port: metadata.bindings.ipcPort,
325
+ path,
326
+ method: 'POST',
327
+ timeout: 1000
328
+ }, (response) => {
329
+ response.resume();
330
+ response.on('end', () => resolve());
331
+ });
332
+ request.on('error', reject);
333
+ request.on('timeout', () => {
334
+ request.destroy();
335
+ reject(Object.assign(new Error('Daemon IPC timeout'), { code: 'DAEMON_UNAVAILABLE' }));
336
+ });
337
+ request.end('{}');
338
+ });
339
+ }
340
+ async function readRequestJson(request) {
341
+ const chunks = [];
342
+ for await (const chunk of request) {
343
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
344
+ }
345
+ if (chunks.length === 0) {
346
+ return {};
347
+ }
348
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
349
+ }
350
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type PortSelection = {
2
+ candidatePorts: number[];
3
+ selectedPair: [number, number];
4
+ excludedCommonPorts: number[];
5
+ };
6
+ export declare const excludedCommonPorts: number[];
7
+ export declare function selectProxyPorts(): Promise<PortSelection>;
8
+ export declare function scanAvailableCandidatePorts(start?: number, end?: number): Promise<number[]>;
9
+ export declare function isUsablePort(port: number): Promise<boolean>;