toiljs 0.0.54 → 0.0.56

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 (105) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/build/backend/.tsbuildinfo +1 -1
  3. package/build/cli/.tsbuildinfo +1 -1
  4. package/build/cli/index.js +9 -5
  5. package/build/client/.tsbuildinfo +1 -1
  6. package/build/client/auth.js +1 -1
  7. package/build/client/components/Image.d.ts +1 -1
  8. package/build/client/dev/devtools.js +3 -1
  9. package/build/client/index.d.ts +2 -2
  10. package/build/client/index.js +2 -2
  11. package/build/client/routing/Router.js +1 -1
  12. package/build/client/routing/mount.js +1 -1
  13. package/build/compiler/.tsbuildinfo +1 -1
  14. package/build/compiler/docs.js +1 -1
  15. package/build/compiler/seo.js +1 -3
  16. package/build/compiler/template-build.js +1 -1
  17. package/build/devserver/.tsbuildinfo +1 -1
  18. package/build/devserver/cache.js +0 -0
  19. package/build/devserver/crypto.js +45 -17
  20. package/build/devserver/database.d.ts +8 -0
  21. package/build/devserver/database.js +416 -0
  22. package/build/devserver/email/caps.js +0 -0
  23. package/build/devserver/email/config.js +7 -2
  24. package/build/devserver/email/validate.js +1 -4
  25. package/build/devserver/host.d.ts +2 -0
  26. package/build/devserver/host.js +3 -2
  27. package/build/devserver/index.d.ts +1 -1
  28. package/build/devserver/index.js +3 -2
  29. package/build/devserver/module.js +52 -7
  30. package/build/devserver/proxy.js +2 -1
  31. package/build/io/.tsbuildinfo +1 -1
  32. package/build/io/codec.d.ts +5 -5
  33. package/build/io/codec.js +193 -77
  34. package/examples/basic/client/components/HoneycombBackground.tsx +1 -1
  35. package/examples/basic/client/public/images/logo.svg +37 -34
  36. package/examples/basic/client/public/index.html +14 -14
  37. package/examples/basic/client/routes/auth.tsx +18 -10
  38. package/examples/basic/client/routes/cookies.tsx +15 -24
  39. package/examples/basic/client/routes/crypto.tsx +4 -5
  40. package/examples/basic/client/routes/features/template/template.tsx +1 -1
  41. package/examples/basic/client/routes/hello.tsx +1 -1
  42. package/examples/basic/client/routes/pq.tsx +14 -14
  43. package/examples/basic/client/routes/rest.tsx +50 -1
  44. package/examples/basic/client/styles/main.css +25 -22
  45. package/examples/basic/client/toil.tsx +1 -1
  46. package/examples/basic/server/README.md +8 -8
  47. package/examples/basic/server/core/AppHandler.ts +4 -7
  48. package/examples/basic/server/main.ts +1 -0
  49. package/examples/basic/server/models/GuestEntry.ts +12 -0
  50. package/examples/basic/server/models/GuestbookView.ts +10 -0
  51. package/examples/basic/server/models/NewMessage.ts +6 -0
  52. package/examples/basic/server/routes/Auth.ts +50 -106
  53. package/examples/basic/server/routes/EnvDemo.ts +9 -3
  54. package/examples/basic/server/routes/Guestbook.ts +62 -0
  55. package/package.json +2 -2
  56. package/server/globals/auth.ts +3 -3
  57. package/server/globals/twofactor.ts +2 -1
  58. package/server/runtime/http/securecookies.ts +3 -2
  59. package/src/backend/index.ts +4 -2
  60. package/src/cli/doctor.ts +10 -3
  61. package/src/cli/notify.ts +1 -6
  62. package/src/cli/ui.ts +3 -3
  63. package/src/cli/version-check.ts +5 -1
  64. package/src/client/auth.ts +33 -10
  65. package/src/client/components/Form.tsx +2 -2
  66. package/src/client/components/Image.tsx +1 -1
  67. package/src/client/components/Script.tsx +1 -1
  68. package/src/client/components/Slot.tsx +1 -1
  69. package/src/client/dev/devtools.tsx +121 -54
  70. package/src/client/dev/error-overlay.tsx +7 -1
  71. package/src/client/head/metadata.ts +1 -1
  72. package/src/client/index.ts +13 -2
  73. package/src/client/routing/Router.tsx +2 -2
  74. package/src/client/routing/error-boundary.tsx +1 -1
  75. package/src/client/routing/loader.ts +2 -2
  76. package/src/client/routing/mount.tsx +5 -6
  77. package/src/compiler/docs.ts +1 -1
  78. package/src/compiler/email-preview.ts +1 -1
  79. package/src/compiler/generate.ts +1 -1
  80. package/src/compiler/seo.ts +1 -3
  81. package/src/compiler/ssg.ts +10 -4
  82. package/src/compiler/template-build.ts +2 -7
  83. package/src/compiler/template.ts +1 -4
  84. package/src/compiler/vite.ts +1 -1
  85. package/src/devserver/cache.ts +0 -0
  86. package/src/devserver/crypto.ts +140 -51
  87. package/src/devserver/database.ts +600 -0
  88. package/src/devserver/dotenv.ts +10 -2
  89. package/src/devserver/email/caps.ts +0 -0
  90. package/src/devserver/email/config.ts +8 -2
  91. package/src/devserver/email/index.ts +3 -3
  92. package/src/devserver/email/validate.ts +1 -4
  93. package/src/devserver/envelope.ts +3 -3
  94. package/src/devserver/host.ts +22 -9
  95. package/src/devserver/index.ts +15 -6
  96. package/src/devserver/module.ts +59 -11
  97. package/src/devserver/proxy.ts +5 -7
  98. package/src/io/codec.ts +226 -83
  99. package/test/devserver-database.test.ts +364 -0
  100. package/test/devserver-pqauth.test.ts +5 -65
  101. package/test/example-guestbook.test.ts +78 -0
  102. package/test/pqauth-e2e.test.ts +6 -6
  103. package/build/devserver/kv.d.ts +0 -3
  104. package/build/devserver/kv.js +0 -53
  105. package/src/devserver/kv.ts +0 -93
