@brett_lamy/docstream 1.20.0 → 1.21.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 CHANGED
@@ -202,6 +202,11 @@ when the page loads. It shows a gate, and its module isn't imported, until the v
202
202
  hint beside each variable.
203
203
  - **Without a host:** the gate asks the reader for the values and keeps them in memory for the page.
204
204
 
205
+ For a passkey keychain, use `createEnvKeychain` and `keychainEnvHost`. Values are kept encrypted
206
+ with a key derived from the passkey's PRF output, and the names are readable while locked. A press
207
+ unlocks it with one biometric prompt, signs in (`obtain`) only for what it doesn't hold, saves that,
208
+ and answers with everything it holds, so every example those values cover opens together.
209
+
205
210
  In-page demos read the values with `useDocstreamEnv().values`. Inline demos that run in almost-node,
206
211
  and live code fences, get them as `process.env.NAME` (`injectEnv` writes a module the entry imports
207
212
  first). Values loaded once are shared by every example on the page. `env` can also be passed as a
package/dist/doc-env.d.ts CHANGED
@@ -4,11 +4,13 @@ export type DocstreamEnvValues = Readonly<Record<string, string>>;
4
4
  export interface DocstreamEnvHost {
5
5
  /**
6
6
  * Resolves with the values it could get (unlocking a keychain or signing in as needed). Names it
7
- * leaves out stay missing and the example stays gated; a rejection is shown on the gate.
7
+ * leaves out stay missing and the example stays gated; a rejection is shown on the gate. It may
8
+ * resolve with more than it was asked for — everything an unlocked keychain holds, say — and every
9
+ * example those values cover opens too.
8
10
  */
9
11
  request: (names: readonly string[]) => Promise<Record<string, string>>;
10
- /** The gate's button, e.g. "Load from Keychain". Default "Load Variables". */
11
- label?: string;
12
+ /** The gate's button, e.g. "Load from Keychain", or one for the names this gate needs. Default "Load Variables". */
13
+ label?: string | ((names: readonly string[]) => string);
12
14
  /** A short line about one variable, e.g. "Sign in with GitHub" — shown beside its name. */
13
15
  describe?: (name: string) => string | undefined;
14
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doc-env.d.ts","sourceRoot":"","sources":["../src/doc-env.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAqF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEzH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAEjE,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACtE,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAA;IAC1B,sFAAsF;IACtF,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAClE,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,2DAA2D;IAC3D,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;CAClD;AAOD,8FAA8F;AAC9F,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAI5F;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI9F;AAED,MAAM,WAAW,yBAAyB;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,yBAAyB,+BA2BhG;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAYxD,uEAAuE;;IAEvE,0CAA0C;;IAE1C,6EAA6E;;IAE7E,qDAAqD;;EAGxD;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAgErF"}
1
+ {"version":3,"file":"doc-env.d.ts","sourceRoot":"","sources":["../src/doc-env.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAqF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEzH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAEjE,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACtE,oHAAoH;IACpH,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,CAAA;IACvD,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAA;IAC1B,sFAAsF;IACtF,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAClE,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,2DAA2D;IAC3D,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;CAClD;AAOD,8FAA8F;AAC9F,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAI5F;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI9F;AAED,MAAM,WAAW,yBAAyB;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,yBAAyB,+BA2BhG;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAYxD,uEAAuE;;IAEvE,0CAA0C;;IAE1C,6EAA6E;;IAE7E,qDAAqD;;EAGxD;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAgErF"}
package/dist/doc-env.js CHANGED
@@ -56,7 +56,7 @@ export function DocstreamEnvProvider({ declared = [], host, children }) {
56
56
  if (!missing.length || !effectiveHost)
57
57
  return valuesRef.current;
58
58
  const got = await effectiveHost.request(missing);
59
- const kept = Object.fromEntries(Object.entries(got).filter(([k, v]) => missing.includes(k) && typeof v === "string"));
59
+ const kept = Object.fromEntries(Object.entries(got).filter(([, v]) => typeof v === "string"));
60
60
  setOwn((v) => ({ ...v, ...kept }));
61
61
  return { ...valuesRef.current, ...kept };
62
62
  }, [effectiveHost]);
@@ -118,6 +118,6 @@ export function EnvGate({ names, title }) {
118
118
  else
119
119
  setError("Fill in every variable to run the example.");
120
120
  };
121
- return (_jsxs("div", { className: "docs-env-gate", role: "group", "aria-label": `${title ?? "Example"} needs environment variables`, "data-docstream-env-gate": "", children: [_jsxs("div", { className: "docs-env-gate-head", children: [_jsx("span", { className: "docs-env-gate-icon", "aria-hidden": "true", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" }), _jsx("path", { d: "m21 2-9.6 9.6" }), _jsx("path", { d: "m15.5 7.5 3 3L22 7l-3-3" })] }) }), _jsxs("span", { children: ["This example needs ", names.length === 1 ? "a variable" : `${names.length} variables`, " before it runs."] })] }), host ? (_jsxs(_Fragment, { children: [_jsx("ul", { className: "docs-env-gate-list", children: names.map((n) => (_jsxs("li", { children: [_jsx("code", { children: n }), host.describe?.(n) ? _jsx("span", { children: host.describe(n) }) : null] }, n))) }), _jsx("button", { type: "button", className: "docs-env-gate-button", onClick: () => void load(), disabled: busy, children: busy ? "Waiting…" : host.label ?? "Load Variables" })] })) : (_jsxs("form", { className: "docs-env-gate-form", onSubmit: submit, children: [names.map((n) => (_jsxs("label", { children: [_jsx("code", { children: n }), _jsx("input", { type: "password", autoComplete: "off", spellCheck: false, value: typed[n] ?? "", onChange: (e) => setTyped((t) => ({ ...t, [n]: e.target.value })) })] }, n))), _jsx("button", { type: "submit", className: "docs-env-gate-button", children: "Run Example" }), _jsx("span", { className: "docs-env-gate-note", children: "Kept in memory for this page only." })] })), error ? _jsx("p", { className: "docs-env-gate-error", role: "alert", children: error }) : null] }));
121
+ return (_jsxs("div", { className: "docs-env-gate", role: "group", "aria-label": `${title ?? "Example"} needs environment variables`, "data-docstream-env-gate": "", children: [_jsxs("div", { className: "docs-env-gate-head", children: [_jsx("span", { className: "docs-env-gate-icon", "aria-hidden": "true", children: _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" }), _jsx("path", { d: "m21 2-9.6 9.6" }), _jsx("path", { d: "m15.5 7.5 3 3L22 7l-3-3" })] }) }), _jsxs("span", { children: ["This example needs ", names.length === 1 ? "a variable" : `${names.length} variables`, " before it runs."] })] }), host ? (_jsxs(_Fragment, { children: [_jsx("ul", { className: "docs-env-gate-list", children: names.map((n) => (_jsxs("li", { children: [_jsx("code", { children: n }), host.describe?.(n) ? _jsx("span", { children: host.describe(n) }) : null] }, n))) }), _jsx("button", { type: "button", className: "docs-env-gate-button", onClick: () => void load(), disabled: busy, children: busy ? "Waiting…" : (typeof host.label === "function" ? host.label(names) : host.label) ?? "Load Variables" })] })) : (_jsxs("form", { className: "docs-env-gate-form", onSubmit: submit, children: [names.map((n) => (_jsxs("label", { children: [_jsx("code", { children: n }), _jsx("input", { type: "password", autoComplete: "off", spellCheck: false, value: typed[n] ?? "", onChange: (e) => setTyped((t) => ({ ...t, [n]: e.target.value })) })] }, n))), _jsx("button", { type: "submit", className: "docs-env-gate-button", children: "Run Example" }), _jsx("span", { className: "docs-env-gate-note", children: "Kept in memory for this page only." })] })), error ? _jsx("p", { className: "docs-env-gate-error", role: "alert", children: error }) : null] }));
122
122
  }
123
123
  //# sourceMappingURL=doc-env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doc-env.js","sourceRoot":"","sources":["../src/doc-env.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doc-env.js","sourceRoot":"","sources":["../src/doc-env.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;qDAaqD;AACrD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAkC,MAAM,OAAO,CAAA;AA+BzH,MAAM,KAAK,GAAuB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACnD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAE9C,MAAM,mBAAmB,GAAG,aAAa,CAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;AAE/H,8FAA8F;AAC9F,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAA;AACxC,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CAAC,MAA2C;IAChF,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,CAAA;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1F,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACnH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,OAA0B,EAAE,QAA2B;IAClF,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,qBAAqB,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACvG,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAA6B;IAC/F,MAAM,KAAK,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,CAAA;IACzD,MAAM,aAAa,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAA;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IAC/G,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;IAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IACpD,uDAAuD;IACvD,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAC9B,CAAA;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,IAA4B,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACrG,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAwB,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;QACvE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa;YAAE,OAAO,SAAS,CAAC,OAAO,CAAA;QAC/D,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAA;QAC7F,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;QAClC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAA;IAC1C,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IACnB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9G,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CACvD,CAAA;IACD,OAAO,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAgC,CAAA;AAC9F,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,OAAiC;IAC1D,MAAM,GAAG,GAAG,eAAe,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,uDAAuD;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvG,sEAAsE;IACtE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,OAAO,KAAK,CAAA;QAC/B,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAuB,CAAA;IAC1H,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACtB,OAAO;QACL,uEAAuE;QACvE,IAAI;QACJ,0CAA0C;QAC1C,OAAO;QACP,6EAA6E;QAC7E,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAC9C,qDAAqD;QACrD,MAAM;KACP,CAAA;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAgD;IACpF,MAAM,GAAG,GAAG,eAAe,EAAE,CAAA;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAA;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IAErB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;YACvD,IAAI,KAAK,CAAC,MAAM;gBAAE,QAAQ,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAClE,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,KAAgB,EAAE,EAAE;QAClC,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7F,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;;YAC/D,QAAQ,CAAC,4CAA4C,CAAC,CAAA;IAC7D,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,OAAO,gBAAa,GAAG,KAAK,IAAI,SAAS,8BAA8B,6BAA0B,EAAE,aACrI,eAAK,SAAS,EAAC,oBAAoB,aACjC,eAAM,SAAS,EAAC,oBAAoB,iBAAa,MAAM,YACrD,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,aAC5I,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,EAAC,KAAK,GAAG,EAAA,eAAM,CAAC,EAAC,eAAe,GAAG,EAAA,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAC/F,GACD,EACP,kDAA0B,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,wBAAwB,IAC7G,EACL,IAAI,CAAC,CAAC,CAAC,CACN,8BACE,aAAI,SAAS,EAAC,oBAAoB,YAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,yBAAY,yBAAO,CAAC,GAAQ,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAQ,CAAC,CAAC,CAAC,IAAI,KAA/E,CAAC,CAAoF,CAC/F,CAAC,GACC,EACL,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,YAC9F,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,GACrG,IACR,CACJ,CAAC,CAAC,CAAC,CACF,gBAAM,SAAS,EAAC,oBAAoB,EAAC,QAAQ,EAAE,MAAM,aAClD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,4BACE,yBAAO,CAAC,GAAQ,EAChB,gBAAO,IAAI,EAAC,UAAU,EAAC,YAAY,EAAC,KAAK,EAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAChF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAI,KAH7D,CAAC,CAIL,CACT,CAAC,EACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,4BAAqB,EAC3E,eAAM,SAAS,EAAC,oBAAoB,mDAA0C,IACzE,CACR,EACA,KAAK,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,qBAAqB,EAAC,IAAI,EAAC,OAAO,YAAE,KAAK,GAAK,CAAC,CAAC,CAAC,IAAI,IACvE,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { DocstreamEnvHost } from "./doc-env.js";
2
+ export type EnvKeychainStatus = "unsupported" | "empty" | "locked" | "unlocked";
3
+ export interface EnvKeychain {
4
+ readonly status: EnvKeychainStatus;
5
+ /** The variables it holds (readable while locked). */
6
+ readonly names: readonly string[];
7
+ /** Creates the passkey (a biometric prompt; may ask twice on authenticators that only return PRF on sign-in). */
8
+ enroll(): Promise<void>;
9
+ /** A biometric prompt; then `values` can be read. */
10
+ unlock(): Promise<void>;
11
+ lock(): void;
12
+ /** Everything it holds. Unlocked only. */
13
+ values(): Promise<Record<string, string>>;
14
+ /** Adds or replaces values. Unlocked only. */
15
+ set(values: Record<string, string>): Promise<void>;
16
+ /** Forgets one variable, or (no argument) everything including the passkey's record. */
17
+ reset(name?: string): Promise<void>;
18
+ subscribe(listener: () => void): () => void;
19
+ }
20
+ export interface EnvKeychainOptions {
21
+ /** Names the keychain in storage; different ids are different keychains. */
22
+ id: string;
23
+ /** Shown by the passkey prompt. */
24
+ rpName: string;
25
+ /** Account name the passkey is listed under. Default "Environment variables". */
26
+ userName?: string;
27
+ /** Default `localStorage`. */
28
+ storage?: Pick<Storage, "getItem" | "setItem" | "removeItem">;
29
+ }
30
+ export declare function createEnvKeychain(options: EnvKeychainOptions): EnvKeychain;
31
+ export interface KeychainEnvHostOptions {
32
+ /** Gets values the keychain doesn't hold — a sign-in, a prompt. Resolve with what you got; it is saved. */
33
+ obtain?: (names: readonly string[]) => Promise<Record<string, string>>;
34
+ /** The gate's button when a sign-in is needed. Default "Sign In". */
35
+ signInLabel?: string | ((names: readonly string[]) => string);
36
+ /** The gate's button when the keychain already holds everything the example needs. Default "Unlock with Passkey". */
37
+ unlockLabel?: string;
38
+ /** A hint beside a variable the keychain doesn't hold. */
39
+ describe?: (name: string) => string | undefined;
40
+ }
41
+ /**
42
+ * A `DocstreamEnvHost` over a keychain. Pressing a gate's button:
43
+ * 1. creates the keychain (first time; a passkey prompt) or unlocks it (a biometric prompt);
44
+ * 2. asks `obtain` for the variables it doesn't hold, and saves them;
45
+ * 3. answers with everything the keychain holds, so every example those values cover opens.
46
+ * Without passkey support (or if the reader declines) values are kept for the page only.
47
+ */
48
+ export declare function keychainEnvHost(keychain: EnvKeychain, options?: KeychainEnvHostOptions): DocstreamEnvHost;
49
+ //# sourceMappingURL=env-keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-keychain.d.ts","sourceRoot":"","sources":["../src/env-keychain.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAA;AAE/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,iHAAiH;IACjH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,qDAAqD;IACrD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,IAAI,IAAI,CAAA;IACZ,0CAA0C;IAC1C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACzC,8CAA8C;IAC9C,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,wFAAwF;IACxF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAA;IACV,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAAA;CAC9D;AA4CD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgI1E;AAED,MAAM,WAAW,sBAAsB;IACrC,2GAA2G;IAC3G,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACtE,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,CAAA;IAC7D,qHAAqH;IACrH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,GAAE,sBAA2B,GAAG,gBAAgB,CAuB7G"}
@@ -0,0 +1,201 @@
1
+ const b64 = (bytes) => {
2
+ const u = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
3
+ let s = "";
4
+ for (const b of u)
5
+ s += String.fromCharCode(b);
6
+ return btoa(s).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
7
+ };
8
+ const unb64 = (text) => {
9
+ const s = atob(text.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((text.length + 3) % 4));
10
+ return Uint8Array.from(s, (c) => c.charCodeAt(0));
11
+ };
12
+ const random = (n) => crypto.getRandomValues(new Uint8Array(n));
13
+ const prfFirst = (credential) => {
14
+ const first = credential.getClientExtensionResults().prf?.results?.first;
15
+ if (!first)
16
+ return null;
17
+ const view = ArrayBuffer.isView(first) ? new Uint8Array(first.buffer, first.byteOffset, first.byteLength) : new Uint8Array(first);
18
+ const copy = new Uint8Array(view.byteLength);
19
+ copy.set(view);
20
+ return copy;
21
+ };
22
+ async function aesKey(prf) {
23
+ const base = await crypto.subtle.importKey("raw", prf, "HKDF", false, ["deriveKey"]);
24
+ return crypto.subtle.deriveKey({ name: "HKDF", hash: "SHA-256", salt: new Uint8Array(0), info: new TextEncoder().encode("docstream env keychain v1") }, base, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
25
+ }
26
+ export function createEnvKeychain(options) {
27
+ const key = `docstream-env-keychain:${options.id}`;
28
+ const storage = options.storage ?? (typeof localStorage !== "undefined" ? localStorage : null);
29
+ const listeners = new Set();
30
+ let aes = null;
31
+ let cache = null;
32
+ const read = () => {
33
+ try {
34
+ const raw = storage?.getItem(key);
35
+ const s = raw ? JSON.parse(raw) : null;
36
+ return s?.v === 1 && typeof s.credentialId === "string" && typeof s.salt === "string" ? { ...s, names: Array.isArray(s.names) ? s.names : [] } : null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ const write = (s) => {
43
+ if (s)
44
+ storage?.setItem(key, JSON.stringify(s));
45
+ else
46
+ storage?.removeItem(key);
47
+ listeners.forEach((l) => l());
48
+ };
49
+ const supported = () => typeof window !== "undefined" && window.isSecureContext && typeof PublicKeyCredential !== "undefined" && !!navigator.credentials && !!storage && !!crypto?.subtle;
50
+ /** A sign-in with the stored passkey, returning its PRF output. */
51
+ async function assert(stored) {
52
+ const credential = (await navigator.credentials.get({
53
+ publicKey: {
54
+ challenge: random(32),
55
+ allowCredentials: [{ type: "public-key", id: unb64(stored.credentialId) }],
56
+ userVerification: "required",
57
+ extensions: { prf: { eval: { first: unb64(stored.salt) } } },
58
+ },
59
+ }));
60
+ const first = credential && prfFirst(credential);
61
+ if (!first)
62
+ throw new Error("This passkey can't unlock the keychain (no PRF support).");
63
+ return first;
64
+ }
65
+ async function seal(values, stored) {
66
+ const iv = random(12);
67
+ const data = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, aes, new TextEncoder().encode(JSON.stringify(values)));
68
+ cache = { ...values };
69
+ write({ ...stored, names: Object.keys(values).sort(), iv: b64(iv), data: b64(data) });
70
+ }
71
+ const keychain = {
72
+ get status() {
73
+ if (!supported())
74
+ return "unsupported";
75
+ if (!read())
76
+ return "empty";
77
+ return aes ? "unlocked" : "locked";
78
+ },
79
+ get names() {
80
+ return read()?.names ?? [];
81
+ },
82
+ async enroll() {
83
+ if (!supported())
84
+ throw new Error("This browser can't keep a passkey keychain.");
85
+ const salt = random(32);
86
+ const created = (await navigator.credentials.create({
87
+ publicKey: {
88
+ rp: { name: options.rpName },
89
+ user: { id: random(16), name: options.userName ?? "Environment variables", displayName: options.userName ?? "Environment variables" },
90
+ challenge: random(32),
91
+ pubKeyCredParams: [{ type: "public-key", alg: -7 }, { type: "public-key", alg: -257 }],
92
+ authenticatorSelection: { residentKey: "preferred", userVerification: "required" },
93
+ extensions: { prf: { eval: { first: salt } } },
94
+ },
95
+ }));
96
+ if (!created)
97
+ throw new Error("No passkey was created.");
98
+ const ext = created.getClientExtensionResults().prf;
99
+ if (!ext?.enabled && !ext?.results?.first)
100
+ throw new Error("This passkey can't encrypt (no PRF support). Try another passkey provider.");
101
+ const stored = { v: 1, credentialId: b64(created.rawId), salt: b64(salt), names: [] };
102
+ // Some authenticators only evaluate PRF on sign-in: then this asks once more.
103
+ aes = await aesKey(prfFirst(created) ?? (await assert(stored)));
104
+ await seal({}, stored);
105
+ },
106
+ async unlock() {
107
+ const stored = read();
108
+ if (!stored)
109
+ throw new Error("There is no keychain yet.");
110
+ if (aes)
111
+ return;
112
+ aes = await aesKey(await assert(stored));
113
+ cache = null;
114
+ listeners.forEach((l) => l());
115
+ },
116
+ lock() {
117
+ aes = null;
118
+ cache = null;
119
+ listeners.forEach((l) => l());
120
+ },
121
+ async values() {
122
+ if (!aes)
123
+ throw new Error("The keychain is locked.");
124
+ if (cache)
125
+ return { ...cache };
126
+ const stored = read();
127
+ if (!stored?.data || !stored.iv)
128
+ return (cache = {});
129
+ try {
130
+ const plain = await crypto.subtle.decrypt({ name: "AES-GCM", iv: unb64(stored.iv) }, aes, unb64(stored.data));
131
+ cache = JSON.parse(new TextDecoder().decode(plain));
132
+ }
133
+ catch {
134
+ aes = null;
135
+ throw new Error("That passkey doesn't open this keychain.");
136
+ }
137
+ return { ...cache };
138
+ },
139
+ async set(values) {
140
+ const stored = read();
141
+ if (!stored || !aes)
142
+ throw new Error("The keychain is locked.");
143
+ await seal({ ...(await keychain.values()), ...values }, stored);
144
+ },
145
+ async reset(name) {
146
+ if (name === undefined) {
147
+ aes = null;
148
+ cache = null;
149
+ write(null);
150
+ return;
151
+ }
152
+ const stored = read();
153
+ if (!stored)
154
+ return;
155
+ if (aes) {
156
+ const { [name]: _, ...rest } = await keychain.values();
157
+ await seal(rest, stored);
158
+ }
159
+ else
160
+ write({ ...stored, names: stored.names.filter((n) => n !== name) });
161
+ },
162
+ subscribe(listener) {
163
+ listeners.add(listener);
164
+ return () => listeners.delete(listener);
165
+ },
166
+ };
167
+ return keychain;
168
+ }
169
+ /**
170
+ * A `DocstreamEnvHost` over a keychain. Pressing a gate's button:
171
+ * 1. creates the keychain (first time; a passkey prompt) or unlocks it (a biometric prompt);
172
+ * 2. asks `obtain` for the variables it doesn't hold, and saves them;
173
+ * 3. answers with everything the keychain holds, so every example those values cover opens.
174
+ * Without passkey support (or if the reader declines) values are kept for the page only.
175
+ */
176
+ export function keychainEnvHost(keychain, options = {}) {
177
+ const held = (names) => names.every((n) => keychain.names.includes(n));
178
+ return {
179
+ label: (names) => held(names) ? options.unlockLabel ?? "Unlock with Passkey"
180
+ : typeof options.signInLabel === "function" ? options.signInLabel(names) : options.signInLabel ?? "Sign In",
181
+ describe: (name) => (keychain.names.includes(name) ? "In your keychain" : options.describe?.(name)),
182
+ async request(names) {
183
+ // The press's user activation is still live here: spend it on the passkey prompt first.
184
+ let usable = keychain.status === "unlocked";
185
+ if (keychain.status === "locked") {
186
+ await keychain.unlock();
187
+ usable = true;
188
+ }
189
+ else if (keychain.status === "empty") {
190
+ usable = await keychain.enroll().then(() => true, () => false);
191
+ }
192
+ const saved = usable ? await keychain.values() : {};
193
+ const missing = names.filter((n) => saved[n] === undefined);
194
+ const got = missing.length && options.obtain ? await options.obtain(missing) : {};
195
+ if (usable && Object.keys(got).length)
196
+ await keychain.set(got);
197
+ return { ...saved, ...got };
198
+ },
199
+ };
200
+ }
201
+ //# sourceMappingURL=env-keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-keychain.js","sourceRoot":"","sources":["../src/env-keychain.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ export type { TaskCheckboxProps, TaskStateChangeHandler } from "./docs/TaskCheck
6
6
  export { TASK_STATES, getTaskState, taskMarker, taskStateFromMarker } from "./gitbook/tasks.js";
7
7
  export { DocstreamEnvProvider, EnvGate, envNamesFromProperties, useDocstreamEnv, useEnvGate, usedEnvNames } from "./doc-env.js";
8
8
  export type { DocstreamEnv, DocstreamEnvHost, DocstreamEnvProviderProps, DocstreamEnvValues } from "./doc-env.js";
9
+ export { createEnvKeychain, keychainEnvHost } from "./env-keychain.js";
10
+ export type { EnvKeychain, EnvKeychainOptions, EnvKeychainStatus, KeychainEnvHostOptions } from "./env-keychain.js";
9
11
  export { DocumentProperties } from "./docs/DocumentProperties.js";
10
12
  export type { DocumentPropertiesProps } from "./docs/DocumentProperties.js";
11
13
  export { readDocumentProperties, removeDocumentProperty, setDocumentProperty } from "./gitbook/properties.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ export { DocsRenderer, MarkdownContent, MathFormula, documentEnv } from "./docs/
5
5
  export { TaskCheckbox, TASK_STATE_ICONS } from "./docs/TaskCheckbox.js";
6
6
  export { TASK_STATES, getTaskState, taskMarker, taskStateFromMarker } from "./gitbook/tasks.js";
7
7
  export { DocstreamEnvProvider, EnvGate, envNamesFromProperties, useDocstreamEnv, useEnvGate, usedEnvNames } from "./doc-env.js";
8
+ export { createEnvKeychain, keychainEnvHost } from "./env-keychain.js";
8
9
  export { DocumentProperties } from "./docs/DocumentProperties.js";
9
10
  export { readDocumentProperties, removeDocumentProperty, setDocumentProperty } from "./gitbook/properties.js";
10
11
  export { DocPageActions } from "./docs/PageActions.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brett_lamy/docstream",
3
- "version": "1.20.0",
3
+ "version": "1.21.0",
4
4
  "description": "GitBook-aware readonly markdown and AI stream renderer.",
5
5
  "publishConfig": {
6
6
  "access": "public"
package/src/doc-env.tsx CHANGED
@@ -20,11 +20,13 @@ export type DocstreamEnvValues = Readonly<Record<string, string>>
20
20
  export interface DocstreamEnvHost {
21
21
  /**
22
22
  * Resolves with the values it could get (unlocking a keychain or signing in as needed). Names it
23
- * leaves out stay missing and the example stays gated; a rejection is shown on the gate.
23
+ * leaves out stay missing and the example stays gated; a rejection is shown on the gate. It may
24
+ * resolve with more than it was asked for — everything an unlocked keychain holds, say — and every
25
+ * example those values cover opens too.
24
26
  */
25
27
  request: (names: readonly string[]) => Promise<Record<string, string>>
26
- /** The gate's button, e.g. "Load from Keychain". Default "Load Variables". */
27
- label?: string
28
+ /** The gate's button, e.g. "Load from Keychain", or one for the names this gate needs. Default "Load Variables". */
29
+ label?: string | ((names: readonly string[]) => string)
28
30
  /** A short line about one variable, e.g. "Sign in with GitHub" — shown beside its name. */
29
31
  describe?: (name: string) => string | undefined
30
32
  }
@@ -95,7 +97,7 @@ export function DocstreamEnvProvider({ declared = [], host, children }: Docstrea
95
97
  const missing = names.filter((n) => valuesRef.current[n] === undefined)
96
98
  if (!missing.length || !effectiveHost) return valuesRef.current
97
99
  const got = await effectiveHost.request(missing)
98
- const kept = Object.fromEntries(Object.entries(got).filter(([k, v]) => missing.includes(k) && typeof v === "string"))
100
+ const kept = Object.fromEntries(Object.entries(got).filter(([, v]) => typeof v === "string"))
99
101
  setOwn((v) => ({ ...v, ...kept }))
100
102
  return { ...valuesRef.current, ...kept }
101
103
  }, [effectiveHost])
@@ -176,7 +178,7 @@ export function EnvGate({ names, title }: { names: readonly string[]; title?: st
176
178
  ))}
177
179
  </ul>
178
180
  <button type="button" className="docs-env-gate-button" onClick={() => void load()} disabled={busy}>
179
- {busy ? "Waiting…" : host.label ?? "Load Variables"}
181
+ {busy ? "Waiting…" : (typeof host.label === "function" ? host.label(names) : host.label) ?? "Load Variables"}
180
182
  </button>
181
183
  </>
182
184
  ) : (
@@ -0,0 +1,264 @@
1
+ /* A passkey keychain for a page's environment variables (frontmatter `env`).
2
+
3
+ The values are encrypted with AES-GCM under a key derived (HKDF) from the passkey's PRF output, so reading
4
+ them takes the reader's fingerprint, face or security key; the ciphertext lives in localStorage. Which
5
+ variables it holds is kept in the clear (names are not secrets), so a page can say "unlock" rather than
6
+ "sign in" before asking for biometrics. There is no recovery key: tokens can always be fetched again, so
7
+ losing the passkey only means signing in again (`reset()` starts over).
8
+
9
+ const keychain = createEnvKeychain({ id: "my-docs", rpName: "My docs" })
10
+ const envHost = keychainEnvHost(keychain, {
11
+ obtain: async (names) => ({ GITHUB_TOKEN: await signInWithGitHub() }), // for what it doesn't hold
12
+ })
13
+
14
+ `keychainEnvHost` unlocks once (a biometric prompt) and then answers with *everything* the keychain holds,
15
+ so one press opens every example on the page whose variables are already saved. Runs in the browser only;
16
+ PRF needs a passkey provider that supports it (iCloud Keychain, Google Password Manager, Windows Hello,
17
+ recent security keys). Without it, values are kept for the page only. */
18
+ import type { DocstreamEnvHost } from "./doc-env"
19
+
20
+ export type EnvKeychainStatus = "unsupported" | "empty" | "locked" | "unlocked"
21
+
22
+ export interface EnvKeychain {
23
+ readonly status: EnvKeychainStatus
24
+ /** The variables it holds (readable while locked). */
25
+ readonly names: readonly string[]
26
+ /** Creates the passkey (a biometric prompt; may ask twice on authenticators that only return PRF on sign-in). */
27
+ enroll(): Promise<void>
28
+ /** A biometric prompt; then `values` can be read. */
29
+ unlock(): Promise<void>
30
+ lock(): void
31
+ /** Everything it holds. Unlocked only. */
32
+ values(): Promise<Record<string, string>>
33
+ /** Adds or replaces values. Unlocked only. */
34
+ set(values: Record<string, string>): Promise<void>
35
+ /** Forgets one variable, or (no argument) everything including the passkey's record. */
36
+ reset(name?: string): Promise<void>
37
+ subscribe(listener: () => void): () => void
38
+ }
39
+
40
+ export interface EnvKeychainOptions {
41
+ /** Names the keychain in storage; different ids are different keychains. */
42
+ id: string
43
+ /** Shown by the passkey prompt. */
44
+ rpName: string
45
+ /** Account name the passkey is listed under. Default "Environment variables". */
46
+ userName?: string
47
+ /** Default `localStorage`. */
48
+ storage?: Pick<Storage, "getItem" | "setItem" | "removeItem">
49
+ }
50
+
51
+ interface Stored {
52
+ v: 1
53
+ credentialId: string
54
+ salt: string
55
+ names: string[]
56
+ iv?: string
57
+ data?: string
58
+ }
59
+
60
+ const b64 = (bytes: ArrayBuffer | Uint8Array) => {
61
+ const u = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)
62
+ let s = ""
63
+ for (const b of u) s += String.fromCharCode(b)
64
+ return btoa(s).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "")
65
+ }
66
+ const unb64 = (text: string) => {
67
+ const s = atob(text.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((text.length + 3) % 4))
68
+ return Uint8Array.from(s, (c) => c.charCodeAt(0))
69
+ }
70
+ const random = (n: number) => crypto.getRandomValues(new Uint8Array(n))
71
+
72
+ type PrfResults = { prf?: { enabled?: boolean; results?: { first?: ArrayBuffer | ArrayBufferView } } }
73
+ const prfFirst = (credential: PublicKeyCredential): Uint8Array<ArrayBuffer> | null => {
74
+ const first = (credential.getClientExtensionResults() as PrfResults).prf?.results?.first
75
+ if (!first) return null
76
+ const view = ArrayBuffer.isView(first) ? new Uint8Array(first.buffer, first.byteOffset, first.byteLength) : new Uint8Array(first)
77
+ const copy = new Uint8Array(view.byteLength)
78
+ copy.set(view)
79
+ return copy
80
+ }
81
+
82
+ async function aesKey(prf: Uint8Array<ArrayBuffer>): Promise<CryptoKey> {
83
+ const base = await crypto.subtle.importKey("raw", prf, "HKDF", false, ["deriveKey"])
84
+ return crypto.subtle.deriveKey(
85
+ { name: "HKDF", hash: "SHA-256", salt: new Uint8Array(0), info: new TextEncoder().encode("docstream env keychain v1") },
86
+ base,
87
+ { name: "AES-GCM", length: 256 },
88
+ false,
89
+ ["encrypt", "decrypt"],
90
+ )
91
+ }
92
+
93
+ export function createEnvKeychain(options: EnvKeychainOptions): EnvKeychain {
94
+ const key = `docstream-env-keychain:${options.id}`
95
+ const storage = options.storage ?? (typeof localStorage !== "undefined" ? localStorage : null)
96
+ const listeners = new Set<() => void>()
97
+ let aes: CryptoKey | null = null
98
+ let cache: Record<string, string> | null = null
99
+
100
+ const read = (): Stored | null => {
101
+ try {
102
+ const raw = storage?.getItem(key)
103
+ const s = raw ? (JSON.parse(raw) as Stored) : null
104
+ return s?.v === 1 && typeof s.credentialId === "string" && typeof s.salt === "string" ? { ...s, names: Array.isArray(s.names) ? s.names : [] } : null
105
+ } catch {
106
+ return null
107
+ }
108
+ }
109
+ const write = (s: Stored | null) => {
110
+ if (s) storage?.setItem(key, JSON.stringify(s))
111
+ else storage?.removeItem(key)
112
+ listeners.forEach((l) => l())
113
+ }
114
+ const supported = () =>
115
+ typeof window !== "undefined" && window.isSecureContext && typeof PublicKeyCredential !== "undefined" && !!navigator.credentials && !!storage && !!crypto?.subtle
116
+
117
+ /** A sign-in with the stored passkey, returning its PRF output. */
118
+ async function assert(stored: Stored): Promise<Uint8Array<ArrayBuffer>> {
119
+ const credential = (await navigator.credentials.get({
120
+ publicKey: {
121
+ challenge: random(32),
122
+ allowCredentials: [{ type: "public-key", id: unb64(stored.credentialId) }],
123
+ userVerification: "required",
124
+ extensions: { prf: { eval: { first: unb64(stored.salt) } } } as AuthenticationExtensionsClientInputs,
125
+ },
126
+ })) as PublicKeyCredential | null
127
+ const first = credential && prfFirst(credential)
128
+ if (!first) throw new Error("This passkey can't unlock the keychain (no PRF support).")
129
+ return first
130
+ }
131
+
132
+ async function seal(values: Record<string, string>, stored: Stored) {
133
+ const iv = random(12)
134
+ const data = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, aes!, new TextEncoder().encode(JSON.stringify(values)))
135
+ cache = { ...values }
136
+ write({ ...stored, names: Object.keys(values).sort(), iv: b64(iv), data: b64(data) })
137
+ }
138
+
139
+ const keychain: EnvKeychain = {
140
+ get status(): EnvKeychainStatus {
141
+ if (!supported()) return "unsupported"
142
+ if (!read()) return "empty"
143
+ return aes ? "unlocked" : "locked"
144
+ },
145
+ get names() {
146
+ return read()?.names ?? []
147
+ },
148
+ async enroll() {
149
+ if (!supported()) throw new Error("This browser can't keep a passkey keychain.")
150
+ const salt = random(32)
151
+ const created = (await navigator.credentials.create({
152
+ publicKey: {
153
+ rp: { name: options.rpName },
154
+ user: { id: random(16), name: options.userName ?? "Environment variables", displayName: options.userName ?? "Environment variables" },
155
+ challenge: random(32),
156
+ pubKeyCredParams: [{ type: "public-key", alg: -7 }, { type: "public-key", alg: -257 }],
157
+ authenticatorSelection: { residentKey: "preferred", userVerification: "required" },
158
+ extensions: { prf: { eval: { first: salt } } } as AuthenticationExtensionsClientInputs,
159
+ },
160
+ })) as PublicKeyCredential | null
161
+ if (!created) throw new Error("No passkey was created.")
162
+ const ext = (created.getClientExtensionResults() as PrfResults).prf
163
+ if (!ext?.enabled && !ext?.results?.first) throw new Error("This passkey can't encrypt (no PRF support). Try another passkey provider.")
164
+ const stored: Stored = { v: 1, credentialId: b64(created.rawId), salt: b64(salt), names: [] }
165
+ // Some authenticators only evaluate PRF on sign-in: then this asks once more.
166
+ aes = await aesKey(prfFirst(created) ?? (await assert(stored)))
167
+ await seal({}, stored)
168
+ },
169
+ async unlock() {
170
+ const stored = read()
171
+ if (!stored) throw new Error("There is no keychain yet.")
172
+ if (aes) return
173
+ aes = await aesKey(await assert(stored))
174
+ cache = null
175
+ listeners.forEach((l) => l())
176
+ },
177
+ lock() {
178
+ aes = null
179
+ cache = null
180
+ listeners.forEach((l) => l())
181
+ },
182
+ async values() {
183
+ if (!aes) throw new Error("The keychain is locked.")
184
+ if (cache) return { ...cache }
185
+ const stored = read()
186
+ if (!stored?.data || !stored.iv) return (cache = {})
187
+ try {
188
+ const plain = await crypto.subtle.decrypt({ name: "AES-GCM", iv: unb64(stored.iv) }, aes, unb64(stored.data))
189
+ cache = JSON.parse(new TextDecoder().decode(plain)) as Record<string, string>
190
+ } catch {
191
+ aes = null
192
+ throw new Error("That passkey doesn't open this keychain.")
193
+ }
194
+ return { ...cache }
195
+ },
196
+ async set(values) {
197
+ const stored = read()
198
+ if (!stored || !aes) throw new Error("The keychain is locked.")
199
+ await seal({ ...(await keychain.values()), ...values }, stored)
200
+ },
201
+ async reset(name) {
202
+ if (name === undefined) {
203
+ aes = null
204
+ cache = null
205
+ write(null)
206
+ return
207
+ }
208
+ const stored = read()
209
+ if (!stored) return
210
+ if (aes) {
211
+ const { [name]: _, ...rest } = await keychain.values()
212
+ await seal(rest, stored)
213
+ } else write({ ...stored, names: stored.names.filter((n) => n !== name) })
214
+ },
215
+ subscribe(listener) {
216
+ listeners.add(listener)
217
+ return () => listeners.delete(listener)
218
+ },
219
+ }
220
+ return keychain
221
+ }
222
+
223
+ export interface KeychainEnvHostOptions {
224
+ /** Gets values the keychain doesn't hold — a sign-in, a prompt. Resolve with what you got; it is saved. */
225
+ obtain?: (names: readonly string[]) => Promise<Record<string, string>>
226
+ /** The gate's button when a sign-in is needed. Default "Sign In". */
227
+ signInLabel?: string | ((names: readonly string[]) => string)
228
+ /** The gate's button when the keychain already holds everything the example needs. Default "Unlock with Passkey". */
229
+ unlockLabel?: string
230
+ /** A hint beside a variable the keychain doesn't hold. */
231
+ describe?: (name: string) => string | undefined
232
+ }
233
+
234
+ /**
235
+ * A `DocstreamEnvHost` over a keychain. Pressing a gate's button:
236
+ * 1. creates the keychain (first time; a passkey prompt) or unlocks it (a biometric prompt);
237
+ * 2. asks `obtain` for the variables it doesn't hold, and saves them;
238
+ * 3. answers with everything the keychain holds, so every example those values cover opens.
239
+ * Without passkey support (or if the reader declines) values are kept for the page only.
240
+ */
241
+ export function keychainEnvHost(keychain: EnvKeychain, options: KeychainEnvHostOptions = {}): DocstreamEnvHost {
242
+ const held = (names: readonly string[]) => names.every((n) => keychain.names.includes(n))
243
+ return {
244
+ label: (names) =>
245
+ held(names) ? options.unlockLabel ?? "Unlock with Passkey"
246
+ : typeof options.signInLabel === "function" ? options.signInLabel(names) : options.signInLabel ?? "Sign In",
247
+ describe: (name) => (keychain.names.includes(name) ? "In your keychain" : options.describe?.(name)),
248
+ async request(names) {
249
+ // The press's user activation is still live here: spend it on the passkey prompt first.
250
+ let usable = keychain.status === "unlocked"
251
+ if (keychain.status === "locked") {
252
+ await keychain.unlock()
253
+ usable = true
254
+ } else if (keychain.status === "empty") {
255
+ usable = await keychain.enroll().then(() => true, () => false)
256
+ }
257
+ const saved = usable ? await keychain.values() : {}
258
+ const missing = names.filter((n) => saved[n] === undefined)
259
+ const got = missing.length && options.obtain ? await options.obtain(missing) : {}
260
+ if (usable && Object.keys(got).length) await keychain.set(got)
261
+ return { ...saved, ...got }
262
+ },
263
+ }
264
+ }
package/src/index.ts CHANGED
@@ -8,6 +8,8 @@ export type { TaskCheckboxProps, TaskStateChangeHandler } from "./docs/TaskCheck
8
8
  export { TASK_STATES, getTaskState, taskMarker, taskStateFromMarker } from "./gitbook/tasks"
9
9
  export { DocstreamEnvProvider, EnvGate, envNamesFromProperties, useDocstreamEnv, useEnvGate, usedEnvNames } from "./doc-env"
10
10
  export type { DocstreamEnv, DocstreamEnvHost, DocstreamEnvProviderProps, DocstreamEnvValues } from "./doc-env"
11
+ export { createEnvKeychain, keychainEnvHost } from "./env-keychain"
12
+ export type { EnvKeychain, EnvKeychainOptions, EnvKeychainStatus, KeychainEnvHostOptions } from "./env-keychain"
11
13
  export { DocumentProperties } from "./docs/DocumentProperties"
12
14
  export type { DocumentPropertiesProps } from "./docs/DocumentProperties"
13
15
  export { readDocumentProperties, removeDocumentProperty, setDocumentProperty } from "./gitbook/properties"