@plumix/core 0.3.0 → 0.5.0
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/dist/auth/authenticator.d.ts +8 -1
- package/dist/auth/authenticator.d.ts.map +1 -1
- package/dist/auth/authenticator.js +15 -0
- package/dist/auth/authenticator.js.map +1 -1
- package/dist/auth/bearer.js +2 -2
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/bootstrap.d.ts.map +1 -1
- package/dist/auth/bootstrap.js +39 -22
- package/dist/auth/bootstrap.js.map +1 -1
- package/dist/cache/decision.d.ts +7 -3
- package/dist/cache/decision.d.ts.map +1 -1
- package/dist/cache/decision.js +8 -6
- package/dist/cache/decision.js.map +1 -1
- package/dist/cache/read-through.d.ts +3 -0
- package/dist/cache/read-through.d.ts.map +1 -1
- package/dist/cache/read-through.js +14 -7
- package/dist/cache/read-through.js.map +1 -1
- package/dist/cache/tags.d.ts.map +1 -1
- package/dist/cache/tags.js +9 -0
- package/dist/cache/tags.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/context/app.d.ts +38 -6
- package/dist/context/app.d.ts.map +1 -1
- package/dist/context/app.js +41 -8
- package/dist/context/app.js.map +1 -1
- package/dist/context/collector.d.ts +9 -0
- package/dist/context/collector.d.ts.map +1 -0
- package/dist/context/collector.js +130 -0
- package/dist/context/collector.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -0
- package/dist/context/index.js.map +1 -1
- package/dist/context/stores.d.ts +2 -9
- package/dist/context/stores.d.ts.map +1 -1
- package/dist/context/stores.js.map +1 -1
- package/dist/context/telemetry.d.ts +148 -0
- package/dist/context/telemetry.d.ts.map +1 -0
- package/dist/context/telemetry.js +20 -0
- package/dist/context/telemetry.js.map +1 -0
- package/dist/context/traced-fetch.d.ts +14 -0
- package/dist/context/traced-fetch.d.ts.map +1 -0
- package/dist/context/traced-fetch.js +33 -0
- package/dist/context/traced-fetch.js.map +1 -0
- package/dist/db/errors.d.ts +8 -0
- package/dist/db/errors.d.ts.map +1 -1
- package/dist/db/errors.js +22 -0
- package/dist/db/errors.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/libsql.d.ts.map +1 -1
- package/dist/db/libsql.js +6 -12
- package/dist/db/libsql.js.map +1 -1
- package/dist/db/query-kind.d.ts +8 -0
- package/dist/db/query-kind.d.ts.map +1 -0
- package/dist/db/query-kind.js +11 -0
- package/dist/db/query-kind.js.map +1 -0
- package/dist/db/schema/users.d.ts +57 -0
- package/dist/db/schema/users.d.ts.map +1 -1
- package/dist/db/schema/users.js +10 -2
- package/dist/db/schema/users.js.map +1 -1
- package/dist/db/trace-libsql.d.ts +15 -0
- package/dist/db/trace-libsql.d.ts.map +1 -0
- package/dist/db/trace-libsql.js +37 -0
- package/dist/db/trace-libsql.js.map +1 -0
- package/dist/db/trace.d.ts +21 -0
- package/dist/db/trace.d.ts.map +1 -0
- package/dist/db/trace.js +64 -0
- package/dist/db/trace.js.map +1 -0
- package/dist/debug-bar/consumer.d.ts +12 -0
- package/dist/debug-bar/consumer.d.ts.map +1 -0
- package/dist/debug-bar/consumer.js +13 -0
- package/dist/debug-bar/consumer.js.map +1 -0
- package/dist/debug-bar/format-param.d.ts +6 -4
- package/dist/debug-bar/format-param.d.ts.map +1 -1
- package/dist/debug-bar/format-param.js +6 -9
- package/dist/debug-bar/format-param.js.map +1 -1
- package/dist/debug-bar/highlight-sql.d.ts +0 -3
- package/dist/debug-bar/highlight-sql.d.ts.map +1 -1
- package/dist/debug-bar/highlight-sql.js +0 -6
- package/dist/debug-bar/highlight-sql.js.map +1 -1
- package/dist/debug-bar/panels/database.d.ts +6 -4
- package/dist/debug-bar/panels/database.d.ts.map +1 -1
- package/dist/debug-bar/panels/database.js +44 -8
- package/dist/debug-bar/panels/database.js.map +1 -1
- package/dist/debug-bar/panels/template.d.ts +1 -1
- package/dist/debug-bar/panels/template.d.ts.map +1 -1
- package/dist/debug-bar/panels/template.js +16 -2
- package/dist/debug-bar/panels/template.js.map +1 -1
- package/dist/debug-bar/panels/timeline.js +1 -1
- package/dist/debug-bar/panels/timeline.js.map +1 -1
- package/dist/debug-bar/styles.d.ts.map +1 -1
- package/dist/debug-bar/styles.js +5 -0
- package/dist/debug-bar/styles.js.map +1 -1
- package/dist/debug-bar/template-node-label.d.ts.map +1 -1
- package/dist/debug-bar/template-node-label.js +8 -0
- package/dist/debug-bar/template-node-label.js.map +1 -1
- package/dist/debug-bar/timeline-model.d.ts +3 -3
- package/dist/debug-bar/timeline-model.d.ts.map +1 -1
- package/dist/debug-bar/timeline-model.js +1 -1
- package/dist/debug-bar/timeline-model.js.map +1 -1
- package/dist/debug-bar/types.d.ts +1 -1
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +21 -3
- package/dist/hooks/registry.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/plugin/manifest.d.ts +51 -0
- package/dist/plugin/manifest.d.ts.map +1 -1
- package/dist/plugin/manifest.js +8 -2
- package/dist/plugin/manifest.js.map +1 -1
- package/dist/plugin/provides-context.d.ts.map +1 -1
- package/dist/plugin/provides-context.js +5 -0
- package/dist/plugin/provides-context.js.map +1 -1
- package/dist/plugin/setup-context.d.ts +10 -1
- package/dist/plugin/setup-context.d.ts.map +1 -1
- package/dist/plugin/setup-context.js +12 -0
- package/dist/plugin/setup-context.js.map +1 -1
- package/dist/rest/build-handler.d.ts.map +1 -1
- package/dist/rest/build-handler.js +14 -1
- package/dist/rest/build-handler.js.map +1 -1
- package/dist/revisions/snapshot-envelope.d.ts +4 -2
- package/dist/revisions/snapshot-envelope.d.ts.map +1 -1
- package/dist/revisions/snapshot-envelope.js +6 -3
- package/dist/revisions/snapshot-envelope.js.map +1 -1
- package/dist/route/compile.d.ts +21 -0
- package/dist/route/compile.d.ts.map +1 -1
- package/dist/route/compile.js +63 -1
- package/dist/route/compile.js.map +1 -1
- package/dist/route/current.d.ts +5 -3
- package/dist/route/current.d.ts.map +1 -1
- package/dist/route/date-range.d.ts +12 -0
- package/dist/route/date-range.d.ts.map +1 -0
- package/dist/route/date-range.js +39 -0
- package/dist/route/date-range.js.map +1 -0
- package/dist/route/intent.d.ts +7 -3
- package/dist/route/intent.d.ts.map +1 -1
- package/dist/route/match.d.ts +1 -0
- package/dist/route/match.d.ts.map +1 -1
- package/dist/route/match.js +1 -1
- package/dist/route/match.js.map +1 -1
- package/dist/route/render/build-resolved-entries.d.ts.map +1 -1
- package/dist/route/render/build-resolved-entries.js +6 -1
- package/dist/route/render/build-resolved-entries.js.map +1 -1
- package/dist/route/render/render-template.d.ts.map +1 -1
- package/dist/route/render/render-template.js +23 -14
- package/dist/route/render/render-template.js.map +1 -1
- package/dist/route/render/resolved-entry.d.ts +36 -0
- package/dist/route/render/resolved-entry.d.ts.map +1 -1
- package/dist/route/render/template-builders.d.ts +66 -2
- package/dist/route/render/template-builders.d.ts.map +1 -1
- package/dist/route/render/template-builders.js +83 -4
- package/dist/route/render/template-builders.js.map +1 -1
- package/dist/route/render/template-hierarchy.d.ts +17 -1
- package/dist/route/render/template-hierarchy.d.ts.map +1 -1
- package/dist/route/render/template-hierarchy.js +23 -0
- package/dist/route/render/template-hierarchy.js.map +1 -1
- package/dist/route/resolve.d.ts +3 -1
- package/dist/route/resolve.d.ts.map +1 -1
- package/dist/route/resolve.js +152 -5
- package/dist/route/resolve.js.map +1 -1
- package/dist/rpc/authenticated.d.ts.map +1 -1
- package/dist/rpc/authenticated.js +2 -1
- package/dist/rpc/authenticated.js.map +1 -1
- package/dist/rpc/build-handler.d.ts.map +1 -1
- package/dist/rpc/build-handler.js +12 -0
- package/dist/rpc/build-handler.js.map +1 -1
- package/dist/rpc/procedures/auth/session.d.ts.map +1 -1
- package/dist/rpc/procedures/auth/session.js +2 -1
- package/dist/rpc/procedures/auth/session.js.map +1 -1
- package/dist/rpc/procedures/entry/create.d.ts +2 -2
- package/dist/rpc/procedures/entry/delete-permanent.d.ts +2 -2
- package/dist/rpc/procedures/entry/duplicate.d.ts +2 -2
- package/dist/rpc/procedures/entry/get.d.ts +2 -2
- package/dist/rpc/procedures/entry/helpers.d.ts +21 -0
- package/dist/rpc/procedures/entry/helpers.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/helpers.js +44 -0
- package/dist/rpc/procedures/entry/helpers.js.map +1 -1
- package/dist/rpc/procedures/entry/index.d.ts +23 -22
- package/dist/rpc/procedures/entry/index.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/list.d.ts +2 -2
- package/dist/rpc/procedures/entry/publish.d.ts +2 -2
- package/dist/rpc/procedures/entry/restore.d.ts +2 -2
- package/dist/rpc/procedures/entry/revisions.d.ts +8 -8
- package/dist/rpc/procedures/entry/schemas.d.ts +2 -0
- package/dist/rpc/procedures/entry/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/schemas.js +7 -0
- package/dist/rpc/procedures/entry/schemas.js.map +1 -1
- package/dist/rpc/procedures/entry/trash.d.ts +2 -2
- package/dist/rpc/procedures/entry/update.d.ts +3 -2
- package/dist/rpc/procedures/entry/update.d.ts.map +1 -1
- package/dist/rpc/procedures/entry/update.js +10 -5
- package/dist/rpc/procedures/entry/update.js.map +1 -1
- package/dist/rpc/procedures/term/create.d.ts +2 -2
- package/dist/rpc/procedures/term/delete.d.ts +2 -2
- package/dist/rpc/procedures/term/get.d.ts +2 -2
- package/dist/rpc/procedures/term/index.d.ts +10 -10
- package/dist/rpc/procedures/term/list.d.ts +2 -2
- package/dist/rpc/procedures/term/update.d.ts +2 -2
- package/dist/rpc/procedures/user/delete.d.ts +2 -0
- package/dist/rpc/procedures/user/delete.d.ts.map +1 -1
- package/dist/rpc/procedures/user/disable.d.ts +2 -0
- package/dist/rpc/procedures/user/disable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/enable.d.ts +2 -0
- package/dist/rpc/procedures/user/enable.d.ts.map +1 -1
- package/dist/rpc/procedures/user/get.d.ts +2 -0
- package/dist/rpc/procedures/user/get.d.ts.map +1 -1
- package/dist/rpc/procedures/user/index.d.ts +13 -0
- package/dist/rpc/procedures/user/index.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.d.ts.map +1 -1
- package/dist/rpc/procedures/user/invite.js +28 -15
- package/dist/rpc/procedures/user/invite.js.map +1 -1
- package/dist/rpc/procedures/user/list.d.ts +2 -0
- package/dist/rpc/procedures/user/list.d.ts.map +1 -1
- package/dist/rpc/procedures/user/list.js +1 -0
- package/dist/rpc/procedures/user/list.js.map +1 -1
- package/dist/rpc/procedures/user/schemas.d.ts +1 -0
- package/dist/rpc/procedures/user/schemas.d.ts.map +1 -1
- package/dist/rpc/procedures/user/schemas.js +5 -0
- package/dist/rpc/procedures/user/schemas.js.map +1 -1
- package/dist/rpc/procedures/user/update.d.ts +3 -0
- package/dist/rpc/procedures/user/update.d.ts.map +1 -1
- package/dist/rpc/procedures/user/update.js +10 -1
- package/dist/rpc/procedures/user/update.js.map +1 -1
- package/dist/rpc/router.d.ts +46 -32
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/schemas.js +6 -6
- package/dist/rpc/schemas.js.map +1 -1
- package/dist/rpc/validation.d.ts +10 -0
- package/dist/rpc/validation.d.ts.map +1 -1
- package/dist/rpc/validation.js +10 -0
- package/dist/rpc/validation.js.map +1 -1
- package/dist/runtime/dispatcher.d.ts.map +1 -1
- package/dist/runtime/dispatcher.js +105 -14
- package/dist/runtime/dispatcher.js.map +1 -1
- package/dist/runtime/load-user-for-public-request.d.ts.map +1 -1
- package/dist/runtime/load-user-for-public-request.js +2 -2
- package/dist/runtime/load-user-for-public-request.js.map +1 -1
- package/dist/runtime/scheduled.d.ts +3 -1
- package/dist/runtime/scheduled.d.ts.map +1 -1
- package/dist/runtime/scheduled.js +16 -2
- package/dist/runtime/scheduled.js.map +1 -1
- package/dist/runtime/telemetry-delivery.d.ts +14 -0
- package/dist/runtime/telemetry-delivery.d.ts.map +1 -0
- package/dist/runtime/telemetry-delivery.js +39 -0
- package/dist/runtime/telemetry-delivery.js.map +1 -0
- package/dist/seo/feed.d.ts +19 -4
- package/dist/seo/feed.d.ts.map +1 -1
- package/dist/seo/feed.js +49 -12
- package/dist/seo/feed.js.map +1 -1
- package/dist/seo/head-defaults.d.ts.map +1 -1
- package/dist/seo/head-defaults.js +6 -3
- package/dist/seo/head-defaults.js.map +1 -1
- package/dist/template-registry.d.ts +31 -1
- package/dist/template-registry.d.ts.map +1 -1
- package/dist/test/default-theme.d.ts.map +1 -1
- package/dist/test/default-theme.js +3 -0
- package/dist/test/default-theme.js.map +1 -1
- package/dist/test/dispatcher.d.ts +13 -0
- package/dist/test/dispatcher.d.ts.map +1 -1
- package/dist/test/dispatcher.js +9 -3
- package/dist/test/dispatcher.js.map +1 -1
- package/dist/test/factories.d.ts +39 -21
- package/dist/test/factories.d.ts.map +1 -1
- package/dist/test/factories.js +1 -0
- package/dist/test/factories.js.map +1 -1
- package/dist/test/harness.d.ts.map +1 -1
- package/dist/test/harness.js +4 -12
- package/dist/test/harness.js.map +1 -1
- package/dist/theme.d.ts +15 -7
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +9 -0
- package/dist/theme.js.map +1 -1
- package/dist/users/slug.d.ts +12 -0
- package/dist/users/slug.d.ts.map +1 -0
- package/dist/users/slug.js +32 -0
- package/dist/users/slug.js.map +1 -0
- package/package.json +2 -2
- package/dist/context/debug.d.ts +0 -25
- package/dist/context/debug.d.ts.map +0 -1
- package/dist/context/debug.js +0 -13
- package/dist/context/debug.js.map +0 -1
- package/dist/debug-bar/collector.d.ts +0 -9
- package/dist/debug-bar/collector.d.ts.map +0 -1
- package/dist/debug-bar/collector.js +0 -80
- package/dist/debug-bar/collector.js.map +0 -1
- package/dist/debug-bar/db-query.d.ts +0 -21
- package/dist/debug-bar/db-query.d.ts.map +0 -1
- package/dist/debug-bar/db-query.js +0 -23
- package/dist/debug-bar/db-query.js.map +0 -1
- package/dist/debug-bar/trace-libsql.d.ts +0 -18
- package/dist/debug-bar/trace-libsql.d.ts.map +0 -1
- package/dist/debug-bar/trace-libsql.js +0 -42
- package/dist/debug-bar/trace-libsql.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Db } from "../context/app.js";
|
|
1
|
+
import type { AppContext, Db } from "../context/app.js";
|
|
2
2
|
import type { User } from "../db/schema/users.js";
|
|
3
3
|
/**
|
|
4
4
|
* Resolved auth on a request — the user plus any guard-specific
|
|
@@ -87,6 +87,13 @@ export interface RequestAuthenticator {
|
|
|
87
87
|
* caps. PAT-style scoping doesn't apply here.
|
|
88
88
|
*/
|
|
89
89
|
export declare function sessionAuthenticator(): RequestAuthenticator;
|
|
90
|
+
/**
|
|
91
|
+
* Run an authenticator inside an `auth` telemetry span, so session/token
|
|
92
|
+
* resolution shows up in the request's span tree with its outcome. The
|
|
93
|
+
* single traced entry point for every auth choke point — public render,
|
|
94
|
+
* admin shell, RPC middleware, and the bearer surfaces (MCP, REST).
|
|
95
|
+
*/
|
|
96
|
+
export declare function authenticateTraced(ctx: AppContext, authenticator: RequestAuthenticator): Promise<AuthResult | null>;
|
|
90
97
|
/**
|
|
91
98
|
* Whether a request carries a session this authenticator would resolve on a
|
|
92
99
|
* public render. Defaults to "the standard `plumix_session` cookie is present"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAKlD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnE;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACvC;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAa3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,UAAU,EACf,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,oBAAoB,EACnC,OAAO,EAAE,OAAO,GACf,OAAO,CAIT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAuB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,cAAc,EAAE,SAAS,oBAAoB,EAAE,GACjD,oBAAoB,CAoBtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAE3D"}
|
|
@@ -25,6 +25,21 @@ export function sessionAuthenticator() {
|
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Run an authenticator inside an `auth` telemetry span, so session/token
|
|
30
|
+
* resolution shows up in the request's span tree with its outcome. The
|
|
31
|
+
* single traced entry point for every auth choke point — public render,
|
|
32
|
+
* admin shell, RPC middleware, and the bearer surfaces (MCP, REST).
|
|
33
|
+
*/
|
|
34
|
+
export function authenticateTraced(ctx, authenticator) {
|
|
35
|
+
return ctx.telemetry.span("auth", async (s) => {
|
|
36
|
+
const result = await authenticator.authenticate(ctx.request, ctx.db);
|
|
37
|
+
s.set("auth.authenticated", result !== null);
|
|
38
|
+
if (result)
|
|
39
|
+
s.set("auth.user.id", result.user.id);
|
|
40
|
+
return result;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
28
43
|
/**
|
|
29
44
|
* Whether a request carries a session this authenticator would resolve on a
|
|
30
45
|
* public render. Defaults to "the standard `plumix_session` cookie is present"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/auth/authenticator.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/bearer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { withUser } from "../context/app.js";
|
|
2
|
-
import { apiTokenAuthenticator } from "./authenticator.js";
|
|
2
|
+
import { apiTokenAuthenticator, authenticateTraced } from "./authenticator.js";
|
|
3
3
|
// Bearer PAT only — shared by the CSRF-exempt external surfaces (MCP, REST).
|
|
4
4
|
// Deliberately NOT the request's configured authenticator (cookie/custom
|
|
5
5
|
// guard): cookie auth must never resolve on an endpoint mounted ahead of the
|
|
@@ -19,7 +19,7 @@ export function hasBearerToken(request) {
|
|
|
19
19
|
* disabled. Callers decide whether a null means 401 or anonymous access.
|
|
20
20
|
*/
|
|
21
21
|
export async function authenticateBearer(ctx) {
|
|
22
|
-
const result = await
|
|
22
|
+
const result = await authenticateTraced(ctx, bearerAuthenticator);
|
|
23
23
|
if (!result)
|
|
24
24
|
return null;
|
|
25
25
|
const { id, email, role, meta } = result.user;
|
package/dist/auth/bearer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bearer.js","sourceRoot":"","sources":["../../src/auth/bearer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"bearer.js","sourceRoot":"","sources":["../../src/auth/bearer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,6EAA6E;AAC7E,yEAAyE;AACzE,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,qBAAqB,EAAE,CAAC;AAEpD,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,8BAA8B;AAC9B,MAAM,MAAM,GAAG,eAAe,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAe;IAEf,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9C,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0C3B"}
|
package/dist/auth/bootstrap.js
CHANGED
|
@@ -1,27 +1,44 @@
|
|
|
1
|
-
import { sql } from "../db/index.js";
|
|
1
|
+
import { isUniqueConstraintErrorOn, sql } from "../db/index.js";
|
|
2
2
|
import { users } from "../db/schema/users.js";
|
|
3
|
+
import { deriveUserSlug, MAX_SLUG_ATTEMPTS } from "../users/slug.js";
|
|
3
4
|
export async function provisionUser(db, input) {
|
|
4
5
|
const defaultRole = input.defaultRole ?? "subscriber";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
6
|
+
for (let attempt = 1;; attempt++) {
|
|
7
|
+
const slug = await deriveUserSlug(db, input.name);
|
|
8
|
+
// Role is decided inside the INSERT so concurrent first-user provisioning
|
|
9
|
+
// can't elect two admins: SQLite serializes writers, and the subquery
|
|
10
|
+
// observes previously-inserted rows. Only the statement that runs when
|
|
11
|
+
// the table is empty gets `admin`.
|
|
12
|
+
let user;
|
|
13
|
+
try {
|
|
14
|
+
[user] = await db
|
|
15
|
+
.insert(users)
|
|
16
|
+
.values({
|
|
17
|
+
email: input.email,
|
|
18
|
+
slug,
|
|
19
|
+
name: input.name ?? null,
|
|
20
|
+
avatarUrl: input.avatarUrl ?? null,
|
|
21
|
+
role: sql `CASE WHEN (SELECT COUNT(*) FROM ${users}) = 0 THEN 'admin' ELSE ${defaultRole} END`,
|
|
22
|
+
emailVerifiedAt: input.emailVerified ? new Date() : null,
|
|
23
|
+
})
|
|
24
|
+
.returning();
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// Only a slug race is retryable; an email collision is a real conflict
|
|
28
|
+
// the caller must see, so re-throw it (and any other error) as-is.
|
|
29
|
+
if (attempt < MAX_SLUG_ATTEMPTS &&
|
|
30
|
+
isUniqueConstraintErrorOn(error, "users.slug")) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
// eslint-disable-next-line no-restricted-syntax -- defensive driver-regression guard; migrate alongside auth errors in PR 2 (#234)
|
|
36
|
+
if (!user)
|
|
37
|
+
throw new Error("provisionUser: insert returned no row");
|
|
38
|
+
return {
|
|
39
|
+
user,
|
|
40
|
+
bootstrapped: user.role === "admin" && defaultRole !== "admin",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
26
43
|
}
|
|
27
44
|
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/auth/bootstrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAM,EACN,KAMC;IAED,MAAM,WAAW,GAAa,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC;IAEhE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAElD,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,mCAAmC;QACnC,IAAI,IAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;iBACd,MAAM,CAAC,KAAK,CAAC;iBACb,MAAM,CAAC;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;gBAClC,IAAI,EAAE,GAAG,CAAU,mCAAmC,KAAK,2BAA2B,WAAW,MAAM;gBACvG,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;aACzD,CAAC;iBACD,SAAS,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,mEAAmE;YACnE,IACE,OAAO,GAAG,iBAAiB;gBAC3B,yBAAyB,CAAC,KAAK,EAAE,YAAY,CAAC,EAC9C,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,mIAAmI;QACnI,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACpE,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/cache/decision.d.ts
CHANGED
|
@@ -18,11 +18,15 @@ interface CacheableRequest {
|
|
|
18
18
|
* would outlive the token's authorization window in the edge cache.
|
|
19
19
|
*/
|
|
20
20
|
export declare function requestIsPrivileged(request: Request): boolean;
|
|
21
|
+
/** Why the edge cache refused to participate in a request. */
|
|
22
|
+
export type CacheBypassReason = "method" | "privileged" | "intent";
|
|
21
23
|
/**
|
|
22
|
-
*
|
|
23
|
-
* both reading a stored response and storing a fresh one.
|
|
24
|
+
* The gate for whether the edge cache may participate in this request at all —
|
|
25
|
+
* both reading a stored response and storing a fresh one. Returns `null` when
|
|
26
|
+
* the request is cacheable, otherwise the first failing check — the reason the
|
|
27
|
+
* telemetry `cache` record carries.
|
|
24
28
|
*/
|
|
25
|
-
export declare function
|
|
29
|
+
export declare function cacheBypassReason(req: CacheableRequest): CacheBypassReason | null;
|
|
26
30
|
/**
|
|
27
31
|
* Whether a rendered response may be written to the edge cache. Only a `200`
|
|
28
32
|
* is a complete public document worth storing; redirects and errors are never
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED
|
|
1
|
+
{"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,GACpB,iBAAiB,GAAG,IAAI,CAI1B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E"}
|
package/dist/cache/decision.js
CHANGED
|
@@ -25,15 +25,17 @@ export function requestIsPrivileged(request) {
|
|
|
25
25
|
return new URL(request.url).searchParams.has("preview");
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
29
|
-
* both reading a stored response and storing a fresh one.
|
|
28
|
+
* The gate for whether the edge cache may participate in this request at all —
|
|
29
|
+
* both reading a stored response and storing a fresh one. Returns `null` when
|
|
30
|
+
* the request is cacheable, otherwise the first failing check — the reason the
|
|
31
|
+
* telemetry `cache` record carries.
|
|
30
32
|
*/
|
|
31
|
-
export function
|
|
33
|
+
export function cacheBypassReason(req) {
|
|
32
34
|
if (req.method !== "GET" && req.method !== "HEAD")
|
|
33
|
-
return
|
|
35
|
+
return "method";
|
|
34
36
|
if (req.isPrivileged)
|
|
35
|
-
return
|
|
36
|
-
return CACHEABLE_INTENTS.has(req.intentKind);
|
|
37
|
+
return "privileged";
|
|
38
|
+
return CACHEABLE_INTENTS.has(req.intentKind) ? null : "intent";
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
39
41
|
* Whether a rendered response may be written to the edge cache. Only a `200`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,+EAA+E;AAC/E,8EAA8E;AAC9E,sDAAsD;AACtD,MAAM,iBAAiB,GAAqC,IAAI,GAAG,CAAC;IAClE,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAYH;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/cache/decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,+EAA+E;AAC/E,8EAA8E;AAC9E,sDAAsD;AACtD,MAAM,iBAAiB,GAAqC,IAAI,GAAG,CAAC;IAClE,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAYH;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,iBAAiB,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAqB;IAErB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACnE,IAAI,GAAG,CAAC,YAAY;QAAE,OAAO,YAAY,CAAC;IAC1C,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DeferFn } from "../context/app.js";
|
|
2
|
+
import type { TelemetryCollector } from "../context/telemetry.js";
|
|
2
3
|
import type { RouteIntent } from "../route/intent.js";
|
|
3
4
|
import type { ConnectedCache } from "../runtime/slots.js";
|
|
4
5
|
interface ReadThroughArgs {
|
|
@@ -10,6 +11,8 @@ interface ReadThroughArgs {
|
|
|
10
11
|
readonly intentKind: RouteIntent["kind"] | null;
|
|
11
12
|
readonly cache: ConnectedCache;
|
|
12
13
|
readonly defer: DeferFn;
|
|
14
|
+
/** Records the cache decision + reason as a durationless `cache` fact. */
|
|
15
|
+
readonly telemetry: TelemetryCollector;
|
|
13
16
|
/** Renders the page live. Called once on a miss, never on a hit. */
|
|
14
17
|
readonly render: () => Promise<Response>;
|
|
15
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-through.d.ts","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"read-through.d.ts","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6B1E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cacheBypassReason, requestIsPrivileged, responseIsStorable, } from "./decision.js";
|
|
2
2
|
/**
|
|
3
3
|
* Serve a public page through the edge cache: return a stored response on a
|
|
4
4
|
* hit, otherwise render live and store the result when it's cacheable. The
|
|
@@ -7,20 +7,27 @@ import { requestIsCacheable, requestIsPrivileged, responseIsStorable, } from "./
|
|
|
7
7
|
* and touch the cache not at all.
|
|
8
8
|
*/
|
|
9
9
|
export async function readThrough(args) {
|
|
10
|
-
const { request, intentKind, cache, defer, render, tags } = args;
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const { request, intentKind, cache, defer, telemetry, render, tags } = args;
|
|
11
|
+
const reason = intentKind === null
|
|
12
|
+
? "no-route"
|
|
13
|
+
: cacheBypassReason({
|
|
13
14
|
method: request.method,
|
|
14
15
|
isPrivileged: requestIsPrivileged(request),
|
|
15
16
|
intentKind,
|
|
16
|
-
})
|
|
17
|
+
});
|
|
18
|
+
if (reason !== null) {
|
|
19
|
+
telemetry.record("cache", { decision: "bypass", reason });
|
|
17
20
|
return render();
|
|
18
21
|
}
|
|
19
22
|
const hit = await cache.match(request);
|
|
20
|
-
if (hit)
|
|
23
|
+
if (hit) {
|
|
24
|
+
telemetry.record("cache", { decision: "hit" });
|
|
21
25
|
return hit;
|
|
26
|
+
}
|
|
22
27
|
const fresh = await render();
|
|
23
|
-
|
|
28
|
+
const stored = responseIsStorable(request.method, fresh.status);
|
|
29
|
+
telemetry.record("cache", { decision: "miss", stored });
|
|
30
|
+
if (stored) {
|
|
24
31
|
defer(cache.put(request, fresh.clone(), tags()));
|
|
25
32
|
}
|
|
26
33
|
return fresh;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-through.js","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-through.js","sourceRoot":"","sources":["../../src/cache/read-through.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAsBvB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE5E,MAAM,MAAM,GACV,UAAU,KAAK,IAAI;QACjB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,iBAAiB,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC;YAC1C,UAAU;SACX,CAAC,CAAC;IACT,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/cache/tags.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACtD,kDAAkD;IAClD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CACtE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACtD,kDAAkD;IAClD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;CACtE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAyB1D;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE7E"}
|
package/dist/cache/tags.js
CHANGED
|
@@ -27,7 +27,16 @@ export function pageTags(sources) {
|
|
|
27
27
|
return sources.frontPageEntryTypes().map(typeTag);
|
|
28
28
|
case "taxonomy":
|
|
29
29
|
return sources.taxonomyEntryTypes(intent.taxonomy).map(typeTag);
|
|
30
|
+
case "author":
|
|
31
|
+
case "date":
|
|
32
|
+
// Author and date archives list the same public, non-hierarchical type
|
|
33
|
+
// set as the front page, so any publish of those types can change them.
|
|
34
|
+
return sources.frontPageEntryTypes().map(typeTag);
|
|
35
|
+
case "custom":
|
|
30
36
|
case "search":
|
|
37
|
+
// A plugin archive's content dependencies are unknown to core (as search
|
|
38
|
+
// results are), so it carries no coarse type tags — the plugin manages
|
|
39
|
+
// its own invalidation if it edge-caches.
|
|
31
40
|
return [];
|
|
32
41
|
}
|
|
33
42
|
}
|
package/dist/cache/tags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,OAAO,KAAK,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAChC,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,cAAc,EAAE,IAAI,KAAK,OAAO;gBACrC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAe;IAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,kBAAqC;IACjE,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/cache/tags.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,OAAO,KAAK,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAChC,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,cAAc,EAAE,IAAI,KAAK,OAAO;gBACrC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,uEAAuE;YACvE,wEAAwE;YACxE,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,yEAAyE;YACzE,uEAAuE;YACvE,0CAA0C;YAC1C,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAe;IAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,kBAAqC;IACjE,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { HtmlAllowlistOverride } from "@plumix/blocks";
|
|
|
2
2
|
import type { RemotePattern } from "@plumix/blocks/renderer";
|
|
3
3
|
import type { PlumixAuthConfig } from "./auth/config.js";
|
|
4
4
|
import type { MailerInput } from "./auth/mailer/resolve.js";
|
|
5
|
+
import type { TelemetryConfig } from "./context/telemetry.js";
|
|
5
6
|
import type { DebugBarInput } from "./debug-bar/config.js";
|
|
6
7
|
import type { I18nInput, ResolvedI18n } from "./i18n/locale-registry.js";
|
|
7
8
|
import type { PluginDescriptor } from "./plugin/define.js";
|
|
@@ -98,6 +99,13 @@ export interface PlumixConfigInput {
|
|
|
98
99
|
* to suppress it or `{ disable: [...] }` to silence individual panels.
|
|
99
100
|
*/
|
|
100
101
|
readonly debugBar?: DebugBarInput;
|
|
102
|
+
/**
|
|
103
|
+
* Telemetry consumers, registered once here. Each consumer head-samples
|
|
104
|
+
* per request and receives a serializable snapshot post-response; with no
|
|
105
|
+
* consumers the collector stays a no-op and production pays nothing. The
|
|
106
|
+
* dev debug bar registers itself as the first consumer automatically.
|
|
107
|
+
*/
|
|
108
|
+
readonly telemetry?: TelemetryConfig;
|
|
101
109
|
/**
|
|
102
110
|
* Block-system configuration. Today only exposes the operator-
|
|
103
111
|
* configurable `core/html` allowlist override; future block-level
|
|
@@ -137,6 +145,7 @@ export interface PlumixConfig {
|
|
|
137
145
|
readonly mcp?: InterfaceToggle;
|
|
138
146
|
readonly api?: ApiConfig;
|
|
139
147
|
readonly debugBar?: DebugBarInput;
|
|
148
|
+
readonly telemetry?: TelemetryConfig;
|
|
140
149
|
readonly blocks?: {
|
|
141
150
|
readonly htmlAllowlist?: HtmlAllowlistOverride;
|
|
142
151
|
};
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0BlD,MAAM,UAAU,gBAAgB,CAAC,MAAmC;IAClE,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAClC,CAAC;AAqID,MAAM,UAAU,MAAM,CAAC,MAAyB;IAC9C,iEAAiE;IACjE,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,MAAM,WAAW,CAAC,uBAAuB,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,cAAc,CAClB,MAAM,CAAC,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CACxD;QACD,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
|
package/dist/context/app.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { ResolvedEntity } from "../route/current.js";
|
|
|
15
15
|
import type { OAuthProviderSummary } from "../runtime/app.js";
|
|
16
16
|
import type { PlumixEnv } from "../runtime/bindings.js";
|
|
17
17
|
import type { AssetsBinding, ConnectedCache, ConnectedObjectStorage, ImageDelivery } from "../runtime/slots.js";
|
|
18
|
-
import type {
|
|
18
|
+
import type { TelemetryCollector, TelemetryConfig, TelemetryConsumer } from "./telemetry.js";
|
|
19
19
|
export type CoreSchema = typeof coreSchema;
|
|
20
20
|
export type Db<TSchema extends Record<string, unknown> = CoreSchema> = BaseSQLiteDatabase<"async" | "sync", unknown, TSchema>;
|
|
21
21
|
export interface AuthenticatedUser {
|
|
@@ -98,12 +98,28 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
|
|
|
98
98
|
readonly shortcodes: ShortcodeRegistry;
|
|
99
99
|
readonly logger: Logger;
|
|
100
100
|
/**
|
|
101
|
-
* Request-scoped
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
101
|
+
* Request-scoped telemetry collector — spans + records for what happened
|
|
102
|
+
* during this request. Core and plugins record via `ctx.telemetry.record`/
|
|
103
|
+
* `span`. Always present: the real collector when at least one registered
|
|
104
|
+
* consumer voted to sample this request, {@link NOOP_TELEMETRY} otherwise
|
|
105
|
+
* (so call sites are safe and a site with no consumers pays nothing).
|
|
105
106
|
*/
|
|
106
|
-
readonly
|
|
107
|
+
readonly telemetry: TelemetryCollector;
|
|
108
|
+
/**
|
|
109
|
+
* Traced outbound HTTP — same signature as global `fetch`, one telemetry
|
|
110
|
+
* span per call with method, URL, and response status. Core and plugins
|
|
111
|
+
* make external calls through this so a slow third-party API shows up in
|
|
112
|
+
* the request waterfall. Bare global `fetch` is an untraced platform
|
|
113
|
+
* boundary (the same line drawn for DB connections not obtained from
|
|
114
|
+
* `ctx.db`) — nothing is patched globally.
|
|
115
|
+
*/
|
|
116
|
+
readonly fetch: typeof globalThis.fetch;
|
|
117
|
+
/**
|
|
118
|
+
* Consumers whose head-sampling vote said yes for this request — the
|
|
119
|
+
* targets of post-response snapshot delivery. Absent when nothing sampled
|
|
120
|
+
* (and `telemetry` is the no-op). Internal to the dispatcher.
|
|
121
|
+
*/
|
|
122
|
+
readonly telemetryConsumers?: readonly TelemetryConsumer[];
|
|
107
123
|
readonly auth: AuthNamespace;
|
|
108
124
|
/**
|
|
109
125
|
* Resolved request authenticator — same instance the dispatcher
|
|
@@ -211,6 +227,13 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
|
|
|
211
227
|
* / custom headers here; the dispatcher folds them into the Response.
|
|
212
228
|
*/
|
|
213
229
|
readonly resHeaders?: Headers;
|
|
230
|
+
/**
|
|
231
|
+
* Unique id for this execution (request or cron run), minted at context
|
|
232
|
+
* creation so mid-request consumers — logs, error hooks, the debug bar —
|
|
233
|
+
* and the post-response telemetry snapshot all correlate on one value.
|
|
234
|
+
* The snapshot envelope's `requestId` is this id.
|
|
235
|
+
*/
|
|
236
|
+
readonly requestId: string;
|
|
214
237
|
/**
|
|
215
238
|
* Set by the public-route resolver after URL → entity matching;
|
|
216
239
|
* `null` for non-public routes (admin, RPC, etc.) and on cold-start.
|
|
@@ -220,6 +243,13 @@ export interface AppContextBase<TSchema extends Record<string, unknown> = CoreSc
|
|
|
220
243
|
* and response rendering, and read paths see the populated value.
|
|
221
244
|
*/
|
|
222
245
|
resolvedEntity: ResolvedEntity | null;
|
|
246
|
+
/**
|
|
247
|
+
* The template rule that won resolution (its `ruleLabel`), written by the
|
|
248
|
+
* theme renderer once a rule matches; `null` before render and on paths
|
|
249
|
+
* that never render a template. Same write-once-mutable design as
|
|
250
|
+
* `resolvedEntity` — the resolve phase span reads it back post-render.
|
|
251
|
+
*/
|
|
252
|
+
resolvedTemplate: string | null;
|
|
223
253
|
}
|
|
224
254
|
export type AppContext<TSchema extends Record<string, unknown> = CoreSchema> = AppContextBase<TSchema> & AppContextExtensions;
|
|
225
255
|
export type AuthenticatedAppContext<TSchema extends Record<string, unknown> = CoreSchema> = Omit<AppContext<TSchema>, "user"> & {
|
|
@@ -245,6 +275,8 @@ export interface CreateAppContextArgs<TSchema extends Record<string, unknown>> {
|
|
|
245
275
|
readonly origin?: string;
|
|
246
276
|
readonly basePath?: string;
|
|
247
277
|
readonly debugBar?: DebugBarInput;
|
|
278
|
+
/** App-config telemetry slot — registered consumers vote per request. */
|
|
279
|
+
readonly telemetry?: TelemetryConfig;
|
|
248
280
|
readonly siteName?: string;
|
|
249
281
|
readonly logger?: Logger;
|
|
250
282
|
readonly defer?: DeferFn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/context/app.ts"],"names":[],"mappings":"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"}
|
package/dist/context/app.js
CHANGED
|
@@ -2,11 +2,13 @@ import { createBlockRegistry } from "@plumix/blocks";
|
|
|
2
2
|
import { defaultAuthenticator } from "../auth/authenticator.js";
|
|
3
3
|
import { resolveMailer } from "../auth/mailer/resolve.js";
|
|
4
4
|
import { createCapabilityResolver } from "../auth/rbac.js";
|
|
5
|
-
import {
|
|
5
|
+
import { debugBarTelemetryConsumer } from "../debug-bar/consumer.js";
|
|
6
6
|
import { resolveLocales } from "../i18n/locale-registry.js";
|
|
7
7
|
import { resolveLocale } from "../i18n/resolve-locale.js";
|
|
8
|
-
import {
|
|
8
|
+
import { createTelemetryCollector } from "./collector.js";
|
|
9
9
|
import { ContextError } from "./errors.js";
|
|
10
|
+
import { NOOP_TELEMETRY } from "./telemetry.js";
|
|
11
|
+
import { createTracedFetch } from "./traced-fetch.js";
|
|
10
12
|
const EMPTY_BLOCK_REGISTRY = createBlockRegistry([]);
|
|
11
13
|
const EMPTY_MARK_LIST = Object.freeze([]);
|
|
12
14
|
const EMPTY_SHORTCODE_REGISTRY = new Map();
|
|
@@ -100,7 +102,9 @@ export function createAppContext(args) {
|
|
|
100
102
|
oauthProviders: args.oauthProviders ?? [],
|
|
101
103
|
authenticator: args.authenticator ?? defaultAuthenticator(),
|
|
102
104
|
bootstrapAllowed: args.bootstrapAllowed ?? false,
|
|
105
|
+
requestId: crypto.randomUUID(),
|
|
103
106
|
resolvedEntity: null,
|
|
107
|
+
resolvedTemplate: null,
|
|
104
108
|
// Best-effort fallback for tests / runtimes that don't pass an
|
|
105
109
|
// explicit origin: derive from the inbound request URL. Production
|
|
106
110
|
// always passes the canonical operator-set origin so URLs in
|
|
@@ -108,11 +112,13 @@ export function createAppContext(args) {
|
|
|
108
112
|
origin: args.origin ?? new URL(args.request.url).origin,
|
|
109
113
|
basePath: args.basePath ?? "",
|
|
110
114
|
debugBar: args.debugBar,
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
115
|
+
// Provisional no-op — swapped for the real collector below iff a consumer
|
|
116
|
+
// votes to sample this request. Consumers see the assembled context when
|
|
117
|
+
// voting, so `telemetry` must exist (inactive) before the vote runs.
|
|
118
|
+
telemetry: NOOP_TELEMETRY,
|
|
119
|
+
// Reads `base.telemetry` per call, so the post-vote collector swap below
|
|
120
|
+
// is observed without rebinding.
|
|
121
|
+
fetch: createTracedFetch(() => base.telemetry),
|
|
116
122
|
siteName: args.siteName,
|
|
117
123
|
};
|
|
118
124
|
// Spread plugin-contributed entries onto the base. The cast is the
|
|
@@ -133,7 +139,34 @@ export function createAppContext(args) {
|
|
|
133
139
|
target[key] = entry.value;
|
|
134
140
|
}
|
|
135
141
|
}
|
|
136
|
-
|
|
142
|
+
const ctx = base;
|
|
143
|
+
// Consumers are declared against the core schema; a custom-schema context
|
|
144
|
+
// is structurally the same at the seam, so the double cast is safe.
|
|
145
|
+
const sampled = sampleTelemetryConsumers(ctx, args.debugBar, args.telemetry);
|
|
146
|
+
if (sampled.length > 0) {
|
|
147
|
+
// The context is frozen-by-type, not by object — createAppContext owns
|
|
148
|
+
// construction, so activating the collector post-vote is a private step.
|
|
149
|
+
const mutable = base;
|
|
150
|
+
mutable.telemetry = createTelemetryCollector();
|
|
151
|
+
mutable.telemetryConsumers = sampled;
|
|
152
|
+
}
|
|
153
|
+
return ctx;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The gate: which registered consumers want this request collected. In dev
|
|
157
|
+
* the debug bar registers first (the `PLUMIX_DEV` branch is Vite-empty in a
|
|
158
|
+
* build, so the bar and its config never reach production bundles); config
|
|
159
|
+
* consumers follow. A consumer without `sample` always votes yes.
|
|
160
|
+
*/
|
|
161
|
+
function sampleTelemetryConsumers(ctx, debugBar, config) {
|
|
162
|
+
const consumers = [];
|
|
163
|
+
if (process.env.PLUMIX_DEV) {
|
|
164
|
+
const bar = debugBarTelemetryConsumer(debugBar);
|
|
165
|
+
if (bar)
|
|
166
|
+
consumers.push(bar);
|
|
167
|
+
}
|
|
168
|
+
consumers.push(...(config?.consumers ?? []));
|
|
169
|
+
return consumers.filter((c) => c.sample?.(ctx) ?? true);
|
|
137
170
|
}
|
|
138
171
|
export function withUser(ctx, user, tokenScopes = null) {
|
|
139
172
|
const resolver = createCapabilityResolver(ctx.plugins);
|