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.
- package/CHANGELOG.md +5 -0
- package/build/backend/.tsbuildinfo +1 -1
- package/build/cli/.tsbuildinfo +1 -1
- package/build/cli/index.js +9 -5
- package/build/client/.tsbuildinfo +1 -1
- package/build/client/auth.js +1 -1
- package/build/client/components/Image.d.ts +1 -1
- package/build/client/dev/devtools.js +3 -1
- package/build/client/index.d.ts +2 -2
- package/build/client/index.js +2 -2
- package/build/client/routing/Router.js +1 -1
- package/build/client/routing/mount.js +1 -1
- package/build/compiler/.tsbuildinfo +1 -1
- package/build/compiler/docs.js +1 -1
- package/build/compiler/seo.js +1 -3
- package/build/compiler/template-build.js +1 -1
- package/build/devserver/.tsbuildinfo +1 -1
- package/build/devserver/cache.js +0 -0
- package/build/devserver/crypto.js +45 -17
- package/build/devserver/database.d.ts +8 -0
- package/build/devserver/database.js +416 -0
- package/build/devserver/email/caps.js +0 -0
- package/build/devserver/email/config.js +7 -2
- package/build/devserver/email/validate.js +1 -4
- package/build/devserver/host.d.ts +2 -0
- package/build/devserver/host.js +3 -2
- package/build/devserver/index.d.ts +1 -1
- package/build/devserver/index.js +3 -2
- package/build/devserver/module.js +52 -7
- package/build/devserver/proxy.js +2 -1
- package/build/io/.tsbuildinfo +1 -1
- package/build/io/codec.d.ts +5 -5
- package/build/io/codec.js +193 -77
- package/examples/basic/client/components/HoneycombBackground.tsx +1 -1
- package/examples/basic/client/public/images/logo.svg +37 -34
- package/examples/basic/client/public/index.html +14 -14
- package/examples/basic/client/routes/auth.tsx +18 -10
- package/examples/basic/client/routes/cookies.tsx +15 -24
- package/examples/basic/client/routes/crypto.tsx +4 -5
- package/examples/basic/client/routes/features/template/template.tsx +1 -1
- package/examples/basic/client/routes/hello.tsx +1 -1
- package/examples/basic/client/routes/pq.tsx +14 -14
- package/examples/basic/client/routes/rest.tsx +50 -1
- package/examples/basic/client/styles/main.css +25 -22
- package/examples/basic/client/toil.tsx +1 -1
- package/examples/basic/server/README.md +8 -8
- package/examples/basic/server/core/AppHandler.ts +4 -7
- package/examples/basic/server/main.ts +1 -0
- package/examples/basic/server/models/GuestEntry.ts +12 -0
- package/examples/basic/server/models/GuestbookView.ts +10 -0
- package/examples/basic/server/models/NewMessage.ts +6 -0
- package/examples/basic/server/routes/Auth.ts +50 -106
- package/examples/basic/server/routes/EnvDemo.ts +9 -3
- package/examples/basic/server/routes/Guestbook.ts +62 -0
- package/package.json +2 -2
- package/server/globals/auth.ts +3 -3
- package/server/globals/twofactor.ts +2 -1
- package/server/runtime/http/securecookies.ts +3 -2
- package/src/backend/index.ts +4 -2
- package/src/cli/doctor.ts +10 -3
- package/src/cli/notify.ts +1 -6
- package/src/cli/ui.ts +3 -3
- package/src/cli/version-check.ts +5 -1
- package/src/client/auth.ts +33 -10
- package/src/client/components/Form.tsx +2 -2
- package/src/client/components/Image.tsx +1 -1
- package/src/client/components/Script.tsx +1 -1
- package/src/client/components/Slot.tsx +1 -1
- package/src/client/dev/devtools.tsx +121 -54
- package/src/client/dev/error-overlay.tsx +7 -1
- package/src/client/head/metadata.ts +1 -1
- package/src/client/index.ts +13 -2
- package/src/client/routing/Router.tsx +2 -2
- package/src/client/routing/error-boundary.tsx +1 -1
- package/src/client/routing/loader.ts +2 -2
- package/src/client/routing/mount.tsx +5 -6
- package/src/compiler/docs.ts +1 -1
- package/src/compiler/email-preview.ts +1 -1
- package/src/compiler/generate.ts +1 -1
- package/src/compiler/seo.ts +1 -3
- package/src/compiler/ssg.ts +10 -4
- package/src/compiler/template-build.ts +2 -7
- package/src/compiler/template.ts +1 -4
- package/src/compiler/vite.ts +1 -1
- package/src/devserver/cache.ts +0 -0
- package/src/devserver/crypto.ts +140 -51
- package/src/devserver/database.ts +600 -0
- package/src/devserver/dotenv.ts +10 -2
- package/src/devserver/email/caps.ts +0 -0
- package/src/devserver/email/config.ts +8 -2
- package/src/devserver/email/index.ts +3 -3
- package/src/devserver/email/validate.ts +1 -4
- package/src/devserver/envelope.ts +3 -3
- package/src/devserver/host.ts +22 -9
- package/src/devserver/index.ts +15 -6
- package/src/devserver/module.ts +59 -11
- package/src/devserver/proxy.ts +5 -7
- package/src/io/codec.ts +226 -83
- package/test/devserver-database.test.ts +364 -0
- package/test/devserver-pqauth.test.ts +5 -65
- package/test/example-guestbook.test.ts +78 -0
- package/test/pqauth-e2e.test.ts +6 -6
- package/build/devserver/kv.d.ts +0 -3
- package/build/devserver/kv.js +0 -53
- package/src/devserver/kv.ts +0 -93
package/src/devserver/kv.ts
DELETED
|
@@ -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
|
-
}
|