@@ -1,93 +0,0 @@
1
- /**
2
- * DEV-ONLY persistent key-value store host imports (`env::kv.*`).
3
- *
4
- * REMOVE LATER. This exists ONLY so the post-quantum auth example can run the
5
- * full register -> login chain end-to-end under `toiljs dev`. A tenant's wasm
6
- * linear memory is wiped after every request, so account records and login
7
- * challenges cannot live in the guest across the two round trips; they need an
8
- * external store. This module is a single-process `Map` standing in for that.
9
- *
10
- * It is intentionally NOT registered on the production Rust edge
11
- * (`toil-backend` `HOST_IMPORTS`), so a module using `kv.*` will not instantiate
12
- * there. Once toildb is implemented, move the example's account + challenge
13
- * stores onto toildb (which provides the atomic fetch-and-delete the challenge
14
- * consume needs) and delete this whole module. DO NOT ship this `Map` as a
15
- * production storage path: it is single-instance, unbounded, and lost on restart.
16
- *
17
- * Wire ABI (mirrors the crypto imports' caller-allocated-buffer convention):
18
- * kv.put(keyPtr, keyLen, valPtr, valLen) -> void
19
- * kv.get(keyPtr, keyLen, outPtr, outCap) -> i32 len | -1 absent | -2 too small
20
- * kv.getdel(keyPtr, keyLen, outPtr, outCap) -> i32 len | -1 absent | -2 too small
21
- * `getdel` is the atomic fetch-and-delete used to consume a login challenge
22
- * exactly once; it deletes only on a successful read (never on a -2 probe).
23
- */
24
-
25
- import type { MemoryRef } from './host.js';
26
-
27
- /** Process-lifetime store, shared across every dispatch (the whole point). */
28
- const STORE = new Map<string, Buffer>();
29
-
30
- /** Hard cap on a single value (bounds the dev process RAM). Account records are
31
- * ~1.5 KiB (1312-byte ML-DSA key + salt + params); 64 KiB is generous. */
32
- const MAX_VALUE_BYTES = 64 * 1024;
33
- /** Hard cap on a key. */
34
- const MAX_KEY_BYTES = 1024;
35
-
36
- function mem(ref: MemoryRef): Buffer {
37
- if (!ref.memory) throw new Error('kv host import called before memory was bound');
38
- return Buffer.from(ref.memory.buffer);
39
- }
40
-
41
- function readBytes(ref: MemoryRef, ptr: number, len: number): Buffer {
42
- const m = mem(ref);
43
- if (ptr < 0 || len < 0 || ptr + len > m.length)
44
- throw new Error(`kv read out of bounds: ptr=${String(ptr)} len=${String(len)}`);
45
- return Buffer.from(m.subarray(ptr, ptr + len)); // copy out
46
- }
47
-
48
- /** Map key from raw guest bytes (latin1 is a lossless 1:1 byte<->char mapping). */
49
- function keyOf(ref: MemoryRef, ptr: number, len: number): string {
50
- if (len > MAX_KEY_BYTES) throw new Error(`kv key too long: ${String(len)} bytes`);
51
- return readBytes(ref, ptr, len).toString('latin1');
52
- }
53
-
54
- /** Write a stored value into the caller buffer (if it fits) and return its
55
- * length; -1 if absent, -2 if the value exceeds `outCap` (no write, no delete). */
56
- function emit(ref: MemoryRef, value: Buffer | undefined, outPtr: number, outCap: number): number {
57
- if (value === undefined) return -1;
58
- if (value.length > outCap) return -2;
59
- const m = mem(ref);
60
- if (outPtr < 0 || outPtr + value.length > m.length)
61
- throw new Error('kv get write out of bounds');
62
- value.copy(m, outPtr);
63
- return value.length;
64
- }
65
-
66
- export function buildKvImports(ref: MemoryRef): Record<string, (...args: number[]) => number | void> {
67
- return {
68
- 'kv.put': (keyPtr: number, keyLen: number, valPtr: number, valLen: number): void => {
69
- if (valLen > MAX_VALUE_BYTES) throw new Error(`kv value too long: ${String(valLen)} bytes`);
70
- STORE.set(keyOf(ref, keyPtr, keyLen), readBytes(ref, valPtr, valLen));
71
- },
72
-
73
- 'kv.get': (keyPtr: number, keyLen: number, outPtr: number, outCap: number): number => {
74
- return emit(ref, STORE.get(keyOf(ref, keyPtr, keyLen)), outPtr, outCap);
75
- },
76
-
77
- // Atomic fetch-and-delete: deletes ONLY when the value is actually
78
- // returned (a -2 "buffer too small" probe leaves the entry intact), so a
79
- // login challenge is consumed exactly once.
80
- 'kv.getdel': (keyPtr: number, keyLen: number, outPtr: number, outCap: number): number => {
81
- const key = keyOf(ref, keyPtr, keyLen);
82
- const value = STORE.get(key);
83
- const n = emit(ref, value, outPtr, outCap);
84
- if (n >= 0) STORE.delete(key);
85
- return n;
86
- },
87
- };
88
- }
89
-
90
- /** Test-only: clear the store between unit tests. */
91
- export function __resetKvForTests(): void {
92
- STORE.clear();
93
- }