@koda-sl/baker-bridge 0.118.0-dev.fc1af4da8 → 0.119.0-dev.4248c4e66
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 +2 -17
- package/dist/hono/agent-session.d.ts +0 -3
- package/dist/hono/agent-session.d.ts.map +1 -1
- package/dist/hono/agent-session.js +0 -15
- package/dist/hono/agent-session.js.map +1 -1
- package/dist/hono/agent.d.ts +0 -2
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +3 -10
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/baker-ui-tool-schemas.test.js +0 -5
- package/dist/hono/baker-ui-tool-schemas.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +30 -14
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +77 -71
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +96 -78
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/connection-input.d.ts +147 -11
- package/dist/hono/connection-input.d.ts.map +1 -1
- package/dist/hono/connection-input.js +127 -13
- package/dist/hono/connection-input.js.map +1 -1
- package/dist/hono/connection-input.test.js +61 -1
- package/dist/hono/connection-input.test.js.map +1 -1
- package/dist/hono/convex.d.ts +0 -8
- package/dist/hono/convex.d.ts.map +1 -1
- package/dist/hono/convex.js +0 -8
- package/dist/hono/convex.js.map +1 -1
- package/dist/hono/mcp-servers.d.ts +8 -1
- package/dist/hono/mcp-servers.d.ts.map +1 -1
- package/dist/hono/mcp-servers.js +17 -6
- package/dist/hono/mcp-servers.js.map +1 -1
- package/dist/hono/mcp-servers.test.js +25 -0
- package/dist/hono/mcp-servers.test.js.map +1 -1
- package/dist/hono/prompt-context.d.ts +1 -8
- package/dist/hono/prompt-context.d.ts.map +1 -1
- package/dist/hono/prompt-context.js +7 -45
- package/dist/hono/prompt-context.js.map +1 -1
- package/dist/hono/prompt-context.test.js +1 -32
- package/dist/hono/prompt-context.test.js.map +1 -1
- package/dist/hono/relay.d.ts +1 -10
- package/dist/hono/relay.d.ts.map +1 -1
- package/dist/hono/relay.js +0 -6
- package/dist/hono/relay.js.map +1 -1
- package/dist/hono/server.d.ts.map +1 -1
- package/dist/hono/server.js +0 -22
- package/dist/hono/server.js.map +1 -1
- package/dist/hono/tag-input.d.ts +3 -83
- package/dist/hono/tag-input.d.ts.map +1 -1
- package/dist/hono/tag-input.js +17 -23
- package/dist/hono/tag-input.js.map +1 -1
- package/dist/hono/tag-input.test.js +1 -15
- package/dist/hono/tag-input.test.js.map +1 -1
- package/dist/hono/types.d.ts +0 -8
- package/dist/hono/types.d.ts.map +1 -1
- package/package.json +2 -5
- package/dist/broker/baker-api.d.ts +0 -14
- package/dist/broker/baker-api.d.ts.map +0 -1
- package/dist/broker/baker-api.js +0 -41
- package/dist/broker/baker-api.js.map +0 -1
- package/dist/broker/broker-client.d.ts +0 -10
- package/dist/broker/broker-client.d.ts.map +0 -1
- package/dist/broker/broker-client.js +0 -60
- package/dist/broker/broker-client.js.map +0 -1
- package/dist/broker/ca.d.ts +0 -30
- package/dist/broker/ca.d.ts.map +0 -1
- package/dist/broker/ca.js +0 -69
- package/dist/broker/ca.js.map +0 -1
- package/dist/broker/ca.test.d.ts +0 -2
- package/dist/broker/ca.test.d.ts.map +0 -1
- package/dist/broker/ca.test.js +0 -42
- package/dist/broker/ca.test.js.map +0 -1
- package/dist/broker/credential-cache.d.ts +0 -29
- package/dist/broker/credential-cache.d.ts.map +0 -1
- package/dist/broker/credential-cache.js +0 -36
- package/dist/broker/credential-cache.js.map +0 -1
- package/dist/broker/credential-cache.test.d.ts +0 -2
- package/dist/broker/credential-cache.test.d.ts.map +0 -1
- package/dist/broker/credential-cache.test.js +0 -74
- package/dist/broker/credential-cache.test.js.map +0 -1
- package/dist/broker/credential-text.d.ts +0 -45
- package/dist/broker/credential-text.d.ts.map +0 -1
- package/dist/broker/credential-text.js +0 -100
- package/dist/broker/credential-text.js.map +0 -1
- package/dist/broker/credential-text.test.d.ts +0 -2
- package/dist/broker/credential-text.test.d.ts.map +0 -1
- package/dist/broker/credential-text.test.js +0 -52
- package/dist/broker/credential-text.test.js.map +0 -1
- package/dist/broker/env.d.ts +0 -19
- package/dist/broker/env.d.ts.map +0 -1
- package/dist/broker/env.js +0 -16
- package/dist/broker/env.js.map +0 -1
- package/dist/broker/main.d.ts +0 -3
- package/dist/broker/main.d.ts.map +0 -1
- package/dist/broker/main.js +0 -51
- package/dist/broker/main.js.map +0 -1
- package/dist/broker/proxy.d.ts +0 -24
- package/dist/broker/proxy.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.d.ts +0 -2
- package/dist/broker/proxy.integration.test.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.js +0 -128
- package/dist/broker/proxy.integration.test.js.map +0 -1
- package/dist/broker/proxy.js +0 -137
- package/dist/broker/proxy.js.map +0 -1
- package/dist/broker/rewrite.d.ts +0 -38
- package/dist/broker/rewrite.d.ts.map +0 -1
- package/dist/broker/rewrite.js +0 -275
- package/dist/broker/rewrite.js.map +0 -1
- package/dist/broker/rewrite.test.d.ts +0 -2
- package/dist/broker/rewrite.test.d.ts.map +0 -1
- package/dist/broker/rewrite.test.js +0 -171
- package/dist/broker/rewrite.test.js.map +0 -1
- package/dist/broker/socket-service.d.ts +0 -18
- package/dist/broker/socket-service.d.ts.map +0 -1
- package/dist/broker/socket-service.js +0 -84
- package/dist/broker/socket-service.js.map +0 -1
- package/dist/broker/socket-service.test.d.ts +0 -2
- package/dist/broker/socket-service.test.d.ts.map +0 -1
- package/dist/broker/socket-service.test.js +0 -62
- package/dist/broker/socket-service.test.js.map +0 -1
- package/dist/broker/token-bucket.d.ts +0 -9
- package/dist/broker/token-bucket.d.ts.map +0 -1
- package/dist/broker/token-bucket.js +0 -18
- package/dist/broker/token-bucket.js.map +0 -1
- package/dist/broker/usage-reporter.d.ts +0 -18
- package/dist/broker/usage-reporter.d.ts.map +0 -1
- package/dist/broker/usage-reporter.js +0 -31
- package/dist/broker/usage-reporter.js.map +0 -1
- package/dist/broker/usage-reporter.test.d.ts +0 -2
- package/dist/broker/usage-reporter.test.d.ts.map +0 -1
- package/dist/broker/usage-reporter.test.js +0 -20
- package/dist/broker/usage-reporter.test.js.map +0 -1
- package/dist/hono/credential-input.d.ts +0 -39
- package/dist/hono/credential-input.d.ts.map +0 -1
- package/dist/hono/credential-input.js +0 -77
- package/dist/hono/credential-input.js.map +0 -1
- package/dist/hono/credential-scrub.d.ts +0 -41
- package/dist/hono/credential-scrub.d.ts.map +0 -1
- package/dist/hono/credential-scrub.js +0 -152
- package/dist/hono/credential-scrub.js.map +0 -1
- package/dist/hono/credential-scrub.test.d.ts +0 -2
- package/dist/hono/credential-scrub.test.d.ts.map +0 -1
- package/dist/hono/credential-scrub.test.js +0 -105
- package/dist/hono/credential-scrub.test.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker-client.js","sourceRoot":"","sources":["../../src/broker/broker-client.ts"],"names":[],"mappings":"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"}
|
package/dist/broker/ca.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_CA_DIR = "/etc/baker-ca";
|
|
2
|
-
export declare const SYSTEM_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt";
|
|
3
|
-
export type CertificateAuthority = {
|
|
4
|
-
keyPath: string;
|
|
5
|
-
certPath: string;
|
|
6
|
-
key: string;
|
|
7
|
-
cert: string;
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Env for every process the agent runs. `NODE_EXTRA_CA_CERTS` adds our CA to
|
|
11
|
-
* Node's roots; the other three *replace* a client's bundle, so they name the
|
|
12
|
-
* system bundle, which carries our CA once `update-ca-certificates` ran.
|
|
13
|
-
*/
|
|
14
|
-
export declare function agentProxyEnv(options: {
|
|
15
|
-
port: number;
|
|
16
|
-
caCertPath: string;
|
|
17
|
-
/** Hosts that bypass the broker entirely, e.g. the model gateway carrying the agent's own conversation. */
|
|
18
|
-
noProxyHosts: readonly string[];
|
|
19
|
-
}): Record<string, string>;
|
|
20
|
-
/**
|
|
21
|
-
* Reuses the CA in `dir`, or creates one (key 0600, cert 0644). With
|
|
22
|
-
* `installSystemTrust`, also adds the cert to the system bundle — needs root;
|
|
23
|
-
* a failure is logged, not thrown, so the proxy still starts.
|
|
24
|
-
*/
|
|
25
|
-
export declare function ensureCertificateAuthority(options: {
|
|
26
|
-
dir?: string;
|
|
27
|
-
installSystemTrust: boolean;
|
|
28
|
-
log?: (message: string) => void;
|
|
29
|
-
}): Promise<CertificateAuthority>;
|
|
30
|
-
//# sourceMappingURL=ca.d.ts.map
|
package/dist/broker/ca.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.d.ts","sourceRoot":"","sources":["../../src/broker/ca.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,gBAAgB,uCAAuC,CAAC;AAKrE,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBzB;AASD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAahC"}
|
package/dist/broker/ca.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The broker's certificate authority — what lets it read HTTPS the agent sends
|
|
3
|
-
* through it — and the environment that points the agent's clients at it.
|
|
4
|
-
*/
|
|
5
|
-
import { execFile } from "node:child_process";
|
|
6
|
-
import { copyFile, mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { promisify } from "node:util";
|
|
9
|
-
import { generateCACertificate } from "mockttp";
|
|
10
|
-
export const DEFAULT_CA_DIR = "/etc/baker-ca";
|
|
11
|
-
export const SYSTEM_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt";
|
|
12
|
-
/** By absolute path: the broker runs as root and must never resolve a binary through PATH. */
|
|
13
|
-
const UPDATE_CA_CERTIFICATES = "/usr/sbin/update-ca-certificates";
|
|
14
|
-
const SYSTEM_TRUST_PATH = "/usr/local/share/ca-certificates/baker-credential-broker.crt";
|
|
15
|
-
/**
|
|
16
|
-
* Env for every process the agent runs. `NODE_EXTRA_CA_CERTS` adds our CA to
|
|
17
|
-
* Node's roots; the other three *replace* a client's bundle, so they name the
|
|
18
|
-
* system bundle, which carries our CA once `update-ca-certificates` ran.
|
|
19
|
-
*/
|
|
20
|
-
export function agentProxyEnv(options) {
|
|
21
|
-
const proxy = `http://127.0.0.1:${options.port}`;
|
|
22
|
-
const noProxy = ["localhost", "127.0.0.1", "::1", ...options.noProxyHosts].join(",");
|
|
23
|
-
return {
|
|
24
|
-
HTTPS_PROXY: proxy,
|
|
25
|
-
HTTP_PROXY: proxy,
|
|
26
|
-
https_proxy: proxy,
|
|
27
|
-
http_proxy: proxy,
|
|
28
|
-
NO_PROXY: noProxy,
|
|
29
|
-
no_proxy: noProxy,
|
|
30
|
-
NODE_USE_ENV_PROXY: "1",
|
|
31
|
-
NODE_EXTRA_CA_CERTS: options.caCertPath,
|
|
32
|
-
REQUESTS_CA_BUNDLE: SYSTEM_CA_BUNDLE,
|
|
33
|
-
SSL_CERT_FILE: SYSTEM_CA_BUNDLE,
|
|
34
|
-
CURL_CA_BUNDLE: SYSTEM_CA_BUNDLE,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function exists(path) {
|
|
38
|
-
return stat(path).then(() => true, () => false);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Reuses the CA in `dir`, or creates one (key 0600, cert 0644). With
|
|
42
|
-
* `installSystemTrust`, also adds the cert to the system bundle — needs root;
|
|
43
|
-
* a failure is logged, not thrown, so the proxy still starts.
|
|
44
|
-
*/
|
|
45
|
-
export async function ensureCertificateAuthority(options) {
|
|
46
|
-
const dir = options.dir ?? DEFAULT_CA_DIR;
|
|
47
|
-
const keyPath = join(dir, "ca.key");
|
|
48
|
-
const certPath = join(dir, "ca.pem");
|
|
49
|
-
if (!(await exists(keyPath)) || !(await exists(certPath))) {
|
|
50
|
-
const ca = await generateCACertificate({ subject: { commonName: "Baker Credential Broker" }, bits: 2048 });
|
|
51
|
-
await mkdir(dir, { recursive: true, mode: 0o755 });
|
|
52
|
-
await writeFile(keyPath, ca.key, { mode: 0o600 });
|
|
53
|
-
await writeFile(certPath, ca.cert, { mode: 0o644 });
|
|
54
|
-
options.log?.(`created certificate authority in ${dir}`);
|
|
55
|
-
}
|
|
56
|
-
if (options.installSystemTrust)
|
|
57
|
-
await installSystemTrust(certPath, options.log);
|
|
58
|
-
return { keyPath, certPath, key: await readFile(keyPath, "utf8"), cert: await readFile(certPath, "utf8") };
|
|
59
|
-
}
|
|
60
|
-
async function installSystemTrust(certPath, log) {
|
|
61
|
-
try {
|
|
62
|
-
await copyFile(certPath, SYSTEM_TRUST_PATH);
|
|
63
|
-
await promisify(execFile)(UPDATE_CA_CERTIFICATES);
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
log?.(`could not add the certificate authority to the system bundle: ${String(error)}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=ca.js.map
|
package/dist/broker/ca.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.js","sourceRoot":"","sources":["../../src/broker/ca.ts"],"names":[],"mappings":"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"}
|
package/dist/broker/ca.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.test.d.ts","sourceRoot":"","sources":["../../src/broker/ca.test.ts"],"names":[],"mappings":""}
|
package/dist/broker/ca.test.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, readFileSync, statSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { agentProxyEnv, ensureCertificateAuthority } from "./ca.js";
|
|
6
|
-
describe("agentProxyEnv", () => {
|
|
7
|
-
it("routes every client through the broker and trusts its CA without dropping the system roots", () => {
|
|
8
|
-
const env = agentProxyEnv({ port: 8877, caCertPath: "/etc/baker-ca/ca.pem", noProxyHosts: [] });
|
|
9
|
-
expect(env).toEqual({
|
|
10
|
-
HTTPS_PROXY: "http://127.0.0.1:8877",
|
|
11
|
-
HTTP_PROXY: "http://127.0.0.1:8877",
|
|
12
|
-
https_proxy: "http://127.0.0.1:8877",
|
|
13
|
-
http_proxy: "http://127.0.0.1:8877",
|
|
14
|
-
NO_PROXY: "localhost,127.0.0.1,::1",
|
|
15
|
-
no_proxy: "localhost,127.0.0.1,::1",
|
|
16
|
-
NODE_USE_ENV_PROXY: "1",
|
|
17
|
-
NODE_EXTRA_CA_CERTS: "/etc/baker-ca/ca.pem",
|
|
18
|
-
REQUESTS_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt",
|
|
19
|
-
SSL_CERT_FILE: "/etc/ssl/certs/ca-certificates.crt",
|
|
20
|
-
CURL_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt",
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
it("keeps the named hosts off the broker, so the agent's own model traffic is never rewritten", () => {
|
|
24
|
-
const env = agentProxyEnv({ port: 8877, caCertPath: "/etc/baker-ca/ca.pem", noProxyHosts: ["openrouter.ai"] });
|
|
25
|
-
expect([env.NO_PROXY, env.no_proxy]).toEqual([
|
|
26
|
-
"localhost,127.0.0.1,::1,openrouter.ai",
|
|
27
|
-
"localhost,127.0.0.1,::1,openrouter.ai",
|
|
28
|
-
]);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe("ensureCertificateAuthority", () => {
|
|
32
|
-
it("creates a private key once and reuses it on the next start", async () => {
|
|
33
|
-
const dir = join(mkdtempSync(join(tmpdir(), "baker-ca-")), "ca");
|
|
34
|
-
const first = await ensureCertificateAuthority({ dir, installSystemTrust: false });
|
|
35
|
-
const second = await ensureCertificateAuthority({ dir, installSystemTrust: false });
|
|
36
|
-
expect(second).toEqual(first);
|
|
37
|
-
expect(statSync(first.keyPath).mode & 0o777).toBe(0o600);
|
|
38
|
-
expect(statSync(first.certPath).mode & 0o777).toBe(0o644);
|
|
39
|
-
expect(readFileSync(first.certPath, "utf8")).toContain("BEGIN CERTIFICATE");
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=ca.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.test.js","sourceRoot":"","sources":["../../src/broker/ca.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAEpE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,4FAA4F,EAAE,GAAG,EAAE;QACpG,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,sBAAsB,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAEhG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,uBAAuB;YACpC,UAAU,EAAE,uBAAuB;YACnC,WAAW,EAAE,uBAAuB;YACpC,UAAU,EAAE,uBAAuB;YACnC,QAAQ,EAAE,yBAAyB;YACnC,QAAQ,EAAE,yBAAyB;YACnC,kBAAkB,EAAE,GAAG;YACvB,mBAAmB,EAAE,sBAAsB;YAC3C,kBAAkB,EAAE,oCAAoC;YACxD,aAAa,EAAE,oCAAoC;YACnD,cAAc,EAAE,oCAAoC;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;QACnG,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE/G,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3C,uCAAuC;YACvC,uCAAuC;SACxC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The broker's copy of the company's credentials, fetched from Baker on first
|
|
3
|
-
* need and kept for 10 seconds. Concurrent reads share one fetch. A failed
|
|
4
|
-
* fetch keeps the last good table until the next refresh; before any fetch
|
|
5
|
-
* has succeeded there is no table (null), which callers must treat as
|
|
6
|
-
* "credentials unavailable", not "no credentials".
|
|
7
|
-
*/
|
|
8
|
-
import type { ResolvedCredential } from "./credential-text.ts";
|
|
9
|
-
export declare const CREDENTIAL_TTL_MS = 10000;
|
|
10
|
-
/** Each fetch decrypts every credential the company has; a refusal loop may force one this often at most. */
|
|
11
|
-
export declare const MIN_REFRESH_INTERVAL_MS = 5000;
|
|
12
|
-
export type FetchCredentials = () => Promise<ResolvedCredential[]>;
|
|
13
|
-
export type CredentialCache = {
|
|
14
|
-
get(): Promise<ResolvedCredential[] | null>;
|
|
15
|
-
/**
|
|
16
|
-
* Drops the table so the next read fetches it again — unless an early
|
|
17
|
-
* refresh already happened within 5 seconds. Returns whether it dropped it.
|
|
18
|
-
*/
|
|
19
|
-
refresh(): boolean;
|
|
20
|
-
/** How many credentials the last fetch returned (0 before the first). */
|
|
21
|
-
size(): number;
|
|
22
|
-
};
|
|
23
|
-
export declare function createCredentialCache(options: {
|
|
24
|
-
fetchCredentials: FetchCredentials;
|
|
25
|
-
now?: () => number;
|
|
26
|
-
ttlMs?: number;
|
|
27
|
-
log?: (message: string) => void;
|
|
28
|
-
}): CredentialCache;
|
|
29
|
-
//# sourceMappingURL=credential-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.d.ts","sourceRoot":"","sources":["../../src/broker/credential-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,6GAA6G;AAC7G,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,IAAI,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,IAAI,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,eAAe,CAiClB"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export const CREDENTIAL_TTL_MS = 10_000;
|
|
2
|
-
/** Each fetch decrypts every credential the company has; a refusal loop may force one this often at most. */
|
|
3
|
-
export const MIN_REFRESH_INTERVAL_MS = 5_000;
|
|
4
|
-
export function createCredentialCache(options) {
|
|
5
|
-
const now = options.now ?? Date.now;
|
|
6
|
-
const ttlMs = options.ttlMs ?? CREDENTIAL_TTL_MS;
|
|
7
|
-
let entry = null;
|
|
8
|
-
let lastGood = null;
|
|
9
|
-
let lastRefreshAt = Number.NEGATIVE_INFINITY;
|
|
10
|
-
return {
|
|
11
|
-
get() {
|
|
12
|
-
if (entry === null || now() - entry.at >= ttlMs) {
|
|
13
|
-
const table = options.fetchCredentials().then((credentials) => {
|
|
14
|
-
lastGood = credentials;
|
|
15
|
-
return credentials;
|
|
16
|
-
}, (error) => {
|
|
17
|
-
options.log?.(`credential fetch failed, keeping ${lastGood?.length ?? 0} cached: ${String(error)}`);
|
|
18
|
-
return lastGood;
|
|
19
|
-
});
|
|
20
|
-
entry = { at: now(), table };
|
|
21
|
-
}
|
|
22
|
-
return entry.table;
|
|
23
|
-
},
|
|
24
|
-
refresh() {
|
|
25
|
-
if (now() - lastRefreshAt < MIN_REFRESH_INTERVAL_MS)
|
|
26
|
-
return false;
|
|
27
|
-
lastRefreshAt = now();
|
|
28
|
-
entry = null;
|
|
29
|
-
return true;
|
|
30
|
-
},
|
|
31
|
-
size() {
|
|
32
|
-
return lastGood?.length ?? 0;
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=credential-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.js","sourceRoot":"","sources":["../../src/broker/credential-cache.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,6GAA6G;AAC7G,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAe7C,MAAM,UAAU,qBAAqB,CAAC,OAKrC;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;IACjD,IAAI,KAAK,GAAuE,IAAI,CAAC;IACrF,IAAI,QAAQ,GAAgC,IAAI,CAAC;IACjD,IAAI,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC7C,OAAO;QACL,GAAG;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAC3C,CAAC,WAAW,EAAE,EAAE;oBACd,QAAQ,GAAG,WAAW,CAAC;oBACvB,OAAO,WAAW,CAAC;gBACrB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;oBACjB,OAAO,CAAC,GAAG,EAAE,CAAC,oCAAoC,QAAQ,EAAE,MAAM,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACpG,OAAO,QAAQ,CAAC;gBAClB,CAAC,CACF,CAAC;gBACF,KAAK,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC;YAC/B,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,OAAO;YACL,IAAI,GAAG,EAAE,GAAG,aAAa,GAAG,uBAAuB;gBAAE,OAAO,KAAK,CAAC;YAClE,aAAa,GAAG,GAAG,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI;YACF,OAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.test.d.ts","sourceRoot":"","sources":["../../src/broker/credential-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { createCredentialCache } from "./credential-cache.js";
|
|
3
|
-
function fetcher() {
|
|
4
|
-
let calls = 0;
|
|
5
|
-
return {
|
|
6
|
-
get calls() {
|
|
7
|
-
return calls;
|
|
8
|
-
},
|
|
9
|
-
fetchCredentials: async () => {
|
|
10
|
-
await Promise.resolve();
|
|
11
|
-
calls += 1;
|
|
12
|
-
return [{ name: `v${calls}`, value: "secret-value", allowedHosts: ["api.example.com"] }];
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
describe("createCredentialCache", () => {
|
|
17
|
-
it("reuses the table for 10 seconds, then fetches it again", async () => {
|
|
18
|
-
let clock = 0;
|
|
19
|
-
const source = fetcher();
|
|
20
|
-
const cache = createCredentialCache({ fetchCredentials: source.fetchCredentials, now: () => clock });
|
|
21
|
-
await cache.get();
|
|
22
|
-
clock = 9_999;
|
|
23
|
-
await cache.get();
|
|
24
|
-
clock = 10_000;
|
|
25
|
-
const table = await cache.get();
|
|
26
|
-
expect(source.calls).toBe(2);
|
|
27
|
-
expect(table?.map((credential) => credential.name)).toEqual(["v2"]);
|
|
28
|
-
});
|
|
29
|
-
it("keeps the last good table when a refresh fails, and has none when no fetch ever succeeded", async () => {
|
|
30
|
-
let clock = 0;
|
|
31
|
-
let failing = true;
|
|
32
|
-
const cache = createCredentialCache({
|
|
33
|
-
fetchCredentials: async () => {
|
|
34
|
-
await Promise.resolve();
|
|
35
|
-
if (failing)
|
|
36
|
-
throw new Error("401 UNAUTHORIZED");
|
|
37
|
-
return [{ name: "shop", value: "secret-value", allowedHosts: ["api.example.com"] }];
|
|
38
|
-
},
|
|
39
|
-
now: () => clock,
|
|
40
|
-
});
|
|
41
|
-
expect(await cache.get()).toBeNull();
|
|
42
|
-
failing = false;
|
|
43
|
-
clock = 10_000;
|
|
44
|
-
await cache.get();
|
|
45
|
-
failing = true;
|
|
46
|
-
clock = 20_000;
|
|
47
|
-
expect((await cache.get())?.map((credential) => credential.name)).toEqual(["shop"]);
|
|
48
|
-
});
|
|
49
|
-
it("fetches again on the next read after a refresh", async () => {
|
|
50
|
-
const source = fetcher();
|
|
51
|
-
const cache = createCredentialCache({ fetchCredentials: source.fetchCredentials, now: () => 0 });
|
|
52
|
-
await cache.get();
|
|
53
|
-
cache.refresh();
|
|
54
|
-
await cache.get();
|
|
55
|
-
expect(source.calls).toBe(2);
|
|
56
|
-
});
|
|
57
|
-
it("refreshes early at most once every 5 seconds, so refused retries cannot make it fetch on every request", async () => {
|
|
58
|
-
let clock = 0;
|
|
59
|
-
const source = fetcher();
|
|
60
|
-
const cache = createCredentialCache({ fetchCredentials: source.fetchCredentials, now: () => clock });
|
|
61
|
-
await cache.get();
|
|
62
|
-
const refreshed = [];
|
|
63
|
-
for (clock = 0; clock < 5_000; clock += 500) {
|
|
64
|
-
refreshed.push(cache.refresh());
|
|
65
|
-
await cache.get();
|
|
66
|
-
}
|
|
67
|
-
clock = 5_000;
|
|
68
|
-
refreshed.push(cache.refresh());
|
|
69
|
-
await cache.get();
|
|
70
|
-
expect(refreshed.filter(Boolean)).toHaveLength(2);
|
|
71
|
-
expect(source.calls).toBe(3);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
//# sourceMappingURL=credential-cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.test.js","sourceRoot":"","sources":["../../src/broker/credential-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hand-copy of the placeholder grammar, host check and scrub in
|
|
3
|
-
* `packages/api/src/credentials/{placeholder,hosts,scrub}.ts`. The bridge is
|
|
4
|
-
* published standalone to npm and cannot depend on the private `@baker/api`,
|
|
5
|
-
* so these are copied rather than imported; `credential-text.test.ts` runs both
|
|
6
|
-
* copies over the same inputs and fails when this one drifts.
|
|
7
|
-
*/
|
|
8
|
-
export type CredentialPlaceholder = {
|
|
9
|
-
name: string;
|
|
10
|
-
start: number;
|
|
11
|
-
end: number;
|
|
12
|
-
};
|
|
13
|
-
export type ResolvedCredential = {
|
|
14
|
-
name: string;
|
|
15
|
-
value: string;
|
|
16
|
-
allowedHosts: readonly string[];
|
|
17
|
-
};
|
|
18
|
-
export type ScrubbableCredential = {
|
|
19
|
-
name: string;
|
|
20
|
-
value: string;
|
|
21
|
-
};
|
|
22
|
-
export type Substitution = {
|
|
23
|
-
out: string;
|
|
24
|
-
used: string[];
|
|
25
|
-
denied: {
|
|
26
|
-
name: string;
|
|
27
|
-
allowedHosts: readonly string[];
|
|
28
|
-
}[];
|
|
29
|
-
unknown: string[];
|
|
30
|
-
};
|
|
31
|
-
/** Below this length a value is too likely to occur in unrelated text to be scrubbed. */
|
|
32
|
-
export declare const MIN_SCRUB_LENGTH = 6;
|
|
33
|
-
export declare function renderPlaceholder(name: string): string;
|
|
34
|
-
export declare function parsePlaceholders(text: string): CredentialPlaceholder[];
|
|
35
|
-
/** The credential a value stands for when the whole value is one placeholder, as a tag's secret field holds it. */
|
|
36
|
-
export declare function credentialNamedBy(value: string): string | null;
|
|
37
|
-
export declare function hostAllowed(host: string, patterns: readonly string[]): boolean;
|
|
38
|
-
export declare function substitute(text: string, credentials: readonly ResolvedCredential[], host: string): Substitution;
|
|
39
|
-
/** Every form of a credential a scrub must catch, longest first, so a longer value is never half-replaced by a shorter one. */
|
|
40
|
-
export declare function scrubPatterns(credentials: readonly ScrubbableCredential[]): {
|
|
41
|
-
needle: string;
|
|
42
|
-
name: string;
|
|
43
|
-
}[];
|
|
44
|
-
export declare function scrub(text: string, credentials: readonly ScrubbableCredential[]): string;
|
|
45
|
-
//# sourceMappingURL=credential-text.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-text.d.ts","sourceRoot":"","sources":["../../src/broker/credential-text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AACjF,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAClG,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAMvE;AAID,mHAAmH;AACnH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9D;AAMD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAM9E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CA4B/G;AAoBD,+HAA+H;AAC/H,wBAAgB,aAAa,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAK9G;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,MAAM,CAMxF"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hand-copy of the placeholder grammar, host check and scrub in
|
|
3
|
-
* `packages/api/src/credentials/{placeholder,hosts,scrub}.ts`. The bridge is
|
|
4
|
-
* published standalone to npm and cannot depend on the private `@baker/api`,
|
|
5
|
-
* so these are copied rather than imported; `credential-text.test.ts` runs both
|
|
6
|
-
* copies over the same inputs and fails when this one drifts.
|
|
7
|
-
*/
|
|
8
|
-
const CREDENTIAL_NAME_PATTERN = "[a-z0-9][a-z0-9_-]{0,63}";
|
|
9
|
-
const PLACEHOLDER_SOURCE = `\\{\\{credential:(${CREDENTIAL_NAME_PATTERN})\\}\\}`;
|
|
10
|
-
/** Below this length a value is too likely to occur in unrelated text to be scrubbed. */
|
|
11
|
-
export const MIN_SCRUB_LENGTH = 6;
|
|
12
|
-
export function renderPlaceholder(name) {
|
|
13
|
-
return `{{credential:${name}}}`;
|
|
14
|
-
}
|
|
15
|
-
export function parsePlaceholders(text) {
|
|
16
|
-
return [...text.matchAll(new RegExp(PLACEHOLDER_SOURCE, "g"))].map((match) => ({
|
|
17
|
-
name: match[1] ?? "",
|
|
18
|
-
start: match.index,
|
|
19
|
-
end: match.index + match[0].length,
|
|
20
|
-
}));
|
|
21
|
-
}
|
|
22
|
-
const WHOLE_PLACEHOLDER_RE = new RegExp(`^${PLACEHOLDER_SOURCE}$`);
|
|
23
|
-
/** The credential a value stands for when the whole value is one placeholder, as a tag's secret field holds it. */
|
|
24
|
-
export function credentialNamedBy(value) {
|
|
25
|
-
return WHOLE_PLACEHOLDER_RE.exec(value.trim())?.[1] ?? null;
|
|
26
|
-
}
|
|
27
|
-
function normaliseHost(host) {
|
|
28
|
-
return host.trim().toLowerCase().replace(/\.$/, "");
|
|
29
|
-
}
|
|
30
|
-
export function hostAllowed(host, patterns) {
|
|
31
|
-
const target = normaliseHost(host);
|
|
32
|
-
return patterns.some((raw) => {
|
|
33
|
-
const pattern = normaliseHost(raw);
|
|
34
|
-
return pattern.startsWith("*.") ? target.endsWith(pattern.slice(1)) : target === pattern;
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
export function substitute(text, credentials, host) {
|
|
38
|
-
const byName = new Map(credentials.map((credential) => [credential.name, credential]));
|
|
39
|
-
const used = new Set();
|
|
40
|
-
const denied = new Map();
|
|
41
|
-
const unknown = new Set();
|
|
42
|
-
let out = "";
|
|
43
|
-
let cursor = 0;
|
|
44
|
-
for (const placeholder of parsePlaceholders(text)) {
|
|
45
|
-
const credential = byName.get(placeholder.name);
|
|
46
|
-
let replacement = text.slice(placeholder.start, placeholder.end);
|
|
47
|
-
if (credential === undefined) {
|
|
48
|
-
unknown.add(placeholder.name);
|
|
49
|
-
}
|
|
50
|
-
else if (hostAllowed(host, credential.allowedHosts)) {
|
|
51
|
-
replacement = credential.value;
|
|
52
|
-
used.add(credential.name);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
denied.set(credential.name, credential.allowedHosts);
|
|
56
|
-
}
|
|
57
|
-
out += text.slice(cursor, placeholder.start) + replacement;
|
|
58
|
-
cursor = placeholder.end;
|
|
59
|
-
}
|
|
60
|
-
out += text.slice(cursor);
|
|
61
|
-
return {
|
|
62
|
-
out,
|
|
63
|
-
used: [...used],
|
|
64
|
-
denied: [...denied].map(([name, allowedHosts]) => ({ name, allowedHosts })),
|
|
65
|
-
unknown: [...unknown],
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
function base64(value) {
|
|
69
|
-
let binary = "";
|
|
70
|
-
for (const byte of new TextEncoder().encode(value))
|
|
71
|
-
binary += String.fromCharCode(byte);
|
|
72
|
-
return btoa(binary);
|
|
73
|
-
}
|
|
74
|
-
function encodings(value) {
|
|
75
|
-
const standard = base64(value);
|
|
76
|
-
const variants = [
|
|
77
|
-
value,
|
|
78
|
-
standard,
|
|
79
|
-
standard.replace(/=+$/, ""),
|
|
80
|
-
standard.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""),
|
|
81
|
-
encodeURIComponent(value),
|
|
82
|
-
];
|
|
83
|
-
return [...new Set(variants)].filter((variant) => variant.length >= MIN_SCRUB_LENGTH);
|
|
84
|
-
}
|
|
85
|
-
/** Every form of a credential a scrub must catch, longest first, so a longer value is never half-replaced by a shorter one. */
|
|
86
|
-
export function scrubPatterns(credentials) {
|
|
87
|
-
return credentials
|
|
88
|
-
.filter((credential) => credential.value.length >= MIN_SCRUB_LENGTH)
|
|
89
|
-
.flatMap((credential) => encodings(credential.value).map((needle) => ({ needle, name: credential.name })))
|
|
90
|
-
.sort((a, b) => b.needle.length - a.needle.length);
|
|
91
|
-
}
|
|
92
|
-
export function scrub(text, credentials) {
|
|
93
|
-
let out = text;
|
|
94
|
-
for (const { needle, name } of scrubPatterns(credentials)) {
|
|
95
|
-
if (out.includes(needle))
|
|
96
|
-
out = out.split(needle).join(renderPlaceholder(name));
|
|
97
|
-
}
|
|
98
|
-
return out;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=credential-text.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-text.js","sourceRoot":"","sources":["../../src/broker/credential-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-text.test.d.ts","sourceRoot":"","sources":["../../src/broker/credential-text.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
-
});
|
|
6
|
-
}
|
|
7
|
-
return path;
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* `credential-text.ts` is a hand-copy of the placeholder grammar, host check
|
|
11
|
-
* and scrub in `packages/api/src/credentials/` — the bridge is published
|
|
12
|
-
* standalone and cannot depend on the private `@baker/api`. These run both
|
|
13
|
-
* copies over the same inputs so the copy fails loudly when it falls behind.
|
|
14
|
-
*/
|
|
15
|
-
import { resolve } from "node:path";
|
|
16
|
-
import { describe, expect, it } from "vitest";
|
|
17
|
-
import * as local from "./credential-text.js";
|
|
18
|
-
const UPSTREAM = resolve(import.meta.dirname, "../../../api/src/credentials/index.ts");
|
|
19
|
-
async function upstream() {
|
|
20
|
-
const path = UPSTREAM;
|
|
21
|
-
return (await import(__rewriteRelativeImportExtension(path)));
|
|
22
|
-
}
|
|
23
|
-
const credentials = [
|
|
24
|
-
{ name: "meta-token", value: "EAAGm0PX4ZCpsBAKZCZ+/x", allowedHosts: ["graph.facebook.com"] },
|
|
25
|
-
{ name: "shop", value: "shpat_0a1b2c3d4e5f", allowedHosts: ["acme.myshopify.com"] },
|
|
26
|
-
{ name: "short", value: "abc", allowedHosts: ["api.example.com"] },
|
|
27
|
-
{ name: "unicode", value: "contraseña-segura-1", allowedHosts: ["api.example.com"] },
|
|
28
|
-
];
|
|
29
|
-
const texts = [
|
|
30
|
-
" {{credential:meta-token}} ",
|
|
31
|
-
"Authorization: Bearer {{credential:meta-token}} and {{credential:shop}} and {{credential:missing}}",
|
|
32
|
-
"{{credential:}} {{credential:Upper}} {credential:x} {{credential:short}}",
|
|
33
|
-
"echo EAAGm0PX4ZCpsBAKZCZ+/x RUFBR20wUFg0WkNwc0JBS1pDWisveA== shpat_0a1b2c3d4e5f abc",
|
|
34
|
-
`encoded ${encodeURIComponent("contraseña-segura-1")} ${btoa("shpat_0a1b2c3d4e5f")}`,
|
|
35
|
-
];
|
|
36
|
-
const hosts = ["graph.facebook.com", "GRAPH.facebook.com.", "acme.myshopify.com", "myshopify.com", "evil.io"];
|
|
37
|
-
describe("credential-text mirrors @baker/api/credentials", () => {
|
|
38
|
-
it("parses, substitutes and scrubs exactly like the contract", async () => {
|
|
39
|
-
const api = await upstream();
|
|
40
|
-
for (const text of texts) {
|
|
41
|
-
expect(local.parsePlaceholders(text)).toEqual(api.parsePlaceholders(text));
|
|
42
|
-
expect(local.credentialNamedBy(text)).toBe(api.credentialNamedBy(text));
|
|
43
|
-
expect(local.scrub(text, credentials)).toBe(api.scrub(text, credentials));
|
|
44
|
-
for (const host of hosts) {
|
|
45
|
-
expect(local.substitute(text, credentials, host)).toEqual(api.substitute(text, credentials, host));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
expect(local.scrubPatterns(credentials)).toEqual(api.scrubPatterns(credentials));
|
|
49
|
-
expect(local.MIN_SCRUB_LENGTH).toBe(api.MIN_SCRUB_LENGTH);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=credential-text.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-text.test.js","sourceRoot":"","sources":["../../src/broker/credential-text.test.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAC;AAG9C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC;AAEvF,KAAK,UAAU,QAAQ;IACrB,MAAM,IAAI,GAAW,QAAQ,CAAC;IAC9B,OAAO,CAAC,MAAM,MAAM,kCAAC,IAAI,EAAC,CAAa,CAAC;AAC1C,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE;IAC7F,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE;IACnF,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE;IAClE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE;CACrF,CAAC;AAEF,MAAM,KAAK,GAAG;IACZ,6BAA6B;IAC7B,oGAAoG;IACpG,0EAA0E;IAC1E,qFAAqF;IACrF,WAAW,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE;CACrF,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;AAE9G,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;YAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/broker/env.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/** The broker's environment, parsed once at startup. */
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
declare const envSchema: z.ZodObject<{
|
|
4
|
-
CREDENTIAL_BROKER_TOKEN: z.ZodString;
|
|
5
|
-
BAKER_CONVEX_SITE_URL: z.ZodURL;
|
|
6
|
-
BAKER_CREDENTIAL_PROXY_PORT: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
7
|
-
BAKER_CA_DIR: z.ZodDefault<z.ZodString>;
|
|
8
|
-
BAKER_BROKER_SOCKET: z.ZodDefault<z.ZodString>;
|
|
9
|
-
}, z.core.$strip>;
|
|
10
|
-
export type BrokerEnv = z.infer<typeof envSchema>;
|
|
11
|
-
export declare function parseBrokerEnv(env?: NodeJS.ProcessEnv): z.ZodSafeParseResult<{
|
|
12
|
-
CREDENTIAL_BROKER_TOKEN: string;
|
|
13
|
-
BAKER_CONVEX_SITE_URL: string;
|
|
14
|
-
BAKER_CREDENTIAL_PROXY_PORT: number;
|
|
15
|
-
BAKER_CA_DIR: string;
|
|
16
|
-
BAKER_BROKER_SOCKET: string;
|
|
17
|
-
}>;
|
|
18
|
-
export {};
|
|
19
|
-
//# sourceMappingURL=env.d.ts.map
|
package/dist/broker/env.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/broker/env.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,SAAS;;;;;;iBAMb,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAElD,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB;;;;;;GAElE"}
|
package/dist/broker/env.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/** The broker's environment, parsed once at startup. */
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
import { DEFAULT_BROKER_SOCKET } from "./broker-client.js";
|
|
4
|
-
import { DEFAULT_CA_DIR } from "./ca.js";
|
|
5
|
-
import { DEFAULT_PROXY_PORT } from "./proxy.js";
|
|
6
|
-
const envSchema = z.object({
|
|
7
|
-
CREDENTIAL_BROKER_TOKEN: z.string().min(1),
|
|
8
|
-
BAKER_CONVEX_SITE_URL: z.url(),
|
|
9
|
-
BAKER_CREDENTIAL_PROXY_PORT: z.coerce.number().int().min(1).max(65_535).default(DEFAULT_PROXY_PORT),
|
|
10
|
-
BAKER_CA_DIR: z.string().min(1).default(DEFAULT_CA_DIR),
|
|
11
|
-
BAKER_BROKER_SOCKET: z.string().min(1).default(DEFAULT_BROKER_SOCKET),
|
|
12
|
-
});
|
|
13
|
-
export function parseBrokerEnv(env = process.env) {
|
|
14
|
-
return envSchema.safeParse(env);
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=env.js.map
|
package/dist/broker/env.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/broker/env.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,qBAAqB,EAAE,CAAC,CAAC,GAAG,EAAE;IAC9B,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACnG,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IACvD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;CACtE,CAAC,CAAC;AAIH,MAAM,UAAU,cAAc,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACjE,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/broker/main.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/broker/main.ts"],"names":[],"mappings":""}
|