@homeflare/distilled-openbao 0.2.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/LICENSE +201 -0
- package/README.md +78 -0
- package/dist/credentials.d.ts +32 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +66 -0
- package/dist/credentials.js.map +1 -0
- package/dist/credentials.test.d.ts +2 -0
- package/dist/credentials.test.d.ts.map +1 -0
- package/dist/credentials.test.js +29 -0
- package/dist/credentials.test.js.map +1 -0
- package/dist/errors.d.ts +57 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +18 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +96 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocol.test.d.ts +2 -0
- package/dist/protocol.test.d.ts.map +1 -0
- package/dist/protocol.test.js +78 -0
- package/dist/protocol.test.js.map +1 -0
- package/dist/retry.d.ts +60 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +53 -0
- package/dist/retry.js.map +1 -0
- package/dist/services/alias.d.ts +73 -0
- package/dist/services/alias.d.ts.map +1 -0
- package/dist/services/alias.js +91 -0
- package/dist/services/alias.js.map +1 -0
- package/dist/services/approle.d.ts +918 -0
- package/dist/services/approle.d.ts.map +1 -0
- package/dist/services/approle.js +1206 -0
- package/dist/services/approle.js.map +1 -0
- package/dist/services/auditing.d.ts +97 -0
- package/dist/services/auditing.d.ts.map +1 -0
- package/dist/services/auditing.js +158 -0
- package/dist/services/auditing.js.map +1 -0
- package/dist/services/auth.d.ts +160 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +169 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/collect.d.ts +35 -0
- package/dist/services/collect.d.ts.map +1 -0
- package/dist/services/collect.js +46 -0
- package/dist/services/collect.js.map +1 -0
- package/dist/services/configure.d.ts +35 -0
- package/dist/services/configure.d.ts.map +1 -0
- package/dist/services/configure.js +43 -0
- package/dist/services/configure.js.map +1 -0
- package/dist/services/cors.d.ts +54 -0
- package/dist/services/cors.d.ts.map +1 -0
- package/dist/services/cors.js +65 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/cubbyhole.d.ts +40 -0
- package/dist/services/cubbyhole.d.ts.map +1 -0
- package/dist/services/cubbyhole.js +56 -0
- package/dist/services/cubbyhole.js.map +1 -0
- package/dist/services/database.d.ts +278 -0
- package/dist/services/database.d.ts.map +1 -0
- package/dist/services/database.js +384 -0
- package/dist/services/database.js.map +1 -0
- package/dist/services/decode.d.ts +18 -0
- package/dist/services/decode.d.ts.map +1 -0
- package/dist/services/decode.js +24 -0
- package/dist/services/decode.js.map +1 -0
- package/dist/services/entity.d.ts +257 -0
- package/dist/services/entity.d.ts.map +1 -0
- package/dist/services/entity.js +313 -0
- package/dist/services/entity.js.map +1 -0
- package/dist/services/generate.d.ts +136 -0
- package/dist/services/generate.d.ts.map +1 -0
- package/dist/services/generate.js +188 -0
- package/dist/services/generate.js.map +1 -0
- package/dist/services/group.d.ts +244 -0
- package/dist/services/group.d.ts.map +1 -0
- package/dist/services/group.js +277 -0
- package/dist/services/group.js.map +1 -0
- package/dist/services/ha.d.ts +17 -0
- package/dist/services/ha.d.ts.map +1 -0
- package/dist/services/ha.js +24 -0
- package/dist/services/ha.js.map +1 -0
- package/dist/services/index.d.ts +54 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +55 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/initialize.d.ts +34 -0
- package/dist/services/initialize.d.ts.map +1 -0
- package/dist/services/initialize.js +31 -0
- package/dist/services/initialize.js.map +1 -0
- package/dist/services/internal.d.ts +131 -0
- package/dist/services/internal.d.ts.map +1 -0
- package/dist/services/internal.js +199 -0
- package/dist/services/internal.js.map +1 -0
- package/dist/services/jwt.d.ts +684 -0
- package/dist/services/jwt.d.ts.map +1 -0
- package/dist/services/jwt.js +801 -0
- package/dist/services/jwt.js.map +1 -0
- package/dist/services/kubernetes.d.ts +166 -0
- package/dist/services/kubernetes.d.ts.map +1 -0
- package/dist/services/kubernetes.js +187 -0
- package/dist/services/kubernetes.js.map +1 -0
- package/dist/services/kv.d.ts +519 -0
- package/dist/services/kv.d.ts.map +1 -0
- package/dist/services/kv.js +655 -0
- package/dist/services/kv.js.map +1 -0
- package/dist/services/leader.d.ts +21 -0
- package/dist/services/leader.d.ts.map +1 -0
- package/dist/services/leader.js +29 -0
- package/dist/services/leader.js.map +1 -0
- package/dist/services/leases.d.ts +185 -0
- package/dist/services/leases.d.ts.map +1 -0
- package/dist/services/leases.js +238 -0
- package/dist/services/leases.js.map +1 -0
- package/dist/services/locked.d.ts +27 -0
- package/dist/services/locked.d.ts.map +1 -0
- package/dist/services/locked.js +42 -0
- package/dist/services/locked.js.map +1 -0
- package/dist/services/loggers.d.ts +69 -0
- package/dist/services/loggers.d.ts.map +1 -0
- package/dist/services/loggers.js +100 -0
- package/dist/services/loggers.js.map +1 -0
- package/dist/services/mfa.d.ts +386 -0
- package/dist/services/mfa.d.ts.map +1 -0
- package/dist/services/mfa.js +553 -0
- package/dist/services/mfa.js.map +1 -0
- package/dist/services/misc.d.ts +103 -0
- package/dist/services/misc.d.ts.map +1 -0
- package/dist/services/misc.js +120 -0
- package/dist/services/misc.js.map +1 -0
- package/dist/services/mounts.d.ts +173 -0
- package/dist/services/mounts.d.ts.map +1 -0
- package/dist/services/mounts.js +168 -0
- package/dist/services/mounts.js.map +1 -0
- package/dist/services/namespaces.d.ts +257 -0
- package/dist/services/namespaces.d.ts.map +1 -0
- package/dist/services/namespaces.js +320 -0
- package/dist/services/namespaces.js.map +1 -0
- package/dist/services/oidc.d.ts +509 -0
- package/dist/services/oidc.d.ts.map +1 -0
- package/dist/services/oidc.js +718 -0
- package/dist/services/oidc.js.map +1 -0
- package/dist/services/persona.d.ts +73 -0
- package/dist/services/persona.d.ts.map +1 -0
- package/dist/services/persona.js +91 -0
- package/dist/services/persona.js.map +1 -0
- package/dist/services/pki.d.ts +5783 -0
- package/dist/services/pki.d.ts.map +1 -0
- package/dist/services/pki.js +4995 -0
- package/dist/services/pki.js.map +1 -0
- package/dist/services/plugins.d.ts +203 -0
- package/dist/services/plugins.d.ts.map +1 -0
- package/dist/services/plugins.js +237 -0
- package/dist/services/plugins.js.map +1 -0
- package/dist/services/policies.d.ts +250 -0
- package/dist/services/policies.d.ts.map +1 -0
- package/dist/services/policies.js +312 -0
- package/dist/services/policies.js.map +1 -0
- package/dist/services/pprof.d.ts +104 -0
- package/dist/services/pprof.d.ts.map +1 -0
- package/dist/services/pprof.js +161 -0
- package/dist/services/pprof.js.map +1 -0
- package/dist/services/query.d.ts +65 -0
- package/dist/services/query.d.ts.map +1 -0
- package/dist/services/query.js +66 -0
- package/dist/services/query.js.map +1 -0
- package/dist/services/rate.d.ts +102 -0
- package/dist/services/rate.d.ts.map +1 -0
- package/dist/services/rate.js +129 -0
- package/dist/services/rate.js.map +1 -0
- package/dist/services/raw.d.ts +85 -0
- package/dist/services/raw.d.ts.map +1 -0
- package/dist/services/raw.js +116 -0
- package/dist/services/raw.js.map +1 -0
- package/dist/services/read.d.ts +87 -0
- package/dist/services/read.d.ts.map +1 -0
- package/dist/services/read.js +123 -0
- package/dist/services/read.js.map +1 -0
- package/dist/services/rekey.d.ts +184 -0
- package/dist/services/rekey.d.ts.map +1 -0
- package/dist/services/rekey.js +243 -0
- package/dist/services/rekey.js.map +1 -0
- package/dist/services/reload.d.ts +15 -0
- package/dist/services/reload.d.ts.map +1 -0
- package/dist/services/reload.js +27 -0
- package/dist/services/reload.js.map +1 -0
- package/dist/services/remount.d.ts +18 -0
- package/dist/services/remount.d.ts.map +1 -0
- package/dist/services/remount.js +30 -0
- package/dist/services/remount.js.map +1 -0
- package/dist/services/root.d.ts +134 -0
- package/dist/services/root.d.ts.map +1 -0
- package/dist/services/root.js +180 -0
- package/dist/services/root.js.map +1 -0
- package/dist/services/rotate.d.ts +367 -0
- package/dist/services/rotate.d.ts.map +1 -0
- package/dist/services/rotate.js +473 -0
- package/dist/services/rotate.js.map +1 -0
- package/dist/services/seal.d.ts +29 -0
- package/dist/services/seal.d.ts.map +1 -0
- package/dist/services/seal.js +37 -0
- package/dist/services/seal.js.map +1 -0
- package/dist/services/ssh.d.ts +491 -0
- package/dist/services/ssh.d.ts.map +1 -0
- package/dist/services/ssh.js +582 -0
- package/dist/services/ssh.js.map +1 -0
- package/dist/services/status.d.ts +17 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +25 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/step.d.ts +14 -0
- package/dist/services/step.d.ts.map +1 -0
- package/dist/services/step.js +21 -0
- package/dist/services/step.js.map +1 -0
- package/dist/services/system.d.ts +33 -0
- package/dist/services/system.d.ts.map +1 -0
- package/dist/services/system.js +47 -0
- package/dist/services/system.js.map +1 -0
- package/dist/services/token.d.ts +408 -0
- package/dist/services/token.d.ts.map +1 -0
- package/dist/services/token.js +415 -0
- package/dist/services/token.js.map +1 -0
- package/dist/services/ui.d.ts +70 -0
- package/dist/services/ui.d.ts.map +1 -0
- package/dist/services/ui.js +95 -0
- package/dist/services/ui.js.map +1 -0
- package/dist/services/update.d.ts +25 -0
- package/dist/services/update.d.ts.map +1 -0
- package/dist/services/update.js +36 -0
- package/dist/services/update.js.map +1 -0
- package/dist/services/userpass.d.ts +151 -0
- package/dist/services/userpass.d.ts.map +1 -0
- package/dist/services/userpass.js +177 -0
- package/dist/services/userpass.js.map +1 -0
- package/dist/services/version.d.ts +22 -0
- package/dist/services/version.d.ts.map +1 -0
- package/dist/services/version.js +28 -0
- package/dist/services/version.js.map +1 -0
- package/dist/services/workflows.d.ts +122 -0
- package/dist/services/workflows.d.ts.map +1 -0
- package/dist/services/workflows.js +149 -0
- package/dist/services/workflows.js.map +1 -0
- package/dist/traits.d.ts +11 -0
- package/dist/traits.d.ts.map +1 -0
- package/dist/traits.js +12 -0
- package/dist/traits.js.map +1 -0
- package/package.json +75 -0
- package/src/credentials.test.ts +36 -0
- package/src/credentials.ts +100 -0
- package/src/errors.ts +73 -0
- package/src/index.ts +33 -0
- package/src/protocol.test.ts +123 -0
- package/src/protocol.ts +120 -0
- package/src/retry.ts +84 -0
- package/src/services/alias.ts +208 -0
- package/src/services/approle.ts +2750 -0
- package/src/services/auditing.ts +318 -0
- package/src/services/auth.ts +416 -0
- package/src/services/collect.ts +103 -0
- package/src/services/configure.ts +94 -0
- package/src/services/cors.ts +155 -0
- package/src/services/cubbyhole.ts +117 -0
- package/src/services/database.ts +854 -0
- package/src/services/decode.ts +49 -0
- package/src/services/entity.ts +744 -0
- package/src/services/generate.ts +409 -0
- package/src/services/group.ts +677 -0
- package/src/services/ha.ts +52 -0
- package/src/services/index.ts +54 -0
- package/src/services/initialize.ts +76 -0
- package/src/services/internal.ts +425 -0
- package/src/services/jwt.ts +1838 -0
- package/src/services/kubernetes.ts +446 -0
- package/src/services/kv.ts +1480 -0
- package/src/services/leader.ts +57 -0
- package/src/services/leases.ts +532 -0
- package/src/services/locked.ts +86 -0
- package/src/services/loggers.ts +215 -0
- package/src/services/mfa.ts +1193 -0
- package/src/services/misc.ts +286 -0
- package/src/services/mounts.ts +428 -0
- package/src/services/namespaces.ts +707 -0
- package/src/services/oidc.ts +1613 -0
- package/src/services/persona.ts +210 -0
- package/src/services/pki.ts +13320 -0
- package/src/services/plugins.ts +549 -0
- package/src/services/policies.ts +689 -0
- package/src/services/pprof.ts +351 -0
- package/src/services/query.ts +170 -0
- package/src/services/rate.ts +303 -0
- package/src/services/raw.ts +244 -0
- package/src/services/read.ts +266 -0
- package/src/services/rekey.ts +540 -0
- package/src/services/reload.ts +51 -0
- package/src/services/remount.ts +58 -0
- package/src/services/root.ts +393 -0
- package/src/services/rotate.ts +1088 -0
- package/src/services/seal.ts +75 -0
- package/src/services/ssh.ts +1351 -0
- package/src/services/status.ts +51 -0
- package/src/services/step.ts +43 -0
- package/src/services/system.ts +98 -0
- package/src/services/token.ts +1046 -0
- package/src/services/ui.ts +207 -0
- package/src/services/update.ts +73 -0
- package/src/services/userpass.ts +410 -0
- package/src/services/version.ts +60 -0
- package/src/services/workflows.ts +327 -0
- package/src/traits.ts +45 -0
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBaoProtocol — the shared bearer-REST protocol instantiated for
|
|
3
|
+
* OpenBao.
|
|
4
|
+
*
|
|
5
|
+
* OpenBao wraps every "logical" response (the vast majority — reads,
|
|
6
|
+
* mount/auth/role CRUD) in an envelope: `{ request_id, lease_id,
|
|
7
|
+
* renewable, lease_duration, data: {...}, wrap_info, warnings, auth }`.
|
|
8
|
+
* The generated response schemas describe the INNER `data` shape only — the
|
|
9
|
+
* OpenAPI document OpenBao's own generator produces documents just that
|
|
10
|
+
* (measured against `.generated-specs/policies.json`'s
|
|
11
|
+
* `PoliciesReadAclPolicyResponse`, which has no `request_id`/`lease_id`/etc
|
|
12
|
+
* member at all) — so `transformResponse` below unwraps `data` before
|
|
13
|
+
* decoding, exactly the rule the kit's hand-rolled client already applies
|
|
14
|
+
* (`packages/alchemy/src/openbao/bao-http.ts`'s `baoRead`: take `data` when
|
|
15
|
+
* it is an object, the whole body otherwise). A handful of endpoints are
|
|
16
|
+
* NOT logical responses and have no `data` envelope at all — `sys/health`,
|
|
17
|
+
* `sys/seal-status`, `sys/leader` answer their fields at the top level — so
|
|
18
|
+
* the unwrap only fires when `data` is actually present and an object,
|
|
19
|
+
* which leaves those untouched.
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ NOT YET HANDLED: auth/login responses (`auth/<mount>/login`, and every
|
|
22
|
+
* `*-login` operation) wrap their payload under `auth`, not `data` — this
|
|
23
|
+
* protocol does not unwrap that shape yet. No migrated family calls a login
|
|
24
|
+
* endpoint through this SDK today; add an `auth`-aware unwrap (or a
|
|
25
|
+
* dedicated response trait) before one does.
|
|
26
|
+
*
|
|
27
|
+
* Failures carry `{"errors": [...]}` — zero or more strings, and often
|
|
28
|
+
* literally empty (measured 2026-09-24: OpenBao 2.6.2 answers a missing ACL
|
|
29
|
+
* policy read with `404 {"errors":[]}`, no text). There is normally no
|
|
30
|
+
* machine-readable code, so typed errors beyond the status-derived ones
|
|
31
|
+
* match on status, or on message when OpenBao actually supplies one — see
|
|
32
|
+
* `patches/`.
|
|
33
|
+
*
|
|
34
|
+
* Authentication is a single header, `X-Vault-Token`, plus an optional
|
|
35
|
+
* `X-Vault-Namespace` when the credential carries one — the estate always
|
|
36
|
+
* does (`BAO_NAMESPACE=homeflare`). A namespace does not change a mounted
|
|
37
|
+
* backend's own path shape (see `stacks/distilled-submodules/spec-repos/
|
|
38
|
+
* openbao/fetch-specs.ts`'s module docs for how that was confirmed), so it
|
|
39
|
+
* is purely a request header here, never a path segment.
|
|
40
|
+
*/
|
|
41
|
+
import * as Effect from "effect/Effect";
|
|
42
|
+
import * as Redacted from "effect/Redacted";
|
|
43
|
+
import { makeRestProtocol, } from "@distilled.cloud/core/protocol-rest";
|
|
44
|
+
import { Credentials } from "./credentials.js";
|
|
45
|
+
import { UnknownOpenBaoError } from "./errors.js";
|
|
46
|
+
/**
|
|
47
|
+
* OpenBao error bodies are `{"errors": [...]}`. Several strings are joined
|
|
48
|
+
* (`"; "`) rather than only the first kept, so a matcher's `includes` still
|
|
49
|
+
* sees text further down the list; an empty array (the common 404 shape)
|
|
50
|
+
* yields no `message`, and the protocol's own `HTTP <status>` fallback
|
|
51
|
+
* covers it. A response that arrives without that envelope (a proxy 502, an
|
|
52
|
+
* HTML error page) falls through to the same fallback.
|
|
53
|
+
*/
|
|
54
|
+
const errorEnvelope = (body) => {
|
|
55
|
+
if (body === null || typeof body !== "object")
|
|
56
|
+
return undefined;
|
|
57
|
+
const b = body;
|
|
58
|
+
if (!Array.isArray(b.errors))
|
|
59
|
+
return undefined;
|
|
60
|
+
const messages = b.errors.filter((e) => typeof e === "string");
|
|
61
|
+
return { message: messages.length > 0 ? messages.join("; ") : undefined };
|
|
62
|
+
};
|
|
63
|
+
/** Unwrap the `data` envelope — see this file's module docs. */
|
|
64
|
+
const transformResponse = (body) => {
|
|
65
|
+
if (body === null || typeof body !== "object")
|
|
66
|
+
return body;
|
|
67
|
+
const data = body.data;
|
|
68
|
+
return typeof data === "object" && data !== null ? data : body;
|
|
69
|
+
};
|
|
70
|
+
export const OpenBaoProtocol = makeRestProtocol({
|
|
71
|
+
// Resolved on the CALLING fiber per request (the layer is memoized per
|
|
72
|
+
// process); the Credentials service holds an effect, so a token rotated
|
|
73
|
+
// between calls is picked up without rebuilding the layer.
|
|
74
|
+
credentials: Effect.gen(function* () {
|
|
75
|
+
const resolve = yield* Credentials;
|
|
76
|
+
return yield* resolve;
|
|
77
|
+
}),
|
|
78
|
+
baseUrl: (creds) => creds.apiBaseUrl,
|
|
79
|
+
headers: (creds) => ({
|
|
80
|
+
"X-Vault-Token": Redacted.value(creds.token),
|
|
81
|
+
...(creds.namespace ? { "X-Vault-Namespace": creds.namespace } : {}),
|
|
82
|
+
Accept: "application/json",
|
|
83
|
+
}),
|
|
84
|
+
errorEnvelope,
|
|
85
|
+
transformResponse,
|
|
86
|
+
unknownError: ({ code, message, body }) => new UnknownOpenBaoError({
|
|
87
|
+
code: typeof code === "string"
|
|
88
|
+
? code
|
|
89
|
+
: code !== undefined
|
|
90
|
+
? String(code)
|
|
91
|
+
: undefined,
|
|
92
|
+
message,
|
|
93
|
+
body,
|
|
94
|
+
}),
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAK5C,OAAO,EACL,gBAAgB,GAEjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAgBtE;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG,CAAC,IAAa,EAAiC,EAAE;IACrE,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC5E,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC5E,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAW,EAAE;IACnD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAI,IAAgC,CAAC,IAAI,CAAC;IACpD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,gBAAgB,CAAS;IACvB,uEAAuE;IACvE,wEAAwE;IACxE,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnB,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IACF,aAAa;IACb,iBAAiB;IACjB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,mBAAmB,CAAC;QACtB,IAAI,EACF,OAAO,IAAI,KAAK,QAAQ;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,CAAC,CAAC,SAAS;QACjB,OAAO;QACP,IAAI;KACL,CAAC;CACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proves the two measured, package-specific rules in `protocol.ts`: the
|
|
3
|
+
* `{"errors": [...]}` envelope (often empty — the common 404 shape) and the
|
|
4
|
+
* `data`-envelope unwrap on 2xx bodies. Same pattern as
|
|
5
|
+
* `@distilled.cloud/proxmox`'s `protocol.test.ts` (a fake `HttpClient`
|
|
6
|
+
* layer in front of a real generated operation), written after that file's
|
|
7
|
+
* own history: an adversarial review is what caught the proxmox bug this
|
|
8
|
+
* pattern exists to stop recurring, so OpenBao gets the same coverage from
|
|
9
|
+
* the start rather than after its own incident.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, expect, test } from "bun:test";
|
|
12
|
+
import * as Effect from "effect/Effect";
|
|
13
|
+
import * as Layer from "effect/Layer";
|
|
14
|
+
import * as HttpClient from "effect/unstable/http/HttpClient";
|
|
15
|
+
import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
|
|
16
|
+
import { credentials } from "./credentials.js";
|
|
17
|
+
import { Forbidden, UnknownOpenBaoError } from "./errors.js";
|
|
18
|
+
import * as Retry from "./retry.js";
|
|
19
|
+
import { PolicyNotFound, policiesReadAclPolicy } from "./services/policies.js";
|
|
20
|
+
const testCredentials = credentials({
|
|
21
|
+
token: "test-token",
|
|
22
|
+
addr: "http://127.0.0.1:8299",
|
|
23
|
+
namespace: "homeflare",
|
|
24
|
+
});
|
|
25
|
+
const fakeOpenBao = (status, body) => Layer.succeed(HttpClient.HttpClient, HttpClient.make((request) => Effect.sync(() => HttpClientResponse.fromWeb(request, new Response(body === undefined ? undefined : JSON.stringify(body), {
|
|
26
|
+
status,
|
|
27
|
+
})))));
|
|
28
|
+
const readAbsent = (status, body) => Effect.runPromise(policiesReadAclPolicy({ name: "zz-probe-absent" }).pipe(Retry.none, Effect.provide(Layer.mergeAll(fakeOpenBao(status, body), testCredentials)), Effect.flip));
|
|
29
|
+
describe("protocol.ts error decoding", () => {
|
|
30
|
+
test("a 404 with an EMPTY errors array (the measured absent-policy shape) is PolicyNotFound", async () => {
|
|
31
|
+
// Measured on OpenBao 2.6.2, 2026-09-24: GET sys/policies/acl/<absent>
|
|
32
|
+
// answers exactly this — see patches/policies/_errors.json.
|
|
33
|
+
const error = await readAbsent(404, { errors: [] });
|
|
34
|
+
expect(error).toBeInstanceOf(PolicyNotFound);
|
|
35
|
+
});
|
|
36
|
+
test("a 403 with an errors array falls back to core's status map (Forbidden), joined", async () => {
|
|
37
|
+
const error = await readAbsent(403, {
|
|
38
|
+
errors: ["permission denied", "token expired"],
|
|
39
|
+
});
|
|
40
|
+
expect(error).toBeInstanceOf(Forbidden);
|
|
41
|
+
expect(error).toMatchObject({
|
|
42
|
+
message: "permission denied; token expired",
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
// 418 is neither in HTTP_STATUS_MAP nor >= 500 (the unmapped-5xx fallback
|
|
46
|
+
// in core's makeRestProtocol answers InternalServerError for those before
|
|
47
|
+
// unknownError is ever reached).
|
|
48
|
+
test("a genuinely unmapped, non-5xx status still falls back to UnknownOpenBaoError", async () => {
|
|
49
|
+
const error = await readAbsent(418, { errors: ["teapot"] });
|
|
50
|
+
expect(error).toBeInstanceOf(UnknownOpenBaoError);
|
|
51
|
+
});
|
|
52
|
+
test('the {"data": ...} envelope is unwrapped before decode', async () => {
|
|
53
|
+
const result = await Effect.runPromise(policiesReadAclPolicy({ name: "agent" }).pipe(Effect.provide(Layer.mergeAll(fakeOpenBao(200, {
|
|
54
|
+
request_id: "r-1",
|
|
55
|
+
lease_id: "",
|
|
56
|
+
renewable: false,
|
|
57
|
+
lease_duration: 0,
|
|
58
|
+
data: { name: "agent", policy: 'path "secret/*" {}', version: 1 },
|
|
59
|
+
wrap_info: null,
|
|
60
|
+
warnings: null,
|
|
61
|
+
auth: null,
|
|
62
|
+
}), testCredentials))));
|
|
63
|
+
expect(result).toMatchObject({
|
|
64
|
+
name: "agent",
|
|
65
|
+
policy: 'path "secret/*" {}',
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test("sys/health-shaped bodies (no data envelope) pass through unchanged", async () => {
|
|
69
|
+
// Not every endpoint is a logical response — sys/health answers its
|
|
70
|
+
// fields at the top level, with no `data` wrapper. This operation never
|
|
71
|
+
// calls that endpoint; the test exercises transformResponse directly
|
|
72
|
+
// through a 2xx body that happens to have no `data` field, confirming
|
|
73
|
+
// the unwrap only fires when one is actually present.
|
|
74
|
+
const result = await Effect.runPromise(policiesReadAclPolicy({ name: "agent" }).pipe(Effect.provide(Layer.mergeAll(fakeOpenBao(200, { name: "agent", policy: "" }), testCredentials))));
|
|
75
|
+
expect(result).toMatchObject({ name: "agent", policy: "" });
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=protocol.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,MAAM,eAAe,GAAG,WAAW,CAAC;IAClC,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,uBAAuB;IAC7B,SAAS,EAAE,WAAW;CACvB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAa,EAAE,EAAE,CACpD,KAAK,CAAC,OAAO,CACX,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACf,kBAAkB,CAAC,OAAO,CACxB,OAAO,EACP,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;IAClE,MAAM;CACP,CAAC,CACH,CACF,CACF,CACF,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,IAAa,EAAE,EAAE,CACnD,MAAM,CAAC,UAAU,CACf,qBAAqB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,IAAI,CACrD,KAAK,CAAC,IAAI,EACV,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,CAAC,CAC3D,EACD,MAAM,CAAC,IAAI,CACZ,CACF,CAAC;AAEJ,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACvG,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE;YAClC,MAAM,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;YAC1B,OAAO,EAAE,kCAAkC;SAC5C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,IAAI,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CACpC,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC3C,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,QAAQ,CACZ,WAAW,CAAC,GAAG,EAAE;YACf,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,EAAE;YACjE,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;SACX,CAAC,EACF,eAAe,CAChB,CACF,CACF,CACF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;YAC3B,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACpF,oEAAoE;QACpE,wEAAwE;QACxE,qEAAqE;QACrE,sEAAsE;QACtE,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CACpC,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC3C,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,QAAQ,CACZ,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAC/C,eAAe,CAChB,CACF,CACF,CACF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBao retry surface — a veneer over `@distilled.cloud/core/retry`.
|
|
3
|
+
*
|
|
4
|
+
* The `Retry` service tag is threaded into every generated operation via
|
|
5
|
+
* `API.make({ retry: Retry })`, so a caller-installed policy applies to all
|
|
6
|
+
* OpenBao calls below it and core's `makeDefault` is the fallback when none
|
|
7
|
+
* is provided.
|
|
8
|
+
*
|
|
9
|
+
* ⚠️ THIS IS NOT THE ESTATE'S CONCURRENCY GATE. The kit's own
|
|
10
|
+
* `packages/alchemy/src/openbao/bao-http.ts` caps in-flight OpenBao
|
|
11
|
+
* exchanges at 8 process-wide (`BaoGate`, a `Semaphore`) after a real
|
|
12
|
+
* outage: unbounded Alchemy fan-out took the dev listener's socket down
|
|
13
|
+
* (measured 2026-09-14). That cap is `HttpClient` middleware, not a retry
|
|
14
|
+
* policy, and stays exactly where it is — the kit's Effect runtime provides
|
|
15
|
+
* the gated `HttpClient.HttpClient` layer underneath whichever protocol
|
|
16
|
+
* (hand-rolled or this SDK) issues the request, so it keeps applying
|
|
17
|
+
* unchanged to every call this package makes.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import * as OpenBao from "@distilled.cloud/openbao";
|
|
22
|
+
*
|
|
23
|
+
* myEffect.pipe(OpenBao.Retry.transient);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import * as Context from "effect/Context";
|
|
27
|
+
import * as Effect from "effect/Effect";
|
|
28
|
+
import * as Retries from "@distilled.cloud/core/retry";
|
|
29
|
+
export type Options = Retries.Options;
|
|
30
|
+
export type Factory = Retries.Factory;
|
|
31
|
+
export type Policy = Retries.Policy;
|
|
32
|
+
declare const Retry_base: Context.ServiceClass<Retry, "OpenBaoRetry", Retries.Policy>;
|
|
33
|
+
/** Context tag for configuring retry behavior of OpenBao API calls. */
|
|
34
|
+
export declare class Retry extends Retry_base {
|
|
35
|
+
}
|
|
36
|
+
/** Provides a custom retry policy to every OpenBao API call below it. */
|
|
37
|
+
export declare const policy: {
|
|
38
|
+
(options: Options): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Retry>>;
|
|
39
|
+
(factory: Factory): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Retry>>;
|
|
40
|
+
};
|
|
41
|
+
/** Disables all automatic retries. */
|
|
42
|
+
export declare const none: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Retry>>;
|
|
43
|
+
/**
|
|
44
|
+
* The default retry policy (core's): transient/throttling/retryable errors,
|
|
45
|
+
* capped exponential backoff with jitter, server `retryAfter` hints honored
|
|
46
|
+
* with precedence.
|
|
47
|
+
*/
|
|
48
|
+
export declare const makeDefault: Factory;
|
|
49
|
+
export declare const jittered: <Error, Env>(self: import("effect/Schedule").Schedule<unknown, unknown, Error, Env>) => import("effect/Schedule").Schedule<unknown, unknown, Error, Env>;
|
|
50
|
+
export declare const capped: (max: import("effect/Duration").Duration) => <Error, Env>(self: import("effect/Schedule").Schedule<unknown, unknown, Error, Env>) => import("effect/Schedule").Schedule<unknown, unknown, Error, Env>;
|
|
51
|
+
/** Retry options that retry all throttling errors indefinitely. */
|
|
52
|
+
export declare const throttlingOptions: Options;
|
|
53
|
+
/** Retries all throttling errors indefinitely (honoring server hints). */
|
|
54
|
+
export declare const throttling: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Retry>>;
|
|
55
|
+
/** Retry options that retry all transient errors indefinitely. */
|
|
56
|
+
export declare const transientOptions: Options;
|
|
57
|
+
/** Retries all transient errors indefinitely (honoring server hints). */
|
|
58
|
+
export declare const transient: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Retry>>;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;AAEpC,uEAAuE;AACvE,qBAAa,KAAM,SAAQ,UAAgD;CAAG;AAE9E,yEAAyE;AACzE,eAAO,MAAM,MAAM,EAAE;IACnB,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;CAEU,CAAC;AAEzD,sCAAsC;AACtC,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAEzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,OAA6B,CAAC;AAExD,eAAO,MAAM,QAAQ,0JAAmB,CAAC;AACzC,eAAO,MAAM,MAAM,uMAAiB,CAAC;AAErC,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,EAAE,OAAmC,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAqC,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,EAAE,OAAkC,CAAC;AAElE,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAoC,CAAC"}
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBao retry surface — a veneer over `@distilled.cloud/core/retry`.
|
|
3
|
+
*
|
|
4
|
+
* The `Retry` service tag is threaded into every generated operation via
|
|
5
|
+
* `API.make({ retry: Retry })`, so a caller-installed policy applies to all
|
|
6
|
+
* OpenBao calls below it and core's `makeDefault` is the fallback when none
|
|
7
|
+
* is provided.
|
|
8
|
+
*
|
|
9
|
+
* ⚠️ THIS IS NOT THE ESTATE'S CONCURRENCY GATE. The kit's own
|
|
10
|
+
* `packages/alchemy/src/openbao/bao-http.ts` caps in-flight OpenBao
|
|
11
|
+
* exchanges at 8 process-wide (`BaoGate`, a `Semaphore`) after a real
|
|
12
|
+
* outage: unbounded Alchemy fan-out took the dev listener's socket down
|
|
13
|
+
* (measured 2026-09-14). That cap is `HttpClient` middleware, not a retry
|
|
14
|
+
* policy, and stays exactly where it is — the kit's Effect runtime provides
|
|
15
|
+
* the gated `HttpClient.HttpClient` layer underneath whichever protocol
|
|
16
|
+
* (hand-rolled or this SDK) issues the request, so it keeps applying
|
|
17
|
+
* unchanged to every call this package makes.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import * as OpenBao from "@distilled.cloud/openbao";
|
|
22
|
+
*
|
|
23
|
+
* myEffect.pipe(OpenBao.Retry.transient);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import * as Context from "effect/Context";
|
|
27
|
+
import * as Effect from "effect/Effect";
|
|
28
|
+
import * as Layer from "effect/Layer";
|
|
29
|
+
import * as Retries from "@distilled.cloud/core/retry";
|
|
30
|
+
/** Context tag for configuring retry behavior of OpenBao API calls. */
|
|
31
|
+
export class Retry extends Context.Service()("OpenBaoRetry") {
|
|
32
|
+
}
|
|
33
|
+
/** Provides a custom retry policy to every OpenBao API call below it. */
|
|
34
|
+
export const policy = (optionsOrFactory) => Effect.provide(Layer.succeed(Retry, optionsOrFactory));
|
|
35
|
+
/** Disables all automatic retries. */
|
|
36
|
+
export const none = Effect.provide(Layer.succeed(Retry, { while: () => false }));
|
|
37
|
+
/**
|
|
38
|
+
* The default retry policy (core's): transient/throttling/retryable errors,
|
|
39
|
+
* capped exponential backoff with jitter, server `retryAfter` hints honored
|
|
40
|
+
* with precedence.
|
|
41
|
+
*/
|
|
42
|
+
export const makeDefault = Retries.makeDefault;
|
|
43
|
+
export const jittered = Retries.jittered;
|
|
44
|
+
export const capped = Retries.capped;
|
|
45
|
+
/** Retry options that retry all throttling errors indefinitely. */
|
|
46
|
+
export const throttlingOptions = Retries.throttlingOptions;
|
|
47
|
+
/** Retries all throttling errors indefinitely (honoring server hints). */
|
|
48
|
+
export const throttling = policy(Retries.throttlingFactory);
|
|
49
|
+
/** Retry options that retry all transient errors indefinitely. */
|
|
50
|
+
export const transientOptions = Retries.transientOptions;
|
|
51
|
+
/** Retries all transient errors indefinitely (honoring server hints). */
|
|
52
|
+
export const transient = policy(Retries.transientFactory);
|
|
53
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAMvD,uEAAuE;AACvE,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAiB,CAAC,cAAc,CAAC;CAAG;AAE9E,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAWf,CAAC,gBAAmC,EAAE,EAAE,CAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEzD,sCAAsC;AACtC,MAAM,CAAC,MAAM,IAAI,GAE6B,MAAM,CAAC,OAAO,CAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAC7C,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAY,OAAO,CAAC,WAAW,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAY,OAAO,CAAC,iBAAiB,CAAC;AAEpE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAEuB,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEhF,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAY,OAAO,CAAC,gBAAgB,CAAC;AAElE,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAEwB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as S from "@distilled.cloud/core/schema";
|
|
2
|
+
import * as API from "@distilled.cloud/core/api";
|
|
3
|
+
import { type OpenBaoOpError, type OpenBaoOpContext } from "../protocol.ts";
|
|
4
|
+
export type { OpenBaoOpError, OpenBaoOpContext };
|
|
5
|
+
export interface AliasDeleteByIdRequest {
|
|
6
|
+
/** ID of the alias */
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const AliasDeleteByIdRequest: S.Schema<AliasDeleteByIdRequest>;
|
|
10
|
+
export interface AliasDeleteByIdResponse {
|
|
11
|
+
}
|
|
12
|
+
export declare const AliasDeleteByIdResponse: S.Schema<AliasDeleteByIdResponse>;
|
|
13
|
+
export type AliasListByIdRequestList = "true";
|
|
14
|
+
export declare const AliasListByIdRequestList: any;
|
|
15
|
+
export interface AliasListByIdRequest {
|
|
16
|
+
/** Must be set to `true` */
|
|
17
|
+
list: AliasListByIdRequestList | (string & {});
|
|
18
|
+
}
|
|
19
|
+
export declare const AliasListByIdRequest: S.Schema<AliasListByIdRequest>;
|
|
20
|
+
export interface AliasListByIdResponse {
|
|
21
|
+
}
|
|
22
|
+
export declare const AliasListByIdResponse: S.Schema<AliasListByIdResponse>;
|
|
23
|
+
export interface AliasReadByIdRequest {
|
|
24
|
+
/** ID of the alias */
|
|
25
|
+
id: string;
|
|
26
|
+
}
|
|
27
|
+
export declare const AliasReadByIdRequest: S.Schema<AliasReadByIdRequest>;
|
|
28
|
+
export interface AliasReadByIdResponse {
|
|
29
|
+
}
|
|
30
|
+
export declare const AliasReadByIdResponse: S.Schema<AliasReadByIdResponse>;
|
|
31
|
+
export interface AliasUpdateByIdRequest {
|
|
32
|
+
/** ID of the alias */
|
|
33
|
+
id: string;
|
|
34
|
+
/** Entity ID to which this alias should be tied to */
|
|
35
|
+
canonical_id?: string;
|
|
36
|
+
/** Entity ID to which this alias should be tied to. This field is deprecated in favor of 'canonical_id'. */
|
|
37
|
+
entity_id?: string;
|
|
38
|
+
/** Mount accessor to which this alias belongs to */
|
|
39
|
+
mount_accessor?: string;
|
|
40
|
+
/** Name of the alias */
|
|
41
|
+
name?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const AliasUpdateByIdRequest: S.Schema<AliasUpdateByIdRequest>;
|
|
44
|
+
export interface AliasUpdateByIdResponse {
|
|
45
|
+
}
|
|
46
|
+
export declare const AliasUpdateByIdResponse: S.Schema<AliasUpdateByIdResponse>;
|
|
47
|
+
export interface CreateAliasRequest {
|
|
48
|
+
/** Entity ID to which this alias belongs to */
|
|
49
|
+
canonical_id?: string;
|
|
50
|
+
/** Entity ID to which this alias belongs to. This field is deprecated in favor of 'canonical_id'. */
|
|
51
|
+
entity_id?: string;
|
|
52
|
+
/** ID of the alias */
|
|
53
|
+
id?: string;
|
|
54
|
+
/** Mount accessor to which this alias belongs to */
|
|
55
|
+
mount_accessor?: string;
|
|
56
|
+
/** Name of the alias */
|
|
57
|
+
name?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare const CreateAliasRequest: S.Schema<CreateAliasRequest>;
|
|
60
|
+
export interface CreateAliasResponse {
|
|
61
|
+
}
|
|
62
|
+
export declare const CreateAliasResponse: S.Schema<CreateAliasResponse>;
|
|
63
|
+
export type AliasDeleteByIdError = OpenBaoOpError;
|
|
64
|
+
export declare const aliasDeleteById: API.OperationMethod<AliasDeleteByIdRequest, AliasDeleteByIdResponse, AliasDeleteByIdError, OpenBaoOpContext>;
|
|
65
|
+
export type AliasListByIdError = OpenBaoOpError;
|
|
66
|
+
export declare const aliasListById: API.OperationMethod<AliasListByIdRequest, AliasListByIdResponse, AliasListByIdError, OpenBaoOpContext>;
|
|
67
|
+
export type AliasReadByIdError = OpenBaoOpError;
|
|
68
|
+
export declare const aliasReadById: API.OperationMethod<AliasReadByIdRequest, AliasReadByIdResponse, AliasReadByIdError, OpenBaoOpContext>;
|
|
69
|
+
export type AliasUpdateByIdError = OpenBaoOpError;
|
|
70
|
+
export declare const aliasUpdateById: API.OperationMethod<AliasUpdateByIdRequest, AliasUpdateByIdResponse, AliasUpdateByIdError, OpenBaoOpContext>;
|
|
71
|
+
export type CreateAliasError = OpenBaoOpError;
|
|
72
|
+
export declare const createAlias: API.OperationMethod<CreateAliasRequest, CreateAliasResponse, CreateAliasError, OpenBaoOpContext>;
|
|
73
|
+
//# sourceMappingURL=alias.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.d.ts","sourceRoot":"","sources":["../../src/services/alias.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/generate.ts from .generated-specs (specs/spec-mirror-openbao, generated — see fetch-specs.ts). Do not edit.
|
|
2
|
+
import * as S from "@distilled.cloud/core/schema";
|
|
3
|
+
import * as API from "@distilled.cloud/core/api";
|
|
4
|
+
import * as T from "../traits.js";
|
|
5
|
+
import { OpenBaoProtocol, } from "../protocol.js";
|
|
6
|
+
import * as Retry from "../retry.js";
|
|
7
|
+
export const AliasDeleteByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({
|
|
8
|
+
id: S.String.pipe(T.Label()),
|
|
9
|
+
}).pipe(T.Http({ method: "DELETE", uri: "/identity/alias/id/{id}", code: 200 }))).annotate({
|
|
10
|
+
identifier: "AliasDeleteByIdRequest",
|
|
11
|
+
});
|
|
12
|
+
export const AliasDeleteByIdResponse = /*@__PURE__*/ S.suspend(() => S.Struct({})).annotate({
|
|
13
|
+
identifier: "AliasDeleteByIdResponse",
|
|
14
|
+
});
|
|
15
|
+
export const AliasListByIdRequestList = S.String;
|
|
16
|
+
export const AliasListByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({
|
|
17
|
+
list: AliasListByIdRequestList.pipe(T.Query()),
|
|
18
|
+
}).pipe(T.Http({ method: "GET", uri: "/identity/alias/id", code: 200 }))).annotate({
|
|
19
|
+
identifier: "AliasListByIdRequest",
|
|
20
|
+
});
|
|
21
|
+
export const AliasListByIdResponse = /*@__PURE__*/ S.suspend(() => S.Struct({})).annotate({
|
|
22
|
+
identifier: "AliasListByIdResponse",
|
|
23
|
+
});
|
|
24
|
+
export const AliasReadByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({
|
|
25
|
+
id: S.String.pipe(T.Label()),
|
|
26
|
+
}).pipe(T.Http({ method: "GET", uri: "/identity/alias/id/{id}", code: 200 }))).annotate({
|
|
27
|
+
identifier: "AliasReadByIdRequest",
|
|
28
|
+
});
|
|
29
|
+
export const AliasReadByIdResponse = /*@__PURE__*/ S.suspend(() => S.Struct({})).annotate({
|
|
30
|
+
identifier: "AliasReadByIdResponse",
|
|
31
|
+
});
|
|
32
|
+
export const AliasUpdateByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({
|
|
33
|
+
id: S.String.pipe(T.Label()),
|
|
34
|
+
canonical_id: S.optional(S.String),
|
|
35
|
+
entity_id: S.optional(S.String),
|
|
36
|
+
mount_accessor: S.optional(S.String),
|
|
37
|
+
name: S.optional(S.String),
|
|
38
|
+
}).pipe(T.Http({ method: "POST", uri: "/identity/alias/id/{id}", code: 200 }))).annotate({
|
|
39
|
+
identifier: "AliasUpdateByIdRequest",
|
|
40
|
+
});
|
|
41
|
+
export const AliasUpdateByIdResponse = /*@__PURE__*/ S.suspend(() => S.Struct({})).annotate({
|
|
42
|
+
identifier: "AliasUpdateByIdResponse",
|
|
43
|
+
});
|
|
44
|
+
export const CreateAliasRequest = /*@__PURE__*/ S.suspend(() => S.Struct({
|
|
45
|
+
canonical_id: S.optional(S.String),
|
|
46
|
+
entity_id: S.optional(S.String),
|
|
47
|
+
id: S.optional(S.String),
|
|
48
|
+
mount_accessor: S.optional(S.String),
|
|
49
|
+
name: S.optional(S.String),
|
|
50
|
+
}).pipe(T.Http({ method: "POST", uri: "/identity/alias", code: 200 }))).annotate({
|
|
51
|
+
identifier: "CreateAliasRequest",
|
|
52
|
+
});
|
|
53
|
+
export const CreateAliasResponse = /*@__PURE__*/ S.suspend(() => S.Struct({})).annotate({
|
|
54
|
+
identifier: "CreateAliasResponse",
|
|
55
|
+
});
|
|
56
|
+
export const aliasDeleteById = /*@__PURE__*/ API.make(() => ({
|
|
57
|
+
input: AliasDeleteByIdRequest,
|
|
58
|
+
output: AliasDeleteByIdResponse,
|
|
59
|
+
errors: [],
|
|
60
|
+
protocol: OpenBaoProtocol,
|
|
61
|
+
retry: Retry.Retry,
|
|
62
|
+
}));
|
|
63
|
+
export const aliasListById = /*@__PURE__*/ API.make(() => ({
|
|
64
|
+
input: AliasListByIdRequest,
|
|
65
|
+
output: AliasListByIdResponse,
|
|
66
|
+
errors: [],
|
|
67
|
+
protocol: OpenBaoProtocol,
|
|
68
|
+
retry: Retry.Retry,
|
|
69
|
+
}));
|
|
70
|
+
export const aliasReadById = /*@__PURE__*/ API.make(() => ({
|
|
71
|
+
input: AliasReadByIdRequest,
|
|
72
|
+
output: AliasReadByIdResponse,
|
|
73
|
+
errors: [],
|
|
74
|
+
protocol: OpenBaoProtocol,
|
|
75
|
+
retry: Retry.Retry,
|
|
76
|
+
}));
|
|
77
|
+
export const aliasUpdateById = /*@__PURE__*/ API.make(() => ({
|
|
78
|
+
input: AliasUpdateByIdRequest,
|
|
79
|
+
output: AliasUpdateByIdResponse,
|
|
80
|
+
errors: [],
|
|
81
|
+
protocol: OpenBaoProtocol,
|
|
82
|
+
retry: Retry.Retry,
|
|
83
|
+
}));
|
|
84
|
+
export const createAlias = /*@__PURE__*/ API.make(() => ({
|
|
85
|
+
input: CreateAliasRequest,
|
|
86
|
+
output: CreateAliasResponse,
|
|
87
|
+
errors: [],
|
|
88
|
+
protocol: OpenBaoProtocol,
|
|
89
|
+
retry: Retry.Retry,
|
|
90
|
+
}));
|
|
91
|
+
//# sourceMappingURL=alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.js","sourceRoot":"","sources":["../../src/services/alias.ts"],"names":[],"mappings":"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"}
|