@demiurgejs/core 0.2.0-beta.2 → 0.2.0-beta.4

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.
Files changed (232) hide show
  1. package/README.md +13 -11
  2. package/bin/demiurge.mjs +30 -12
  3. package/dist/adapter/testing.js.map +1 -1
  4. package/dist/browser/file-router.d.ts +388 -5
  5. package/dist/browser/file-router.d.ts.map +1 -1
  6. package/dist/browser/focus.d.ts +20 -0
  7. package/dist/browser/focus.d.ts.map +1 -0
  8. package/dist/browser/index.d.ts +7 -1
  9. package/dist/browser/index.d.ts.map +1 -1
  10. package/dist/browser/mutation-action.d.ts +81 -0
  11. package/dist/browser/mutation-action.d.ts.map +1 -0
  12. package/dist/chunks/document-shell-CpJnFtSC.js +36 -0
  13. package/dist/chunks/document-shell-CpJnFtSC.js.map +1 -0
  14. package/dist/chunks/env-startup-DOBYWlZD.js +257 -0
  15. package/dist/chunks/env-startup-DOBYWlZD.js.map +1 -0
  16. package/dist/chunks/{image-codec-BGTx_t5K.js → image-codec-BmzWnH6W.js} +2 -2
  17. package/dist/chunks/{image-codec-BGTx_t5K.js.map → image-codec-BmzWnH6W.js.map} +1 -1
  18. package/dist/chunks/{images-B9MqcjSA.js → images-BQ80950B.js} +99 -91
  19. package/dist/chunks/images-BQ80950B.js.map +1 -0
  20. package/dist/chunks/index-BVk9zWbe.js +832 -0
  21. package/dist/chunks/index-BVk9zWbe.js.map +1 -0
  22. package/dist/chunks/manifest-vO6c0G0W.js +19 -0
  23. package/dist/chunks/manifest-vO6c0G0W.js.map +1 -0
  24. package/dist/chunks/plugin-BQgMiHxa.js +1827 -0
  25. package/dist/chunks/plugin-BQgMiHxa.js.map +1 -0
  26. package/dist/chunks/session-store-ChModVcq.js +92 -0
  27. package/dist/chunks/session-store-ChModVcq.js.map +1 -0
  28. package/dist/chunks/static-files-ehaD1kE7.js +51 -0
  29. package/dist/chunks/static-files-ehaD1kE7.js.map +1 -0
  30. package/dist/chunks/{streaming-BQ1bykDo.js → streaming-BEbPN7Uk.js} +163 -163
  31. package/dist/chunks/streaming-BEbPN7Uk.js.map +1 -0
  32. package/dist/chunks/testing-DueXbMo4.js +4167 -0
  33. package/dist/chunks/testing-DueXbMo4.js.map +1 -0
  34. package/dist/chunks/vite-DO70kZA6.js +259 -0
  35. package/dist/chunks/vite-DO70kZA6.js.map +1 -0
  36. package/dist/cli.d.ts +17 -25
  37. package/dist/cli.d.ts.map +1 -1
  38. package/dist/cli.js +159 -124
  39. package/dist/cli.js.map +1 -1
  40. package/dist/config/define.d.ts +3 -0
  41. package/dist/config/define.d.ts.map +1 -0
  42. package/dist/config/index.d.ts +7 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +78 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/load.d.ts +12 -0
  47. package/dist/config/load.d.ts.map +1 -0
  48. package/dist/config/types.d.ts +64 -0
  49. package/dist/config/types.d.ts.map +1 -0
  50. package/dist/config/validate.d.ts +9 -0
  51. package/dist/config/validate.d.ts.map +1 -0
  52. package/dist/config/vite.d.ts +12 -0
  53. package/dist/config/vite.d.ts.map +1 -0
  54. package/dist/data/cache.d.ts +10 -0
  55. package/dist/data/cache.d.ts.map +1 -1
  56. package/dist/data/idempotency.d.ts.map +1 -1
  57. package/dist/data/index.d.ts +3 -1
  58. package/dist/data/index.d.ts.map +1 -1
  59. package/dist/data/testing.d.ts.map +1 -1
  60. package/dist/data/testing.js +94 -72
  61. package/dist/data/testing.js.map +1 -1
  62. package/dist/data/tiered.d.ts +7 -0
  63. package/dist/data/tiered.d.ts.map +1 -0
  64. package/dist/deployment/testing.d.ts +25 -0
  65. package/dist/deployment/testing.d.ts.map +1 -0
  66. package/dist/deployment/testing.js +171 -0
  67. package/dist/deployment/testing.js.map +1 -0
  68. package/dist/document/deferred-scripts.d.ts.map +1 -1
  69. package/dist/document/hydration.d.ts +9 -0
  70. package/dist/document/hydration.d.ts.map +1 -1
  71. package/dist/document/index.d.ts +5 -2
  72. package/dist/document/index.d.ts.map +1 -1
  73. package/dist/document/metadata.d.ts +8 -0
  74. package/dist/document/metadata.d.ts.map +1 -1
  75. package/dist/document/navigation.d.ts +28 -0
  76. package/dist/document/navigation.d.ts.map +1 -0
  77. package/dist/document/render.d.ts +3 -1
  78. package/dist/document/render.d.ts.map +1 -1
  79. package/dist/document/seo.d.ts.map +1 -1
  80. package/dist/document/trusted-types.d.ts +10 -0
  81. package/dist/document/trusted-types.d.ts.map +1 -0
  82. package/dist/edge/assets.d.ts.map +1 -1
  83. package/dist/edge/index.js +55 -73
  84. package/dist/edge/index.js.map +1 -1
  85. package/dist/index.d.ts +15 -13
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2078 -573
  88. package/dist/index.js.map +1 -1
  89. package/dist/internal/testing.js +11 -11
  90. package/dist/kv/index.d.ts +4 -0
  91. package/dist/kv/index.d.ts.map +1 -1
  92. package/dist/kv/index.js +180 -60
  93. package/dist/kv/index.js.map +1 -1
  94. package/dist/kv/rate-limit-store.d.ts +8 -0
  95. package/dist/kv/rate-limit-store.d.ts.map +1 -0
  96. package/dist/kv/session-store.d.ts +20 -0
  97. package/dist/kv/session-store.d.ts.map +1 -0
  98. package/dist/kv/store.d.ts.map +1 -1
  99. package/dist/manifest.d.ts +10 -0
  100. package/dist/manifest.d.ts.map +1 -0
  101. package/dist/node/http.d.ts.map +1 -1
  102. package/dist/node/image.d.ts.map +1 -1
  103. package/dist/node/index.d.ts +3 -0
  104. package/dist/node/index.d.ts.map +1 -1
  105. package/dist/node/index.js +251 -178
  106. package/dist/node/index.js.map +1 -1
  107. package/dist/node/serve.d.ts +47 -0
  108. package/dist/node/serve.d.ts.map +1 -0
  109. package/dist/node/static.d.ts.map +1 -1
  110. package/dist/node/streaming.d.ts.map +1 -1
  111. package/dist/platform/fonts.d.ts.map +1 -1
  112. package/dist/platform/image-url.d.ts.map +1 -1
  113. package/dist/platform/images.d.ts.map +1 -1
  114. package/dist/platform/index.d.ts +5 -1
  115. package/dist/platform/index.d.ts.map +1 -1
  116. package/dist/platform/observability.d.ts +2 -1
  117. package/dist/platform/observability.d.ts.map +1 -1
  118. package/dist/platform/url.d.ts +19 -0
  119. package/dist/platform/url.d.ts.map +1 -0
  120. package/dist/platform/web-vitals-client.d.ts +32 -0
  121. package/dist/platform/web-vitals-client.d.ts.map +1 -0
  122. package/dist/platform/web-vitals.d.ts +78 -0
  123. package/dist/platform/web-vitals.d.ts.map +1 -0
  124. package/dist/redis/index.d.ts +4 -0
  125. package/dist/redis/index.d.ts.map +1 -1
  126. package/dist/redis/index.js +209 -54
  127. package/dist/redis/index.js.map +1 -1
  128. package/dist/redis/rate-limit-store.d.ts +8 -0
  129. package/dist/redis/rate-limit-store.d.ts.map +1 -0
  130. package/dist/redis/session-store.d.ts +9 -0
  131. package/dist/redis/session-store.d.ts.map +1 -0
  132. package/dist/redis/store.d.ts.map +1 -1
  133. package/dist/route/index.d.ts +2 -2
  134. package/dist/route/index.d.ts.map +1 -1
  135. package/dist/route/middleware.d.ts.map +1 -1
  136. package/dist/route/mutation.d.ts +97 -0
  137. package/dist/route/mutation.d.ts.map +1 -0
  138. package/dist/route/response.d.ts.map +1 -1
  139. package/dist/route/types.d.ts +6 -1
  140. package/dist/route/types.d.ts.map +1 -1
  141. package/dist/router/index.d.ts +1 -1
  142. package/dist/router/index.d.ts.map +1 -1
  143. package/dist/router/manifest.d.ts +9 -0
  144. package/dist/router/manifest.d.ts.map +1 -1
  145. package/dist/router/navigation-data.d.ts +9 -1
  146. package/dist/router/navigation-data.d.ts.map +1 -1
  147. package/dist/routing/generate.d.ts +3 -0
  148. package/dist/routing/generate.d.ts.map +1 -1
  149. package/dist/routing/index.d.ts +3 -1
  150. package/dist/routing/index.d.ts.map +1 -1
  151. package/dist/routing/locale.d.ts +43 -0
  152. package/dist/routing/locale.d.ts.map +1 -0
  153. package/dist/routing/types.d.ts +12 -0
  154. package/dist/routing/types.d.ts.map +1 -1
  155. package/dist/security/cookie-session.d.ts +43 -0
  156. package/dist/security/cookie-session.d.ts.map +1 -0
  157. package/dist/security/cookies.d.ts +26 -0
  158. package/dist/security/cookies.d.ts.map +1 -0
  159. package/dist/security/csrf.d.ts +1 -1
  160. package/dist/security/csrf.d.ts.map +1 -1
  161. package/dist/security/env-startup.d.ts +15 -0
  162. package/dist/security/env-startup.d.ts.map +1 -0
  163. package/dist/security/env.d.ts +25 -6
  164. package/dist/security/env.d.ts.map +1 -1
  165. package/dist/security/fetch-metadata.d.ts +29 -0
  166. package/dist/security/fetch-metadata.d.ts.map +1 -0
  167. package/dist/security/index.d.ts +14 -2
  168. package/dist/security/index.d.ts.map +1 -1
  169. package/dist/security/policy.d.ts.map +1 -1
  170. package/dist/security/rate-limit.d.ts +6 -3
  171. package/dist/security/rate-limit.d.ts.map +1 -1
  172. package/dist/security/report.d.ts.map +1 -1
  173. package/dist/security/request.d.ts.map +1 -1
  174. package/dist/security/session-manager.d.ts +32 -0
  175. package/dist/security/session-manager.d.ts.map +1 -0
  176. package/dist/security/session-store.d.ts +51 -0
  177. package/dist/security/session-store.d.ts.map +1 -0
  178. package/dist/security/testing.d.ts +10 -0
  179. package/dist/security/testing.d.ts.map +1 -0
  180. package/dist/security/testing.js +145 -0
  181. package/dist/security/testing.js.map +1 -0
  182. package/dist/security/types.d.ts +73 -3
  183. package/dist/security/types.d.ts.map +1 -1
  184. package/dist/server/document-shell.d.ts.map +1 -1
  185. package/dist/server/errors.d.ts +1 -0
  186. package/dist/server/errors.d.ts.map +1 -1
  187. package/dist/server/index.d.ts +2 -1
  188. package/dist/server/index.d.ts.map +1 -1
  189. package/dist/server/not-found.d.ts +1 -0
  190. package/dist/server/not-found.d.ts.map +1 -1
  191. package/dist/server/render-tree.d.ts.map +1 -1
  192. package/dist/server/request-handler.d.ts +10 -2
  193. package/dist/server/request-handler.d.ts.map +1 -1
  194. package/dist/server/request-metadata.d.ts +1 -0
  195. package/dist/server/request-metadata.d.ts.map +1 -1
  196. package/dist/server/ssr.d.ts +2 -0
  197. package/dist/server/ssr.d.ts.map +1 -1
  198. package/dist/static/index.d.ts +2 -0
  199. package/dist/static/index.d.ts.map +1 -1
  200. package/dist/static/index.js +380 -363
  201. package/dist/static/index.js.map +1 -1
  202. package/dist/static/preview.d.ts.map +1 -1
  203. package/dist/static/vercel.d.ts +11 -2
  204. package/dist/static/vercel.d.ts.map +1 -1
  205. package/dist/static-files.d.ts +12 -0
  206. package/dist/static-files.d.ts.map +1 -1
  207. package/dist/type-guards.d.ts +19 -0
  208. package/dist/type-guards.d.ts.map +1 -0
  209. package/dist/vite/env-boundary.d.ts +14 -0
  210. package/dist/vite/env-boundary.d.ts.map +1 -0
  211. package/dist/vite/index.d.ts +8 -3
  212. package/dist/vite/index.d.ts.map +1 -1
  213. package/dist/vite/index.js +22 -1196
  214. package/dist/vite/index.js.map +1 -1
  215. package/dist/vite/plugin.d.ts +8 -1
  216. package/dist/vite/plugin.d.ts.map +1 -1
  217. package/dist/vite/policy-verification.d.ts.map +1 -1
  218. package/dist/vite/route-audit.d.ts +50 -0
  219. package/dist/vite/route-audit.d.ts.map +1 -0
  220. package/package.json +19 -6
  221. package/dist/chunks/document-shell-D1xo6cEA.js +0 -35
  222. package/dist/chunks/document-shell-D1xo6cEA.js.map +0 -1
  223. package/dist/chunks/images-B9MqcjSA.js.map +0 -1
  224. package/dist/chunks/request-metadata-D5NrT8ks.js +0 -642
  225. package/dist/chunks/request-metadata-D5NrT8ks.js.map +0 -1
  226. package/dist/chunks/static-files-DUjHw-4H.js +0 -11
  227. package/dist/chunks/static-files-DUjHw-4H.js.map +0 -1
  228. package/dist/chunks/streaming-BQ1bykDo.js.map +0 -1
  229. package/dist/chunks/testing-B_iMFYz_.js +0 -3321
  230. package/dist/chunks/testing-B_iMFYz_.js.map +0 -1
  231. package/dist/route/action.d.ts +0 -33
  232. package/dist/route/action.d.ts.map +0 -1
