@ketvietlab/ketjs 0.1.1 → 0.1.3

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 (300) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -2
  3. package/dist/agent/capabilities.d.ts +1 -3
  4. package/dist/agent/capabilities.d.ts.map +1 -1
  5. package/dist/agent/capabilities.js +10 -1
  6. package/dist/agent/capabilities.js.map +1 -1
  7. package/dist/agent/permissions.d.ts +43 -1
  8. package/dist/agent/permissions.d.ts.map +1 -1
  9. package/dist/agent/permissions.js +50 -2
  10. package/dist/agent/permissions.js.map +1 -1
  11. package/dist/cli.js +246 -97
  12. package/dist/cli.js.map +1 -1
  13. package/dist/codegen/dts.d.ts.map +1 -1
  14. package/dist/codegen/dts.js +1 -0
  15. package/dist/codegen/dts.js.map +1 -1
  16. package/dist/data/changeset.d.ts +12 -0
  17. package/dist/data/changeset.d.ts.map +1 -1
  18. package/dist/data/changeset.js +73 -17
  19. package/dist/data/changeset.js.map +1 -1
  20. package/dist/data/expr.d.ts +16 -0
  21. package/dist/data/expr.d.ts.map +1 -1
  22. package/dist/data/expr.js +33 -5
  23. package/dist/data/expr.js.map +1 -1
  24. package/dist/data/fleet.d.ts +41 -1
  25. package/dist/data/fleet.d.ts.map +1 -1
  26. package/dist/data/fleet.js +100 -11
  27. package/dist/data/fleet.js.map +1 -1
  28. package/dist/data/migrate.d.ts +20 -0
  29. package/dist/data/migrate.d.ts.map +1 -1
  30. package/dist/data/migrate.js +86 -3
  31. package/dist/data/migrate.js.map +1 -1
  32. package/dist/data/physical.d.ts +5 -0
  33. package/dist/data/physical.d.ts.map +1 -0
  34. package/dist/data/physical.js +196 -0
  35. package/dist/data/physical.js.map +1 -0
  36. package/dist/data/pool.d.ts +2 -1
  37. package/dist/data/pool.d.ts.map +1 -1
  38. package/dist/data/pool.js +159 -31
  39. package/dist/data/pool.js.map +1 -1
  40. package/dist/data/query.d.ts +10 -1
  41. package/dist/data/query.d.ts.map +1 -1
  42. package/dist/data/query.js +136 -27
  43. package/dist/data/query.js.map +1 -1
  44. package/dist/data/sqlite.d.ts.map +1 -1
  45. package/dist/data/sqlite.js +350 -52
  46. package/dist/data/sqlite.js.map +1 -1
  47. package/dist/data/time.d.ts +13 -0
  48. package/dist/data/time.d.ts.map +1 -1
  49. package/dist/data/time.js +61 -17
  50. package/dist/data/time.js.map +1 -1
  51. package/dist/index.d.ts +43 -22
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +32 -16
  54. package/dist/index.js.map +1 -1
  55. package/dist/kernel/audit.d.ts +27 -0
  56. package/dist/kernel/audit.d.ts.map +1 -0
  57. package/dist/kernel/audit.js +67 -0
  58. package/dist/kernel/audit.js.map +1 -0
  59. package/dist/kernel/classification.d.ts +26 -0
  60. package/dist/kernel/classification.d.ts.map +1 -0
  61. package/dist/kernel/classification.js +73 -0
  62. package/dist/kernel/classification.js.map +1 -0
  63. package/dist/kernel/compose.d.ts +6 -2
  64. package/dist/kernel/compose.d.ts.map +1 -1
  65. package/dist/kernel/compose.js +269 -15
  66. package/dist/kernel/compose.js.map +1 -1
  67. package/dist/kernel/define.d.ts +2 -3
  68. package/dist/kernel/define.d.ts.map +1 -1
  69. package/dist/kernel/define.js +22 -12
  70. package/dist/kernel/define.js.map +1 -1
  71. package/dist/kernel/diff.d.ts.map +1 -1
  72. package/dist/kernel/diff.js +28 -4
  73. package/dist/kernel/diff.js.map +1 -1
  74. package/dist/kernel/graph.js +1 -1
  75. package/dist/kernel/graph.js.map +1 -1
  76. package/dist/kernel/i18n.d.ts +10 -1
  77. package/dist/kernel/i18n.d.ts.map +1 -1
  78. package/dist/kernel/i18n.js +34 -1
  79. package/dist/kernel/i18n.js.map +1 -1
  80. package/dist/kernel/layout.d.ts +97 -0
  81. package/dist/kernel/layout.d.ts.map +1 -1
  82. package/dist/kernel/layout.js +294 -12
  83. package/dist/kernel/layout.js.map +1 -1
  84. package/dist/kernel/menu.d.ts +33 -2
  85. package/dist/kernel/menu.d.ts.map +1 -1
  86. package/dist/kernel/menu.js +99 -7
  87. package/dist/kernel/menu.js.map +1 -1
  88. package/dist/kernel/modules.d.ts +3 -3
  89. package/dist/kernel/modules.d.ts.map +1 -1
  90. package/dist/kernel/modules.js +21 -21
  91. package/dist/kernel/modules.js.map +1 -1
  92. package/dist/kernel/permissions.d.ts +10 -0
  93. package/dist/kernel/permissions.d.ts.map +1 -0
  94. package/dist/kernel/permissions.js +365 -0
  95. package/dist/kernel/permissions.js.map +1 -0
  96. package/dist/kernel/schedule.d.ts +23 -0
  97. package/dist/kernel/schedule.d.ts.map +1 -0
  98. package/dist/kernel/schedule.js +83 -0
  99. package/dist/kernel/schedule.js.map +1 -0
  100. package/dist/kernel/types.d.ts.map +1 -1
  101. package/dist/kernel/types.js +5 -4
  102. package/dist/kernel/types.js.map +1 -1
  103. package/dist/kernel/workspace.d.ts +92 -14
  104. package/dist/kernel/workspace.d.ts.map +1 -1
  105. package/dist/kernel/workspace.js +128 -49
  106. package/dist/kernel/workspace.js.map +1 -1
  107. package/dist/pdf/assets/Inter-Bold.ttf +0 -0
  108. package/dist/pdf/assets/Inter-Regular.ttf +0 -0
  109. package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
  110. package/dist/pdf/assets/LICENSE.txt +92 -0
  111. package/dist/pdf/font.d.ts +10 -0
  112. package/dist/pdf/font.d.ts.map +1 -0
  113. package/dist/pdf/font.js +83 -0
  114. package/dist/pdf/font.js.map +1 -0
  115. package/dist/pdf/image.d.ts +8 -0
  116. package/dist/pdf/image.d.ts.map +1 -0
  117. package/dist/pdf/image.js +94 -0
  118. package/dist/pdf/image.js.map +1 -0
  119. package/dist/pdf/index.d.ts +15 -0
  120. package/dist/pdf/index.d.ts.map +1 -0
  121. package/dist/pdf/index.js +17 -0
  122. package/dist/pdf/index.js.map +1 -0
  123. package/dist/pdf/markup.d.ts +19 -0
  124. package/dist/pdf/markup.d.ts.map +1 -0
  125. package/dist/pdf/markup.js +146 -0
  126. package/dist/pdf/markup.js.map +1 -0
  127. package/dist/pdf/render.d.ts +14 -0
  128. package/dist/pdf/render.d.ts.map +1 -0
  129. package/dist/pdf/render.js +387 -0
  130. package/dist/pdf/render.js.map +1 -0
  131. package/dist/scaffold/index.js +6 -6
  132. package/dist/scaffold/index.js.map +1 -1
  133. package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
  134. package/dist/scaffold/templates/dev.mjs.tmpl +1 -1
  135. package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
  136. package/dist/scaffold/templates/module.ts.tmpl +1 -4
  137. package/dist/server/assets.d.ts +23 -0
  138. package/dist/server/assets.d.ts.map +1 -0
  139. package/dist/server/assets.js +97 -0
  140. package/dist/server/assets.js.map +1 -0
  141. package/dist/server/boot.d.ts +157 -38
  142. package/dist/server/boot.d.ts.map +1 -1
  143. package/dist/server/boot.js +360 -138
  144. package/dist/server/boot.js.map +1 -1
  145. package/dist/server/config.d.ts +30 -10
  146. package/dist/server/config.d.ts.map +1 -1
  147. package/dist/server/config.js +73 -17
  148. package/dist/server/config.js.map +1 -1
  149. package/dist/server/ctx.d.ts +10 -0
  150. package/dist/server/ctx.d.ts.map +1 -1
  151. package/dist/server/ctx.js +268 -49
  152. package/dist/server/ctx.js.map +1 -1
  153. package/dist/server/development.d.ts +10 -0
  154. package/dist/server/development.d.ts.map +1 -0
  155. package/dist/server/development.js +15 -0
  156. package/dist/server/development.js.map +1 -0
  157. package/dist/server/fn.d.ts +22 -3
  158. package/dist/server/fn.d.ts.map +1 -1
  159. package/dist/server/fn.js +116 -32
  160. package/dist/server/fn.js.map +1 -1
  161. package/dist/server/form.d.ts +33 -0
  162. package/dist/server/form.d.ts.map +1 -0
  163. package/dist/server/form.js +47 -0
  164. package/dist/server/form.js.map +1 -0
  165. package/dist/server/http.d.ts +55 -3
  166. package/dist/server/http.d.ts.map +1 -1
  167. package/dist/server/http.js +306 -22
  168. package/dist/server/http.js.map +1 -1
  169. package/dist/server/idem.d.ts +3 -2
  170. package/dist/server/idem.d.ts.map +1 -1
  171. package/dist/server/idem.js +12 -4
  172. package/dist/server/idem.js.map +1 -1
  173. package/dist/server/jobs.js +1 -1
  174. package/dist/server/jobs.js.map +1 -1
  175. package/dist/server/log/combinators.d.ts +42 -0
  176. package/dist/server/log/combinators.d.ts.map +1 -0
  177. package/dist/server/log/combinators.js +270 -0
  178. package/dist/server/log/combinators.js.map +1 -0
  179. package/dist/server/log/console.d.ts +12 -0
  180. package/dist/server/log/console.d.ts.map +1 -0
  181. package/dist/server/log/console.js +96 -0
  182. package/dist/server/log/console.js.map +1 -0
  183. package/dist/server/log/file.d.ts +11 -0
  184. package/dist/server/log/file.d.ts.map +1 -0
  185. package/dist/server/log/file.js +61 -0
  186. package/dist/server/log/file.js.map +1 -0
  187. package/dist/server/log/index.d.ts +23 -0
  188. package/dist/server/log/index.d.ts.map +1 -0
  189. package/dist/server/log/index.js +45 -0
  190. package/dist/server/log/index.js.map +1 -0
  191. package/dist/server/log/logger.d.ts +53 -0
  192. package/dist/server/log/logger.d.ts.map +1 -0
  193. package/dist/server/log/logger.js +94 -0
  194. package/dist/server/log/logger.js.map +1 -0
  195. package/dist/server/log/memory.d.ts +11 -0
  196. package/dist/server/log/memory.d.ts.map +1 -0
  197. package/dist/server/log/memory.js +25 -0
  198. package/dist/server/log/memory.js.map +1 -0
  199. package/dist/server/log/types.d.ts +112 -0
  200. package/dist/server/log/types.d.ts.map +1 -0
  201. package/dist/server/log/types.js +58 -0
  202. package/dist/server/log/types.js.map +1 -0
  203. package/dist/server/policy.d.ts +29 -0
  204. package/dist/server/policy.d.ts.map +1 -0
  205. package/dist/server/policy.js +29 -0
  206. package/dist/server/policy.js.map +1 -0
  207. package/dist/server/queue.d.ts +1 -1
  208. package/dist/server/queue.d.ts.map +1 -1
  209. package/dist/server/queue.js.map +1 -1
  210. package/dist/server/ratelimit.d.ts +48 -0
  211. package/dist/server/ratelimit.d.ts.map +1 -0
  212. package/dist/server/ratelimit.js +102 -0
  213. package/dist/server/ratelimit.js.map +1 -0
  214. package/dist/server/respond.d.ts.map +1 -1
  215. package/dist/server/respond.js +16 -1
  216. package/dist/server/respond.js.map +1 -1
  217. package/dist/server/runtime.d.ts +18 -3
  218. package/dist/server/runtime.d.ts.map +1 -1
  219. package/dist/server/runtime.js +32 -2
  220. package/dist/server/runtime.js.map +1 -1
  221. package/dist/server/schedule.d.ts +18 -0
  222. package/dist/server/schedule.d.ts.map +1 -0
  223. package/dist/server/schedule.js +70 -0
  224. package/dist/server/schedule.js.map +1 -0
  225. package/dist/server/sequence.d.ts +42 -0
  226. package/dist/server/sequence.d.ts.map +1 -0
  227. package/dist/server/sequence.js +97 -0
  228. package/dist/server/sequence.js.map +1 -0
  229. package/dist/server/session.d.ts +21 -0
  230. package/dist/server/session.d.ts.map +1 -1
  231. package/dist/server/session.js +84 -10
  232. package/dist/server/session.js.map +1 -1
  233. package/dist/server/sessionstore.d.ts +3 -1
  234. package/dist/server/sessionstore.d.ts.map +1 -1
  235. package/dist/server/sessionstore.js +7 -3
  236. package/dist/server/sessionstore.js.map +1 -1
  237. package/dist/server/storage/index.d.ts +1 -1
  238. package/dist/server/storage/index.d.ts.map +1 -1
  239. package/dist/server/storage/index.js +61 -1
  240. package/dist/server/storage/index.js.map +1 -1
  241. package/dist/server/storage/types.d.ts +8 -0
  242. package/dist/server/storage/types.d.ts.map +1 -1
  243. package/dist/server/storage/types.js +58 -0
  244. package/dist/server/storage/types.js.map +1 -1
  245. package/dist/server/tenants.d.ts +20 -18
  246. package/dist/server/tenants.d.ts.map +1 -1
  247. package/dist/server/tenants.js +133 -84
  248. package/dist/server/tenants.js.map +1 -1
  249. package/dist/server/transport/types.js +2 -2
  250. package/dist/server/transport/types.js.map +1 -1
  251. package/dist/server/worker.d.ts +19 -3
  252. package/dist/server/worker.d.ts.map +1 -1
  253. package/dist/server/worker.js +168 -21
  254. package/dist/server/worker.js.map +1 -1
  255. package/dist/testing.d.ts +26 -10
  256. package/dist/testing.d.ts.map +1 -1
  257. package/dist/testing.js +41 -14
  258. package/dist/testing.js.map +1 -1
  259. package/dist/theme/contracts.d.ts +14 -1
  260. package/dist/theme/contracts.d.ts.map +1 -1
  261. package/dist/theme/contracts.js +35 -6
  262. package/dist/theme/contracts.js.map +1 -1
  263. package/dist/theme/index.d.ts +1 -1
  264. package/dist/theme/index.d.ts.map +1 -1
  265. package/dist/theme/index.js +1 -1
  266. package/dist/theme/index.js.map +1 -1
  267. package/dist/theme/joint-runtime.d.ts +33 -0
  268. package/dist/theme/joint-runtime.d.ts.map +1 -0
  269. package/dist/theme/joint-runtime.js +121 -0
  270. package/dist/theme/joint-runtime.js.map +1 -0
  271. package/dist/theme/joints.d.ts.map +1 -1
  272. package/dist/theme/joints.js +15 -97
  273. package/dist/theme/joints.js.map +1 -1
  274. package/dist/theme/ktl/compile.d.ts +4 -0
  275. package/dist/theme/ktl/compile.d.ts.map +1 -1
  276. package/dist/theme/ktl/compile.js +54 -1
  277. package/dist/theme/ktl/compile.js.map +1 -1
  278. package/dist/theme/ktl/parser.d.ts +4 -0
  279. package/dist/theme/ktl/parser.d.ts.map +1 -1
  280. package/dist/theme/ktl/parser.js +8 -0
  281. package/dist/theme/ktl/parser.js.map +1 -1
  282. package/dist/theme/render.d.ts +8 -0
  283. package/dist/theme/render.d.ts.map +1 -1
  284. package/dist/theme/render.js +88 -118
  285. package/dist/theme/render.js.map +1 -1
  286. package/dist/theme/tokens.d.ts +6 -0
  287. package/dist/theme/tokens.d.ts.map +1 -1
  288. package/dist/theme/tokens.js +6 -0
  289. package/dist/theme/tokens.js.map +1 -1
  290. package/dist/theme/viewmodel.d.ts +24 -0
  291. package/dist/theme/viewmodel.d.ts.map +1 -1
  292. package/dist/theme/viewmodel.js +75 -6
  293. package/dist/theme/viewmodel.js.map +1 -1
  294. package/dist/types.d.ts +304 -56
  295. package/dist/types.d.ts.map +1 -1
  296. package/package.json +6 -2
  297. package/dist/kernel/apps.d.ts +0 -43
  298. package/dist/kernel/apps.d.ts.map +0 -1
  299. package/dist/kernel/apps.js +0 -234
  300. package/dist/kernel/apps.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  // One server function, three surfaces: an HTTP endpoint, the typed client that
