@ratelkey/burrow-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -0
- package/dist/cjs/Burrow.js +30 -0
- package/dist/cjs/Burrow.js.map +1 -0
- package/dist/cjs/BurrowClient.js +110 -0
- package/dist/cjs/BurrowClient.js.map +1 -0
- package/dist/cjs/Errors.js +80 -0
- package/dist/cjs/Errors.js.map +1 -0
- package/dist/cjs/Identity.js +274 -0
- package/dist/cjs/Identity.js.map +1 -0
- package/dist/cjs/Model.js +143 -0
- package/dist/cjs/Model.js.map +1 -0
- package/dist/cjs/Signer.js +42 -0
- package/dist/cjs/Signer.js.map +1 -0
- package/dist/cjs/Tls.js +85 -0
- package/dist/cjs/Tls.js.map +1 -0
- package/dist/cjs/Transport.js +198 -0
- package/dist/cjs/Transport.js.map +1 -0
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/Burrow.d.ts +59 -0
- package/dist/esm/Burrow.d.ts.map +1 -0
- package/dist/esm/Burrow.js +27 -0
- package/dist/esm/Burrow.js.map +1 -0
- package/dist/esm/BurrowClient.d.ts +40 -0
- package/dist/esm/BurrowClient.d.ts.map +1 -0
- package/dist/esm/BurrowClient.js +106 -0
- package/dist/esm/BurrowClient.js.map +1 -0
- package/dist/esm/Errors.d.ts +57 -0
- package/dist/esm/Errors.d.ts.map +1 -0
- package/dist/esm/Errors.js +67 -0
- package/dist/esm/Errors.js.map +1 -0
- package/dist/esm/Identity.d.ts +62 -0
- package/dist/esm/Identity.d.ts.map +1 -0
- package/dist/esm/Identity.js +269 -0
- package/dist/esm/Identity.js.map +1 -0
- package/dist/esm/Model.d.ts +75 -0
- package/dist/esm/Model.d.ts.map +1 -0
- package/dist/esm/Model.js +137 -0
- package/dist/esm/Model.js.map +1 -0
- package/dist/esm/Signer.d.ts +19 -0
- package/dist/esm/Signer.d.ts.map +1 -0
- package/dist/esm/Signer.js +39 -0
- package/dist/esm/Signer.js.map +1 -0
- package/dist/esm/Tls.d.ts +71 -0
- package/dist/esm/Tls.d.ts.map +1 -0
- package/dist/esm/Tls.js +79 -0
- package/dist/esm/Tls.js.map +1 -0
- package/dist/esm/Transport.d.ts +29 -0
- package/dist/esm/Transport.d.ts.map +1 -0
- package/dist/esm/Transport.js +195 -0
- package/dist/esm/Transport.js.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/package.json +1 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { request as httpRequest } from "node:http";
|
|
2
|
+
import { connect as netConnect, isIP } from "node:net";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { connect as tlsConnect } from "node:tls";
|
|
5
|
+
import { BurrowAuthException, BurrowCertificateException, BurrowException, BurrowForbiddenException, BurrowNotFoundException, BurrowServerException, BurrowTransportException, } from "./Errors.js";
|
|
6
|
+
import { fingerprintsEqual, PinStore, publicKeyPin } from "./Tls.js";
|
|
7
|
+
const TIMEOUT_MS = 15_000;
|
|
8
|
+
/**
|
|
9
|
+
* Performs signed machine-plane GETs against one Burrow, applying the configured {@link TlsMode}. Burrows
|
|
10
|
+
* serve HTTPS self-signed by default, so `TlsMode.Pinned` pins the certificate trust-on-first-use and
|
|
11
|
+
* refuses a changed one. Maps the Burrow's HTTP status + `{"error": …}` body to the typed
|
|
12
|
+
* {@link BurrowException}s, and surfaces the Burrow's own rejection reason verbatim.
|
|
13
|
+
*
|
|
14
|
+
* The TLS handshake is completed and the pin checked BEFORE the HTTP request is handed the socket, so a
|
|
15
|
+
* mismatched certificate never sees the signed `Ratel-*` headers. That ordering is the whole point of
|
|
16
|
+
* pinning, and it is why this dials the socket itself rather than letting the HTTP agent do it.
|
|
17
|
+
*/
|
|
18
|
+
export class Transport {
|
|
19
|
+
tls;
|
|
20
|
+
base;
|
|
21
|
+
pins;
|
|
22
|
+
/** The fingerprint currently enforced. Null in trust-on-first-use mode until the first pin is learned. */
|
|
23
|
+
pinned;
|
|
24
|
+
constructor(burrowUrl, tls,
|
|
25
|
+
/** This Burrow's identity directory — where its pinned key lives, beside the key that signs for it. */
|
|
26
|
+
identityDir) {
|
|
27
|
+
this.tls = tls;
|
|
28
|
+
this.base = burrowUrl.replace(/\/+$/, "");
|
|
29
|
+
this.pins = new PinStore(identityDir);
|
|
30
|
+
this.pinned = tls.kind === "pinnedTo" ? tls.fingerprint : tls.kind === "pinned" ? this.pins.read() : null;
|
|
31
|
+
}
|
|
32
|
+
/** Signed GET, returning the response body on 2xx; throws a typed {@link BurrowException} otherwise. */
|
|
33
|
+
async get(path, headers) {
|
|
34
|
+
const url = this.resolve(path);
|
|
35
|
+
const conn = await this.connect(url);
|
|
36
|
+
let status;
|
|
37
|
+
let body;
|
|
38
|
+
try {
|
|
39
|
+
({ status, body } = await exchange(conn.socket, url, headers));
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new BurrowTransportException(`reaching burrow ${this.base}: ${messageOf(e)}`, { cause: e });
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
conn.socket.destroy();
|
|
46
|
+
}
|
|
47
|
+
if (status < 200 || status > 299)
|
|
48
|
+
throw this.errorFor(status, body);
|
|
49
|
+
this.commitPinIfNew(conn.fingerprint);
|
|
50
|
+
return body;
|
|
51
|
+
}
|
|
52
|
+
resolve(path) {
|
|
53
|
+
let url;
|
|
54
|
+
try {
|
|
55
|
+
url = new URL(this.base + path);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
throw new BurrowTransportException(`invalid burrow URL '${this.base}${path}': ${messageOf(e)}`, { cause: e });
|
|
59
|
+
}
|
|
60
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
61
|
+
throw new BurrowTransportException(`burrow URL '${this.base}' is not http(s)`);
|
|
62
|
+
}
|
|
63
|
+
return url;
|
|
64
|
+
}
|
|
65
|
+
/** Dial the Burrow and, for the pinned modes, verify its certificate before anything is written. */
|
|
66
|
+
connect(url) {
|
|
67
|
+
const host = url.hostname;
|
|
68
|
+
const port = url.port.length > 0 ? Number(url.port) : url.protocol === "https:" ? 443 : 80;
|
|
69
|
+
// Pinning is authoritative for a self-signed Burrow, so the CA chain and hostname checks are waived —
|
|
70
|
+
// the certificate is reached by IP or a self-signed domain that no SAN or CA would match. SystemTrust
|
|
71
|
+
// keeps the full standard verification and needs no pin check of its own.
|
|
72
|
+
const pinning = this.tls.kind !== "systemTrust";
|
|
73
|
+
const socket = url.protocol === "http:"
|
|
74
|
+
? netConnect({ host, port })
|
|
75
|
+
: tlsConnect({
|
|
76
|
+
host,
|
|
77
|
+
port,
|
|
78
|
+
// SNI carries a hostname; an IP literal is not a legal server name.
|
|
79
|
+
...(isIP(host) === 0 ? { servername: host } : {}),
|
|
80
|
+
rejectUnauthorized: !pinning,
|
|
81
|
+
});
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
const finish = (settle) => {
|
|
84
|
+
socket.removeListener("error", onError);
|
|
85
|
+
socket.removeListener("timeout", onTimeout);
|
|
86
|
+
socket.removeListener("secureConnect", onSecure);
|
|
87
|
+
socket.removeListener("connect", onPlain);
|
|
88
|
+
socket.setTimeout(0);
|
|
89
|
+
// Hold a no-op error listener so a fault between here and the HTTP client taking the socket over is
|
|
90
|
+
// never an unhandled 'error' event, which would take the process down.
|
|
91
|
+
socket.on("error", ignore);
|
|
92
|
+
settle();
|
|
93
|
+
};
|
|
94
|
+
const onError = (e) => finish(() => reject(new BurrowTransportException(`reaching burrow ${this.base}: ${e.message}`, { cause: e })));
|
|
95
|
+
const onTimeout = () => {
|
|
96
|
+
socket.destroy();
|
|
97
|
+
finish(() => reject(new BurrowTransportException(`reaching burrow ${this.base}: timed out after ${TIMEOUT_MS}ms`)));
|
|
98
|
+
};
|
|
99
|
+
const onPlain = () => finish(() => resolve({ socket, fingerprint: null }));
|
|
100
|
+
const onSecure = () => {
|
|
101
|
+
if (!pinning) {
|
|
102
|
+
finish(() => resolve({ socket, fingerprint: null }));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const der = socket.getPeerCertificate().raw;
|
|
106
|
+
if (der === undefined || der.length === 0) {
|
|
107
|
+
socket.destroy();
|
|
108
|
+
finish(() => reject(new BurrowCertificateException("Burrow presented no certificate")));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const seen = publicKeyPin(der);
|
|
112
|
+
const pin = this.pinned;
|
|
113
|
+
if (pin !== null && !fingerprintsEqual(seen, pin)) {
|
|
114
|
+
socket.destroy();
|
|
115
|
+
finish(() => reject(new BurrowCertificateException(`Burrow key does not match the pinned one (pinned=${pin}, got=${seen})`)));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
finish(() => resolve({ socket, fingerprint: seen }));
|
|
119
|
+
};
|
|
120
|
+
socket.setTimeout(TIMEOUT_MS);
|
|
121
|
+
socket.once("timeout", onTimeout);
|
|
122
|
+
socket.once("error", onError);
|
|
123
|
+
if (url.protocol === "https:")
|
|
124
|
+
socket.once("secureConnect", onSecure);
|
|
125
|
+
else
|
|
126
|
+
socket.once("connect", onPlain);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
commitPinIfNew(fingerprint) {
|
|
130
|
+
if (fingerprint === null)
|
|
131
|
+
return;
|
|
132
|
+
if (this.tls.kind !== "pinned")
|
|
133
|
+
return; // only TOFU persists; PinnedTo is caller-fixed, never learned
|
|
134
|
+
if (this.pinned !== null)
|
|
135
|
+
return;
|
|
136
|
+
this.pins.write(fingerprint);
|
|
137
|
+
this.pinned = fingerprint; // enforce on subsequent requests within this process too
|
|
138
|
+
}
|
|
139
|
+
errorFor(status, body) {
|
|
140
|
+
let reason = "";
|
|
141
|
+
try {
|
|
142
|
+
const parsed = JSON.parse(body);
|
|
143
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
144
|
+
const e = parsed.error;
|
|
145
|
+
if (typeof e === "string")
|
|
146
|
+
reason = e;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Not JSON — fall back to the raw body below.
|
|
151
|
+
}
|
|
152
|
+
if (reason.trim().length === 0)
|
|
153
|
+
reason = body.trim().length > 0 ? body.trim() : "(no message)";
|
|
154
|
+
switch (status) {
|
|
155
|
+
case 401:
|
|
156
|
+
return new BurrowAuthException(reason);
|
|
157
|
+
case 403:
|
|
158
|
+
return new BurrowForbiddenException(reason);
|
|
159
|
+
case 404:
|
|
160
|
+
return new BurrowNotFoundException(reason);
|
|
161
|
+
default:
|
|
162
|
+
return new BurrowServerException(status, reason);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Write the GET over an already-connected (and, for HTTPS, already-verified) socket and read the response. */
|
|
167
|
+
function exchange(socket, url, headers) {
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
const req = httpRequest({
|
|
170
|
+
method: "GET",
|
|
171
|
+
// No agent, and createConnection hands back the socket we already dialled — host/port here only shape
|
|
172
|
+
// the request line, nothing is dialled again.
|
|
173
|
+
createConnection: () => socket,
|
|
174
|
+
host: url.hostname,
|
|
175
|
+
path: url.pathname + url.search,
|
|
176
|
+
headers: { ...headers, Accept: "application/json", Host: url.host },
|
|
177
|
+
});
|
|
178
|
+
req.setTimeout(TIMEOUT_MS, () => req.destroy(new Error(`timed out after ${TIMEOUT_MS}ms`)));
|
|
179
|
+
req.on("error", reject);
|
|
180
|
+
req.on("response", (res) => {
|
|
181
|
+
const chunks = [];
|
|
182
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
183
|
+
res.on("error", reject);
|
|
184
|
+
res.on("end", () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString("utf8") }));
|
|
185
|
+
});
|
|
186
|
+
req.end();
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function ignore() {
|
|
190
|
+
// Deliberately empty: see the note in Transport.connect.
|
|
191
|
+
}
|
|
192
|
+
function messageOf(e) {
|
|
193
|
+
return e instanceof Error ? e.message : String(e);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=Transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transport.js","sourceRoot":"","sources":["../../src/Transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { Burrow, DEFAULT_CLIENT_TAG, SDK_VERSION } from "./Burrow.js";
|
|
2
|
+
export type { BurrowFactory, BurrowOptions, ConnectOptions } from "./Burrow.js";
|
|
3
|
+
export type { BurrowClient } from "./BurrowClient.js";
|
|
4
|
+
export { ProjectAccess, Secret, SecretCoordinate } from "./Model.js";
|
|
5
|
+
export type { SecretField } from "./Model.js";
|
|
6
|
+
export { Identities, MachineIdentity } from "./Identity.js";
|
|
7
|
+
export { TlsMode } from "./Tls.js";
|
|
8
|
+
export { BurrowAuthException, BurrowCertificateException, BurrowException, BurrowForbiddenException, BurrowIdentityException, BurrowNotFoundException, BurrowServerException, BurrowTransportException, FieldNotFoundException, SecretShapeException, } from "./Errors.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Burrow, DEFAULT_CLIENT_TAG, SDK_VERSION } from "./Burrow.js";
|
|
2
|
+
export { ProjectAccess, Secret, SecretCoordinate } from "./Model.js";
|
|
3
|
+
export { Identities, MachineIdentity } from "./Identity.js";
|
|
4
|
+
export { TlsMode } from "./Tls.js";
|
|
5
|
+
export { BurrowAuthException, BurrowCertificateException, BurrowException, BurrowForbiddenException, BurrowIdentityException, BurrowNotFoundException, BurrowServerException, BurrowTransportException, FieldNotFoundException, SecretShapeException, } from "./Errors.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"@ratelkey/burrow-sdk","version":"0.1.0","description":"Read secrets from a self-hosted RatelKey Burrow with a machine identity.","type":"module","engines":{"node":">=18.17"},"main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./package.json":"./package.json"},"files":["dist","README.md"],"scripts":{"build":"node scripts/build.mjs","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.0"},"keywords":["ratelkey","burrow","secrets","sdk"]}
|