@@ -1,23 +1,23 @@
1
- import { h as n, b as u, k as b, am as i, j as r, an as _, ao as c, y as m, w as d, x as h, ap as R, aq as p, ar as g, as as f, at as F } from "../chunks/testing-B_iMFYz_.js";
1
+ import { h as u, b as n, D as b, aM as i, w as _, q as r, aN as c, Q as R, P as d, p as h, aO as m, aP as p, aQ as P, aR as g, aS as f } from "../chunks/testing-DueXbMo4.js";
2
2
  import "react-dom/server";
3
- import "../chunks/request-metadata-D5NrT8ks.js";
3
+ import "../chunks/index-BVk9zWbe.js";
4
4
  import "react";
5
5
  import "react/jsx-runtime";
6
6
  export {
7
- n as handleRequestWithManifest,
8
- u as unstable_collectStaticRoutePaths,
7
+ u as handleRequestWithManifest,
8
+ n as unstable_collectStaticRoutePaths,
9
9
  b as unstable_createRouteManifest,
10
10
  i as unstable_findPageMatch,
11
- r as unstable_findRouteMatch,
12
- _ as unstable_isAttachedFileForRoute,
11
+ _ as unstable_findRouteMatch,
12
+ r as unstable_isAttachedFileForRoute,
13
13
  c as unstable_isLayoutForPage,
14
- m as unstable_loadErrorFallback,
14
+ R as unstable_loadErrorFallback,
15
15
  d as unstable_loadLoadingFallback,
16
16
  h as unstable_loadPageRoute,
17
- R as unstable_loadRoute,
17
+ m as unstable_loadRoute,
18
18
  p as unstable_matchSegments,
19
- g as unstable_scoreRoute,
20
- f as unstable_splitPathname,
21
- F as unstable_toRouteSegments
19
+ P as unstable_scoreRoute,
20
+ g as unstable_splitPathname,
21
+ f as unstable_toRouteSegments
22
22
  };