2
2
  // calls it, and an agent tool descriptor — all read off the same manifest entry.
3
+ import { isVersioned } from './assets.js';
3
4
  import { createServer } from 'node:http';
4
5
  import { pipeline } from 'node:stream/promises';
5
6
  import { isNavigationRequest, navigablePage } from './respond.js';
@@ -10,9 +11,49 @@ import { callFn } from './fn.js';
10
11
  import { createStreams, dbStreamStore, memoryStreamStore } from './stream.js';
11
12
  import { agentDescriptor } from '../agent/capabilities.js';
12
13
  import { KetError } from '../kernel/errors.js';
14
+ import { FormValidationError } from './form.js';
13
15
  import { KetError as KetErr } from '../kernel/errors.js';
14
16
  import { compileRoutes } from '../kernel/routes.js';
17
+ import { claimRateSlot } from './ratelimit.js';
15
18
  import { html, trustedMarkup } from '@ketvietlab/ketjs-view';
19
+ /**
20
+ * What an error means over HTTP.
21
+ *
22
+ * Every KetError used to answer 400, which said "you sent something wrong" to a
23
+ * person whose request was fine and whose permissions were not. A monitor cannot
24
+ * tell a missing grant from a malformed body, and neither can a client.
25
+ */
26
+ export const statusForError = (code) => {
27
+ if (code === 'E_FN_NOT_PERMITTED')
28
+ return 403;
29
+ if (code === 'E_NOT_FOUND' || code === 'E_UNKNOWN_FUNCTION')
30
+ return 404;
31
+ if (code === 'E_PAYLOAD_TOO_LARGE')
32
+ return 413;
33
+ return 400;
34
+ };
35
+ /** True when this request is a browser navigating, rather than a client calling. */
36
+ export const wantsHtml = (req) => {
37
+ const accept = String(req.headers.accept ?? '');
38
+ if (!accept.includes('text/html'))
39
+ return false;
40
+ // A fragment request is answered by the caller's own error handling; replacing
41
+ // a slot with a full document would paint a page inside a page.
42
+ return String(req.headers['x-ket-navigation'] ?? '') === '';
43
+ };
44
+ /**
45
+ * The file types a module may publish, and what they are served as.
46
+ *
47
+ * This doubles as the list of what gets served at all, so it has to cover what
48
+ * a browser actually loads from an asset directory rather than only what this
49
+ * repo happens to ship today. It was briefly the shorter list, which 404'd
50
+ * `.jpeg`, `.gif`, `.webp` and `.woff` — all of which had worked, because an
51
+ * unknown type used to fall through to `application/octet-stream` and browsers
52
+ * sniff images successfully.
53
+ *
54
+ * What stays out is source and anything that carries it: `.ts`, `.tsx`, and
55
+ * `.map` — a minified bundle's sourcemap inlines the whole original file.
56
+ */
16
57
  const ASSET_MIME = {
17
58
  '.css': 'text/css',
18
59
  '.js': 'text/javascript',
@@ -20,9 +61,25 @@ const ASSET_MIME = {
20
61
  '.svg': 'image/svg+xml',
21
62
  '.png': 'image/png',
22
63
  '.jpg': 'image/jpeg',
64
+ '.jpeg': 'image/jpeg',
65
+ '.gif': 'image/gif',
66
+ '.webp': 'image/webp',
67
+ '.avif': 'image/avif',
68
+ '.woff': 'font/woff',
23
69
  '.woff2': 'font/woff2',
70
+ '.ttf': 'font/ttf',
71
+ '.otf': 'font/otf',
24
72
  '.ico': 'image/x-icon',
73
+ '.webmanifest': 'application/manifest+json',
74
+ '.pdf': 'application/pdf',
75
+ '.mp4': 'video/mp4',
76
+ '.webm': 'video/webm',
25
77
  };
78
+ /**
79
+ * Extensions are compared in lower case, because a file called `logo.PNG` is
80
+ * a PNG. `extname` reports the case it finds, so the table lookup missed it.
81
+ */
82
+ const assetType = (rel) => ASSET_MIME[extname(rel).toLowerCase()];
26
83
  const json = (res, status, body) => {
27
84
  const s = JSON.stringify(body, null, 2);
28
85
  res.writeHead(status, { 'content-type': 'application/json; charset=utf-8' });
@@ -40,6 +97,26 @@ const contentType = (type) => {
40
97
  };
41
98
  const islandScript = '<script type="module" src="/_ket/islands.js"></script>';
42
99
  const viewRuntimeUrl = '/_ket/view/index.js';
100
+ const TOKENS_PATH = '/_ket/tokens.css';
101
+ const tokensLink = `<link rel="stylesheet" href="${TOKENS_PATH}">`;
102
+ /**
103
+ * A theme's declared tokens, linked into the document it renders.
104
+ *
105
+ * `tokens` had been a declaration with no consumer: every theme wrote one, the
106
+ * manifest composed them, `tokensToCss` turned them into `--ket-*` custom
107
+ * properties inside the `ket.theme` layer — and nothing ever put the result on a
108
+ * page, so themes hard-coded a second palette in their own stylesheet instead. The
109
+ * framework owns the cascade order it publishes, which is why it links this rather
110
+ * than asking every theme to.
111
+ */
112
+ const withThemeTokens = (body, css) => {
113
+ if (!css || body.includes(TOKENS_PATH))
114
+ return body;
115
+ const closingHead = body.indexOf('</head>');
116
+ return closingHead < 0
117
+ ? tokensLink + body
118
+ : body.slice(0, closingHead) + tokensLink + body.slice(closingHead);
119
+ };
43
120
  const bootstrapDocument = (body) => {
44
121
  if ((!body.includes('<ket-island') && !body.includes('data-ket-slot=')) ||
45
122
  body.includes('src="/_ket/islands.js"'))
@@ -242,13 +319,88 @@ const send = async (res, result) => {
242
319
  // 'close' — which hung the handler and leaked one fd per cancelled download.
243
320
  await pipeline(result.body, res);
244
321
  };
245
- const readBody = async (req) => {
322
+ const requestUrl = (req) => {
323
+ const target = req.url ?? '/';
324
+ const host = req.headers.host ?? 'localhost';
325
+ const invalid = () => new KetError({
326
+ code: 'E_INVALID_REQUEST_URL',
327
+ message: 'request target or Host header is invalid',
328
+ });
329
+ // KetJS is an origin server, not a forward proxy. Absolute-form and
330
+ // scheme-relative targets can replace the Host-derived authority in WHATWG URL
331
+ // parsing, and a backslash is treated like a slash for special schemes.
332
+ if (!target.startsWith('/') || target.startsWith('//') || target.includes('\\'))
333
+ throw invalid();
334
+ // Parse only an authority. Userinfo and path/query delimiters are all valid to
335
+ // URL(), but none are valid in the Host contract and each can change which
336
+ // tenant a resolver sees.
337
+ const forbiddenHostCharacter = [...host].some((character) => {
338
+ const code = character.charCodeAt(0);
339
+ return (character.trim() === '' ||
340
+ code <= 0x1f ||
341
+ (code >= 0x7f && code <= 0x9f) ||
342
+ '@/\\?#%'.includes(character));
343
+ });
344
+ if (!host || forbiddenHostCharacter)
345
+ throw invalid();
346
+ try {
347
+ const base = new URL(`http://${host}`);
348
+ if (base.username || base.password || base.pathname !== '/' || base.search || base.hash)
349
+ throw invalid();
350
+ const url = new URL(target, base);
351
+ if (url.origin !== base.origin)
352
+ throw invalid();
353
+ return url;
354
+ }
355
+ catch {
356
+ throw invalid();
357
+ }
358
+ };
359
+ const decodeRequestPath = (value) => {
360
+ try {
361
+ return decodeURIComponent(value);
362
+ }
363
+ catch {
364
+ throw new KetError({
365
+ code: 'E_ROUTE_ENCODING',
366
+ message: 'request path contains invalid percent encoding',
367
+ });
368
+ }
369
+ };
370
+ const readBody = async (req, maxBytes) => {
371
+ const declared = Number(req.headers['content-length']);
372
+ if (Number.isFinite(declared) && declared > maxBytes) {
373
+ throw new KetError({
374
+ code: 'E_PAYLOAD_TOO_LARGE',
375
+ message: `JSON body exceeds ${maxBytes} bytes`,
376
+ });
377
+ }
246
378
  const chunks = [];
247
- for await (const c of req)
248
- chunks.push(c);
379
+ let total = 0;
380
+ for await (const held of req) {
381
+ const chunk = Buffer.isBuffer(held) ? held : Buffer.from(held);
382
+ total += chunk.byteLength;
383
+ if (total > maxBytes) {
384
+ throw new KetError({
385
+ code: 'E_PAYLOAD_TOO_LARGE',
386
+ message: `JSON body exceeds ${maxBytes} bytes`,
387
+ });
388
+ }
389
+ chunks.push(chunk);
390
+ }
249
391
  if (!chunks.length)
250
392
  return {};
251
- return JSON.parse(Buffer.concat(chunks).toString('utf8'));
393
+ let value;
394
+ try {
395
+ value = JSON.parse(Buffer.concat(chunks).toString('utf8'));
396
+ }
397
+ catch {
398
+ throw new KetError({ code: 'E_INVALID_JSON_BODY', message: 'request body must be valid JSON' });
399
+ }
400
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
401
+ throw new KetError({ code: 'E_INVALID_JSON_BODY', message: 'request body must be a JSON object' });
402
+ }
403
+ return value;
252
404
  };
253
405
  export async function createKetServer(o) {
254
406
  if (!o.adapter && !o.pool)
@@ -258,6 +410,12 @@ export async function createKetServer(o) {
258
410
  code: 'E_NO_RESOLVER',
259
411
  message: 'a pool needs resolveDatastore to know which database a request belongs to',
260
412
  });
413
+ const maxJsonBodyBytes = o.maxJsonBodyBytes ?? 1024 * 1024;
414
+ if (!Number.isSafeInteger(maxJsonBodyBytes) || maxJsonBodyBytes <= 0)
415
+ throw new KetErr({
416
+ code: 'E_JSON_BODY_LIMIT',
417
+ message: 'maxJsonBodyBytes must be a positive safe integer',
418
+ });
261
419
  // Compile once: matching stays cheap per request, and an ambiguous surface is
262
420
  // refused before the server starts rather than depending on object insertion order.
263
421
  const matchRoute = compileRoutes(o.routes ?? {});
@@ -271,7 +429,7 @@ export async function createKetServer(o) {
271
429
  throw new KetErr({
272
430
  code: 'E_UNKNOWN_TENANT',
273
431
  message: `no datastore for ${url.host}${url.pathname}`,
274
- hint: 'resolveDatastore returned null — the request names a tenant this app does not serve',
432
+ hint: 'resolveDatastore returned null — the request names a tenant this deployment does not serve',
275
433
  });
276
434
  }
277
435
  return o.pool.with(key, fn);
@@ -298,16 +456,38 @@ export async function createKetServer(o) {
298
456
  return o.islandClients ?? theme?.clients ?? {};
299
457
  };
300
458
  const streams = await createStreams(o.streamStore ?? (o.adapter ? dbStreamStore(o.adapter) : memoryStreamStore()));
459
+ const tenantForLog = (url, req) => {
460
+ try {
461
+ return o.resolveDatastore?.(url, req) ?? null;
462
+ }
463
+ catch {
464
+ return null;
465
+ }
466
+ };
301
467
  const server = createServer(async (req, res) => {
302
- const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
468
+ const started = Date.now();
469
+ // The route pattern, never the pathname: a raw path carries record ids and a
470
+ // query string, which is how customer data reaches a log aggregator. An
471
+ // unmatched path stays unnamed for the same reason — the status already says
472
+ // what happened, and the string a stranger typed is not worth keeping.
473
+ let route = '(unmatched)';
474
+ let requestLog = o.log;
303
475
  try {
304
- // Static files. Several mounts, because the app has its own and every
305
- // installed module may ship some and a module's must stop being served the
306
- // moment it is switched off, which is what `resolve` is for: it answers per
307
- // request instead of being fixed when the server was built.
476
+ const url = requestUrl(req);
477
+ // Which tenant this request belongs to, for attribution only.
478
+ //
479
+ // Guarded, and the guard is the point: `resolveDatastore` throws
480
+ // E_UNKNOWN_TENANT for a host this deployment does not serve, and static
481
+ // assets are answered before any tenant is needed. Letting that throw here
482
+ // would mean adding logging had changed what the server serves.
483
+ requestLog = o.log?.child({ tenant: tenantForLog(url, req) });
484
+ // Static files. Several mounts, because the deployment has its own and every
485
+ // composed module may ship some. `resolve` keeps the file lookup behind the
486
+ // same request boundary as every other route.
308
487
  for (const mount of mounts) {
309
488
  if (!url.pathname.startsWith(mount.prefix))
310
489
  continue;
490
+ route = 'asset';
311
491
  // Path traversal is the one thing a static handler must not get wrong.
312
492
  const rel = normalize(url.pathname.slice(mount.prefix.length)).replace(/^(\.\.[/\\])+/, '');
313
493
  const file = mount.dir !== undefined
@@ -317,10 +497,25 @@ export async function createKetServer(o) {
317
497
  : await mount.resolve(rel, url, req);
318
498
  if (file === null)
319
499
  break;
500
+ // A module publishes a *directory*, not a list of files, so anything
501
+ // else that lives in that directory went out with the assets: the TSX an
502
+ // island is authored in, a sourcemap with the original text inlined, a
503
+ // README. They were answered as `application/octet-stream` — a download
504
+ // rather than an error, which is worse than useless for source nobody
505
+ // meant to publish. `ASSET_MIME` is already the list of things a browser
506
+ // loads as a page asset, so it is the list of things that get served.
507
+ const type = assetType(rel);
508
+ if (type === undefined)
509
+ break;
320
510
  try {
321
511
  const body = await readFile(file);
322
- const type = ASSET_MIME[extname(rel)] ?? 'application/octet-stream';
323
- res.writeHead(200, { 'content-type': contentType(type), 'cache-control': 'no-cache' });
512
+ // A URL that names its own content can never go stale, so it is kept
513
+ // rather than revalidated. Anything else keeps the old answer: safe,
514
+ // and re-fetched every time, which is what versioning is for.
515
+ res.writeHead(200, {
516
+ 'content-type': contentType(type),
517
+ 'cache-control': isVersioned(rel) ? 'public, max-age=31536000, immutable' : 'no-cache',
518
+ });
324
519
  return res.end(body);
325
520
  }
326
521
  catch {
@@ -331,16 +526,57 @@ export async function createKetServer(o) {
331
526
  res.writeHead(404, { 'content-type': 'text/plain' });
332
527
  return res.end('not found');
333
528
  }
334
- const route = matchRoute(url.pathname);
335
- if (route) {
336
- const r = await route.value(url, req, route.params);
529
+ // Before anything expensive, including before a route is chosen: refusing
530
+ // after doing the work is a limit that costs what it was meant to save.
531
+ const policy = o.rateLimit?.(url, req);
532
+ if (policy) {
533
+ const verdict = await withDb(url, req, (adapter) => claimRateSlot(adapter, policy));
534
+ if (!verdict.ok) {
535
+ route = `rate:${policy.action}`;
536
+ requestLog?.log({
537
+ level: 'warn',
538
+ event: 'rate_limited',
539
+ fields: {
540
+ action: policy.action,
541
+ limit: policy.limit,
542
+ retryAfterMs: verdict.retryAfterMs,
543
+ method: req.method ?? '',
544
+ },
545
+ });
546
+ res.writeHead(429, {
547
+ 'content-type': 'application/json; charset=utf-8',
548
+ 'retry-after': String(Math.max(1, Math.ceil(verdict.retryAfterMs / 1_000))),
549
+ });
550
+ return res.end(JSON.stringify({ code: 'E_RATE_LIMITED', message: `too many "${policy.action}" requests` }));
551
+ }
552
+ }
553
+ const matched = matchRoute(url.pathname);
554
+ if (matched) {
555
+ route = matched.path;
556
+ const r = await matched.value(url, req, matched.params);
337
557
  return await send(res, r);
338
558
  }
339
- if (url.pathname === '/_ket/manifest')
559
+ // Framework endpoints name themselves: the paths are fixed, so there is no
560
+ // identifier to leak and no cardinality to worry about.
561
+ if (url.pathname === '/_ket/manifest') {
562
+ route = url.pathname;
340
563
  return json(res, 200, o.manifest);
341
- if (url.pathname === '/_ket/agent')
564
+ }
565
+ if (url.pathname === '/_ket/agent') {
566
+ route = url.pathname;
342
567
  return json(res, 200, agentDescriptor(o.manifest));
568
+ }
569
+ if (url.pathname === TOKENS_PATH) {
570
+ route = url.pathname;
571
+ const theme = await resolveTheme(url, req);
572
+ res.writeHead(theme ? 200 : 404, {
573
+ 'content-type': contentType(theme ? 'text/css' : 'text/plain'),
574
+ 'cache-control': 'no-cache',
575
+ });
576
+ return res.end(theme ? theme.tokensCss : 'not found');
577
+ }
343
578
  if (url.pathname === '/_ket/islands.js') {
579
+ route = url.pathname;
344
580
  const theme = await resolveTheme(url, req);
345
581
  const clients = await resolveIslandClients(url, req, theme);
346
582
  res.writeHead(200, {
@@ -352,7 +588,14 @@ export async function createKetServer(o) {
352
588
  // Resumable stream: the client reconnects with ?from=<cursor> and gets
353
589
  // exactly what it missed, never a duplicate and never a gap.
354
590
  if (url.pathname.startsWith('/_ket/stream/')) {
355
- const id = url.pathname.slice('/_ket/stream/'.length);
591
+ route = '/_ket/stream';
592
+ const publicId = decodeRequestPath(url.pathname.slice('/_ket/stream/'.length));
593
+ // A public stream id is never a storage key by default. The resolver is the
594
+ // deployment's authentication and tenant boundary; omitting it keeps this
595
+ // framework endpoint closed, and null does not reveal whether a topic exists.
596
+ const id = await o.resolveStream?.(publicId, url, req);
597
+ if (!id)
598
+ return json(res, 404, { code: 'E_STREAM_NOT_FOUND', message: 'stream not found' });
356
599
  const from = Number(url.searchParams.get('from') ?? 0);
357
600
  res.writeHead(200, {
358
601
  'content-type': 'text/event-stream',
@@ -379,7 +622,8 @@ export async function createKetServer(o) {
379
622
  return res.end();
380
623
  }
381
624
  if (url.pathname.startsWith('/_ket/fn/') && req.method === 'POST') {
382
- const fnKey = decodeURIComponent(url.pathname.slice('/_ket/fn/'.length));
625
+ route = '/_ket/fn';
626
+ const fnKey = decodeRequestPath(url.pathname.slice('/_ket/fn/'.length));
383
627
  const meta = o.manifest.functions[fnKey];
384
628
  if (meta?.exposure === 'internal') {
385
629
  throw new KetError({
@@ -388,7 +632,10 @@ export async function createKetServer(o) {
388
632
  hint: 'call it from the trusted route that owns its security policy',
389
633
  });
390
634
  }
391
- const args = await readBody(req);
635
+ // Bound the untrusted body before authentication/session resolvers run. A
636
+ // caller must not be able to make those expensive paths retain an unbounded
637
+ // payload first, whether or not Content-Length was supplied.
638
+ const args = await readBody(req, maxJsonBodyBytes);
392
639
  // Resolved before the pool lease, so a session lookup never holds one.
393
640
  const scope = await o.resolveScope?.(url, req);
394
641
  const allow = await o.resolveAllow?.(url, req);
@@ -402,6 +649,7 @@ export async function createKetServer(o) {
402
649
  queueNotify: o.queueNotify,
403
650
  dryRun: url.searchParams.get('dryRun') === '1',
404
651
  idempotencyKey: req.headers['idempotency-key'] ?? null,
652
+ idempotencyNamespace: `fn:http:${scope?.company ?? 'none'}:${actor ?? 'anonymous'}`,
405
653
  }));
406
654
  return json(res, 200, result);
407
655
  }
@@ -423,7 +671,7 @@ export async function createKetServer(o) {
423
671
  },
424
672
  }));
425
673
  }
426
- const fullHtml = bootstrapDocument(theme.renderRegion('layout', scope));
674
+ const fullHtml = bootstrapDocument(withThemeTokens(theme.renderRegion('layout', scope), theme.tokensCss));
427
675
  res.writeHead(200, {
428
676
  'content-type': 'text/html; charset=utf-8',
429
677
  ...(o.pageRegion ? { vary: 'X-Ket-Navigation' } : {}),
@@ -433,6 +681,18 @@ export async function createKetServer(o) {
433
681
  return json(res, 404, { code: 'E_NOT_FOUND', message: `no route for ${url.pathname}` });
434
682
  }
435
683
  catch (e) {
684
+ // Anything that is not a named contract failure escaped a `try` nobody wrote,
685
+ // and so did a failure that arrived after the headers went out. Both used to
686
+ // be discarded here: the client got a message and the server kept nothing.
687
+ if (!(e instanceof KetError) || res.headersSent) {
688
+ requestLog?.log({
689
+ level: 'error',
690
+ event: 'unhandled',
691
+ durationMs: Date.now() - started,
692
+ error: e,
693
+ fields: { method: req.method ?? '', route, headersSent: res.headersSent },
694
+ });
695
+ }
436
696
  // A streaming response has already sent its headers; there is no status code
437
697
  // left to send, so the only honest thing is to close the socket.
438
698
  if (res.headersSent) {
@@ -440,10 +700,34 @@ export async function createKetServer(o) {
440
700
  res.destroy(e);
441
701
  return;
442
702
  }
703
+ if (e instanceof FormValidationError)
704
+ return json(res, 422, e.toJSON());
705
+ const status = e instanceof KetError ? statusForError(e.code) : 500;
706
+ const code = e instanceof KetError ? e.code : 'E_INTERNAL';
707
+ if (o.renderErrorPage && wantsHtml(req)) {
708
+ // A page that fails to render an error is worse than the error, so the
709
+ // fallback is the JSON that was always there.
710
+ const page = await o.renderErrorPage({ code, status, url: requestUrl(req), req }).catch(() => null);
711
+ if (page !== null) {
712
+ res.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });
713
+ return res.end(page);
714
+ }
715
+ }
443
716
  if (e instanceof KetError)
444
- return json(res, e.code === 'E_PAYLOAD_TOO_LARGE' ? 413 : 400, e.toJSON());
717
+ return json(res, status, e.toJSON());
445
718
  return json(res, 500, { code: 'E_INTERNAL', message: e.message });
446
719
  }
720
+ finally {
721
+ requestLog?.log({
722
+ // A stylesheet is not an application event. One page load is dozens of
723
+ // asset requests, and at info they would be most of what a deployment
724
+ // says about itself.
725
+ level: route === 'asset' ? 'debug' : 'info',
726
+ event: 'http_request',
727
+ durationMs: Date.now() - started,
728
+ fields: { method: req.method ?? '', route, status: res.statusCode },
729
+ });
730
+ }
447
731
  });
448
732
  return {
449
733
  server,
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/http.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { Adapter } from '../types.ts';
2
- export declare const IDEM_DDL = "\nCREATE TABLE IF NOT EXISTS ket_idem (\n key TEXT PRIMARY KEY,\n fn TEXT NOT NULL,\n state TEXT NOT NULL,\n result TEXT,\n created_at TEXT NOT NULL\n);\n";
2
+ export declare const IDEM_DDL = "\nCREATE TABLE IF NOT EXISTS ket_idem (\n key TEXT PRIMARY KEY,\n fn TEXT NOT NULL,\n state TEXT NOT NULL,\n result TEXT,\n digest TEXT,\n created_at TEXT NOT NULL\n);\n";
3
3
  export declare const IDEM_DDL_PG: string;
4
4
  export type IdemRecord = {
5
5
  state: 'pending' | 'done';
6
6
  result: unknown;
7
+ digest: string | null;
7
8
  };
8
9
  export declare function createIdempotency(adapter: Adapter, o?: {
9
10
  now?: () => string;
@@ -16,7 +17,7 @@ export declare function createIdempotency(adapter: Adapter, o?: {
16
17
  * taken over. This is a liveness/safety trade made explicit: too short and a
17
18
  * slow call gets run twice, too long and a stuck key blocks retries.
18
19
  */
19
- claim(key: string, fn: string, staleMs?: number): Promise<boolean>;
20
+ claim(key: string, fn: string, staleMs?: number, digest?: string | null): Promise<boolean>;
20
21
  read(key: string): Promise<IdemRecord | null>;
21
22
  complete(key: string, result: unknown): Promise<void>;
22
23
  /** Drop a claim whose call then failed, so a retry is not locked out. */
@@ -1 +1 @@
1
- {"version":3,"file":"idem.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/idem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,QAAQ,4LAQpB,CAAA;AAED,eAAO,MAAM,WAAW,QAAkF,CAAA;AAE1G,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAA;AAEvE,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO;IAOpF;;;;;;;OAOG;eACc,MAAM,MAAM,MAAM,qBAAyB,OAAO,CAAC,OAAO,CAAC;cAc5D,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;kBAS/B,MAAM,UAAU,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,yEAAyE;iBACtD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC;;;;OAIG;iCAC0C,OAAO,CAAC,MAAM,CAAC;GAM/D"}
1
+ {"version":3,"file":"idem.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/idem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,QAAQ,gNASpB,CAAA;AAED,eAAO,MAAM,WAAW,QAAkF,CAAA;AAE1G,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAE9F,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO;IASpF;;;;;;;OAOG;eAEI,MAAM,MACP,MAAM,6BAEF,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,OAAO,CAAC;cAgBH,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;kBAU/B,MAAM,UAAU,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,yEAAyE;iBACtD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC;;;;OAIG;iCAC0C,OAAO,CAAC,MAAM,CAAC;GAM/D"}
@@ -7,6 +7,7 @@ CREATE TABLE IF NOT EXISTS ket_idem (
7
7
  fn TEXT NOT NULL,
8
8
  state TEXT NOT NULL,
9
9
  result TEXT,
10
+ digest TEXT,
10
11
  created_at TEXT NOT NULL
11
12
  );
12
13
  `;
@@ -16,6 +17,9 @@ export async function createIdempotency(adapter, o = {}) {
16
17
  const pg = adapter.name === 'postgres';
17
18
  const p = (n) => (pg ? `$${n}` : '?');
18
19
  await adapter.exec(pg ? IDEM_DDL_PG : IDEM_DDL);
20
+ const table = (await adapter.introspect()).ket_idem ?? {};
21
+ if (!('digest' in table))
22
+ await adapter.exec('ALTER TABLE ket_idem ADD COLUMN digest TEXT');
19
23
  return {
20
24
  /**
21
25
  * Claim a key. False means somebody else holds it; the primary key decides.
@@ -25,22 +29,26 @@ export async function createIdempotency(adapter, o = {}) {
25
29
  * taken over. This is a liveness/safety trade made explicit: too short and a
26
30
  * slow call gets run twice, too long and a stuck key blocks retries.
27
31
  */
28
- async claim(key, fn, staleMs = 5 * 60_000) {
29
- const r = await adapter.run(`INSERT INTO ket_idem (key, fn, state, created_at) VALUES (${p(1)}, ${p(2)}, 'pending', ${p(3)}) ON CONFLICT DO NOTHING`, [key, fn, now()]);
32
+ async claim(key, fn, staleMs = 5 * 60_000, digest = null) {
33
+ const r = await adapter.run(`INSERT INTO ket_idem (key, fn, state, digest, created_at) VALUES (${p(1)}, ${p(2)}, 'pending', ${p(3)}, ${p(4)}) ON CONFLICT DO NOTHING`, [key, fn, digest, now()]);
30
34
  if (r.changes === 1)
31
35
  return true;
36
+ const existing = await adapter.all(`SELECT digest FROM ket_idem WHERE key = ${p(1)}`, [key]);
37
+ if (digest && existing[0]?.digest && String(existing[0].digest) !== digest)
38
+ return false;
32
39
  const cutoff = new Date(Date.parse(now()) - staleMs).toISOString();
33
- const taken = await adapter.run(`UPDATE ket_idem SET created_at = ${p(1)} WHERE key = ${p(2)} AND state = 'pending' AND created_at < ${p(3)}`, [now(), key, cutoff]);
40
+ const taken = await adapter.run(`UPDATE ket_idem SET created_at = ${p(1)}, digest = ${p(2)} WHERE key = ${p(3)} AND state = 'pending' AND created_at < ${p(4)}`, [now(), digest, key, cutoff]);
34
41
  return taken.changes === 1;
35
42
  },
36
43
  async read(key) {
37
- const rows = await adapter.all(`SELECT state, result FROM ket_idem WHERE key = ${p(1)}`, [key]);
44
+ const rows = await adapter.all(`SELECT state, result, digest FROM ket_idem WHERE key = ${p(1)}`, [key]);
38
45
  const r = rows[0];
39
46
  if (!r)
40
47
  return null;
41
48
  return {
42
49
  state: String(r.state),
43
50
  result: r.result == null ? null : JSON.parse(String(r.result)),
51
+ digest: r.digest == null ? null : String(r.digest),
44
52
  };
45
53
  },
46
54
  async complete(key, result) {
@@ -1 +1 @@
1
- {"version":3,"file":"idem.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/idem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idem.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/idem.ts"],"names":[],"mappings":"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"}