@cpajs/cpa 0.0.0-stage → 0.0.1-alpha-2

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 (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -2
  3. package/dist/client/errors.d.ts +70 -0
  4. package/dist/client/errors.d.ts.map +1 -0
  5. package/dist/client/errors.js +91 -0
  6. package/dist/client/errors.js.map +1 -0
  7. package/dist/client/index.d.ts +46 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +65 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/resources/config.d.ts +61 -0
  12. package/dist/client/resources/config.d.ts.map +1 -0
  13. package/dist/client/resources/config.js +80 -0
  14. package/dist/client/resources/config.js.map +1 -0
  15. package/dist/client/resources/credentials.d.ts +64 -0
  16. package/dist/client/resources/credentials.d.ts.map +1 -0
  17. package/dist/client/resources/credentials.js +94 -0
  18. package/dist/client/resources/credentials.js.map +1 -0
  19. package/dist/client/resources/download.d.ts +8 -0
  20. package/dist/client/resources/download.d.ts.map +1 -0
  21. package/dist/client/resources/download.js +17 -0
  22. package/dist/client/resources/download.js.map +1 -0
  23. package/dist/client/resources/logs.d.ts +23 -0
  24. package/dist/client/resources/logs.d.ts.map +1 -0
  25. package/dist/client/resources/logs.js +37 -0
  26. package/dist/client/resources/logs.js.map +1 -0
  27. package/dist/client/resources/oauth.d.ts +43 -0
  28. package/dist/client/resources/oauth.d.ts.map +1 -0
  29. package/dist/client/resources/oauth.js +70 -0
  30. package/dist/client/resources/oauth.js.map +1 -0
  31. package/dist/client/resources/plugins.d.ts +25 -0
  32. package/dist/client/resources/plugins.d.ts.map +1 -0
  33. package/dist/client/resources/plugins.js +47 -0
  34. package/dist/client/resources/plugins.js.map +1 -0
  35. package/dist/client/resources/requests.d.ts +14 -0
  36. package/dist/client/resources/requests.d.ts.map +1 -0
  37. package/dist/client/resources/requests.js +16 -0
  38. package/dist/client/resources/requests.js.map +1 -0
  39. package/dist/client/resources/routing.d.ts +12 -0
  40. package/dist/client/resources/routing.d.ts.map +1 -0
  41. package/dist/client/resources/routing.js +20 -0
  42. package/dist/client/resources/routing.js.map +1 -0
  43. package/dist/client/resources/server.d.ts +17 -0
  44. package/dist/client/resources/server.d.ts.map +1 -0
  45. package/dist/client/resources/server.js +49 -0
  46. package/dist/client/resources/server.js.map +1 -0
  47. package/dist/client/resources/usage.d.ts +16 -0
  48. package/dist/client/resources/usage.d.ts.map +1 -0
  49. package/dist/client/resources/usage.js +20 -0
  50. package/dist/client/resources/usage.js.map +1 -0
  51. package/dist/client/transport.d.ts +60 -0
  52. package/dist/client/transport.d.ts.map +1 -0
  53. package/dist/client/transport.js +170 -0
  54. package/dist/client/transport.js.map +1 -0
  55. package/dist/client/types/common.d.ts +38 -0
  56. package/dist/client/types/common.d.ts.map +1 -0
  57. package/dist/client/types/common.js +4 -0
  58. package/dist/client/types/common.js.map +1 -0
  59. package/dist/client/types/config.d.ts +407 -0
  60. package/dist/client/types/config.d.ts.map +1 -0
  61. package/dist/client/types/config.js +9 -0
  62. package/dist/client/types/config.js.map +1 -0
  63. package/dist/client/types/credentials.d.ts +240 -0
  64. package/dist/client/types/credentials.d.ts.map +1 -0
  65. package/dist/client/types/credentials.js +4 -0
  66. package/dist/client/types/credentials.js.map +1 -0
  67. package/dist/client/types/index.d.ts +10 -0
  68. package/dist/client/types/index.d.ts.map +1 -0
  69. package/dist/client/types/index.js +2 -0
  70. package/dist/client/types/index.js.map +1 -0
  71. package/dist/client/types/oauth.d.ts +89 -0
  72. package/dist/client/types/oauth.d.ts.map +1 -0
  73. package/dist/client/types/oauth.js +4 -0
  74. package/dist/client/types/oauth.js.map +1 -0
  75. package/dist/client/types/observability.d.ts +111 -0
  76. package/dist/client/types/observability.d.ts.map +1 -0
  77. package/dist/client/types/observability.js +4 -0
  78. package/dist/client/types/observability.js.map +1 -0
  79. package/dist/client/types/plugins.d.ts +171 -0
  80. package/dist/client/types/plugins.d.ts.map +1 -0
  81. package/dist/client/types/plugins.js +4 -0
  82. package/dist/client/types/plugins.js.map +1 -0
  83. package/dist/client/types/requests.d.ts +16 -0
  84. package/dist/client/types/requests.d.ts.map +1 -0
  85. package/dist/client/types/requests.js +4 -0
  86. package/dist/client/types/requests.js.map +1 -0
  87. package/dist/client/types/routing.d.ts +50 -0
  88. package/dist/client/types/routing.d.ts.map +1 -0
  89. package/dist/client/types/routing.js +4 -0
  90. package/dist/client/types/routing.js.map +1 -0
  91. package/dist/client/types/server.d.ts +15 -0
  92. package/dist/client/types/server.d.ts.map +1 -0
  93. package/dist/client/types/server.js +4 -0
  94. package/dist/client/types/server.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +3 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/server/binary.d.ts +35 -0
  100. package/dist/server/binary.d.ts.map +1 -0
  101. package/dist/server/binary.js +108 -0
  102. package/dist/server/binary.js.map +1 -0
  103. package/dist/server/config.d.ts +37 -0
  104. package/dist/server/config.d.ts.map +1 -0
  105. package/dist/server/config.js +103 -0
  106. package/dist/server/config.js.map +1 -0
  107. package/dist/server/cpa-version.d.ts +12 -0
  108. package/dist/server/cpa-version.d.ts.map +1 -0
  109. package/dist/server/cpa-version.js +12 -0
  110. package/dist/server/cpa-version.js.map +1 -0
  111. package/dist/server/errors.d.ts +36 -0
  112. package/dist/server/errors.d.ts.map +1 -0
  113. package/dist/server/errors.js +26 -0
  114. package/dist/server/errors.js.map +1 -0
  115. package/dist/server/index.d.ts +18 -0
  116. package/dist/server/index.d.ts.map +1 -0
  117. package/dist/server/index.js +208 -0
  118. package/dist/server/index.js.map +1 -0
  119. package/dist/server/process.d.ts +27 -0
  120. package/dist/server/process.d.ts.map +1 -0
  121. package/dist/server/process.js +114 -0
  122. package/dist/server/process.js.map +1 -0
  123. package/dist/server/readiness.d.ts +13 -0
  124. package/dist/server/readiness.d.ts.map +1 -0
  125. package/dist/server/readiness.js +56 -0
  126. package/dist/server/readiness.js.map +1 -0
  127. package/dist/server/redact.d.ts +3 -0
  128. package/dist/server/redact.d.ts.map +1 -0
  129. package/dist/server/redact.js +16 -0
  130. package/dist/server/redact.js.map +1 -0
  131. package/dist/server/targets.d.ts +48 -0
  132. package/dist/server/targets.d.ts.map +1 -0
  133. package/dist/server/targets.js +90 -0
  134. package/dist/server/targets.js.map +1 -0
  135. package/dist/server/types.d.ts +87 -0
  136. package/dist/server/types.d.ts.map +1 -0
  137. package/dist/server/types.js +2 -0
  138. package/dist/server/types.js.map +1 -0
  139. package/package.json +83 -4
  140. package/src/client/errors.ts +104 -0
  141. package/src/client/index.ts +95 -0
  142. package/src/client/resources/config.ts +124 -0
  143. package/src/client/resources/credentials.ts +133 -0
  144. package/src/client/resources/download.ts +21 -0
  145. package/src/client/resources/logs.ts +46 -0
  146. package/src/client/resources/oauth.ts +105 -0
  147. package/src/client/resources/plugins.ts +70 -0
  148. package/src/client/resources/requests.ts +20 -0
  149. package/src/client/resources/routing.ts +29 -0
  150. package/src/client/resources/server.ts +52 -0
  151. package/src/client/resources/usage.ts +27 -0
  152. package/src/client/transport.ts +215 -0
  153. package/src/client/types/common.ts +38 -0
  154. package/src/client/types/config.ts +248 -0
  155. package/src/client/types/credentials.ts +195 -0
  156. package/src/client/types/index.ts +9 -0
  157. package/src/client/types/oauth.ts +71 -0
  158. package/src/client/types/observability.ts +93 -0
  159. package/src/client/types/plugins.ts +136 -0
  160. package/src/client/types/requests.ts +19 -0
  161. package/src/client/types/routing.ts +44 -0
  162. package/src/client/types/server.ts +18 -0
  163. package/src/index.ts +2 -0
  164. package/src/server/binary.ts +128 -0
  165. package/src/server/config.ts +128 -0
  166. package/src/server/cpa-version.ts +11 -0
  167. package/src/server/errors.ts +48 -0
  168. package/src/server/index.ts +236 -0
  169. package/src/server/process.ts +124 -0
  170. package/src/server/readiness.ts +58 -0
  171. package/src/server/redact.ts +14 -0
  172. package/src/server/targets.ts +133 -0
  173. package/src/server/types.ts +93 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../../src/server/binary.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2D,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAIpG,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC;IACzB,gCAAgC;IAChC,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,wBAAgB,UAAU,IAAI,IAAI,GAAG,SAAS,CAc7C;AAED,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAO7D;AAuBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;CAAO,GAAG,cAAc,CAuC5G"}
@@ -0,0 +1,108 @@
1
+ import { accessSync, chmodSync, constants, existsSync, readdirSync, statSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { CpaBinaryError } from './errors.js';
5
+ import { TARGETS, UNSUPPORTED_PLATFORMS, binaryName, packageName } from './targets.js';
6
+ const require = createRequire(import.meta.url);
7
+ /** Detects the C library of the running Linux system. */
8
+ export function detectLibc() {
9
+ if (process.platform !== 'linux')
10
+ return undefined;
11
+ try {
12
+ const report = process.report?.getReport();
13
+ if (report?.header)
14
+ return report.header.glibcVersionRuntime ? 'glibc' : 'musl';
15
+ }
16
+ catch {
17
+ // Fall through to the filesystem probe; some runtimes do not implement process.report.
18
+ }
19
+ try {
20
+ if (readdirSync('/lib').some((name) => name.startsWith('ld-musl-')))
21
+ return 'musl';
22
+ }
23
+ catch {
24
+ // Ignore unreadable /lib.
25
+ }
26
+ return 'glibc';
27
+ }
28
+ export function currentPlatform() {
29
+ const libc = detectLibc();
30
+ return libc ? { os: process.platform, cpu: process.arch, libc } : { os: process.platform, cpu: process.arch };
31
+ }
32
+ /**
33
+ * Returns the targets that can run on a host, best match first.
34
+ *
35
+ * On Linux the libc-specific build is preferred, followed by the static
36
+ * portable build of the other libc, which runs anywhere on the same CPU.
37
+ */
38
+ export function candidateTargets(host) {
39
+ const matches = TARGETS.filter((t) => t.os === host.os && t.cpu === host.cpu);
40
+ const score = (t) => {
41
+ if (t.libc === undefined || t.libc === host.libc)
42
+ return 0;
43
+ return t.build === 'portable' ? 1 : Number.POSITIVE_INFINITY;
44
+ };
45
+ return matches.filter((t) => Number.isFinite(score(t))).sort((a, b) => score(a) - score(b));
46
+ }
47
+ function ensureExecutable(path, source) {
48
+ if (!existsSync(path)) {
49
+ throw new CpaBinaryError('missing', `CLIProxyAPI binary not found at ${path} (${source}).`);
50
+ }
51
+ if (!statSync(path).isFile()) {
52
+ throw new CpaBinaryError('missing', `CLIProxyAPI binary path ${path} is not a file (${source}).`);
53
+ }
54
+ if (process.platform === 'win32')
55
+ return;
56
+ try {
57
+ accessSync(path, constants.X_OK);
58
+ }
59
+ catch {
60
+ // Some package managers drop the executable bit on extraction; restore it once.
61
+ try {
62
+ chmodSync(path, 0o755);
63
+ accessSync(path, constants.X_OK);
64
+ }
65
+ catch {
66
+ throw new CpaBinaryError('not-executable', `CLIProxyAPI binary at ${path} is not executable (${source}).`);
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Locates the CLIProxyAPI executable.
72
+ *
73
+ * `binaryPath` overrides the lookup. Otherwise the platform package installed
74
+ * through the main package's optionalDependencies is used.
75
+ */
76
+ export function resolveBinary(options = {}) {
77
+ if (options.binaryPath) {
78
+ ensureExecutable(options.binaryPath, 'binaryPath option');
79
+ return { path: options.binaryPath };
80
+ }
81
+ const host = options.platform ?? currentPlatform();
82
+ const candidates = candidateTargets(host);
83
+ const hostLabel = `${host.os}-${host.cpu}${host.libc ? ` (${host.libc})` : ''}`;
84
+ if (candidates.length === 0) {
85
+ const supported = TARGETS.map((t) => t.id).join(', ');
86
+ const reason = UNSUPPORTED_PLATFORMS[`${host.os}-${host.cpu}`] ?? UNSUPPORTED_PLATFORMS[`${host.os}-*`];
87
+ throw new CpaBinaryError('unsupported-platform', `No prebuilt CLIProxyAPI binary for ${hostLabel}${reason ? ` (${reason})` : ''}. ` +
88
+ `Supported targets: ${supported}. Pass binaryPath to use your own build.`);
89
+ }
90
+ for (const target of candidates) {
91
+ const name = packageName(target);
92
+ let manifest;
93
+ try {
94
+ manifest = require.resolve(`${name}/package.json`);
95
+ }
96
+ catch {
97
+ continue;
98
+ }
99
+ const path = join(dirname(manifest), 'bin', binaryName(target));
100
+ ensureExecutable(path, name);
101
+ return { path, packageName: name, target };
102
+ }
103
+ const expected = candidates.map(packageName).join(' or ');
104
+ throw new CpaBinaryError('package-not-installed', `The CLIProxyAPI binary package for ${hostLabel} is not installed (expected ${expected}). ` +
105
+ 'It is an optional dependency of @cpajs/cpa; reinstall without --no-optional / --omit=optional, ' +
106
+ 'make sure your lockfile was not created on another platform without it, or pass binaryPath.');
107
+ }
108
+ //# sourceMappingURL=binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.js","sourceRoot":"","sources":["../../src/server/binary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { CpaConfig } from '../client/types/config.ts';
2
+ export declare const DEFAULT_PORT = 8317;
3
+ export declare const MANAGED_CONFIG_FILE = "config.yaml";
4
+ export interface ListenSettings {
5
+ /** The `server.host` value as configured; empty means all interfaces. */
6
+ host: string;
7
+ port: number;
8
+ tls: boolean;
9
+ }
10
+ /**
11
+ * Reads listener settings from a parsed config document. The v8 `server.*`
12
+ * keys win over the legacy top-level `host`/`port`/`tls` keys, mirroring CPA.
13
+ */
14
+ export declare function readListenSettings(doc: unknown): ListenSettings;
15
+ /** Secrets that appear in a config document and must never reach logs. */
16
+ export declare function configSecrets(doc: unknown): string[];
17
+ export interface PreparedConfig {
18
+ configPath: string;
19
+ listen: ListenSettings;
20
+ secrets: string[];
21
+ /** True when the file was written by this package. */
22
+ managed: boolean;
23
+ }
24
+ /**
25
+ * Writes a `config` object to the managed config file in `stateDir`.
26
+ *
27
+ * The object is serialised as JSON, which is valid YAML and is read by CPA's
28
+ * YAML loader unchanged. Listener and auth directory defaults are filled in so
29
+ * the process stays inside `stateDir` and binds to loopback unless told otherwise.
30
+ */
31
+ export declare function writeManagedConfig(config: CpaConfig, stateDir: string, listen: {
32
+ host: string;
33
+ port: number;
34
+ }): Promise<PreparedConfig>;
35
+ /** Reads an existing config file without modifying it. */
36
+ export declare function inspectConfigFile(configPath: string): Promise<PreparedConfig>;
37
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAe/D;AAKD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAkBpD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,0DAA0D;AAC1D,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBnF"}
@@ -0,0 +1,103 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { CpaStartError } from './errors.js';
5
+ export const DEFAULT_PORT = 8317;
6
+ export const MANAGED_CONFIG_FILE = 'config.yaml';
7
+ function isRecord(value) {
8
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
9
+ }
10
+ /**
11
+ * Reads listener settings from a parsed config document. The v8 `server.*`
12
+ * keys win over the legacy top-level `host`/`port`/`tls` keys, mirroring CPA.
13
+ */
14
+ export function readListenSettings(doc) {
15
+ const root = isRecord(doc) ? doc : {};
16
+ const server = isRecord(root.server) ? root.server : {};
17
+ const pick = (key) => (key in server ? server[key] : root[key]);
18
+ const host = pick('host');
19
+ const port = pick('port');
20
+ const tls = pick('tls');
21
+ const parsedPort = typeof port === 'number' ? port : typeof port === 'string' ? Number(port) : Number.NaN;
22
+ return {
23
+ host: typeof host === 'string' ? host.trim() : '',
24
+ // CPA falls back to 8317 when the port is missing or not positive.
25
+ port: Number.isInteger(parsedPort) && parsedPort > 0 ? parsedPort : port === 0 ? 0 : DEFAULT_PORT,
26
+ tls: isRecord(tls) && tls.enable === true,
27
+ };
28
+ }
29
+ const SECRET_FIELDS = new Set(['secret-key', 'api-key', 'github-token', 'credential', 'access_token', 'refresh_token']);
30
+ const SECRET_LISTS = new Set(['api-keys']);
31
+ /** Secrets that appear in a config document and must never reach logs. */
32
+ export function configSecrets(doc) {
33
+ const out = [];
34
+ const walk = (value, key) => {
35
+ if (typeof value === 'string') {
36
+ if (key !== undefined && SECRET_FIELDS.has(key) && value !== '')
37
+ out.push(value);
38
+ return;
39
+ }
40
+ if (Array.isArray(value)) {
41
+ for (const item of value) {
42
+ if (typeof item === 'string' && key !== undefined && SECRET_LISTS.has(key) && item !== '')
43
+ out.push(item);
44
+ else
45
+ walk(item, undefined);
46
+ }
47
+ return;
48
+ }
49
+ if (isRecord(value))
50
+ for (const [k, v] of Object.entries(value))
51
+ walk(v, k);
52
+ };
53
+ walk(doc, undefined);
54
+ return out;
55
+ }
56
+ /**
57
+ * Writes a `config` object to the managed config file in `stateDir`.
58
+ *
59
+ * The object is serialised as JSON, which is valid YAML and is read by CPA's
60
+ * YAML loader unchanged. Listener and auth directory defaults are filled in so
61
+ * the process stays inside `stateDir` and binds to loopback unless told otherwise.
62
+ */
63
+ export async function writeManagedConfig(config, stateDir, listen) {
64
+ const doc = structuredClone(config);
65
+ const server = isRecord(doc.server) ? doc.server : {};
66
+ doc.server = { ...server, host: listen.host, port: listen.port };
67
+ if (doc['config-version'] === undefined)
68
+ doc['config-version'] = 8;
69
+ const oauth = isRecord(doc.oauth) ? doc.oauth : {};
70
+ // Keep credentials inside stateDir unless the config chooses a location (v8 or legacy key).
71
+ if (oauth['auth-dir'] === undefined && doc['auth-dir'] === undefined) {
72
+ const authDir = join(stateDir, 'auths');
73
+ await mkdir(authDir, { recursive: true });
74
+ doc.oauth = { ...oauth, 'auth-dir': authDir };
75
+ }
76
+ const configPath = join(stateDir, MANAGED_CONFIG_FILE);
77
+ await writeFile(configPath, `${JSON.stringify(doc, null, 2)}\n`, { mode: 0o600 });
78
+ return { configPath, listen: readListenSettings(doc), secrets: configSecrets(doc), managed: true };
79
+ }
80
+ /** Reads an existing config file without modifying it. */
81
+ export async function inspectConfigFile(configPath) {
82
+ const absolute = resolve(configPath);
83
+ let text;
84
+ try {
85
+ text = await readFile(absolute, 'utf8');
86
+ }
87
+ catch (cause) {
88
+ throw new CpaStartError('invalid-options', `Cannot read configPath ${absolute}.`, { cause });
89
+ }
90
+ let doc;
91
+ try {
92
+ doc = parseYaml(text);
93
+ }
94
+ catch (cause) {
95
+ throw new CpaStartError('invalid-options', `configPath ${absolute} is not valid YAML.`, { cause });
96
+ }
97
+ const listen = readListenSettings(doc);
98
+ if (listen.port === 0) {
99
+ throw new CpaStartError('invalid-options', `configPath ${absolute} sets port 0. CLIProxyAPI does not report the port it picks, so set a fixed port or pass a config object instead.`);
100
+ }
101
+ return { configPath: absolute, listen, secrets: configSecrets(doc), managed: false };
102
+ }
103
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** The CLIProxyAPI release this package version is built and verified against. */
2
+ export declare const CPA_RELEASE: {
3
+ readonly version: '8.0.43';
4
+ readonly tag: 'v8.0.43';
5
+ readonly commit: '307803510bce87f986fcf7b1a84190f105c7b4aa';
6
+ /** Commit timestamp, used as the reproducible build date. */
7
+ readonly commitDate: '2026-10-25T14:45:00Z';
8
+ readonly repository: 'https://github.com/router-for-me/CLIProxyAPI';
9
+ /** Go toolchain required by the pinned go.mod. */
10
+ readonly goVersion: '1.26.10';
11
+ };
12
+ //# sourceMappingURL=cpa-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpa-version.d.ts","sourceRoot":"","sources":["../../src/server/cpa-version.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,WAAW;aACtB,OAAO,EAAE,QAAQ;aACjB,GAAG,EAAE,SAAS;aACd,MAAM,EAAE,0CAA0C;IAClD,6DAA6D;aAC7D,UAAU,EAAE,sBAAsB;aAClC,UAAU,EAAE,8CAA8C;IAC1D,kDAAkD;aAClD,SAAS,EAAE,SAAS;CACZ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** The CLIProxyAPI release this package version is built and verified against. */
2
+ export const CPA_RELEASE = {
3
+ version: '8.0.43',
4
+ tag: 'v8.0.43',
5
+ commit: '307803510bce87f986fcf7b1a84190f105c7b4aa',
6
+ /** Commit timestamp, used as the reproducible build date. */
7
+ commitDate: '2026-10-25T14:45:00Z',
8
+ repository: 'https://github.com/router-for-me/CLIProxyAPI',
9
+ /** Go toolchain required by the pinned go.mod. */
10
+ goVersion: '1.26.10',
11
+ };
12
+ //# sourceMappingURL=cpa-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpa-version.js","sourceRoot":"","sources":["../../src/server/cpa-version.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,QAAQ;IACjB,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,0CAA0C;IAClD,6DAA6D;IAC7D,UAAU,EAAE,sBAAsB;IAClC,UAAU,EAAE,8CAA8C;IAC1D,kDAAkD;IAClD,SAAS,EAAE,SAAS;CACZ,CAAC"}
@@ -0,0 +1,36 @@
1
+ export type CpaBinaryErrorCode = 'unsupported-platform' | 'package-not-installed' | 'missing' | 'not-executable';
2
+ /** The CLIProxyAPI executable could not be located or used. */
3
+ export declare class CpaBinaryError extends Error {
4
+ readonly name = "CpaBinaryError";
5
+ readonly code: CpaBinaryErrorCode;
6
+ constructor(code: CpaBinaryErrorCode, message: string);
7
+ }
8
+ export type CpaStartErrorCode =
9
+ /** Invalid `startServer` options. */
10
+ 'invalid-options'
11
+ /** The configured port is already taken. */
12
+ | 'port-in-use'
13
+ /** The process exited before it became ready. */
14
+ | 'exited'
15
+ /** The process could not be spawned. */
16
+ | 'spawn-failed'
17
+ /** Readiness was not reached within `startupTimeoutMs`. */
18
+ | 'timeout'
19
+ /** The `signal` passed to `startServer` was aborted. */
20
+ | 'aborted';
21
+ /** `startServer` failed. Secrets are redacted from `message` and `output`. */
22
+ export declare class CpaStartError extends Error {
23
+ readonly name = "CpaStartError";
24
+ readonly code: CpaStartErrorCode;
25
+ /** Recent process output (redacted), useful for diagnosing failures. */
26
+ readonly output: string;
27
+ readonly exitCode: number | null;
28
+ readonly signal: NodeJS.Signals | null;
29
+ constructor(code: CpaStartErrorCode, message: string, details?: {
30
+ output?: string;
31
+ exitCode?: number | null;
32
+ signal?: NodeJS.Signals | null;
33
+ cause?: unknown;
34
+ });
35
+ }
36
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,uBAAuB,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAEjH,+DAA+D;AAC/D,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,oBAAoB;IAC1C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAElC,YAAY,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAGpD;CACF;AAED,MAAM,MAAM,iBAAiB;AAC3B,qCAAqC;AACnC,iBAAiB;AACnB,4CAA4C;GAC1C,aAAa;AACf,iDAAiD;GAC/C,QAAQ;AACV,wCAAwC;GACtC,cAAc;AAChB,2DAA2D;GACzD,SAAS;AACX,wDAAwD;GACtD,SAAS,CAAC;AAEd,8EAA8E;AAC9E,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;IACzC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAEvC,YACE,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,EAO7G;CACF"}
@@ -0,0 +1,26 @@
1
+ /** The CLIProxyAPI executable could not be located or used. */
2
+ export class CpaBinaryError extends Error {
3
+ name = 'CpaBinaryError';
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ }
9
+ }
10
+ /** `startServer` failed. Secrets are redacted from `message` and `output`. */
11
+ export class CpaStartError extends Error {
12
+ name = 'CpaStartError';
13
+ code;
14
+ /** Recent process output (redacted), useful for diagnosing failures. */
15
+ output;
16
+ exitCode;
17
+ signal;
18
+ constructor(code, message, details = {}) {
19
+ super(message, details.cause === undefined ? undefined : { cause: details.cause });
20
+ this.code = code;
21
+ this.output = details.output ?? '';
22
+ this.exitCode = details.exitCode ?? null;
23
+ this.signal = details.signal ?? null;
24
+ }
25
+ }
26
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrB,IAAI,GAAG,gBAAgB,CAAC;IACjC,IAAI,CAAqB;IAElC,YAAY,IAAwB,EAAE,OAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAgBD,8EAA8E;AAC9E,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;IAChC,IAAI,CAAoB;IACjC,wEAAwE;IAC/D,MAAM,CAAS;IACf,QAAQ,CAAgB;IACxB,MAAM,CAAwB;IAEvC,YACE,IAAuB,EACvB,OAAe,EACf,OAAO,GAAmG,EAAE;QAE5G,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { CpaServer, StartServerOptions } from './types.ts';
2
+ export { candidateTargets, currentPlatform, detectLibc, resolveBinary } from './binary.ts';
3
+ export type { HostPlatform, Libc, ResolvedBinary } from './binary.ts';
4
+ export { CpaBinaryError, CpaStartError } from './errors.ts';
5
+ export type { CpaBinaryErrorCode, CpaStartErrorCode } from './errors.ts';
6
+ export { TARGETS, NPM_SCOPE, UNSUPPORTED_PLATFORMS, binaryName, packageName } from './targets.ts';
7
+ export { CPA_RELEASE } from './cpa-version.ts';
8
+ export type { Target, TargetBuild, TargetVerification } from './targets.ts';
9
+ export type * from './types.ts';
10
+ export type { CpaConfig } from '../client/types/config.ts';
11
+ /**
12
+ * Starts the official CLIProxyAPI binary and resolves once `/healthz` answers.
13
+ *
14
+ * On any failure the child process is stopped and resources created by this
15
+ * call (the temporary state directory) are removed before the error is thrown.
16
+ */
17
+ export declare function startServer(options?: StartServerOptions): Promise<CpaServer>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAc,kBAAkB,EAA0B,MAAM,YAAY,CAAC;AAEpG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC5E,mBAAmB,YAAY,CAAC;AAChC,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA2C3D;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAmGtF"}
@@ -0,0 +1,208 @@
1
+ import { mkdir, mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ import { resolveBinary } from './binary.js';
6
+ import { inspectConfigFile, writeManagedConfig } from './config.js';
7
+ import { CpaStartError } from './errors.js';
8
+ import { ManagedProcess } from './process.js';
9
+ import { connectHost, findFreePort, formatOrigin, isPortFree, probeHealth } from './readiness.js';
10
+ import { createRedactor } from './redact.js';
11
+ export { candidateTargets, currentPlatform, detectLibc, resolveBinary } from './binary.js';
12
+ export { CpaBinaryError, CpaStartError } from './errors.js';
13
+ export { TARGETS, NPM_SCOPE, UNSUPPORTED_PLATFORMS, binaryName, packageName } from './targets.js';
14
+ export { CPA_RELEASE } from './cpa-version.js';
15
+ const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
16
+ const DEFAULT_STOP_TIMEOUT_MS = 10_000;
17
+ const PROBE_INTERVAL_MS = 100;
18
+ const PROBE_TIMEOUT_MS = 1_000;
19
+ const DYNAMIC_PORT_ATTEMPTS = 3;
20
+ const ADDRESS_IN_USE = /address already in use|only one usage of each socket address/i;
21
+ function validate(options) {
22
+ if (options.config !== undefined && options.configPath !== undefined) {
23
+ throw new CpaStartError('invalid-options', 'config and configPath are mutually exclusive.');
24
+ }
25
+ if (options.configPath !== undefined && (options.host !== undefined || options.port !== undefined)) {
26
+ throw new CpaStartError('invalid-options', 'host and port cannot be combined with configPath; set them in the file.');
27
+ }
28
+ const { port } = options;
29
+ if (port !== undefined && (!Number.isInteger(port) || port < 0 || port > 65_535)) {
30
+ throw new CpaStartError('invalid-options', `Invalid port ${String(port)}.`);
31
+ }
32
+ }
33
+ function buildEnv(options) {
34
+ const env = { ...process.env };
35
+ for (const [key, value] of Object.entries(options.env ?? {})) {
36
+ if (value === undefined)
37
+ delete env[key];
38
+ else
39
+ env[key] = value;
40
+ }
41
+ if (options.managementKey !== undefined)
42
+ env.MANAGEMENT_PASSWORD = options.managementKey;
43
+ return env;
44
+ }
45
+ function configListen(options) {
46
+ const server = (options.config?.server ?? {});
47
+ const host = options.host ?? (typeof server.host === 'string' ? server.host : '127.0.0.1');
48
+ const port = options.port ?? (typeof server.port === 'number' ? server.port : 0);
49
+ return { host, port };
50
+ }
51
+ function abortError(signal, output) {
52
+ return new CpaStartError('aborted', 'startServer was aborted.', { output, cause: signal.reason });
53
+ }
54
+ /**
55
+ * Starts the official CLIProxyAPI binary and resolves once `/healthz` answers.
56
+ *
57
+ * On any failure the child process is stopped and resources created by this
58
+ * call (the temporary state directory) are removed before the error is thrown.
59
+ */
60
+ export async function startServer(options = {}) {
61
+ validate(options);
62
+ const { signal } = options;
63
+ if (signal?.aborted)
64
+ throw abortError(signal, '');
65
+ const binary = resolveBinary(options.binaryPath === undefined ? {} : { binaryPath: options.binaryPath });
66
+ const ownsStateDir = options.stateDir === undefined;
67
+ const stateDir = ownsStateDir ? await mkdtemp(join(tmpdir(), 'cpajs-')) : resolve(options.stateDir);
68
+ if (!ownsStateDir)
69
+ await mkdir(stateDir, { recursive: true });
70
+ const cleanup = async () => {
71
+ if (ownsStateDir)
72
+ await rm(stateDir, { recursive: true, force: true, maxRetries: 3 });
73
+ };
74
+ const startupTimeoutMs = options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
75
+ const deadline = Date.now() + startupTimeoutMs;
76
+ const env = buildEnv(options);
77
+ try {
78
+ for (let attempt = 1;; attempt++) {
79
+ let prepared;
80
+ let dynamicPort = false;
81
+ if (options.configPath !== undefined) {
82
+ prepared = await inspectConfigFile(options.configPath);
83
+ }
84
+ else {
85
+ const listen = configListen(options);
86
+ if (listen.port === 0) {
87
+ listen.port = await findFreePort(listen.host);
88
+ dynamicPort = true;
89
+ }
90
+ prepared = await writeManagedConfig(options.config ?? {}, stateDir, listen);
91
+ }
92
+ const { host, port, tls } = prepared.listen;
93
+ const redact = createRedactor([options.managementKey, ...prepared.secrets, ...(options.redact ?? [])]);
94
+ if (!dynamicPort && !(await isPortFree(host, port))) {
95
+ throw new CpaStartError('port-in-use', `Port ${port} on ${host || 'all interfaces'} is already in use.`);
96
+ }
97
+ const origin = formatOrigin(tls ? 'https' : 'http', connectHost(host), port);
98
+ let proc;
99
+ try {
100
+ proc = new ManagedProcess(binary.path, ['-config', prepared.configPath, ...(options.args ?? [])], {
101
+ cwd: stateDir,
102
+ env,
103
+ redact,
104
+ onLog: options.onLog,
105
+ });
106
+ }
107
+ catch (cause) {
108
+ // Node reports spawn failures through the 'error' event; Bun throws synchronously.
109
+ throw new CpaStartError('spawn-failed', `Failed to spawn ${binary.path}: ${redact(cause.message)}`, { cause });
110
+ }
111
+ const outcome = await waitUntilReady(proc, origin, deadline, signal);
112
+ if (outcome === 'ready') {
113
+ return createHandle(proc, {
114
+ origin,
115
+ host,
116
+ port,
117
+ binaryPath: binary.path,
118
+ configPath: prepared.configPath,
119
+ stateDir,
120
+ managementKey: options.managementKey,
121
+ stopTimeoutMs: options.stopTimeoutMs ?? DEFAULT_STOP_TIMEOUT_MS,
122
+ cleanup,
123
+ });
124
+ }
125
+ // Not ready: make sure the process is gone before deciding what to report.
126
+ const exit = await proc.stop(0);
127
+ const output = proc.output();
128
+ if (outcome === 'aborted')
129
+ throw abortError(signal, output);
130
+ if (outcome === 'timeout') {
131
+ throw new CpaStartError('timeout', `CLIProxyAPI did not become ready within ${startupTimeoutMs} ms.`, { output });
132
+ }
133
+ if (proc.spawnError) {
134
+ throw new CpaStartError('spawn-failed', `Failed to spawn ${binary.path}: ${redact(proc.spawnError.message)}`, {
135
+ output,
136
+ cause: proc.spawnError,
137
+ });
138
+ }
139
+ if (ADDRESS_IN_USE.test(output)) {
140
+ // A dynamically picked port can be taken between probing and binding; try another.
141
+ if (dynamicPort && attempt < DYNAMIC_PORT_ATTEMPTS)
142
+ continue;
143
+ throw new CpaStartError('port-in-use', `Port ${port} on ${host || 'all interfaces'} is already in use.`, {
144
+ output,
145
+ exitCode: exit.code,
146
+ signal: exit.signal,
147
+ });
148
+ }
149
+ throw new CpaStartError('exited', `CLIProxyAPI exited before becoming ready (code ${String(exit.code)}, signal ${String(exit.signal)}).`, { output, exitCode: exit.code, signal: exit.signal });
150
+ }
151
+ }
152
+ catch (error) {
153
+ await cleanup();
154
+ throw error;
155
+ }
156
+ }
157
+ async function waitUntilReady(proc, origin, deadline, signal) {
158
+ let exited = false;
159
+ void proc.exited.then(() => {
160
+ exited = true;
161
+ });
162
+ while (true) {
163
+ if (signal?.aborted)
164
+ return 'aborted';
165
+ if (exited)
166
+ return 'exited';
167
+ const remaining = deadline - Date.now();
168
+ if (remaining <= 0)
169
+ return 'timeout';
170
+ if (await probeHealth(origin, Math.min(PROBE_TIMEOUT_MS, remaining))) {
171
+ // The probe may have raced the process exiting (e.g. another server on the port).
172
+ return exited || proc.exitResult ? 'exited' : 'ready';
173
+ }
174
+ try {
175
+ await delay(Math.min(PROBE_INTERVAL_MS, Math.max(0, deadline - Date.now())), undefined, signal ? { signal } : {});
176
+ }
177
+ catch {
178
+ return 'aborted';
179
+ }
180
+ }
181
+ }
182
+ function createHandle(proc, info) {
183
+ const exited = proc.exited.then(async (result) => {
184
+ await info.cleanup();
185
+ return result;
186
+ });
187
+ return {
188
+ origin: info.origin,
189
+ baseUrl: `${info.origin}/v1`,
190
+ host: info.host,
191
+ port: info.port,
192
+ pid: proc.child.pid,
193
+ binaryPath: info.binaryPath,
194
+ configPath: info.configPath,
195
+ stateDir: info.stateDir,
196
+ managementKey: info.managementKey,
197
+ process: proc.child,
198
+ get recentLogs() {
199
+ return [...proc.recentLogs];
200
+ },
201
+ exited,
202
+ async stop(stopOptions = {}) {
203
+ await proc.stop(stopOptions.timeoutMs ?? info.stopTimeoutMs);
204
+ return exited;
205
+ },
206
+ };
207
+ }
208
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}