✨ feat: enhance admin UI configuration and SSR handling
- Add support for number chip arrays and JSON editor in admin UI config. - Introduce pagebuilder block registry for Svelte components in admin previews. - Implement custom role names and a 3-layer cascade model for field-level permissions. - Add CORS configuration hierarchy for better API security. - Update project setup instructions for admin token and config management. - Improve SSR 404 signaling with proper context handling in NotFound component. - Refactor routing structure to separate NotFound page into its own route.
This commit is contained in:
@@ -150,6 +150,41 @@ If this mapping is wrong, SSR may appear to work for root pages while returning
|
||||
- This means SSR is not just HTML prerendering; it also primes client-side data access.
|
||||
- If HTML renders but `window.__SSR_CACHE__` is missing, the SSR pipeline is incomplete.
|
||||
|
||||
## SSR 404 signaling
|
||||
|
||||
When a page is not found during SSR, the framework returns the 404 page but with HTTP status **200** unless a 404 signal is set. The SSR hook (`get_read.js`) checks `context.is404` after rendering:
|
||||
|
||||
```js
|
||||
// get_read.js, after app.default.render()
|
||||
if (context.is404) {
|
||||
status = 404
|
||||
}
|
||||
```
|
||||
|
||||
The signal is set from `NotFound.svelte` — when this component is rendered during SSR, it sets the flag directly. This keeps the 404 logic in the component that owns it:
|
||||
|
||||
```ts
|
||||
// NotFound.svelte — top-level script, runs during render:
|
||||
if (typeof window === "undefined") {
|
||||
// @ts-ignore - context is the goja global in SSR runtime
|
||||
context.is404 = true
|
||||
}
|
||||
```
|
||||
|
||||
**Why this works:**
|
||||
- The `tibi-types` package declares `var context: HookContext` as a global (available because goja provides it during SSR).
|
||||
- During SSR, `loadContent()` runs synchronously (goja transforms `async`/`await`).
|
||||
- By the time `render(App)` returns in `ssr.ts`, `context.is404` is already `true`.
|
||||
- `get_read.js` reads it, returns HTTP 404, and the rendered 404 page HTML is sent with the correct status.
|
||||
- Caching is automatically skipped for 404 responses.
|
||||
|
||||
**Verification:** Test with a non-existent URL:
|
||||
|
||||
```bash
|
||||
curl -w "\nHTTP Status: %{http_code}\n" "http://tibiserver:8080/api/v1/_/<namespace>/ssr?url=/de/nicht-existierend"
|
||||
# Expected: HTTP 404, body contains the 404 page HTML
|
||||
```
|
||||
|
||||
## What an LLM should inspect first when changing SSR
|
||||
|
||||
1. `api/hooks/ssr/get_read.js` to understand cache lookup, route validation, and template injection.
|
||||
|
||||
Reference in New Issue
Block a user