@cpajs/cpa 0.0.1-alpha-2 → 0.1.0-rc.1
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/README.md +108 -14
- package/dist/client/resources/oauth.d.ts +6 -2
- package/dist/client/resources/oauth.d.ts.map +1 -1
- package/dist/client/resources/oauth.js +28 -8
- package/dist/client/resources/oauth.js.map +1 -1
- package/dist/client/transport.d.ts.map +1 -1
- package/dist/client/transport.js +7 -3
- package/dist/client/transport.js.map +1 -1
- package/dist/server/args.d.ts +4 -0
- package/dist/server/args.d.ts.map +1 -0
- package/dist/server/args.js +54 -0
- package/dist/server/args.js.map +1 -0
- package/dist/server/config.d.ts +46 -7
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +148 -22
- package/dist/server/config.js.map +1 -1
- package/dist/server/errors.d.ts +4 -2
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +1 -1
- package/dist/server/errors.js.map +1 -1
- package/dist/server/index.d.ts +18 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +365 -77
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +16 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +10 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/management.d.ts +29 -0
- package/dist/server/management.d.ts.map +1 -0
- package/dist/server/management.js +64 -0
- package/dist/server/management.js.map +1 -0
- package/dist/server/process.d.ts +4 -1
- package/dist/server/process.d.ts.map +1 -1
- package/dist/server/process.js +24 -4
- package/dist/server/process.js.map +1 -1
- package/dist/server/readiness.d.ts +16 -2
- package/dist/server/readiness.d.ts.map +1 -1
- package/dist/server/readiness.js +32 -2
- package/dist/server/readiness.js.map +1 -1
- package/dist/server/types.d.ts +94 -15
- package/dist/server/types.d.ts.map +1 -1
- package/package.json +31 -24
- package/src/client/resources/oauth.ts +28 -13
- package/src/client/transport.ts +7 -3
- package/src/server/args.ts +53 -0
- package/src/server/config.ts +169 -22
- package/src/server/errors.ts +4 -2
- package/src/server/index.ts +433 -92
- package/src/server/internal.ts +16 -0
- package/src/server/management.ts +89 -0
- package/src/server/process.ts +23 -4
- package/src/server/readiness.ts +38 -3
- package/src/server/types.ts +97 -15
package/dist/server/config.js
CHANGED
|
@@ -1,31 +1,74 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
|
-
import { parse as parseYaml } from 'yaml';
|
|
3
|
+
import { parse as parseYaml, parseDocument, stringify as stringifyYaml } from 'yaml';
|
|
4
4
|
import { CpaStartError } from './errors.js';
|
|
5
|
-
export const DEFAULT_PORT = 8317;
|
|
6
5
|
export const MANAGED_CONFIG_FILE = 'config.yaml';
|
|
7
6
|
function isRecord(value) {
|
|
8
7
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
8
|
}
|
|
9
|
+
function hasOwn(value, key) {
|
|
10
|
+
return Object.hasOwn(value, key);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Decodes a port like yaml.v3 decodes into an int: null (and a missing key)
|
|
14
|
+
* becomes 0, a finite float is truncated, and anything else is NaN. CPA does
|
|
15
|
+
* not default the port, so 0 must stay 0 instead of becoming 8317.
|
|
16
|
+
*/
|
|
17
|
+
function readPort(value, present) {
|
|
18
|
+
if (!present || value === null || value === undefined)
|
|
19
|
+
return 0;
|
|
20
|
+
return typeof value === 'number' && Number.isFinite(value) ? Math.trunc(value) : Number.NaN;
|
|
21
|
+
}
|
|
10
22
|
/**
|
|
11
|
-
* Reads listener settings from a parsed config document
|
|
12
|
-
*
|
|
23
|
+
* Reads listener settings from a parsed config document using upstream's
|
|
24
|
+
* presence-based precedence: a `server.*` leaf wins whenever it is present,
|
|
25
|
+
* even when it is `0`, `false` or `null` (internal/config/config_v8.go).
|
|
26
|
+
* Legacy top-level `host`/`port`/`tls` are used only when that v8 leaf is
|
|
27
|
+
* absent, and `tls.enable` is resolved leaf by leaf rather than by replacing
|
|
28
|
+
* the whole `tls` object.
|
|
13
29
|
*/
|
|
14
30
|
export function readListenSettings(doc) {
|
|
15
31
|
const root = isRecord(doc) ? doc : {};
|
|
16
32
|
const server = isRecord(root.server) ? root.server : {};
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
33
|
+
const serverTls = isRecord(server.tls) ? server.tls : undefined;
|
|
34
|
+
const legacyTls = isRecord(root.tls) ? root.tls : undefined;
|
|
35
|
+
const v8Port = hasOwn(server, 'port');
|
|
36
|
+
const host = hasOwn(server, 'host') ? server.host : root.host;
|
|
37
|
+
const port = readPort(v8Port ? server.port : root.port, v8Port || hasOwn(root, 'port'));
|
|
38
|
+
let tls;
|
|
39
|
+
if (serverTls !== undefined && hasOwn(serverTls, 'enable'))
|
|
40
|
+
tls = serverTls.enable;
|
|
41
|
+
else if (legacyTls !== undefined && hasOwn(legacyTls, 'enable'))
|
|
42
|
+
tls = legacyTls.enable;
|
|
22
43
|
return {
|
|
23
44
|
host: typeof host === 'string' ? host.trim() : '',
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
tls: isRecord(tls) && tls.enable === true,
|
|
45
|
+
port,
|
|
46
|
+
tls: tls === true,
|
|
27
47
|
};
|
|
28
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Reads management settings from a parsed config document. The v8 `management`
|
|
51
|
+
* section wins over the legacy `remote-management` alias, mirroring CPA.
|
|
52
|
+
*/
|
|
53
|
+
export function readManagementSettings(doc) {
|
|
54
|
+
const root = isRecord(doc) ? doc : {};
|
|
55
|
+
const section = isRecord(root.management)
|
|
56
|
+
? root.management
|
|
57
|
+
: isRecord(root['remote-management'])
|
|
58
|
+
? root['remote-management']
|
|
59
|
+
: {};
|
|
60
|
+
const secret = section['secret-key'];
|
|
61
|
+
return {
|
|
62
|
+
allowRemote: section['allow-remote'] === true,
|
|
63
|
+
hasSecret: typeof secret === 'string' && secret.trim() !== '',
|
|
64
|
+
secretKey: typeof secret === 'string' && secret.trim() !== '' ? secret : undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Only known secret keys are collected. Open-ended maps such as `headers`,
|
|
68
|
+
// `payload` and `plugins.configs.*` can hold credentials under arbitrary names;
|
|
69
|
+
// they are deliberately skipped so an ordinary config value is never mistaken
|
|
70
|
+
// for a secret and redacted out of unrelated log lines. Pass `redact` to
|
|
71
|
+
// startServer for those.
|
|
29
72
|
const SECRET_FIELDS = new Set(['secret-key', 'api-key', 'github-token', 'credential', 'access_token', 'refresh_token']);
|
|
30
73
|
const SECRET_LISTS = new Set(['api-keys']);
|
|
31
74
|
/** Secrets that appear in a config document and must never reach logs. */
|
|
@@ -56,16 +99,24 @@ export function configSecrets(doc) {
|
|
|
56
99
|
/**
|
|
57
100
|
* Writes a `config` object to the managed config file in `stateDir`.
|
|
58
101
|
*
|
|
59
|
-
* The object is serialised as
|
|
60
|
-
*
|
|
61
|
-
*
|
|
102
|
+
* The object is serialised as YAML so CPA and humans see the same stable shape.
|
|
103
|
+
* Listener and auth directory defaults are filled in so the process stays inside
|
|
104
|
+
* `stateDir` and binds to loopback unless told otherwise.
|
|
62
105
|
*/
|
|
63
|
-
export async function writeManagedConfig(config, stateDir, listen) {
|
|
106
|
+
export async function writeManagedConfig(config, stateDir, listen, management) {
|
|
64
107
|
const doc = structuredClone(config);
|
|
65
108
|
const server = isRecord(doc.server) ? doc.server : {};
|
|
66
109
|
doc.server = { ...server, host: listen.host, port: listen.port };
|
|
67
110
|
if (doc['config-version'] === undefined)
|
|
68
111
|
doc['config-version'] = 8;
|
|
112
|
+
if (management !== undefined) {
|
|
113
|
+
const section = isRecord(doc.management) ? doc.management : {};
|
|
114
|
+
doc.management = {
|
|
115
|
+
...section,
|
|
116
|
+
'secret-key': management.secretKeyHash,
|
|
117
|
+
'allow-remote': management.allowRemote,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
69
120
|
const oauth = isRecord(doc.oauth) ? doc.oauth : {};
|
|
70
121
|
// Keep credentials inside stateDir unless the config chooses a location (v8 or legacy key).
|
|
71
122
|
if (oauth['auth-dir'] === undefined && doc['auth-dir'] === undefined) {
|
|
@@ -74,8 +125,68 @@ export async function writeManagedConfig(config, stateDir, listen) {
|
|
|
74
125
|
doc.oauth = { ...oauth, 'auth-dir': authDir };
|
|
75
126
|
}
|
|
76
127
|
const configPath = join(stateDir, MANAGED_CONFIG_FILE);
|
|
77
|
-
await writeFile(configPath,
|
|
78
|
-
return {
|
|
128
|
+
await writeFile(configPath, stringifyYaml(doc), { mode: 0o600 });
|
|
129
|
+
return {
|
|
130
|
+
configPath,
|
|
131
|
+
listen: readListenSettings(doc),
|
|
132
|
+
management: readManagementSettings(doc),
|
|
133
|
+
secrets: configSecrets(doc),
|
|
134
|
+
managed: true,
|
|
135
|
+
reused: false,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function isFixedPort(port) {
|
|
139
|
+
return Number.isInteger(port) && port > 0 && port <= 65_535;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Reads the managed config file in `stateDir` without modifying it.
|
|
143
|
+
*
|
|
144
|
+
* Returns `undefined` when the file does not exist yet. An existing file must
|
|
145
|
+
* set a fixed `server.port`, because CPA does not report the port it picks and
|
|
146
|
+
* a later start cannot discover it.
|
|
147
|
+
*/
|
|
148
|
+
export async function readManagedConfig(stateDir) {
|
|
149
|
+
const configPath = join(stateDir, MANAGED_CONFIG_FILE);
|
|
150
|
+
let text;
|
|
151
|
+
try {
|
|
152
|
+
text = await readFile(configPath, 'utf8');
|
|
153
|
+
}
|
|
154
|
+
catch (cause) {
|
|
155
|
+
if (cause.code === 'ENOENT')
|
|
156
|
+
return undefined;
|
|
157
|
+
throw new CpaStartError('invalid-options', `Cannot read ${configPath}.`, { cause });
|
|
158
|
+
}
|
|
159
|
+
let doc;
|
|
160
|
+
try {
|
|
161
|
+
doc = parseYaml(text, { merge: true });
|
|
162
|
+
}
|
|
163
|
+
catch (cause) {
|
|
164
|
+
throw new CpaStartError('invalid-options', `${configPath} is not valid YAML.`, { cause });
|
|
165
|
+
}
|
|
166
|
+
const listen = readListenSettings(doc);
|
|
167
|
+
if (!isFixedPort(listen.port)) {
|
|
168
|
+
throw new CpaStartError('invalid-options', `${configPath} does not set a fixed server.port. CLIProxyAPI does not report the port it picks; set server.port, delete the file, or pass overwriteConfig: true.`);
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
configPath,
|
|
172
|
+
listen,
|
|
173
|
+
management: readManagementSettings(doc),
|
|
174
|
+
secrets: configSecrets(doc),
|
|
175
|
+
managed: true,
|
|
176
|
+
reused: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Sets `management.secret-key` and `management.allow-remote` in a reused
|
|
181
|
+
* managed config, leaving every other key and comment as CPA left them.
|
|
182
|
+
* The legacy `remote-management` section is dropped so it cannot shadow them.
|
|
183
|
+
*/
|
|
184
|
+
export async function updateManagedSecret(configPath, management) {
|
|
185
|
+
const document = parseDocument(await readFile(configPath, 'utf8'), { merge: true });
|
|
186
|
+
document.delete('remote-management');
|
|
187
|
+
document.setIn(['management', 'secret-key'], management.secretKeyHash);
|
|
188
|
+
document.setIn(['management', 'allow-remote'], management.allowRemote);
|
|
189
|
+
await writeFile(configPath, document.toString(), { mode: 0o600 });
|
|
79
190
|
}
|
|
80
191
|
/** Reads an existing config file without modifying it. */
|
|
81
192
|
export async function inspectConfigFile(configPath) {
|
|
@@ -89,15 +200,30 @@ export async function inspectConfigFile(configPath) {
|
|
|
89
200
|
}
|
|
90
201
|
let doc;
|
|
91
202
|
try {
|
|
92
|
-
doc = parseYaml(text);
|
|
203
|
+
doc = parseYaml(text, { merge: true });
|
|
93
204
|
}
|
|
94
205
|
catch (cause) {
|
|
95
206
|
throw new CpaStartError('invalid-options', `configPath ${absolute} is not valid YAML.`, { cause });
|
|
96
207
|
}
|
|
208
|
+
const root = isRecord(doc) ? doc : {};
|
|
209
|
+
if (hasOwn(root, 'server') && !isRecord(root.server)) {
|
|
210
|
+
throw new CpaStartError('invalid-options', `configPath ${absolute} has a "server" section that is not a mapping.`);
|
|
211
|
+
}
|
|
212
|
+
if (isRecord(root.server) && hasOwn(root.server, 'tls') && !isRecord(root.server.tls)) {
|
|
213
|
+
throw new CpaStartError('invalid-options', `configPath ${absolute} has a "server.tls" section that is not a mapping.`);
|
|
214
|
+
}
|
|
97
215
|
const listen = readListenSettings(doc);
|
|
98
|
-
if (listen.port
|
|
99
|
-
|
|
216
|
+
if (!isFixedPort(listen.port)) {
|
|
217
|
+
const shown = Number.isNaN(listen.port) ? 'a non-numeric value' : String(listen.port);
|
|
218
|
+
throw new CpaStartError('invalid-options', `configPath ${absolute} does not set a fixed port between 1 and 65535 (got ${shown}). CLIProxyAPI does not default the port: a missing or non-positive port becomes 0 and binds a random port it does not report. Set a fixed port or pass a config object instead.`);
|
|
100
219
|
}
|
|
101
|
-
return {
|
|
220
|
+
return {
|
|
221
|
+
configPath: absolute,
|
|
222
|
+
listen,
|
|
223
|
+
management: readManagementSettings(doc),
|
|
224
|
+
secrets: configSecrets(doc),
|
|
225
|
+
managed: false,
|
|
226
|
+
reused: false,
|
|
227
|
+
};
|
|
102
228
|
}
|
|
103
229
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,aAAa,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAoBjD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,MAAM,CAAC,KAAW,EAAE,GAAW;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,KAAc,EAAE,OAAgB;IAChD,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAChE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAExF,IAAI,GAAY,CAAC;IACjB,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC;QAAE,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;SAC9E,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC;QAAE,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;IAExF,OAAO;QACL,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;QACjD,IAAI;QACJ,GAAG,EAAE,GAAG,KAAK,IAAI;KAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;YAC3B,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI;QAC7C,SAAS,EAAE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAC7D,SAAS,EAAE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACnF,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,gFAAgF;AAChF,8EAA8E;AAC9E,yEAAyE;AACzE,yBAAyB;AACzB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AACxH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE3C,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,GAAuB,EAAQ,EAAE;QAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;oBACrG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,QAAgB,EAChB,MAAsC,EACtC,UAA4D;IAE5D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACjE,IAAI,GAAG,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACnE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,UAAU,GAAG;YACf,GAAG,OAAO;YACV,YAAY,EAAE,UAAU,CAAC,aAAa;YACtC,cAAc,EAAE,UAAU,CAAC,WAAW;SACvC,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,4FAA4F;IAC5F,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,OAAO;QACL,UAAU;QACV,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC;QAC/B,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;QACvC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACvD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,eAAe,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,GAAG,UAAU,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,aAAa,CACrB,iBAAiB,EACjB,GAAG,UAAU,oJAAoJ,CAClK,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU;QACV,MAAM;QACN,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;QACvC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,UAA2D;IAE3D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;IACvE,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,0BAA0B,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,cAAc,QAAQ,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,cAAc,QAAQ,gDAAgD,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,cAAc,QAAQ,oDAAoD,CAAC,CAAC;IACzH,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,IAAI,aAAa,CACrB,iBAAiB,EACjB,cAAc,QAAQ,uDAAuD,KAAK,kLAAkL,CACrQ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,MAAM;QACN,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;QACvC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3B,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC"}
|
package/dist/server/errors.d.ts
CHANGED
|
@@ -17,8 +17,10 @@ export type CpaStartErrorCode =
|
|
|
17
17
|
/** Readiness was not reached within `startupTimeoutMs`. */
|
|
18
18
|
| 'timeout'
|
|
19
19
|
/** The `signal` passed to `startServer` was aborted. */
|
|
20
|
-
| 'aborted'
|
|
21
|
-
/** `
|
|
20
|
+
| 'aborted'
|
|
21
|
+
/** `restart` was called after the server stopped. */
|
|
22
|
+
| 'stopped';
|
|
23
|
+
/** `startServer` or `restart` failed. Secrets are redacted from `message` and `output`. */
|
|
22
24
|
export declare class CpaStartError extends Error {
|
|
23
25
|
readonly name = "CpaStartError";
|
|
24
26
|
readonly code: CpaStartErrorCode;
|
|
@@ -1 +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,
|
|
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;AACX,qDAAqD;GACnD,SAAS,CAAC;AAEd,2FAA2F;AAC3F,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"}
|
package/dist/server/errors.js
CHANGED
|
@@ -7,7 +7,7 @@ export class CpaBinaryError extends Error {
|
|
|
7
7
|
this.code = code;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
/** `startServer` failed. Secrets are redacted from `message` and `output`. */
|
|
10
|
+
/** `startServer` or `restart` failed. Secrets are redacted from `message` and `output`. */
|
|
11
11
|
export class CpaStartError extends Error {
|
|
12
12
|
name = 'CpaStartError';
|
|
13
13
|
code;
|
|
@@ -1 +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;
|
|
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;AAkBD,2FAA2F;AAC3F,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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CpaServer, StartServerOptions } from './types.ts';
|
|
1
|
+
import type { CpaServer, ExitResult, StartServerOptions, StopOptions } from './types.ts';
|
|
2
2
|
export { candidateTargets, currentPlatform, detectLibc, resolveBinary } from './binary.ts';
|
|
3
3
|
export type { HostPlatform, Libc, ResolvedBinary } from './binary.ts';
|
|
4
4
|
export { CpaBinaryError, CpaStartError } from './errors.ts';
|
|
@@ -15,4 +15,21 @@ export type { CpaConfig } from '../client/types/config.ts';
|
|
|
15
15
|
* call (the temporary state directory) are removed before the error is thrown.
|
|
16
16
|
*/
|
|
17
17
|
export declare function startServer(options?: StartServerOptions): Promise<CpaServer>;
|
|
18
|
+
/**
|
|
19
|
+
* Stops every server started by this process and still running, using each
|
|
20
|
+
* handle's `stop()` (so temporary state directories are removed too).
|
|
21
|
+
*
|
|
22
|
+
* The library does not install signal handlers. A host that should not leave
|
|
23
|
+
* CPA processes behind on SIGTERM/SIGINT calls this from its own handler:
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* for (const signal of ['SIGINT', 'SIGTERM'] as const) {
|
|
27
|
+
* process.once(signal, async () => {
|
|
28
|
+
* await stopAllServers();
|
|
29
|
+
* process.exit(0);
|
|
30
|
+
* });
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function stopAllServers(options?: StopOptions): Promise<ExitResult[]>;
|
|
18
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAA2B,kBAAkB,EAA0B,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1I,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;AA4K3D;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,CAiKtF;AAoMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAErF"}
|