@kywi-software/core 0.15.0 → 0.15.2
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/AGENT-PATTERNS.md +51 -1
- package/dist/admin/audience-editor.d.ts +2 -0
- package/dist/admin/audience-editor.d.ts.map +1 -1
- package/dist/admin/audience-editor.js +4 -2
- package/dist/admin/audience-editor.js.map +1 -1
- package/dist/admin/condition-builder.d.ts.map +1 -1
- package/dist/admin/condition-builder.js +16 -3
- package/dist/admin/condition-builder.js.map +1 -1
- package/dist/admin/rule-tester.d.ts +1 -0
- package/dist/admin/rule-tester.d.ts.map +1 -1
- package/dist/admin/rule-tester.js +7 -4
- package/dist/admin/rule-tester.js.map +1 -1
- package/dist/admin/signal-options.d.ts +17 -0
- package/dist/admin/signal-options.d.ts.map +1 -1
- package/dist/admin/signal-options.js +28 -0
- package/dist/admin/signal-options.js.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
- package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
- package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
- package/dist/admin/surfaces/feeds/feeds-data.d.ts +8 -1
- package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -1
- package/dist/admin/surfaces/feeds/feeds-data.js +39 -22
- package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -1
- package/dist/api/api-key-routes.js +2 -2
- package/dist/api/api-key-routes.js.map +1 -1
- package/dist/api/audience-routes.d.ts.map +1 -1
- package/dist/api/audience-routes.js +10 -4
- package/dist/api/audience-routes.js.map +1 -1
- package/dist/api/audience-runtime-routes.d.ts +17 -0
- package/dist/api/audience-runtime-routes.d.ts.map +1 -1
- package/dist/api/audience-runtime-routes.js +474 -23
- package/dist/api/audience-runtime-routes.js.map +1 -1
- package/dist/api/ax-routes.d.ts.map +1 -1
- package/dist/api/ax-routes.js +7 -3
- package/dist/api/ax-routes.js.map +1 -1
- package/dist/api/category-routes.js +3 -3
- package/dist/api/category-routes.js.map +1 -1
- package/dist/api/changeset-routes.js +2 -2
- package/dist/api/changeset-routes.js.map +1 -1
- package/dist/api/comment-routes.js +4 -4
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/component-routes.js +3 -3
- package/dist/api/component-routes.js.map +1 -1
- package/dist/api/config-routes.js +4 -4
- package/dist/api/config-routes.js.map +1 -1
- package/dist/api/content-permission-routes.js +2 -2
- package/dist/api/content-permission-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +8 -3
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-type-routes.js +3 -3
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/experiment-routes.js +2 -2
- package/dist/api/experiment-routes.js.map +1 -1
- package/dist/api/extension-routes.js +4 -4
- package/dist/api/extension-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts.map +1 -1
- package/dist/api/feed-routes.js +51 -4
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.js +2 -2
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/group-routes.js +3 -3
- package/dist/api/group-routes.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +15 -4
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout-routes.d.ts +19 -1
- package/dist/api/layout-routes.d.ts.map +1 -1
- package/dist/api/layout-routes.js +65 -5
- package/dist/api/layout-routes.js.map +1 -1
- package/dist/api/layout-write-guard.d.ts +3 -2
- package/dist/api/layout-write-guard.d.ts.map +1 -1
- package/dist/api/layout-write-guard.js +12 -4
- package/dist/api/layout-write-guard.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +50 -9
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/menu-routes.js +2 -2
- package/dist/api/menu-routes.js.map +1 -1
- package/dist/api/nav-routes.js +3 -3
- package/dist/api/nav-routes.js.map +1 -1
- package/dist/api/oauth-routes.js +2 -2
- package/dist/api/oauth-routes.js.map +1 -1
- package/dist/api/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +14 -1
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/pagination.d.ts +10 -0
- package/dist/api/pagination.d.ts.map +1 -1
- package/dist/api/pagination.js +7 -1
- package/dist/api/pagination.js.map +1 -1
- package/dist/api/response.d.ts +29 -0
- package/dist/api/response.d.ts.map +1 -1
- package/dist/api/response.js +23 -3
- package/dist/api/response.js.map +1 -1
- package/dist/api/search-routes.d.ts.map +1 -1
- package/dist/api/search-routes.js +17 -3
- package/dist/api/search-routes.js.map +1 -1
- package/dist/api/section-template-routes.js +2 -2
- package/dist/api/section-template-routes.js.map +1 -1
- package/dist/api/site-routes.js +2 -2
- package/dist/api/site-routes.js.map +1 -1
- package/dist/api/tag-routes.d.ts.map +1 -1
- package/dist/api/tag-routes.js +2 -2
- package/dist/api/tag-routes.js.map +1 -1
- package/dist/api/user-routes.js +2 -2
- package/dist/api/user-routes.js.map +1 -1
- package/dist/api/version-routes.js +2 -2
- package/dist/api/version-routes.js.map +1 -1
- package/dist/api/webhook-routes.js +3 -3
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +15 -6
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/audiences/collectors/index.d.ts +8 -4
- package/dist/audiences/collectors/index.d.ts.map +1 -1
- package/dist/audiences/collectors/index.js +17 -4
- package/dist/audiences/collectors/index.js.map +1 -1
- package/dist/audiences/collectors/selfid.d.ts +25 -0
- package/dist/audiences/collectors/selfid.d.ts.map +1 -0
- package/dist/audiences/collectors/selfid.js +46 -0
- package/dist/audiences/collectors/selfid.js.map +1 -0
- package/dist/audiences/collectors/session.d.ts +41 -0
- package/dist/audiences/collectors/session.d.ts.map +1 -0
- package/dist/audiences/collectors/session.js +50 -0
- package/dist/audiences/collectors/session.js.map +1 -0
- package/dist/audiences/consent-config.d.ts +12 -0
- package/dist/audiences/consent-config.d.ts.map +1 -1
- package/dist/audiences/consent-config.js +16 -0
- package/dist/audiences/consent-config.js.map +1 -1
- package/dist/audiences/consent-startup.d.ts +7 -0
- package/dist/audiences/consent-startup.d.ts.map +1 -1
- package/dist/audiences/consent-startup.js +9 -2
- package/dist/audiences/consent-startup.js.map +1 -1
- package/dist/audiences/consent.d.ts +13 -0
- package/dist/audiences/consent.d.ts.map +1 -1
- package/dist/audiences/consent.js +13 -0
- package/dist/audiences/consent.js.map +1 -1
- package/dist/audiences/cookies.d.ts +21 -0
- package/dist/audiences/cookies.d.ts.map +1 -1
- package/dist/audiences/cookies.js +26 -0
- package/dist/audiences/cookies.js.map +1 -1
- package/dist/audiences/engine.d.ts.map +1 -1
- package/dist/audiences/engine.js +1 -0
- package/dist/audiences/engine.js.map +1 -1
- package/dist/audiences/entry-page.d.ts +89 -0
- package/dist/audiences/entry-page.d.ts.map +1 -0
- package/dist/audiences/entry-page.js +116 -0
- package/dist/audiences/entry-page.js.map +1 -0
- package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
- package/dist/audiences/evaluator/instant-match.js +7 -0
- package/dist/audiences/evaluator/instant-match.js.map +1 -1
- package/dist/audiences/index.d.ts +3 -2
- package/dist/audiences/index.d.ts.map +1 -1
- package/dist/audiences/index.js +6 -2
- package/dist/audiences/index.js.map +1 -1
- package/dist/audiences/queries.d.ts +16 -0
- package/dist/audiences/queries.d.ts.map +1 -1
- package/dist/audiences/queries.js +28 -1
- package/dist/audiences/queries.js.map +1 -1
- package/dist/audiences/schema.d.ts +17 -0
- package/dist/audiences/schema.d.ts.map +1 -1
- package/dist/audiences/schema.js +7 -0
- package/dist/audiences/schema.js.map +1 -1
- package/dist/audiences/server-eval.d.ts +19 -0
- package/dist/audiences/server-eval.d.ts.map +1 -1
- package/dist/audiences/server-eval.js +17 -1
- package/dist/audiences/server-eval.js.map +1 -1
- package/dist/audiences/types.d.ts +22 -1
- package/dist/audiences/types.d.ts.map +1 -1
- package/dist/audiences/types.js +1 -0
- package/dist/audiences/types.js.map +1 -1
- package/dist/ax/content-source.d.ts +10 -2
- package/dist/ax/content-source.d.ts.map +1 -1
- package/dist/ax/content-source.js +81 -5
- package/dist/ax/content-source.js.map +1 -1
- package/dist/ax/effective-body.d.ts +28 -0
- package/dist/ax/effective-body.d.ts.map +1 -0
- package/dist/ax/effective-body.js +47 -0
- package/dist/ax/effective-body.js.map +1 -0
- package/dist/ax/index.d.ts +3 -1
- package/dist/ax/index.d.ts.map +1 -1
- package/dist/ax/index.js +2 -0
- package/dist/ax/index.js.map +1 -1
- package/dist/ax/jsonld.d.ts +31 -1
- package/dist/ax/jsonld.d.ts.map +1 -1
- package/dist/ax/jsonld.js +35 -22
- package/dist/ax/jsonld.js.map +1 -1
- package/dist/ax/layout-to-html.d.ts +127 -0
- package/dist/ax/layout-to-html.d.ts.map +1 -0
- package/dist/ax/layout-to-html.js +545 -0
- package/dist/ax/layout-to-html.js.map +1 -0
- package/dist/ax/llms-full-txt.d.ts +3 -1
- package/dist/ax/llms-full-txt.d.ts.map +1 -1
- package/dist/ax/llms-full-txt.js +5 -2
- package/dist/ax/llms-full-txt.js.map +1 -1
- package/dist/ax/page-markdown.d.ts +10 -2
- package/dist/ax/page-markdown.d.ts.map +1 -1
- package/dist/ax/page-markdown.js +16 -3
- package/dist/ax/page-markdown.js.map +1 -1
- package/dist/ax/summary.d.ts +4 -0
- package/dist/ax/summary.d.ts.map +1 -1
- package/dist/ax/summary.js +6 -1
- package/dist/ax/summary.js.map +1 -1
- package/dist/ax/types.d.ts +24 -0
- package/dist/ax/types.d.ts.map +1 -1
- package/dist/cache/content-invalidation.d.ts.map +1 -1
- package/dist/cache/content-invalidation.js +11 -0
- package/dist/cache/content-invalidation.js.map +1 -1
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/db/apply-snapshot.d.ts +7 -0
- package/dist/db/apply-snapshot.d.ts.map +1 -1
- package/dist/db/apply-snapshot.js +7 -0
- package/dist/db/apply-snapshot.js.map +1 -1
- package/dist/db/ax-queries.d.ts +6 -0
- package/dist/db/ax-queries.d.ts.map +1 -1
- package/dist/db/ax-queries.js +6 -0
- package/dist/db/ax-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +8 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/layout-queries.d.ts +19 -2
- package/dist/db/layout-queries.d.ts.map +1 -1
- package/dist/db/layout-queries.js +11 -3
- package/dist/db/layout-queries.js.map +1 -1
- package/dist/db/search-queries.d.ts.map +1 -1
- package/dist/db/search-queries.js +24 -1
- package/dist/db/search-queries.js.map +1 -1
- package/dist/hooks/ax-invalidation.d.ts.map +1 -1
- package/dist/hooks/ax-invalidation.js +4 -0
- package/dist/hooks/ax-invalidation.js.map +1 -1
- package/dist/layout/index.d.ts +3 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +3 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-permissions.d.ts.map +1 -1
- package/dist/layout/module-permissions.js +2 -38
- package/dist/layout/module-permissions.js.map +1 -1
- package/dist/layout/seed-defaults.d.ts +45 -0
- package/dist/layout/seed-defaults.d.ts.map +1 -0
- package/dist/layout/seed-defaults.js +75 -0
- package/dist/layout/seed-defaults.js.map +1 -0
- package/dist/layout/walk.d.ts +14 -0
- package/dist/layout/walk.d.ts.map +1 -0
- package/dist/layout/walk.js +49 -0
- package/dist/layout/walk.js.map +1 -0
- package/dist/media/index.d.ts +1 -1
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/upload-allowlist.d.ts +23 -0
- package/dist/media/upload-allowlist.d.ts.map +1 -1
- package/dist/media/upload-allowlist.js +29 -0
- package/dist/media/upload-allowlist.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +17 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +2 -0
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/scope/jsonld.d.ts +18 -3
- package/dist/scope/jsonld.d.ts.map +1 -1
- package/dist/scope/jsonld.js +6 -4
- package/dist/scope/jsonld.js.map +1 -1
- package/package.json +6 -1
|
@@ -1,45 +1,328 @@
|
|
|
1
|
-
import { jsonOk, jsonError, unauthorized, forbidden } from './response.js';
|
|
2
|
-
import { getAudienceById, upsertAdapterIdentity, deleteAdapterIdentity } from '../audiences/queries.js';
|
|
1
|
+
import { jsonOk, listOk, jsonError, unauthorized, forbidden } from './response.js';
|
|
2
|
+
import { getAudienceById, getActiveAudiences, listPublicAudiences, listSelfIdFields, upsertAdapterIdentity, deleteAdapterIdentity, } from '../audiences/queries.js';
|
|
3
3
|
import { verifyHmacSignature } from '../audiences/hmac.js';
|
|
4
|
+
import { verifyCsrfToken } from '../forms/csrf.js';
|
|
4
5
|
import { COOKIE_NAMES, COOKIE_MAX_AGE, buildSetCookieHeader } from '../audiences/cookies.js';
|
|
5
6
|
import { cookieAllowedByHeader } from '../audiences/consent.js';
|
|
6
7
|
import { buildAudiencePinValue } from '../audiences/collectors/pinned-audience.js';
|
|
8
|
+
import { runServerCollectors } from '../audiences/collectors/index.js';
|
|
9
|
+
import { resolveAudiences } from '../audiences/evaluator/resolver.js';
|
|
10
|
+
import { createEmptySignals } from '../audiences/types.js';
|
|
7
11
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* Is `candidate` the same site as the request being served?
|
|
13
|
+
*
|
|
14
|
+
* Exact origin match first. Behind a proxy the request URL's authority can
|
|
15
|
+
* differ from what the browser saw, so the forwarded `Host` is a fallback — but
|
|
16
|
+
* only within the same scheme when the request is https, or an `http://` origin
|
|
17
|
+
* would be trusted on an https endpoint (a downgrade an active attacker can
|
|
18
|
+
* arrange).
|
|
14
19
|
*/
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
if (!origin)
|
|
20
|
+
function isSameSiteUrl(candidate, req, requestUrl) {
|
|
21
|
+
if (candidate.origin === requestUrl.origin)
|
|
18
22
|
return true;
|
|
19
|
-
|
|
23
|
+
const host = req.headers.get('host');
|
|
24
|
+
if (host === null || candidate.host !== host)
|
|
25
|
+
return false;
|
|
26
|
+
return requestUrl.protocol !== 'https:' || candidate.protocol === 'https:';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* May this unauthenticated WRITE be trusted as coming from this site's own page?
|
|
30
|
+
*
|
|
31
|
+
* These routes are visitor-facing and cookie-authenticated by construction (the
|
|
32
|
+
* visitor IS the credential), and the self-ID form path posts
|
|
33
|
+
* `application/x-www-form-urlencoded` — a "simple request" that needs no
|
|
34
|
+
* preflight. So any page on the internet can submit it with the visitor's
|
|
35
|
+
* cookies attached, and the ONLY thing standing in the way is what the browser
|
|
36
|
+
* says about where the request came from.
|
|
37
|
+
*
|
|
38
|
+
* That is why a MISSING `Origin` is no longer treated as same-origin (it was,
|
|
39
|
+
* and it made the check decorative for exactly the request shape that needed
|
|
40
|
+
* it). A write must present positive evidence, in order:
|
|
41
|
+
*
|
|
42
|
+
* 1. `Origin` — must match. Present-but-different is a rejection, never a
|
|
43
|
+
* fall-through, and the opaque `null` origin a sandboxed iframe sends
|
|
44
|
+
* matches nothing.
|
|
45
|
+
* 2. `Sec-Fetch-Site` — `same-origin` / `same-site`, or `none` for a
|
|
46
|
+
* user-initiated navigation. Sent by every current browser.
|
|
47
|
+
* 3. A same-origin `Referer`.
|
|
48
|
+
*
|
|
49
|
+
* Nothing at all is a 403. Non-browser clients (curl, a server-side script)
|
|
50
|
+
* therefore have to say where they are posting from — which is the point: they
|
|
51
|
+
* are indistinguishable from a forged submit otherwise.
|
|
52
|
+
*/
|
|
53
|
+
function isTrustedWrite(req) {
|
|
54
|
+
const requestUrl = new URL(req.url);
|
|
55
|
+
const origin = req.headers.get('origin');
|
|
56
|
+
if (origin !== null) {
|
|
57
|
+
if (origin === 'null')
|
|
58
|
+
return false;
|
|
59
|
+
let originUrl;
|
|
60
|
+
try {
|
|
61
|
+
originUrl = new URL(origin);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return isSameSiteUrl(originUrl, req, requestUrl);
|
|
67
|
+
}
|
|
68
|
+
const fetchSite = req.headers.get('sec-fetch-site');
|
|
69
|
+
if (fetchSite !== null) {
|
|
70
|
+
return fetchSite === 'same-origin' || fetchSite === 'same-site' || fetchSite === 'none';
|
|
71
|
+
}
|
|
72
|
+
return refererPage(req) !== null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Double-submit CSRF, for a site that issues one.
|
|
76
|
+
*
|
|
77
|
+
* `@kywi-software/js` already sends `X-CSRF-Token` (from the
|
|
78
|
+
* `meta[name="kywi:csrf-token"]` a host may render) on every runtime write, and
|
|
79
|
+
* until now nothing read it. It is honoured here rather than dropped from the
|
|
80
|
+
* client: when the request carries a `kywi_csrf` cookie — i.e. the site has
|
|
81
|
+
* wired token issuance — a matching token is REQUIRED, header or `_csrf` form
|
|
82
|
+
* field. A site that issues no such cookie is exactly where it was, protected
|
|
83
|
+
* by the origin evidence above.
|
|
84
|
+
*
|
|
85
|
+
* Comparison is `verifyCsrfToken`'s constant-time one, shared with the form
|
|
86
|
+
* routes so there is a single notion of "matching token" in the codebase.
|
|
87
|
+
*/
|
|
88
|
+
function csrfRejected(req, formToken) {
|
|
89
|
+
const cookieToken = req.headers.get('cookie')?.match(/(?:^|;\s*)kywi_csrf=([^;]*)/)?.[1] ?? '';
|
|
90
|
+
if (!cookieToken)
|
|
91
|
+
return false;
|
|
92
|
+
const submitted = req.headers.get('x-csrf-token') ?? formToken ?? '';
|
|
93
|
+
return !verifyCsrfToken(decodeURIComponent(cookieToken), submitted);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The page the visitor was on when they submitted, from the `Referer` — or null
|
|
97
|
+
* when there is none, it will not parse, or it belongs to somebody else.
|
|
98
|
+
*/
|
|
99
|
+
function refererPage(req) {
|
|
100
|
+
const referer = req.headers.get('referer');
|
|
101
|
+
if (!referer)
|
|
102
|
+
return null;
|
|
20
103
|
try {
|
|
21
|
-
|
|
104
|
+
const parsed = new URL(referer);
|
|
105
|
+
const sameOrigin = parsed.origin === new URL(req.url).origin || parsed.host === req.headers.get('host');
|
|
106
|
+
return sameOrigin ? parsed : null;
|
|
22
107
|
}
|
|
23
108
|
catch {
|
|
24
|
-
return
|
|
109
|
+
return null;
|
|
25
110
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Merge the self-ID answers a submit carries into the signals of the PAGE the
|
|
114
|
+
* visitor is on.
|
|
115
|
+
*
|
|
116
|
+
* The page matters: this route's own URL is `/api/v1/kywi/self-id`, so
|
|
117
|
+
* collecting signals off it would make `session.entryPage` the API path and
|
|
118
|
+
* `query.*` empty, and every rule combining a role with a campaign link would
|
|
119
|
+
* stop matching at the moment the visitor answers. The `Referer` is the page —
|
|
120
|
+
* accepted only when it is same-origin, and falling back to this request's URL
|
|
121
|
+
* when it is missing or foreign.
|
|
122
|
+
*/
|
|
123
|
+
function pageSignals(req, fields, gate) {
|
|
124
|
+
const pageRequest = new Request(refererPage(req)?.href ?? req.url, { headers: req.headers });
|
|
125
|
+
const collected = runServerCollectors(pageRequest, gate);
|
|
126
|
+
const base = createEmptySignals();
|
|
127
|
+
return {
|
|
128
|
+
...base,
|
|
129
|
+
...collected,
|
|
130
|
+
// The submitted answers REPLACE any stored ones: this is the visitor telling
|
|
131
|
+
// us who they are now, not adding to a history.
|
|
132
|
+
selfId: fields,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Only same-origin, root-relative paths — never an open redirect.
|
|
137
|
+
*
|
|
138
|
+
* Three ways a "clearly relative" string is not:
|
|
139
|
+
*
|
|
140
|
+
* `//evil.example` protocol-relative.
|
|
141
|
+
* `/\evil.example` browsers normalise a backslash to a slash, so this is
|
|
142
|
+
* the same bypass wearing a hat.
|
|
143
|
+
* `/\t/evil.example` the URL parser STRIPS tab, CR and LF from ANYWHERE in a
|
|
144
|
+
* URL, so a shape check that runs before they are removed
|
|
145
|
+
* reads a different string than the browser will. `\n`
|
|
146
|
+
* additionally throws out of `Headers.set`, which would
|
|
147
|
+
* turn an anonymous POST into a 500.
|
|
148
|
+
*
|
|
149
|
+
* The whitespace test therefore runs FIRST, on the raw value, before any shape
|
|
150
|
+
* check can be fooled by characters that are about to disappear.
|
|
151
|
+
*/
|
|
152
|
+
function safeReturnTo(raw, req) {
|
|
153
|
+
const value = typeof raw === 'string' ? raw.trim() : '';
|
|
154
|
+
if (/[\t\r\n]/.test(value))
|
|
155
|
+
return refererFallback(req);
|
|
156
|
+
if (/^\/[^/\\]/.test(value) || value === '/')
|
|
157
|
+
return value;
|
|
158
|
+
return refererFallback(req);
|
|
159
|
+
}
|
|
160
|
+
/** Where to send a visitor whose `returnTo` we refused: their own last page. */
|
|
161
|
+
function refererFallback(req) {
|
|
162
|
+
const page = refererPage(req);
|
|
163
|
+
return page ? `${page.pathname}${page.search}` : '/';
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Cookie-size cap on the serialized answers, and the field-count / length caps
|
|
167
|
+
* that keep one submit from spending the whole budget on a single key.
|
|
168
|
+
*
|
|
169
|
+
* The answers live in a cookie, and a cookie the visitor's browser refuses to
|
|
170
|
+
* send back is worse than no answer at all: it would silently stop every later
|
|
171
|
+
* request resolving self-ID. So an oversized submit is REFUSED (413) rather
|
|
172
|
+
* than written and quietly ignored forever after.
|
|
173
|
+
*
|
|
174
|
+
* The measurement is of the ENCODED value, not the raw JSON — `buildSetCookieHeader`
|
|
175
|
+
* percent-encodes what it writes, and `{"role":"marketer"}` roughly doubles in
|
|
176
|
+
* the process, so measuring the JSON bytes would let through a cookie twice the
|
|
177
|
+
* size we thought we allowed.
|
|
178
|
+
*/
|
|
179
|
+
const SELFID_MAX_BYTES = 2048;
|
|
180
|
+
const SELFID_MAX_FIELDS = 16;
|
|
181
|
+
const SELFID_MAX_KEY = 64;
|
|
182
|
+
const SELFID_MAX_VALUE = 256;
|
|
183
|
+
/**
|
|
184
|
+
* Read a self-ID submit off the request, from JSON or a plain HTML form.
|
|
185
|
+
*
|
|
186
|
+
* Form bodies are flat (`role=marketer&returnTo=/developers`), so every key
|
|
187
|
+
* except the three reserved ones (`returnTo`, `_csrf`, `audienceId`) is an
|
|
188
|
+
* answer — that is what lets the no-JS `<form>` post straight here with no
|
|
189
|
+
* wrapper. Values that arrive empty are DROPPED rather than stored blank, so
|
|
190
|
+
* `role=''` means "forget my role", which is exactly what a "Change" control
|
|
191
|
+
* submits.
|
|
192
|
+
*/
|
|
193
|
+
async function readSelfIdSubmit(req) {
|
|
194
|
+
// Refuse before reading the body at all. Buffering a multi-megabyte form only
|
|
195
|
+
// to reject it afterwards is work an unauthenticated caller should not be
|
|
196
|
+
// able to make the server do. The bound is generous (percent-encoding and
|
|
197
|
+
// form syntax both inflate the wire form) — it is a bomb guard, not the real
|
|
198
|
+
// limit, which is applied to the parsed answers below.
|
|
199
|
+
const declared = Number(req.headers.get('content-length') ?? '0');
|
|
200
|
+
if (Number.isFinite(declared) && declared > SELFID_MAX_BYTES * 4) {
|
|
201
|
+
return { ok: false, reason: 'too_large' };
|
|
202
|
+
}
|
|
203
|
+
const contentType = req.headers.get('content-type') ?? '';
|
|
204
|
+
const isForm = contentType.includes('application/x-www-form-urlencoded') ||
|
|
205
|
+
contentType.includes('multipart/form-data');
|
|
206
|
+
const fields = {};
|
|
207
|
+
let audienceId = null;
|
|
208
|
+
if (isForm) {
|
|
209
|
+
let form;
|
|
210
|
+
try {
|
|
211
|
+
form = await req.formData();
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return { ok: false, reason: 'invalid' };
|
|
215
|
+
}
|
|
216
|
+
let oversized = false;
|
|
217
|
+
// `forEach` rather than a for-of: the package's lib set is ES2022 + DOM
|
|
218
|
+
// without DOM.Iterable, so FormData is not typed as iterable here.
|
|
219
|
+
form.forEach((value, key) => {
|
|
220
|
+
if (typeof value !== 'string')
|
|
221
|
+
return;
|
|
222
|
+
if (key === 'returnTo' || key === '_csrf')
|
|
223
|
+
return;
|
|
224
|
+
if (key === 'audienceId') {
|
|
225
|
+
audienceId = value.trim() || null;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const trimmed = value.trim();
|
|
229
|
+
if (trimmed === '')
|
|
230
|
+
return;
|
|
231
|
+
if (key.length > SELFID_MAX_KEY || trimmed.length > SELFID_MAX_VALUE) {
|
|
232
|
+
oversized = true;
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
fields[key] = trimmed;
|
|
236
|
+
});
|
|
237
|
+
if (oversized || Object.keys(fields).length > SELFID_MAX_FIELDS) {
|
|
238
|
+
return { ok: false, reason: 'too_large' };
|
|
239
|
+
}
|
|
240
|
+
const formCsrf = form.get('_csrf');
|
|
241
|
+
return {
|
|
242
|
+
ok: true,
|
|
243
|
+
submit: {
|
|
244
|
+
fields,
|
|
245
|
+
audienceId,
|
|
246
|
+
isForm,
|
|
247
|
+
returnTo: safeReturnTo(form.get('returnTo'), req),
|
|
248
|
+
formCsrfToken: typeof formCsrf === 'string' ? formCsrf : undefined,
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
let body;
|
|
253
|
+
try {
|
|
254
|
+
body = await req.json();
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return { ok: false, reason: 'invalid' };
|
|
258
|
+
}
|
|
259
|
+
if (typeof body !== 'object' || body === null)
|
|
260
|
+
return { ok: false, reason: 'invalid' };
|
|
261
|
+
const raw = body.fields;
|
|
262
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
263
|
+
return { ok: false, reason: 'invalid' };
|
|
264
|
+
const rawAudienceId = body.audienceId;
|
|
265
|
+
if (rawAudienceId !== undefined && typeof rawAudienceId !== 'string')
|
|
266
|
+
return { ok: false, reason: 'invalid' };
|
|
267
|
+
audienceId = typeof rawAudienceId === 'string' ? rawAudienceId.trim() || null : null;
|
|
268
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
269
|
+
if (typeof value !== 'string')
|
|
270
|
+
return { ok: false, reason: 'invalid' };
|
|
271
|
+
const trimmed = value.trim();
|
|
272
|
+
if (trimmed === '')
|
|
273
|
+
continue;
|
|
274
|
+
if (key.length > SELFID_MAX_KEY || trimmed.length > SELFID_MAX_VALUE) {
|
|
275
|
+
return { ok: false, reason: 'too_large' };
|
|
276
|
+
}
|
|
277
|
+
fields[key] = trimmed;
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(fields).length > SELFID_MAX_FIELDS)
|
|
280
|
+
return { ok: false, reason: 'too_large' };
|
|
281
|
+
return { ok: true, submit: { fields, audienceId, isForm, returnTo: '/', formCsrfToken: undefined } };
|
|
282
|
+
}
|
|
283
|
+
/** Would these answers make a cookie the browser will refuse to carry? */
|
|
284
|
+
function tooLargeForCookie(fields) {
|
|
285
|
+
return encodeURIComponent(JSON.stringify(fields)).length > SELFID_MAX_BYTES;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Keep only the answers the site actually asked for.
|
|
289
|
+
*
|
|
290
|
+
* The self-ID fields an editor configured (`kywi_selfid_fields`) ARE the
|
|
291
|
+
* vocabulary of this endpoint: a page can only meaningfully submit what an
|
|
292
|
+
* audience rule can read back. Anything else is dropped rather than stored, so
|
|
293
|
+
* a stray hidden input — or a forged submit that got past the origin checks —
|
|
294
|
+
* cannot fill a visitor's cookie with keys nobody will ever match on.
|
|
295
|
+
*
|
|
296
|
+
* A site with no self-ID fields configured therefore stores no answers. That is
|
|
297
|
+
* the honest behaviour and it is visible: the response echoes the `fields` that
|
|
298
|
+
* survived, so a page submitting into a site that never declared the field sees
|
|
299
|
+
* an empty bag rather than silently accumulating dead data. Configure the field
|
|
300
|
+
* in Audiences → Self-ID Fields first.
|
|
301
|
+
*/
|
|
302
|
+
function allowedFields(fields, declared) {
|
|
303
|
+
const out = {};
|
|
304
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
305
|
+
if (declared.has(key))
|
|
306
|
+
out[key] = value;
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
/** Append `?selfid=error` to a same-origin return path (no-JS error signal). */
|
|
311
|
+
function withErrorFlag(returnTo) {
|
|
312
|
+
return `${returnTo}${returnTo.includes('?') ? '&' : '?'}selfid=error`;
|
|
33
313
|
}
|
|
34
314
|
export function registerAudienceRuntimeRoutes(router, ctx) {
|
|
35
315
|
const { db, webhookSecret } = ctx;
|
|
316
|
+
const defaultSiteId = ctx.defaultSiteId ?? '';
|
|
36
317
|
// Built conditionally: under `exactOptionalPropertyTypes` an explicit
|
|
37
318
|
// `undefined` is not the same as an absent key.
|
|
38
319
|
const gate = ctx.requireConsent === undefined ? {} : { requireConsent: ctx.requireConsent };
|
|
39
320
|
// POST /kywi/audience — update kywi_audience cookie
|
|
40
321
|
router.post('/kywi/audience', async (req) => {
|
|
41
|
-
if (!
|
|
322
|
+
if (!isTrustedWrite(req))
|
|
42
323
|
return forbidden('Cross-origin request rejected');
|
|
324
|
+
if (csrfRejected(req))
|
|
325
|
+
return forbidden('CSRF token missing or invalid');
|
|
43
326
|
const body = await req.json();
|
|
44
327
|
if (!body.audienceId)
|
|
45
328
|
return jsonError('VALIDATION_ERROR', 'audienceId required', 400);
|
|
@@ -66,7 +349,7 @@ export function registerAudienceRuntimeRoutes(router, ctx) {
|
|
|
66
349
|
// would make the panel lie about what its buttons do.
|
|
67
350
|
//
|
|
68
351
|
// `source` is client-supplied, but this route is same-origin-hardened
|
|
69
|
-
// (
|
|
352
|
+
// (isTrustedWrite above), so only this site's own page can assert it — the
|
|
70
353
|
// same trust model the client-supplied `audienceId` already relies on.
|
|
71
354
|
//
|
|
72
355
|
// Either way the pin is accepted and echoed back so the caller can act on it
|
|
@@ -85,6 +368,174 @@ export function registerAudienceRuntimeRoutes(router, ctx) {
|
|
|
85
368
|
status: 200, headers,
|
|
86
369
|
});
|
|
87
370
|
});
|
|
371
|
+
// POST /kywi/self-id — record the visitor's self-identification
|
|
372
|
+
//
|
|
373
|
+
// The public half of self-ID (kywi-cms#200). Before this, a site that wanted
|
|
374
|
+
// its own "What brings you here?" control instead of the built-in hello-bar
|
|
375
|
+
// widget had nothing to call: the runtime's `storeSelfId` is module-private,
|
|
376
|
+
// `POST /kywi/audience` needs an audience UUID a public page cannot discover,
|
|
377
|
+
// and `GET /audiences` is admin-only. Sites wrote their own route; this is
|
|
378
|
+
// that route, made first-class.
|
|
379
|
+
//
|
|
380
|
+
// What it does, in order:
|
|
381
|
+
// 1. Store the answers in `kywi_selfid` so the SERVER can resolve
|
|
382
|
+
// `selfId.*` rules on later renders — gated on personalization consent,
|
|
383
|
+
// because a stored attribute bag is exactly the tracking the gate governs.
|
|
384
|
+
// 2. Re-resolve the site's active audiences with those answers merged into
|
|
385
|
+
// the signals of the page the visitor is on.
|
|
386
|
+
// 3. Pin the winner as a `switcher:` pin — an ESSENTIAL preference, stored
|
|
387
|
+
// whatever the consent decision, on the same argument as the transparency
|
|
388
|
+
// panel's switcher and `kywi_optout`: a control the visitor operated by
|
|
389
|
+
// hand must be honoured or the buttons lie about what they do.
|
|
390
|
+
//
|
|
391
|
+
// Step 3 is the one that makes the feature work at all. Since kywi-cms#167
|
|
392
|
+
// every variant arm is chosen AND PRUNED on the server, so the arms the
|
|
393
|
+
// visitor did not get are not in the DOM for any client-side re-evaluation to
|
|
394
|
+
// swap to. Only a fresh server render can show them, and the only thing that
|
|
395
|
+
// render reads is the pin.
|
|
396
|
+
//
|
|
397
|
+
// Deliberately NOT resolved through `createAudienceEngine`: the engine prefers
|
|
398
|
+
// an existing pin over the signal-derived winner, which is right for a page
|
|
399
|
+
// render and wrong here — the visitor is REPLACING their earlier answer, so
|
|
400
|
+
// the new signals must win.
|
|
401
|
+
router.post('/kywi/self-id', async (req) => {
|
|
402
|
+
if (!isTrustedWrite(req))
|
|
403
|
+
return forbidden('Cross-origin request rejected');
|
|
404
|
+
const read = await readSelfIdSubmit(req);
|
|
405
|
+
if (!read.ok) {
|
|
406
|
+
// Answered as JSON even for a form post: the body could not be read, so
|
|
407
|
+
// there is no `returnTo` to redirect back to. Errors raised AFTER the
|
|
408
|
+
// parse do bounce the form back with `?selfid=error`.
|
|
409
|
+
//
|
|
410
|
+
// 413 vs 400 is a real distinction for the caller: "what you sent is too
|
|
411
|
+
// big" is fixed by sending less, "that was not a self-ID submit" by
|
|
412
|
+
// sending something else.
|
|
413
|
+
return read.reason === 'too_large'
|
|
414
|
+
? jsonError('PAYLOAD_TOO_LARGE', 'Self-ID answers are too large to store', 413)
|
|
415
|
+
: jsonError('VALIDATION_ERROR', 'fields object required', 400);
|
|
416
|
+
}
|
|
417
|
+
const { audienceId, isForm, returnTo, formCsrfToken } = read.submit;
|
|
418
|
+
// A security refusal, not a user error: it is answered the same way for
|
|
419
|
+
// both shapes rather than bounced back to the page, because nothing the
|
|
420
|
+
// visitor can do on that page fixes it and a forged submit deserves no
|
|
421
|
+
// redirect.
|
|
422
|
+
if (csrfRejected(req, formCsrfToken))
|
|
423
|
+
return forbidden('CSRF token missing or invalid');
|
|
424
|
+
const cookieHeader = req.headers.get('cookie');
|
|
425
|
+
const secure = new URL(req.url).protocol === 'https:';
|
|
426
|
+
// Only answers the site declared as self-ID fields are stored — see
|
|
427
|
+
// `allowedFields`. Loaded once per request and reused for the evaluation,
|
|
428
|
+
// so the signals and the cookie can never disagree about what was accepted.
|
|
429
|
+
const declared = await listSelfIdFields(db, defaultSiteId);
|
|
430
|
+
const fields = allowedFields(read.submit.fields, new Set(declared.map((f) => f.id)));
|
|
431
|
+
if (tooLargeForCookie(fields)) {
|
|
432
|
+
return isForm
|
|
433
|
+
? new Response(null, { status: 303, headers: { Location: withErrorFlag(returnTo) } })
|
|
434
|
+
: jsonError('PAYLOAD_TOO_LARGE', 'Self-ID answers are too large to store', 413);
|
|
435
|
+
}
|
|
436
|
+
const signals = pageSignals(req, fields, gate);
|
|
437
|
+
// Opt-out beats a pin in the engine, so pinning a visitor who turned
|
|
438
|
+
// personalization off would write a cookie every render is under orders to
|
|
439
|
+
// ignore. Answer honestly instead of pretending it took.
|
|
440
|
+
const optedOut = signals.meta.isOptedOut;
|
|
441
|
+
// An explicit `audienceId` names one of the site's PUBLIC audiences — the
|
|
442
|
+
// ones `GET /kywi/audiences` lists — so a chooser rendered from that list
|
|
443
|
+
// can pin exactly what the visitor picked, without the site having to
|
|
444
|
+
// author a rule per option (kywi-cms#200). Validated against the same
|
|
445
|
+
// site-scoped list the listing route serves, so it can neither reach a
|
|
446
|
+
// private audience nor another site's.
|
|
447
|
+
let winner = null;
|
|
448
|
+
if (audienceId !== null) {
|
|
449
|
+
const offered = await listPublicAudiences(db, defaultSiteId);
|
|
450
|
+
const picked = offered.find((a) => a.id === audienceId);
|
|
451
|
+
if (!picked) {
|
|
452
|
+
return isForm
|
|
453
|
+
? new Response(null, { status: 303, headers: { Location: withErrorFlag(returnTo) } })
|
|
454
|
+
: jsonError('INVALID_AUDIENCE', 'Audience not found, not active, or not public', 400);
|
|
455
|
+
}
|
|
456
|
+
if (!optedOut)
|
|
457
|
+
winner = { id: picked.id, name: picked.name };
|
|
458
|
+
}
|
|
459
|
+
else if (Object.keys(fields).length > 0 && !optedOut) {
|
|
460
|
+
const audiences = await getActiveAudiences(db, defaultSiteId);
|
|
461
|
+
const { winningAudienceId } = resolveAudiences(audiences, signals);
|
|
462
|
+
const match = winningAudienceId ? audiences.find((a) => a.id === winningAudienceId) : undefined;
|
|
463
|
+
winner = match ? { id: match.id, name: match.name } : null;
|
|
464
|
+
}
|
|
465
|
+
const headers = new Headers({ 'Content-Type': 'application/json' });
|
|
466
|
+
// The answers themselves: stored for a consenting visitor, cleared when the
|
|
467
|
+
// submit is empty ("forget what I told you"), otherwise left alone.
|
|
468
|
+
// Not HttpOnly, deliberately and for the same reason `kywi_audience` is not:
|
|
469
|
+
// `clearDeniedCookies` runs in the browser, and a Reject that cannot delete
|
|
470
|
+
// this cookie would be a revocation that does not revoke.
|
|
471
|
+
const mayStore = cookieAllowedByHeader(COOKIE_NAMES.SELFID, cookieHeader, gate);
|
|
472
|
+
const persisted = mayStore && Object.keys(fields).length > 0;
|
|
473
|
+
if (persisted) {
|
|
474
|
+
headers.append('Set-Cookie', buildSetCookieHeader(COOKIE_NAMES.SELFID, JSON.stringify(fields), COOKIE_MAX_AGE.SELFID, { httpOnly: false, secure }));
|
|
475
|
+
}
|
|
476
|
+
else if (Object.keys(fields).length === 0) {
|
|
477
|
+
headers.append('Set-Cookie', buildSetCookieHeader(COOKIE_NAMES.SELFID, '', 0, { httpOnly: false, secure }));
|
|
478
|
+
}
|
|
479
|
+
// The pin. A submit that resolves to nothing CLEARS it rather than leaving
|
|
480
|
+
// the visitor pinned to the answer they just replaced.
|
|
481
|
+
//
|
|
482
|
+
// Its LIFETIME depends on consent (owner ruling). The click is honoured
|
|
483
|
+
// either way — it is a preference the visitor operated by hand, so it is
|
|
484
|
+
// never withheld — but for a visitor who has not consented to
|
|
485
|
+
// personalization it is a SESSION cookie: it changes the pages they are
|
|
486
|
+
// reading right now and is forgotten when they close the browser, rather
|
|
487
|
+
// than becoming a 30-day record of a segment they never agreed to be filed
|
|
488
|
+
// under. Consent turns the same pin into the durable one.
|
|
489
|
+
if (!optedOut) {
|
|
490
|
+
const pinLifetime = mayStore ? COOKIE_MAX_AGE.AUDIENCE : COOKIE_MAX_AGE.SESSION;
|
|
491
|
+
headers.append('Set-Cookie', winner
|
|
492
|
+
? buildSetCookieHeader(COOKIE_NAMES.AUDIENCE, buildAudiencePinValue(winner.id, true), pinLifetime, { httpOnly: false, secure })
|
|
493
|
+
: buildSetCookieHeader(COOKIE_NAMES.AUDIENCE, '', 0, { httpOnly: false, secure }));
|
|
494
|
+
}
|
|
495
|
+
if (isForm) {
|
|
496
|
+
// No-JS path: 303 back to the page so the browser re-requests it with the
|
|
497
|
+
// cookies above, and the server renders the arms this visitor now gets.
|
|
498
|
+
headers.set('Location', returnTo);
|
|
499
|
+
return new Response(null, { status: 303, headers });
|
|
500
|
+
}
|
|
501
|
+
return new Response(JSON.stringify({
|
|
502
|
+
data: {
|
|
503
|
+
audience: winner ? { id: winner.id, name: winner.name } : null,
|
|
504
|
+
fields,
|
|
505
|
+
persisted,
|
|
506
|
+
optedOut,
|
|
507
|
+
},
|
|
508
|
+
}), { status: 200, headers });
|
|
509
|
+
});
|
|
510
|
+
// GET /kywi/audiences — the audiences a page may offer BY NAME
|
|
511
|
+
//
|
|
512
|
+
// Public and consent-independent (kywi-cms#200). `GET /api/v1/audiences` is
|
|
513
|
+
// admin-only and returns whole audiences including their condition groups, so
|
|
514
|
+
// a page had no way to discover even the id of the audience it wanted to
|
|
515
|
+
// offer. THIS ENDPOINT PUBLISHES ONLY id/name, for audiences that are active
|
|
516
|
+
// AND flagged `public`, and an audience is not listed until an editor
|
|
517
|
+
// deliberately publishes its name.
|
|
518
|
+
//
|
|
519
|
+
// That is a statement about this endpoint, not a privacy guarantee about
|
|
520
|
+
// audience rules in general: the client runtime is handed the active
|
|
521
|
+
// audiences so it can re-evaluate on client signals, so how a visitor is
|
|
522
|
+
// classified is readable in the page either way (see kywi-cms#167 and
|
|
523
|
+
// AGENT-PATTERNS §8). Author rules accordingly.
|
|
524
|
+
//
|
|
525
|
+
// Consent does not gate it because nothing is stored and nothing about the
|
|
526
|
+
// visitor is read: offering a list of choices is not tracking, and a chooser
|
|
527
|
+
// that disappeared for a visitor who rejected cookies would be the worse
|
|
528
|
+
// outcome. It answers for ONE site — the configured one — so it cannot be
|
|
529
|
+
// used to enumerate another site's audiences.
|
|
530
|
+
router.get('/kywi/audiences', async () => {
|
|
531
|
+
const audiences = await listPublicAudiences(db, defaultSiteId);
|
|
532
|
+
// `label` is what to SHOW a visitor and `name` is what identifies the
|
|
533
|
+
// audience. They are the same string today; the field exists so a page's
|
|
534
|
+
// markup does not have to change when a separate visitor-facing label
|
|
535
|
+
// arrives. The description is deliberately not used: it is an editor's
|
|
536
|
+
// internal note and often describes the targeting.
|
|
537
|
+
return listOk(audiences.map((a) => ({ id: a.id, name: a.name, label: a.name })));
|
|
538
|
+
});
|
|
88
539
|
// POST /kywi/identity/:visitorId — push adapter identity
|
|
89
540
|
router.post('/kywi/identity/:visitorId', async (req, params) => {
|
|
90
541
|
const bodyText = await req.text();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-runtime-routes.js","sourceRoot":"","sources":["../../src/api/audience-runtime-routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACvG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,EAAE,qBAAqB,EAA2B,MAAM,yBAAyB,CAAA;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAA;AAalF;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,SAAc,CAAA;IAClB,IAAI,CAAC;QAAC,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACvD,8EAA8E;IAC9E,kDAAkD;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,OAAO,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAc,EAAE,GAAwB;IACpF,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,GAAG,CAAA;IACjC,sEAAsE;IACtE,gDAAgD;IAChD,MAAM,IAAI,GACR,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAA;IAEhF,oDAAoD;IACpD,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC,+BAA+B,CAAC,CAAA;QACzE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA8C,CAAA;QACzE,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;QACtF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,kBAAkB,EAAE,kCAAkC,EAAE,GAAG,CAAC,CAAA;QAC5H,4EAA4E;QAC5E,4EAA4E;QAC5E,4EAA4E;QAC5E,4EAA4E;QAC5E,EAAE;QACF,wEAAwE;QACxE,mCAAmC;QACnC,EAAE;QACF,2EAA2E;QAC3E,4EAA4E;QAC5E,yEAAyE;QACzE,6CAA6C;QAC7C,uEAAuE;QACvE,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,EAAE;QACF,sEAAsE;QACtE,yEAAyE;QACzE,uEAAuE;QACvE,EAAE;QACF,6EAA6E;QAC7E,2EAA2E;QAC3E,gDAAgD;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAA;QAC9C,MAAM,SAAS,GACb,WAAW,IAAI,qBAAqB,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;QAC9F,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA;QAC9E,IAAI,SAAS,EAAE,CAAC;YACd,2EAA2E;YAC3E,yEAAyE;YACzE,iDAAiD;YACjD,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAC1C,YAAY,CAAC,QAAQ,EACrB,qBAAqB,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EACnD,cAAc,CAAC,QAAQ,EACvB,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB,CAAA;QACH,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE;YACxF,MAAM,EAAE,GAAG,EAAE,OAAO;SACrB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,yDAAyD;IACzD,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS;YAAE,OAAO,YAAY,CAAC,iCAAiC,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;QAC3E,IAAI,CAAC,KAAK;YAAE,OAAO,YAAY,CAAC,mBAAmB,CAAC,CAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA2C,CAAA;QAC3E,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;QACpF,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,SAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAA+B,IAAI,EAAE,CAAC,CAAA;QAC9G,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,iDAAiD;IACjD,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS;YAAE,OAAO,YAAY,CAAC,iCAAiC,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;QAC3E,IAAI,CAAC,KAAK;YAAE,OAAO,YAAY,CAAC,mBAAmB,CAAC,CAAA;QACpD,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,SAAU,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE;YAC/D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,EAAE;SACnF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"audience-runtime-routes.js","sourceRoot":"","sources":["../../src/api/audience-runtime-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ax-routes.d.ts","sourceRoot":"","sources":["../../src/api/ax-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,gBAAgB,CAAA;AAYtE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,iBAAiB,CAAA;IAChC,aAAa,EAAE,eAAe,CAAA;IAC9B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ax-routes.d.ts","sourceRoot":"","sources":["../../src/api/ax-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,gBAAgB,CAAA;AAYtE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,iBAAiB,CAAA;IAChC,aAAa,EAAE,eAAe,CAAA;IAC9B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAwH1E"}
|
package/dist/api/ax-routes.js
CHANGED
|
@@ -62,9 +62,13 @@ export function registerAxRoutes(router, ctx) {
|
|
|
62
62
|
if (!slug)
|
|
63
63
|
return mdNotFound();
|
|
64
64
|
const siteId = siteIdFor(req);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
// Prefer the per-node read: `listForSite` projects EVERY page's layout, and
|
|
66
|
+
// this route is uncached (kywi-cms#195). Sources that predate `getForSite`
|
|
67
|
+
// still work through the list path.
|
|
68
|
+
const node = contentSource.getForSite
|
|
69
|
+
? await contentSource.getForSite(siteId, slug)
|
|
70
|
+
: (await contentSource.listForSite(siteId)).find((n) => n.slug === slug) ?? null;
|
|
71
|
+
if (!node || node.excludeFromSearch === true)
|
|
68
72
|
return mdNotFound();
|
|
69
73
|
const renderCtx = await buildRenderCtx(req, siteId);
|
|
70
74
|
const md = generatePageMarkdown(node, renderCtx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ax-routes.js","sourceRoot":"","sources":["../../src/api/ax-routes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ax-routes.js","sourceRoot":"","sources":["../../src/api/ax-routes.ts"],"names":[],"mappings":"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"}
|