teste1w12sqw12
12e1x12s12s
12312312312312312312
All operations on resources go through the Handlers system — an onion/middleware model where each handler can run before, after, or produce the response. Handlers use next() to delegate to the next handler in the chain.
resource/
├── types.ts Resource, ResourceStore, User
├── result.ts HandlerResult, ok(), fail(), isError()
├── handlers.ts createHandlers() — onion/next() model
├── matcher.ts createMatcher() — pattern matching
├── engine.ts createResourceEngine() + ResourceEngine interface
├── http.ts createHttpHandler() + resultToResponse()
└── index.ts barrel exportsThis sliver is hydrated on the client.
// Register for multiple actions
engine.handlers.on('render', 'GET', ['render', 'default'], handler, {
resourceType: 'Page'
});
// BEFORE — check, then call next()
engine.handlers.on('auth', 'POST', '*', async (ctx, next) => {
if (!ctx.user) return fail('Unauthorized', 401);
return next();
}, { priority: 100 });HTTP Request
→ createHttpHandler(engine)
→ path = URL pathname (JCR-style)
→ action = ?action= or 'default'
→ engine.resolve(path) [virtuals → D1 store]
→ handlers.execute({ method, action, resource })
→ onion chain: auth → validate → handler → audit
→ HandlerResult → resultToResponse() → ResponseHandlers use the onion/next() pattern. Priority determines wrapping order: highest priority = outermost layer. Handlers return HandlerResult — ok(data) or fail(error) — not Response objects.