23
23
  //# sourceMappingURL=testing.js.map
@@ -1,3 +1,7 @@
1
1
  export { createKvCacheStore } from "./store";
2
2
  export type { EdgeKvListKey, EdgeKvListResult, EdgeKvNamespace, EdgeKvPutOptions, KvCacheStoreOptions, } from "./store";
3
+ export { createKvRateLimitStore } from "./rate-limit-store";
4
+ export type { KvRateLimitStoreOptions } from "./rate-limit-store";
5
+ export { createKvSessionStore } from "./session-store";
6
+ export type { EdgeKvAtomicOperation, EdgeKvSessionNamespace, KvSessionStoreOptions, } from "./session-store";
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kv/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kv/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
package/dist/kv/index.js CHANGED
@@ -1,103 +1,223 @@
1
- const $ = "demiurge:cache:";
2
- function S(i) {
3
- if (!i.namespace || typeof i.namespace.get != "function")
1
+ import { s as R, p as b } from "../chunks/session-store-ChModVcq.js";
2
+ const M = "demiurge:cache:", O = 1e3;
3
+ function T(r) {
4
+ if (!r.namespace || typeof r.namespace.get != "function")
4
5
  throw new Error(
5
6
  "Demiurge KV cache store requires an EdgeKvNamespace. Pass a connected KV client matching the get/put/delete/list interface documented on EdgeKvNamespace."
6
7
  );
7
- const a = i.namespace, u = i.keyPrefix ?? $, v = `${u}entry:`, K = `${u}tag:`, P = `${u}lease:`;
8
- function o(e) {
9
- return v + e;
8
+ const t = r.namespace, d = r.keyPrefix ?? M, w = `${d}entry:`, f = `${d}tag:`, c = `${d}lease:`;
9
+ function s(e) {
10
+ return w + e;
10
11
  }
11
- function r(e) {
12
- return P + e;
12
+ function n(e) {
13
+ return c + e;
13
14
  }
14
- function f(e, t) {
15
- return `${K}${e}:${t}`;
15
+ function o(e, a) {
16
+ return `${f}${e}:${a}`;
16
17
  }
17
- async function l(e) {
18
- const t = await a.get(o(e));
19
- return t ? JSON.parse(t) : void 0;
18
+ async function i(e) {
19
+ const a = await t.get(s(e));
20
+ return a ? JSON.parse(a) : void 0;
20
21
  }
21
- async function w(e, t) {
22
+ async function u(e, a) {
22
23
  await Promise.all(
23
- t.map((n) => a.delete(f(n, e)))
24
+ a.map((l) => t.delete(o(l, e)))
24
25
  );
25
26
  }
26
- async function E(e, t, n) {
27
+ async function y(e, a, l) {
27
28
  await Promise.all(
28
- t.map(
29
- (s) => a.put(f(s, e), "1", { expiration: n })
29
+ a.map(
30
+ (p) => t.put(o(p, e), "1", { expiration: l })
30
31
  )
31
32
  );
32
33
  }
33
- async function m(e, t) {
34
- const n = await l(e);
35
- n && await w(e, n.tags);
36
- const s = b(t);
37
- await a.put(o(e), JSON.stringify(t), { expiration: s }), await E(e, t.tags, s);
34
+ async function g(e, a) {
35
+ const l = await i(e);
36
+ l && await u(e, l.tags);
37
+ const p = J(a);
38
+ await t.put(s(e), JSON.stringify(a), { expiration: p }), await y(e, a.tags, p);
38
39
  }
39
40
  return {
40
- async acquireRefreshLease(e, t, n) {
41
- return await a.get(r(e)) ? !1 : (await a.put(r(e), t, {
42
- expiration: y(n)
41
+ async acquireRefreshLease(e, a, l) {
42
+ return await t.get(n(e)) ? !1 : (await t.put(n(e), a, {
43
+ expiration: $(l)
43
44
  }), !0);
44
45
  },
45
46
  async delete(e) {
46
- const t = await l(e);
47
- return await a.delete(r(e)), t ? (await w(e, t.tags), await a.delete(o(e)), !0) : !1;
47
+ const a = await i(e);
48
+ return await t.delete(n(e)), a ? (await u(e, a.tags), await t.delete(s(e)), !0) : !1;
48
49
  },
49
50
  async get(e) {
50
- return await l(e);
51
+ return await i(e);
51
52
  },
52
53
  async invalidateTags(e) {
53
54
  if (e.length === 0)
54
55
  return 0;
55
- const t = /* @__PURE__ */ new Set();
56
- let n = 0;
57
- for (const s of e) {
58
- const p = f(s, "");
59
- let d;
56
+ const a = /* @__PURE__ */ new Set();
57
+ let l = 0;
58
+ for (const p of e) {
59
+ const E = o(p, "");
60
+ let v;
60
61
  do {
61
- const g = await a.list({
62
- cursor: d,
63
- limit: 1e3,
64
- prefix: p
62
+ const h = await t.list({
63
+ cursor: v,
64
+ limit: O,
65
+ prefix: E
65
66
  });
66
- for (const h of g.keys) {
67
- const c = h.name.slice(p.length);
68
- if (t.has(c))
67
+ for (const S of h.keys) {
68
+ const m = S.name.slice(E.length);
69
+ if (a.has(m))
69
70
  continue;
70
- t.add(c);
71
- const x = await l(c);
72
- if (!x) {
73
- await a.delete(h.name);
71
+ a.add(m);
72
+ const N = await i(m);
73
+ if (!N) {
74
+ await t.delete(S.name);
74
75
  continue;
75
76
  }
76
- await w(c, x.tags), await a.delete(o(c)), await a.delete(r(c)), n += 1;
77
+ await u(m, N.tags), await t.delete(s(m)), await t.delete(n(m)), l += 1;
77
78
  }
78
- d = g.list_complete ? void 0 : g.cursor;
79
- } while (d);
79
+ v = h.list_complete ? void 0 : h.cursor;
80
+ } while (v);
80
81
  }
81
- return n;
82
+ return l;
82
83
  },
83
- async publishRefresh(e, t, n) {
84
- return await a.get(r(e)) !== t ? !1 : (await m(e, n), await a.delete(r(e)), !0);
84
+ async publishRefresh(e, a, l) {
85
+ return await t.get(n(e)) !== a ? !1 : (await g(e, l), await t.delete(n(e)), !0);
85
86
  },
86
- async releaseRefreshLease(e, t) {
87
- await a.get(r(e)) === t && await a.delete(r(e));
87
+ async releaseRefreshLease(e, a) {
88
+ await t.get(n(e)) === a && await t.delete(n(e));
88
89
  },
89
- async set(e, t) {
90
- await m(e, t), await a.delete(r(e));
90
+ async set(e, a) {
91
+ await g(e, a), await t.delete(n(e));
91
92
  }
92
93
  };
93
94
  }
94
- function b(i) {
95
- return i.staleUntil === null ? void 0 : y(i.staleUntil);
95
+ function J(r) {
96
+ return r.staleUntil === null ? void 0 : $(r.staleUntil);
96
97
  }
97
- function y(i) {
98
- return Math.ceil(i / 1e3);
98
+ function $(r) {
99
+ return Math.ceil(r / 1e3);
100
+ }
101
+ const q = "demiurge:rate-limit:";
102
+ function C(r) {
103
+ if (!r.namespace || typeof r.namespace.get != "function")
104
+ throw new Error(
105
+ "Demiurge KV rate limit store requires an EdgeKvNamespace. Pass a connected KV client matching the get/put/delete/list interface documented on EdgeKvNamespace."
106
+ );
107
+ const t = r.namespace, d = r.keyPrefix ?? q;
108
+ function w(f) {
109
+ return `${d}${f}`;
110
+ }
111
+ return {
112
+ async increment(f, c, s) {
113
+ const n = w(f), o = await t.get(n), i = o ? JSON.parse(o) : void 0, u = !i || i.resetAt <= s ? { count: 1, resetAt: s + c } : { count: i.count + 1, resetAt: i.resetAt };
114
+ return await t.put(n, JSON.stringify(u), {
115
+ expiration: V(u.resetAt)
116
+ }), u;
117
+ }
118
+ };
119
+ }
120
+ function V(r) {
121
+ return Math.ceil(r / 1e3);
122
+ }
123
+ const D = "demiurge:session:";
124
+ function I(r) {
125
+ if (!r.store || typeof r.store.get != "function")
126
+ throw new Error(
127
+ "Demiurge KV session store requires an EdgeKvSessionNamespace. Pass an application-owned KV client as `store`."
128
+ );
129
+ if (typeof r.store.atomic != "function")
130
+ throw new Error(
131
+ "Demiurge KV session store requires atomic compare-and-swap operations. Adapt the provider transaction API to EdgeKvSessionNamespace.atomic."
132
+ );
133
+ const t = r.store, d = R(r.namespace), w = `${r.keyPrefix ?? D}${d}:`, f = (c) => w + c;
134
+ return {
135
+ async create(c) {
136
+ const s = P(c, 0);
137
+ try {
138
+ return await t.atomic([x(f(s.id), null, s)]) ? { record: s, status: "stored" } : { status: "conflict" };
139
+ } catch {
140
+ return { status: "unavailable" };
141
+ }
142
+ },
143
+ async destroy(c) {
144
+ const s = f(c), n = await t.get(s);
145
+ return n === null ? !1 : await t.atomic([{ expected: n, key: s }]);
146
+ },
147
+ async read(c, s) {
148
+ const n = f(c), o = await t.get(n);
149
+ if (o === null)
150
+ return;
151
+ const i = K(o);
152
+ if (i) {
153
+ if (A(i) <= s) {
154
+ await t.atomic([{ expected: o, key: n }]);
155
+ return;
156
+ }
157
+ return i;
158
+ }
159
+ },
160
+ async rotate(c, s, n) {
161
+ const o = f(c), i = f(s.id), [u, y] = await Promise.all([
162
+ t.get(o),
163
+ o === i ? Promise.resolve(null) : t.get(i)
164
+ ]);
165
+ if (!u || i !== o && y !== null)
166
+ return { status: "conflict" };
167
+ const g = K(u);
168
+ if (!g || g.version !== n)
169
+ return { status: "conflict" };
170
+ const e = P(s, n + 1), a = o === i ? [x(o, u, e)] : [
171
+ { expected: u, key: o },
172
+ x(i, null, e)
173
+ ];
174
+ try {
175
+ return await t.atomic(a) ? { record: e, status: "stored" } : { status: "conflict" };
176
+ } catch {
177
+ return { status: "unavailable" };
178
+ }
179
+ },
180
+ async update(c, s) {
181
+ const n = f(c.id), o = await t.get(n), i = o ? K(o) : void 0;
182
+ if (!i || i.version !== s)
183
+ return { status: "conflict" };
184
+ const u = P(c, s + 1);
185
+ try {
186
+ return await t.atomic([
187
+ x(n, o, u)
188
+ ]) ? { record: u, status: "stored" } : { status: "conflict" };
189
+ } catch {
190
+ return { status: "unavailable" };
191
+ }
192
+ }
193
+ };
194
+ }
195
+ function x(r, t, d) {
196
+ return {
197
+ expected: t,
198
+ key: r,
199
+ write: {
200
+ options: { expiration: Math.ceil(A(d) / 1e3) },
201
+ value: JSON.stringify(d)
202
+ }
203
+ };
204
+ }
205
+ function K(r) {
206
+ try {
207
+ return b(JSON.parse(r));
208
+ } catch {
209
+ return;
210
+ }
211
+ }
212
+ function P(r, t) {
213
+ return structuredClone({ ...r, version: t });
214
+ }
215
+ function A(r) {
216
+ return Math.min(r.expiresAt, r.idleExpiresAt ?? r.expiresAt);
99
217
  }
100
218
  export {
101
- S as createKvCacheStore
219
+ T as createKvCacheStore,
220
+ C as createKvRateLimitStore,
221
+ I as createKvSessionStore
102
222
  };
103
223
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/kv/store.ts"],"sourcesContent":["import type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\n// This type documents the interface an adapter FOR a KV store needs, not a\n// dependency on any vendor SDK. It is modeled closely on the binding API\n// Cloudflare Workers KV exposes, because that shape is the one most other\n// edge KV providers already copy. The application supplies its own\n// connected client matching this interface, the same way\n// `createRedisCacheStore` takes a connected `ioredis` client rather than\n// owning the connection. A Deno KV or Vercel Edge Config client can satisfy\n// this interface with a small wrapper even when its native method names\n// differ.\nexport type EdgeKvListKey = {\n name: string;\n};\n\nexport type EdgeKvListResult = {\n cursor?: string;\n keys: readonly EdgeKvListKey[];\n list_complete: boolean;\n};\n\nexport type EdgeKvPutOptions = {\n // Absolute expiration, in seconds since the Unix epoch. This store always\n // uses `expiration` rather than `expirationTtl` so an entry's lifetime\n // tracks its `staleUntil` timestamp exactly. Redis gets the same result\n // with `PEXPIREAT` instead of a relative `PEXPIRE`.\n expiration?: number;\n};\n\nexport type EdgeKvNamespace = {\n delete: (key: string) => Promise<void>;\n get: (key: string) => Promise<string | null>;\n list: (options?: {\n cursor?: string;\n limit?: number;\n prefix?: string;\n }) => Promise<EdgeKvListResult>;\n put: (key: string, value: string, options?: EdgeKvPutOptions) => Promise<void>;\n};\n\nexport type KvCacheStoreOptions = {\n // Every consumer of one KV namespace shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an\n // application's other use of the same namespace. Two Demiurge\n // deployments that share a namespace still need distinct prefixes, the\n // same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues operations on a client the application already\n // constructed and bound. Which provider, region, and namespace ID back\n // it is the application's decision, not this store's.\n namespace: EdgeKvNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\nconst listPageLimit = 1000;\n\n// KV stores give up two things Redis's Lua scripts provided: cross-key\n// atomicity and a compare-and-swap primitive. Every write below is\n// therefore several sequential operations rather than one atomic script.\n//\n// Concretely, `set()`, `delete()`, and `publishRefresh()` each read the\n// previous entry, then write tag membership changes and the entry itself as\n// separate operations. A reader racing with one of these calls can briefly\n// see an entry whose tag memberships have not finished updating. It can\n// also see a tag membership entry whose backing cache entry is already\n// gone. `invalidateTags()` tolerates the latter case. It treats a\n// membership entry with no backing cache entry as already invalid and\n// simply removes it.\n//\n// `acquireRefreshLease()` and `publishRefresh()` implement single-writer\n// coordination with a get-then-write pattern, not a real compare-and-swap.\n// Two isolates that call `acquireRefreshLease()` within the same\n// observation window can both see no lease and both write one. The worst\n// case is redundant refresh work, the same failure mode\n// `staleWhileRevalidate` already tolerates when no coordination exists at\n// all. Do not rely on this store for exclusive-execution correctness\n// beyond that. The Redis store's atomic Lua scripts give a stronger\n// guarantee where that matters.\n//\n// Tag invalidation lists membership keys by prefix and deletes each\n// matching entry. `list()` on a real KV store is typically eventually\n// consistent. A membership entry written just before a matching `list()`\n// call may not appear on that call. A store that needs read-your-writes\n// tag invalidation should use the Redis store instead.\nexport function createKvCacheStore(options: KvCacheStoreOptions): CacheStore {\n if (!options.namespace || typeof options.namespace.get !== \"function\") {\n throw new Error(\n \"Demiurge KV cache store requires an EdgeKvNamespace. Pass a connected KV client matching the get/put/delete/list interface documented on EdgeKvNamespace.\",\n );\n }\n\n const kv = options.namespace;\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n function entryKey(key: string) {\n return entryPrefix + key;\n }\n\n function leaseKey(key: string) {\n return leasePrefix + key;\n }\n\n function tagMemberKey(tagId: string, key: string) {\n return `${tagPrefix}${tagId}:${key}`;\n }\n\n async function readEntry(key: string): Promise<CacheStoreEntry | undefined> {\n const raw = await kv.get(entryKey(key));\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n }\n\n async function removeTagMemberships(key: string, tags: readonly string[]) {\n await Promise.all(\n tags.map((tagId) => kv.delete(tagMemberKey(tagId, key))),\n );\n }\n\n async function addTagMemberships(\n key: string,\n tags: readonly string[],\n expiration: number | undefined,\n ) {\n await Promise.all(\n tags.map((tagId) =>\n kv.put(tagMemberKey(tagId, key), \"1\", { expiration })\n ),\n );\n }\n\n async function writeEntry(key: string, entry: CacheStoreEntry) {\n const previous = await readEntry(key);\n\n if (previous) {\n await removeTagMemberships(key, previous.tags);\n }\n\n const expiration = entryExpiration(entry);\n await kv.put(entryKey(key), JSON.stringify(entry), { expiration });\n await addTagMemberships(key, entry.tags, expiration);\n }\n\n return {\n async acquireRefreshLease(key, token, expiresAt) {\n const existing = await kv.get(leaseKey(key));\n\n if (existing) {\n return false;\n }\n\n await kv.put(leaseKey(key), token, {\n expiration: toExpirationSeconds(expiresAt),\n });\n\n return true;\n },\n async delete(key) {\n const previous = await readEntry(key);\n await kv.delete(leaseKey(key));\n\n if (!previous) {\n return false;\n }\n\n await removeTagMemberships(key, previous.tags);\n await kv.delete(entryKey(key));\n\n return true;\n },\n async get(key) {\n return await readEntry(key);\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n const seen = new Set<string>();\n let deleted = 0;\n\n for (const tagId of tags) {\n const membershipPrefix = tagMemberKey(tagId, \"\");\n let cursor: string | undefined;\n\n do {\n const page = await kv.list({\n cursor,\n limit: listPageLimit,\n prefix: membershipPrefix,\n });\n\n for (const listedKey of page.keys) {\n const rawKey = listedKey.name.slice(membershipPrefix.length);\n\n if (seen.has(rawKey)) {\n continue;\n }\n\n seen.add(rawKey);\n\n const entry = await readEntry(rawKey);\n\n if (!entry) {\n await kv.delete(listedKey.name);\n continue;\n }\n\n await removeTagMemberships(rawKey, entry.tags);\n await kv.delete(entryKey(rawKey));\n await kv.delete(leaseKey(rawKey));\n deleted += 1;\n }\n\n cursor = page.list_complete ? undefined : page.cursor;\n } while (cursor);\n }\n\n return deleted;\n },\n async publishRefresh(key, token, entry) {\n const owner = await kv.get(leaseKey(key));\n\n if (owner !== token) {\n return false;\n }\n\n await writeEntry(key, entry);\n await kv.delete(leaseKey(key));\n\n return true;\n },\n async releaseRefreshLease(key, token) {\n const owner = await kv.get(leaseKey(key));\n\n if (owner === token) {\n await kv.delete(leaseKey(key));\n }\n },\n async set(key, entry) {\n await writeEntry(key, entry);\n await kv.delete(leaseKey(key));\n },\n };\n}\n\nfunction entryExpiration(entry: CacheStoreEntry) {\n return entry.staleUntil === null\n ? undefined\n : toExpirationSeconds(entry.staleUntil);\n}\n\nfunction toExpirationSeconds(epochMilliseconds: number) {\n return Math.ceil(epochMilliseconds / 1000);\n}\n"],"names":["defaultKeyPrefix","createKvCacheStore","options","kv","prefix","entryPrefix","tagPrefix","leasePrefix","entryKey","key","leaseKey","tagMemberKey","tagId","readEntry","raw","removeTagMemberships","tags","addTagMemberships","expiration","writeEntry","entry","previous","entryExpiration","token","expiresAt","toExpirationSeconds","seen","deleted","membershipPrefix","cursor","page","listedKey","rawKey","epochMilliseconds"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/kv/store.ts","../../src/kv/rate-limit-store.ts","../../src/kv/session-store.ts"],"sourcesContent":["import type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\n// This type documents the interface an adapter FOR a KV store needs, not a\n// dependency on any vendor SDK. It is modeled closely on the binding API\n// Cloudflare Workers KV exposes, because that shape is the one most other\n// edge KV providers already copy. The application supplies its own\n// connected client matching this interface, the same way\n// `createRedisCacheStore` takes a connected `ioredis` client rather than\n// owning the connection. A Deno KV or Vercel Edge Config client can satisfy\n// this interface with a small wrapper even when its native method names\n// differ.\nexport type EdgeKvListKey = {\n name: string;\n};\n\nexport type EdgeKvListResult = {\n cursor?: string;\n keys: readonly EdgeKvListKey[];\n list_complete: boolean;\n};\n\nexport type EdgeKvPutOptions = {\n // Absolute expiration, in seconds since the Unix epoch. This store always\n // uses `expiration` rather than `expirationTtl` so an entry's lifetime\n // tracks its `staleUntil` timestamp exactly. Redis gets the same result\n // with `PEXPIREAT` instead of a relative `PEXPIRE`.\n expiration?: number;\n};\n\nexport type EdgeKvNamespace = {\n delete: (key: string) => Promise<void>;\n get: (key: string) => Promise<string | null>;\n list: (options?: {\n cursor?: string;\n limit?: number;\n prefix?: string;\n }) => Promise<EdgeKvListResult>;\n put: (key: string, value: string, options?: EdgeKvPutOptions) => Promise<void>;\n};\n\nexport type KvCacheStoreOptions = {\n // Every consumer of one KV namespace shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an\n // application's other use of the same namespace. Two Demiurge\n // deployments that share a namespace still need distinct prefixes, the\n // same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues operations on a client the application already\n // constructed and bound. Which provider, region, and namespace ID back\n // it is the application's decision, not this store's.\n namespace: EdgeKvNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\nconst listPageLimit = 1000;\n\n// KV stores give up two things Redis's Lua scripts provided: cross-key\n// atomicity and a compare-and-swap primitive. Every write below is\n// therefore several sequential operations rather than one atomic script.\n//\n// Concretely, `set()`, `delete()`, and `publishRefresh()` each read the\n// previous entry, then write tag membership changes and the entry itself as\n// separate operations. A reader racing with one of these calls can briefly\n// see an entry whose tag memberships have not finished updating. It can\n// also see a tag membership entry whose backing cache entry is already\n// gone. `invalidateTags()` tolerates the latter case. It treats a\n// membership entry with no backing cache entry as already invalid and\n// simply removes it.\n//\n// `acquireRefreshLease()` and `publishRefresh()` implement single-writer\n// coordination with a get-then-write pattern, not a real compare-and-swap.\n// Two isolates that call `acquireRefreshLease()` within the same\n// observation window can both see no lease and both write one. The worst\n// case is redundant refresh work, the same failure mode\n// `staleWhileRevalidate` already tolerates when no coordination exists at\n// all. Do not rely on this store for exclusive-execution correctness\n// beyond that. The Redis store's atomic Lua scripts give a stronger\n// guarantee where that matters.\n//\n// Tag invalidation lists membership keys by prefix and deletes each\n// matching entry. `list()` on a real KV store is typically eventually\n// consistent. A membership entry written just before a matching `list()`\n// call may not appear on that call. A store that needs read-your-writes\n// tag invalidation should use the Redis store instead.\nexport function createKvCacheStore(options: KvCacheStoreOptions): CacheStore {\n if (!options.namespace || typeof options.namespace.get !== \"function\") {\n throw new Error(\n \"Demiurge KV cache store requires an EdgeKvNamespace. Pass a connected KV client matching the get/put/delete/list interface documented on EdgeKvNamespace.\",\n );\n }\n\n const kv = options.namespace;\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n function entryKey(key: string) {\n return entryPrefix + key;\n }\n\n function leaseKey(key: string) {\n return leasePrefix + key;\n }\n\n function tagMemberKey(tagId: string, key: string) {\n return `${tagPrefix}${tagId}:${key}`;\n }\n\n async function readEntry(key: string): Promise<CacheStoreEntry | undefined> {\n const raw = await kv.get(entryKey(key));\n // TYPE-EVIDENCE: the stored raw value is JSON that the store serialized from a cache entry. The cast restores that shape.\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n }\n\n async function removeTagMemberships(key: string, tags: readonly string[]) {\n await Promise.all(\n tags.map((tagId) => kv.delete(tagMemberKey(tagId, key))),\n );\n }\n\n async function addTagMemberships(\n key: string,\n tags: readonly string[],\n expiration: number | undefined,\n ) {\n await Promise.all(\n tags.map((tagId) =>\n kv.put(tagMemberKey(tagId, key), \"1\", { expiration })\n ),\n );\n }\n\n async function writeEntry(key: string, entry: CacheStoreEntry) {\n const previous = await readEntry(key);\n\n if (previous) {\n await removeTagMemberships(key, previous.tags);\n }\n\n const expiration = entryExpiration(entry);\n await kv.put(entryKey(key), JSON.stringify(entry), { expiration });\n await addTagMemberships(key, entry.tags, expiration);\n }\n\n return {\n async acquireRefreshLease(key, token, expiresAt) {\n const existing = await kv.get(leaseKey(key));\n\n if (existing) {\n return false;\n }\n\n await kv.put(leaseKey(key), token, {\n expiration: toExpirationSeconds(expiresAt),\n });\n\n return true;\n },\n async delete(key) {\n const previous = await readEntry(key);\n await kv.delete(leaseKey(key));\n\n if (!previous) {\n return false;\n }\n\n await removeTagMemberships(key, previous.tags);\n await kv.delete(entryKey(key));\n\n return true;\n },\n async get(key) {\n return await readEntry(key);\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n const seen = new Set<string>();\n let deleted = 0;\n\n for (const tagId of tags) {\n const membershipPrefix = tagMemberKey(tagId, \"\");\n let cursor: string | undefined;\n\n do {\n const page = await kv.list({\n cursor,\n limit: listPageLimit,\n prefix: membershipPrefix,\n });\n\n for (const listedKey of page.keys) {\n const rawKey = listedKey.name.slice(membershipPrefix.length);\n\n if (seen.has(rawKey)) {\n continue;\n }\n\n seen.add(rawKey);\n\n const entry = await readEntry(rawKey);\n\n if (!entry) {\n await kv.delete(listedKey.name);\n continue;\n }\n\n await removeTagMemberships(rawKey, entry.tags);\n await kv.delete(entryKey(rawKey));\n await kv.delete(leaseKey(rawKey));\n deleted += 1;\n }\n\n cursor = page.list_complete ? undefined : page.cursor;\n } while (cursor);\n }\n\n return deleted;\n },\n async publishRefresh(key, token, entry) {\n const owner = await kv.get(leaseKey(key));\n\n if (owner !== token) {\n return false;\n }\n\n await writeEntry(key, entry);\n await kv.delete(leaseKey(key));\n\n return true;\n },\n async releaseRefreshLease(key, token) {\n const owner = await kv.get(leaseKey(key));\n\n if (owner === token) {\n await kv.delete(leaseKey(key));\n }\n },\n async set(key, entry) {\n await writeEntry(key, entry);\n await kv.delete(leaseKey(key));\n },\n };\n}\n\nfunction entryExpiration(entry: CacheStoreEntry) {\n return entry.staleUntil === null\n ? undefined\n : toExpirationSeconds(entry.staleUntil);\n}\n\nfunction toExpirationSeconds(epochMilliseconds: number) {\n return Math.ceil(epochMilliseconds / 1000);\n}\n","import type { RateLimitStore } from \"../security/types\";\nimport type { EdgeKvNamespace } from \"./store\";\n\nexport type KvRateLimitStoreOptions = {\n // Every consumer of one KV namespace shares one keyspace. This prefix\n // scopes the store's counter keys away from an application's other use of\n // the same namespace, the same way `KvCacheStoreOptions.keyPrefix` scopes\n // `createKvCacheStore`'s keys.\n keyPrefix?: string;\n // The store issues operations on a client the application already\n // constructed and bound. Which provider, region, and namespace ID back\n // it is the application's decision, not this store's.\n namespace: EdgeKvNamespace;\n};\n\ntype KvRateLimitEntry = {\n count: number;\n resetAt: number;\n};\n\nconst defaultKeyPrefix = \"demiurge:rate-limit:\";\n\n// KV gives up the same thing here that `createKvCacheStore` gives up:\n// cross-operation atomicity. Plain KV has no compare-and-swap, so\n// `increment()` is necessarily a get-then-write, not a single atomic\n// operation. Two requests that call `increment()` within the same\n// observation window can both read the same prior count. Both then write\n// `count + 1`, so one increment is lost. The store can therefore undercount\n// under concurrent requests in that narrow window. It cannot overcount, and\n// it never blocks a request that should have been limited by more than one\n// request's worth of slack. Treat this as a soft limiter suitable for\n// coarse abuse protection, not an exact one. The Redis store's atomic Lua\n// script gives a stronger guarantee where that matters.\nexport function createKvRateLimitStore(\n options: KvRateLimitStoreOptions,\n): RateLimitStore {\n if (!options.namespace || typeof options.namespace.get !== \"function\") {\n throw new Error(\n \"Demiurge KV rate limit store requires an EdgeKvNamespace. Pass a connected KV client matching the get/put/delete/list interface documented on EdgeKvNamespace.\",\n );\n }\n\n const kv = options.namespace;\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n\n function counterKey(key: string) {\n return `${prefix}${key}`;\n }\n\n return {\n async increment(key, windowMs, now) {\n const storeKey = counterKey(key);\n const raw = await kv.get(storeKey);\n // TYPE-EVIDENCE: the stored raw value is JSON that the store serialized as a rate limit entry. The cast restores that shape.\n const existing = raw ? (JSON.parse(raw) as KvRateLimitEntry) : undefined;\n\n const next: KvRateLimitEntry = !existing || existing.resetAt <= now\n ? { count: 1, resetAt: now + windowMs }\n : { count: existing.count + 1, resetAt: existing.resetAt };\n\n await kv.put(storeKey, JSON.stringify(next), {\n expiration: toExpirationSeconds(next.resetAt),\n });\n\n return next;\n },\n };\n}\n\nfunction toExpirationSeconds(epochMilliseconds: number) {\n return Math.ceil(epochMilliseconds / 1000);\n}\n","import {\n parseSessionRecord,\n serializeSessionNamespace,\n type SessionData,\n type SessionNamespace,\n type SessionRecord,\n type SessionStore,\n type SessionStoreCandidate,\n} from \"../security/session-store\";\nimport type { EdgeKvNamespace, EdgeKvPutOptions } from \"./store\";\n\nexport type EdgeKvAtomicOperation = {\n expected: string | null;\n key: string;\n write?: {\n options?: EdgeKvPutOptions;\n value: string;\n };\n};\n\nexport type EdgeKvSessionNamespace = EdgeKvNamespace & {\n atomic: (operations: readonly EdgeKvAtomicOperation[]) => Promise<boolean>;\n};\n\nexport type KvSessionStoreOptions = {\n keyPrefix?: string;\n namespace: SessionNamespace;\n store: EdgeKvSessionNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:session:\";\n\nexport function createKvSessionStore<\n TData extends SessionData = SessionData,\n>(options: KvSessionStoreOptions): SessionStore<TData> {\n if (!options.store || typeof options.store.get !== \"function\") {\n throw new Error(\n \"Demiurge KV session store requires an EdgeKvSessionNamespace. Pass an application-owned KV client as `store`.\",\n );\n }\n\n if (typeof options.store.atomic !== \"function\") {\n throw new Error(\n \"Demiurge KV session store requires atomic compare-and-swap operations. Adapt the provider transaction API to EdgeKvSessionNamespace.atomic.\",\n );\n }\n\n const store = options.store;\n const namespace = serializeSessionNamespace(options.namespace);\n const prefix = `${options.keyPrefix ?? defaultKeyPrefix}${namespace}:`;\n const key = (id: string) => prefix + id;\n\n return {\n async create(candidate) {\n const record = toRecord(candidate, 0);\n\n try {\n const stored = await store.atomic([putOperation(key(record.id), null, record)]);\n return stored\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async destroy(id) {\n const storageKey = key(id);\n const current = await store.get(storageKey);\n\n if (current === null) {\n return false;\n }\n\n return await store.atomic([{ expected: current, key: storageKey }]);\n },\n async read(id, now) {\n const storageKey = key(id);\n const raw = await store.get(storageKey);\n\n if (raw === null) {\n return undefined;\n }\n\n const record = parseRecord<TData>(raw);\n\n if (!record) {\n return undefined;\n }\n\n if (storeExpiration(record) <= now) {\n await store.atomic([{ expected: raw, key: storageKey }]);\n return undefined;\n }\n\n return record;\n },\n async rotate(currentId, candidate, expectedVersion) {\n const currentKey = key(currentId);\n const nextKey = key(candidate.id);\n const [current, next] = await Promise.all([\n store.get(currentKey),\n currentKey === nextKey ? Promise.resolve(null) : store.get(nextKey),\n ]);\n\n if (!current || (nextKey !== currentKey && next !== null)) {\n return { status: \"conflict\" };\n }\n\n const currentRecord = parseRecord<TData>(current);\n\n if (!currentRecord || currentRecord.version !== expectedVersion) {\n return { status: \"conflict\" };\n }\n\n const record = toRecord(candidate, expectedVersion + 1);\n const operations = currentKey === nextKey\n ? [putOperation(currentKey, current, record)]\n : [\n { expected: current, key: currentKey },\n putOperation(nextKey, null, record),\n ];\n\n try {\n const stored = await store.atomic(operations);\n return stored\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async update(candidate, expectedVersion) {\n const storageKey = key(candidate.id);\n const current = await store.get(storageKey);\n\n const currentRecord = current ? parseRecord<TData>(current) : undefined;\n\n if (!currentRecord || currentRecord.version !== expectedVersion) {\n return { status: \"conflict\" };\n }\n\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await store.atomic([\n putOperation(storageKey, current, record),\n ]);\n return stored\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n };\n}\n\nfunction putOperation(\n key: string,\n expected: string | null,\n record: SessionRecord,\n): EdgeKvAtomicOperation {\n return {\n expected,\n key,\n write: {\n options: { expiration: Math.ceil(storeExpiration(record) / 1000) },\n value: JSON.stringify(record),\n },\n };\n}\n\nfunction parseRecord<TData extends SessionData>(\n raw: string,\n): SessionRecord<TData> | undefined {\n try {\n return parseSessionRecord<TData>(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nfunction toRecord<TData extends SessionData>(\n candidate: SessionStoreCandidate<TData>,\n version: number,\n): SessionRecord<TData> {\n return structuredClone({ ...candidate, version });\n}\n\nfunction storeExpiration(record: SessionRecord) {\n return Math.min(record.expiresAt, record.idleExpiresAt ?? record.expiresAt);\n}\n"],"names":["defaultKeyPrefix","listPageLimit","createKvCacheStore","options","kv","prefix","entryPrefix","tagPrefix","leasePrefix","entryKey","key","leaseKey","tagMemberKey","tagId","readEntry","raw","removeTagMemberships","tags","addTagMemberships","expiration","writeEntry","entry","previous","entryExpiration","token","expiresAt","toExpirationSeconds","seen","deleted","membershipPrefix","cursor","page","listedKey","rawKey","epochMilliseconds","createKvRateLimitStore","counterKey","windowMs","now","storeKey","existing","next","createKvSessionStore","store","namespace","serializeSessionNamespace","id","candidate","record","toRecord","putOperation","storageKey","current","parseRecord","storeExpiration","currentId","expectedVersion","currentKey","nextKey","currentRecord","operations","expected","parseSessionRecord","version"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RateLimitStore } from "../security/types";
2
+ import type { EdgeKvNamespace } from "./store";
3
+ export type KvRateLimitStoreOptions = {
4
+ keyPrefix?: string;
5
+ namespace: EdgeKvNamespace;
6
+ };
7
+ export declare function createKvRateLimitStore(options: KvRateLimitStoreOptions): RateLimitStore;
8
+ //# sourceMappingURL=rate-limit-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store.d.ts","sourceRoot":"","sources":["../../src/kv/rate-limit-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,uBAAuB,GAAG;IAKpC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AAoBF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,cAAc,CAgChB"}
@@ -0,0 +1,20 @@
1
+ import { type SessionData, type SessionNamespace, type SessionStore } from "../security/session-store";
2
+ import type { EdgeKvNamespace, EdgeKvPutOptions } from "./store";
3
+ export type EdgeKvAtomicOperation = {
4
+ expected: string | null;
5
+ key: string;
6
+ write?: {
7
+ options?: EdgeKvPutOptions;
8
+ value: string;
9
+ };
10
+ };
11
+ export type EdgeKvSessionNamespace = EdgeKvNamespace & {
12
+ atomic: (operations: readonly EdgeKvAtomicOperation[]) => Promise<boolean>;
13
+ };
14
+ export type KvSessionStoreOptions = {
15
+ keyPrefix?: string;
16
+ namespace: SessionNamespace;
17
+ store: EdgeKvSessionNamespace;
18
+ };
19
+ export declare function createKvSessionStore<TData extends SessionData = SessionData>(options: KvSessionStoreOptions): SessionStore<TData>;
20
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/kv/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,MAAM,EAAE,CAAC,UAAU,EAAE,SAAS,qBAAqB,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAIF,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,WAAW,GAAG,WAAW,EACvC,OAAO,EAAE,qBAAqB,GAAG,YAAY,CAAC,KAAK,CAAC,CAyHrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/kv/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAWjE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAK7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAMhC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AAiCF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAiK3E"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/kv/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAWjE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAK7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAMhC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AAiCF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAkK3E"}
@@ -0,0 +1,10 @@
1
+ export type ClientBuildManifest = {
2
+ clientEntry: string;
3
+ styles: string[];
4
+ };
5
+ /**
6
+ * Read the browser build manifest that names the hashed client entry and the
7
+ * stylesheet paths a rendered document must load.
8
+ */
9
+ export declare function parseClientManifest(source: string): ClientBuildManifest;
10
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CA0BvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/node/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACf,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,KAAK,GACL;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAclC,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM;CAK3B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM;CAKzB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,QA+BhE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,WA0C7B;AAgOD,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,QAIjE;AAED,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,QAAQ,iBAgDtB;AAsBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,mBAAmB,WAiBrD"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/node/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACf,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,KAAK,GACL;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAclC,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM;CAK3B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM;CAKzB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,QA+BhE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,WA2C7B;AAiOD,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,cAAc,QAIjE;AAED,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,QAAQ,iBAiDtB;AAsBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,mBAAmB,WAiBrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/node/image.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAKpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,qBAAqB,GAAG;IAGlC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IAIrB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,sBAAsB,GAAG,SAAS,CAAC;IAG1E,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,iBAAiB,CAiGnB"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/node/image.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAKpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,qBAAqB,GAAG;IAGlC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IAIrB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,sBAAsB,GAAG,SAAS,CAAC;IAG1E,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAQF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,iBAAiB,CAkGnB"}
@@ -7,6 +7,8 @@ export type { FontAssetHandlerOptions } from "./font";
7
7
  export { createImageOptimizer } from "./image";
8
8
  export type { ImageOptimizerFetch, ImageOptimizerOptions, } from "./image";
9
9
  export { createStaticFileHandler } from "./static";
10
+ export { defaultNodeBuildClientDir, defaultNodeBuildReadyPath, serveNodeBuild, } from "./serve";
11
+ export type { NodeBuildContext, NodeBuildPageOptions, ServeNodeBuildEnvironment, ServeNodeBuildOptions, } from "./serve";
10
12
  export { renderNodePageResponse, renderStreamingPageResponse, } from "./streaming";
11
13
  export type { HttpScheme, NodeOriginPolicy, ToWebRequestOptions, TrustProxy, } from "./http";
12
14
  export type { StaticFileHandler, StaticFileHandlerOptions } from "./static";
@@ -31,6 +33,7 @@ export type NodeGracefulShutdownOptions = {
31
33
  signals?: readonly NodeShutdownSignal[];
32
34
  };
33
35
  export type NodeServerOptions = NodeRequestListenerOptions & {
36
+ readyPath?: string;
34
37
  shutdown?: NodeGracefulShutdownOptions;
35
38
  timeouts?: Partial<NodeServerTimeouts>;
36
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAUhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,EACT,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAChD,YAAY,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAE5E,eAAO,MAAM,WAAW,sBAQtB,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,KACrB,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG,OAAO,QAAQ,EAAE,gBAAgB,GAAG;IAC3E,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7D,MAAM,CAAC,EAAE,iBAAiB,GAAG,wBAAwB,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/D,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,GAAG;IAC3D,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;CAIC,CAAC;AAIxC,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAsDrB;AAoCD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,iBAAiB,GACzB,UAAU,CAQZ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"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"}