@c15t/backend 2.0.0-rc.0 → 2.0.0-rc.10
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/README.md +3 -3
- package/dist/302.js +473 -0
- package/dist/583.js +540 -0
- package/dist/915.js +1771 -0
- package/dist/cache.cjs +5 -5
- package/dist/cache.js +4 -415
- package/dist/core.cjs +1356 -120
- package/dist/core.js +163 -1981
- package/dist/db/adapters/drizzle.cjs +1 -1
- package/dist/db/adapters/drizzle.js +1 -2
- package/dist/db/adapters/kysely.cjs +1 -1
- package/dist/db/adapters/kysely.js +1 -2
- package/dist/db/adapters/mongo.cjs +1 -1
- package/dist/db/adapters/mongo.js +1 -2
- package/dist/db/adapters/prisma.cjs +1 -1
- package/dist/db/adapters/prisma.js +1 -2
- package/dist/db/adapters/typeorm.cjs +1 -1
- package/dist/db/adapters/typeorm.js +1 -2
- package/dist/db/adapters.cjs +1 -1
- package/dist/db/migrator.cjs +1 -1
- package/dist/db/schema.cjs +43 -3
- package/dist/db/schema.js +35 -4
- package/dist/define-config.cjs +1 -1
- package/dist/edge.cjs +1106 -0
- package/dist/edge.js +190 -0
- package/dist/router.cjs +885 -123
- package/dist/router.js +1 -1507
- package/dist/{types.cjs → types/index.cjs} +1 -1
- package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
- package/{dist → dist-types}/cache/gvl-resolver.d.ts +0 -1
- package/{dist → dist-types}/cache/index.d.ts +0 -1
- package/{dist → dist-types}/cache/keys.d.ts +0 -1
- package/{dist → dist-types}/cache/types.d.ts +0 -1
- package/{dist → dist-types}/core.d.ts +8 -1
- package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
- package/dist-types/db/registry/consent-policy.d.ts +78 -0
- package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
- package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
- package/dist-types/db/registry/index.d.ts +118 -0
- package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
- package/{dist → dist-types}/db/registry/subject.d.ts +0 -2
- package/{dist → dist-types}/db/registry/types.d.ts +1 -1
- package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
- package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
- package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -32
- package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -2
- package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +3 -3
- package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +7 -2
- package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +455 -28
- package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
- package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -3
- package/{dist → dist-types}/db/schema/index.d.ts +908 -86
- package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
- package/dist-types/define-config.d.ts +17 -0
- package/dist-types/edge/index.d.ts +5 -0
- package/dist-types/edge/init-handler.d.ts +40 -0
- package/dist-types/edge/resolve-consent.d.ts +80 -0
- package/dist-types/edge/types.d.ts +13 -0
- package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
- package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
- package/{dist → dist-types}/handlers/init/index.d.ts +2 -3
- package/dist-types/handlers/init/policy.d.ts +26 -0
- package/dist-types/handlers/init/resolve-init.d.ts +44 -0
- package/dist-types/handlers/init/translations.d.ts +48 -0
- package/dist-types/handlers/legal-document/current.handler.d.ts +11 -0
- package/dist-types/handlers/legal-document/snapshot.d.ts +39 -0
- package/dist-types/handlers/policy/snapshot.d.ts +99 -0
- package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
- package/{dist → dist-types}/handlers/subject/get.handler.d.ts +3 -2
- package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/subject/list.handler.d.ts +3 -2
- package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -2
- package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
- package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +3 -1
- package/{dist → dist-types}/init.d.ts +4 -7
- package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
- package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
- package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
- package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
- package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +0 -1
- package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
- package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
- package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
- package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
- package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
- package/dist-types/policies/builder.d.ts +127 -0
- package/dist-types/policies/defaults.d.ts +2 -0
- package/dist-types/policies/matchers.d.ts +3 -0
- package/{dist → dist-types}/router.d.ts +0 -1
- package/{dist → dist-types}/routes/consent.d.ts +0 -1
- package/{dist → dist-types}/routes/index.d.ts +1 -1
- package/{dist → dist-types}/routes/init.d.ts +0 -1
- package/dist-types/routes/legal-document.d.ts +7 -0
- package/{dist → dist-types}/routes/status.d.ts +0 -1
- package/{dist → dist-types}/routes/subject.d.ts +0 -1
- package/{dist → dist-types}/types/api.d.ts +0 -1
- package/dist-types/types/index.d.ts +464 -0
- package/dist-types/utils/background.d.ts +6 -0
- package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
- package/{dist → dist-types}/utils/env.d.ts +0 -1
- package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
- package/{dist → dist-types}/utils/instrumentation.d.ts +2 -3
- package/{dist → dist-types}/utils/logger.d.ts +0 -1
- package/{dist → dist-types}/utils/metrics.d.ts +0 -1
- package/dist-types/version.d.ts +1 -0
- package/docs/README.md +49 -0
- package/docs/api/configuration.md +208 -0
- package/docs/api/endpoints.md +211 -0
- package/docs/guides/caching.md +85 -0
- package/docs/guides/database-setup.md +128 -0
- package/docs/guides/edge-deployment.md +251 -0
- package/docs/guides/framework-integration.md +142 -0
- package/docs/guides/iab-tcf.md +89 -0
- package/docs/guides/observability.md +96 -0
- package/docs/guides/policy-packs.md +396 -0
- package/docs/quickstart.md +129 -0
- package/package.json +53 -39
- package/.turbo/turbo-build.log +0 -49
- package/CHANGELOG.md +0 -89
- package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
- package/dist/cache/adapters/index.d.ts.map +0 -1
- package/dist/cache/adapters/memory.d.ts.map +0 -1
- package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
- package/dist/cache/gvl-resolver.d.ts.map +0 -1
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/keys.d.ts.map +0 -1
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/db/adapters/drizzle.d.ts +0 -2
- package/dist/db/adapters/drizzle.d.ts.map +0 -1
- package/dist/db/adapters/index.d.ts +0 -2
- package/dist/db/adapters/index.d.ts.map +0 -1
- package/dist/db/adapters/kysely.d.ts +0 -2
- package/dist/db/adapters/kysely.d.ts.map +0 -1
- package/dist/db/adapters/mongo.d.ts +0 -2
- package/dist/db/adapters/mongo.d.ts.map +0 -1
- package/dist/db/adapters/prisma.d.ts +0 -2
- package/dist/db/adapters/prisma.d.ts.map +0 -1
- package/dist/db/adapters/typeorm.d.ts +0 -2
- package/dist/db/adapters/typeorm.d.ts.map +0 -1
- package/dist/db/migrator/index.d.ts.map +0 -1
- package/dist/db/registry/consent-policy.d.ts +0 -23
- package/dist/db/registry/consent-policy.d.ts.map +0 -1
- package/dist/db/registry/consent-purpose.d.ts.map +0 -1
- package/dist/db/registry/domain.d.ts.map +0 -1
- package/dist/db/registry/index.d.ts +0 -57
- package/dist/db/registry/index.d.ts.map +0 -1
- package/dist/db/registry/subject.d.ts.map +0 -1
- package/dist/db/registry/types.d.ts.map +0 -1
- package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
- package/dist/db/registry/utils.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
- package/dist/db/schema/index.d.ts.map +0 -1
- package/dist/db/tenant-scope.d.ts.map +0 -1
- package/dist/define-config.d.ts +0 -5
- package/dist/define-config.d.ts.map +0 -1
- package/dist/handlers/consent/check.handler.d.ts.map +0 -1
- package/dist/handlers/consent/index.d.ts +0 -12
- package/dist/handlers/consent/index.d.ts.map +0 -1
- package/dist/handlers/init/geo.d.ts.map +0 -1
- package/dist/handlers/init/index.d.ts.map +0 -1
- package/dist/handlers/init/translations.d.ts +0 -28
- package/dist/handlers/init/translations.d.ts.map +0 -1
- package/dist/handlers/status/index.d.ts +0 -7
- package/dist/handlers/status/index.d.ts.map +0 -1
- package/dist/handlers/status/status.handler.d.ts.map +0 -1
- package/dist/handlers/subject/get.handler.d.ts.map +0 -1
- package/dist/handlers/subject/index.d.ts +0 -10
- package/dist/handlers/subject/index.d.ts.map +0 -1
- package/dist/handlers/subject/list.handler.d.ts.map +0 -1
- package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
- package/dist/handlers/subject/post.handler.d.ts.map +0 -1
- package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
- package/dist/init.d.ts.map +0 -1
- package/dist/middleware/auth/index.d.ts.map +0 -1
- package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
- package/dist/middleware/cors/cors.d.ts.map +0 -1
- package/dist/middleware/cors/index.d.ts +0 -30
- package/dist/middleware/cors/index.d.ts.map +0 -1
- package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
- package/dist/middleware/cors/process-cors.d.ts.map +0 -1
- package/dist/middleware/openapi/config.d.ts.map +0 -1
- package/dist/middleware/openapi/handlers.d.ts.map +0 -1
- package/dist/middleware/openapi/index.d.ts +0 -12
- package/dist/middleware/openapi/index.d.ts.map +0 -1
- package/dist/middleware/process-ip/index.d.ts.map +0 -1
- package/dist/router.d.ts.map +0 -1
- package/dist/routes/consent.d.ts.map +0 -1
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/init.d.ts.map +0 -1
- package/dist/routes/status.d.ts.map +0 -1
- package/dist/routes/subject.d.ts.map +0 -1
- package/dist/types/api.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -255
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/create-telemetry-options.d.ts.map +0 -1
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/extract-error-message.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/instrumentation.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/metrics.d.ts.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/knip.json +0 -31
- package/rslib.config.ts +0 -93
- package/src/cache/adapters/cloudflare-kv.ts +0 -71
- package/src/cache/adapters/index.ts +0 -22
- package/src/cache/adapters/memory.ts +0 -111
- package/src/cache/adapters/upstash-redis.ts +0 -113
- package/src/cache/gvl-resolver.ts +0 -289
- package/src/cache/index.ts +0 -34
- package/src/cache/keys.ts +0 -68
- package/src/cache/types.ts +0 -66
- package/src/core.ts +0 -368
- package/src/db/migrator/index.ts +0 -80
- package/src/db/registry/consent-policy.test.ts +0 -451
- package/src/db/registry/consent-policy.ts +0 -82
- package/src/db/registry/consent-purpose.test.ts +0 -428
- package/src/db/registry/consent-purpose.ts +0 -61
- package/src/db/registry/domain.test.ts +0 -445
- package/src/db/registry/domain.ts +0 -91
- package/src/db/registry/index.ts +0 -14
- package/src/db/registry/subject.test.ts +0 -388
- package/src/db/registry/subject.ts +0 -129
- package/src/db/registry/types.ts +0 -10
- package/src/db/registry/utils/generate-id.test.ts +0 -216
- package/src/db/registry/utils/generate-id.ts +0 -133
- package/src/db/registry/utils.ts +0 -133
- package/src/db/schema/1.0.0/audit-log.ts +0 -15
- package/src/db/schema/1.0.0/consent-policy.ts +0 -14
- package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
- package/src/db/schema/1.0.0/consent-record.ts +0 -10
- package/src/db/schema/1.0.0/consent.ts +0 -20
- package/src/db/schema/1.0.0/domain.ts +0 -12
- package/src/db/schema/1.0.0/index.ts +0 -48
- package/src/db/schema/1.0.0/subject.ts +0 -12
- package/src/db/schema/2.0.0/audit-log.ts +0 -18
- package/src/db/schema/2.0.0/consent-policy.ts +0 -28
- package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
- package/src/db/schema/2.0.0/consent.ts +0 -26
- package/src/db/schema/2.0.0/domain.ts +0 -12
- package/src/db/schema/2.0.0/index.ts +0 -47
- package/src/db/schema/2.0.0/subject.ts +0 -14
- package/src/db/schema/index.ts +0 -15
- package/src/db/tenant-scope.test.ts +0 -750
- package/src/db/tenant-scope.ts +0 -103
- package/src/define-config.ts +0 -5
- package/src/handlers/consent/check.handler.ts +0 -126
- package/src/handlers/init/geo.test.ts +0 -317
- package/src/handlers/init/geo.ts +0 -195
- package/src/handlers/init/index.test.ts +0 -205
- package/src/handlers/init/index.ts +0 -114
- package/src/handlers/init/translations.test.ts +0 -121
- package/src/handlers/init/translations.ts +0 -72
- package/src/handlers/status/status.handler.test.ts +0 -155
- package/src/handlers/status/status.handler.ts +0 -51
- package/src/handlers/subject/get.handler.ts +0 -93
- package/src/handlers/subject/list.handler.ts +0 -93
- package/src/handlers/subject/patch.handler.ts +0 -122
- package/src/handlers/subject/post.handler.test.ts +0 -294
- package/src/handlers/subject/post.handler.ts +0 -254
- package/src/handlers/utils/consent-enrichment.test.ts +0 -380
- package/src/handlers/utils/consent-enrichment.ts +0 -218
- package/src/init.test.ts +0 -126
- package/src/init.ts +0 -87
- package/src/middleware/auth/index.ts +0 -11
- package/src/middleware/auth/validate-api-key.test.ts +0 -86
- package/src/middleware/auth/validate-api-key.ts +0 -107
- package/src/middleware/cors/cors.test.ts +0 -135
- package/src/middleware/cors/cors.ts +0 -186
- package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
- package/src/middleware/cors/is-origin-trusted.ts +0 -130
- package/src/middleware/cors/process-cors.ts +0 -91
- package/src/middleware/openapi/config.ts +0 -29
- package/src/middleware/openapi/handlers.ts +0 -34
- package/src/middleware/process-ip/index.test.ts +0 -195
- package/src/middleware/process-ip/index.ts +0 -199
- package/src/router.ts +0 -15
- package/src/routes/consent.ts +0 -52
- package/src/routes/index.ts +0 -10
- package/src/routes/init.ts +0 -102
- package/src/routes/status.ts +0 -46
- package/src/routes/subject.ts +0 -152
- package/src/types/api.ts +0 -48
- package/src/types/index.ts +0 -288
- package/src/utils/create-telemetry-options.test.ts +0 -302
- package/src/utils/create-telemetry-options.ts +0 -229
- package/src/utils/env.ts +0 -84
- package/src/utils/extract-error-message.ts +0 -21
- package/src/utils/instrumentation.test.ts +0 -185
- package/src/utils/instrumentation.ts +0 -196
- package/src/utils/logger.ts +0 -41
- package/src/utils/metrics.test.ts +0 -323
- package/src/utils/metrics.ts +0 -402
- package/src/utils/telemetry-pii.test.ts +0 -325
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -11
- package/vitest.config.ts +0 -28
- /package/dist/{types.js → types/index.js} +0 -0
- /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
- /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
- /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
- /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
- /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
- /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
- /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
package/dist/edge.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { createLogger } from "@c15t/logger";
|
|
2
|
+
import { inspectPolicies as policy_inspectPolicies, policy_resolvePolicySync, resolveInitPayload, validateMessages, checkJurisdiction } from "./583.js";
|
|
3
|
+
const STRIP_REGEX = /^(?:https?:\/\/)|^(?:wss?:\/\/)|(?:\/+$)|(?::\d+$)/g;
|
|
4
|
+
function matchesWildcard(hostname, wildcardPattern, logger) {
|
|
5
|
+
const wildcardDomain = wildcardPattern.slice(2);
|
|
6
|
+
const isValid = hostname !== wildcardDomain && hostname.endsWith(`.${wildcardDomain}`);
|
|
7
|
+
logger?.debug(`Wildcard match result: ${isValid} ${hostname} ends with .${wildcardDomain}`);
|
|
8
|
+
return isValid;
|
|
9
|
+
}
|
|
10
|
+
function isOriginTrusted(origin, trustedDomains, logger) {
|
|
11
|
+
try {
|
|
12
|
+
if (0 === trustedDomains.length) throw new Error('No trusted domains');
|
|
13
|
+
logger?.debug(`Checking if origin ${origin} is trusted in ${trustedDomains}`);
|
|
14
|
+
if (trustedDomains.includes('*')) {
|
|
15
|
+
logger?.debug('Allowing all origins');
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
const url = new URL(origin);
|
|
19
|
+
const originHostname = url.hostname.toLowerCase();
|
|
20
|
+
logger?.debug(`Parsed origin hostname: ${originHostname}`);
|
|
21
|
+
return trustedDomains.some((domain)=>{
|
|
22
|
+
if (!domain || '' === domain.trim()) {
|
|
23
|
+
logger?.debug('Skipping empty domain');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const strippedDomain = domain.replace(STRIP_REGEX, '').toLowerCase();
|
|
27
|
+
logger?.debug(`Checking against stripped domain: ${strippedDomain}`);
|
|
28
|
+
if (strippedDomain.startsWith('*.')) return matchesWildcard(originHostname, strippedDomain, logger);
|
|
29
|
+
const isMatch = originHostname === strippedDomain;
|
|
30
|
+
logger?.debug(`Exact match result: ${isMatch} ${originHostname} === ${strippedDomain}`);
|
|
31
|
+
return isMatch;
|
|
32
|
+
});
|
|
33
|
+
} catch (error) {
|
|
34
|
+
logger?.error('Error validating origin:', error);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function unstable_c15tEdgeInit(options) {
|
|
39
|
+
const logger = createLogger(options.logger);
|
|
40
|
+
const validation = validateMessages({
|
|
41
|
+
customTranslations: options.customTranslations,
|
|
42
|
+
i18n: options.i18n,
|
|
43
|
+
policies: options.policyPacks
|
|
44
|
+
});
|
|
45
|
+
if (validation.errors.length > 0) throw new Error(`Edge init validation failed: ${validation.errors.join(', ')}`);
|
|
46
|
+
for (const warning of validation.warnings)logger.warn(warning);
|
|
47
|
+
if (options.policyPacks) policy_inspectPolicies(options.policyPacks, {
|
|
48
|
+
iabEnabled: options.iab?.enabled === true
|
|
49
|
+
});
|
|
50
|
+
return async (request)=>{
|
|
51
|
+
if ('OPTIONS' === request.method) return new Response(null, {
|
|
52
|
+
status: 204,
|
|
53
|
+
headers: buildCorsHeaders(request, options.trustedOrigins, logger)
|
|
54
|
+
});
|
|
55
|
+
try {
|
|
56
|
+
const payload = await resolveInitPayload(request, options, logger);
|
|
57
|
+
const headers = new Headers({
|
|
58
|
+
'content-type': 'application/json'
|
|
59
|
+
});
|
|
60
|
+
applyCorsHeaders(headers, request, options.trustedOrigins, logger);
|
|
61
|
+
return new Response(JSON.stringify(payload), {
|
|
62
|
+
status: 200,
|
|
63
|
+
headers
|
|
64
|
+
});
|
|
65
|
+
} catch (error) {
|
|
66
|
+
logger.error('Edge init handler error', error);
|
|
67
|
+
const errorHeaders = new Headers({
|
|
68
|
+
'content-type': 'application/json'
|
|
69
|
+
});
|
|
70
|
+
applyCorsHeaders(errorHeaders, request, options.trustedOrigins, logger);
|
|
71
|
+
return new Response(JSON.stringify({
|
|
72
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
73
|
+
message: 'Internal server error',
|
|
74
|
+
status: 500
|
|
75
|
+
}), {
|
|
76
|
+
status: 500,
|
|
77
|
+
headers: errorHeaders
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function buildCorsHeaders(request, trustedOrigins, logger) {
|
|
83
|
+
const origin = request.headers.get('origin');
|
|
84
|
+
const headers = {
|
|
85
|
+
'access-control-allow-methods': 'GET, OPTIONS',
|
|
86
|
+
'access-control-allow-headers': 'content-type, accept-language',
|
|
87
|
+
'access-control-max-age': '86400'
|
|
88
|
+
};
|
|
89
|
+
if (origin && isTrusted(origin, trustedOrigins, logger)) {
|
|
90
|
+
headers['access-control-allow-origin'] = origin;
|
|
91
|
+
headers.vary = 'Origin';
|
|
92
|
+
}
|
|
93
|
+
return headers;
|
|
94
|
+
}
|
|
95
|
+
function applyCorsHeaders(headers, request, trustedOrigins, logger) {
|
|
96
|
+
const origin = request.headers.get('origin');
|
|
97
|
+
if (origin && isTrusted(origin, trustedOrigins, logger)) {
|
|
98
|
+
headers.set('access-control-allow-origin', origin);
|
|
99
|
+
headers.set('vary', 'Origin');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function isTrusted(origin, trustedOrigins, logger) {
|
|
103
|
+
if (0 === trustedOrigins.length) return false;
|
|
104
|
+
return isOriginTrusted(origin, trustedOrigins, logger);
|
|
105
|
+
}
|
|
106
|
+
function getLocationFromHeaders(headers) {
|
|
107
|
+
const countryCode = headers.get('x-c15t-country') ?? headers.get('cf-ipcountry') ?? headers.get('x-vercel-ip-country') ?? headers.get('x-amz-cf-ipcountry') ?? headers.get('x-country-code');
|
|
108
|
+
const regionCode = headers.get('x-c15t-region') ?? headers.get('x-vercel-ip-country-region') ?? headers.get('x-region-code');
|
|
109
|
+
return {
|
|
110
|
+
countryCode,
|
|
111
|
+
regionCode
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function resolveNoPolicyFallback() {
|
|
115
|
+
return {
|
|
116
|
+
id: 'no_banner',
|
|
117
|
+
model: 'none',
|
|
118
|
+
ui: {
|
|
119
|
+
mode: 'none'
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function resolveDefaultConsent(policy, gpc) {
|
|
124
|
+
const model = policy.model;
|
|
125
|
+
const categories = policy.consent?.categories ?? [];
|
|
126
|
+
const preselected = new Set(policy.consent?.preselectedCategories ?? []);
|
|
127
|
+
const respectsGpc = policy.consent?.gpc === true && gpc;
|
|
128
|
+
const defaults = {};
|
|
129
|
+
defaults.necessary = {
|
|
130
|
+
granted: true,
|
|
131
|
+
required: true
|
|
132
|
+
};
|
|
133
|
+
if ('none' === model) {
|
|
134
|
+
for (const category of categories)if ('*' !== category && 'necessary' !== category) defaults[category] = {
|
|
135
|
+
granted: true,
|
|
136
|
+
required: false
|
|
137
|
+
};
|
|
138
|
+
return defaults;
|
|
139
|
+
}
|
|
140
|
+
if ('opt-out' === model) {
|
|
141
|
+
for (const category of categories){
|
|
142
|
+
if ('*' === category || 'necessary' === category) continue;
|
|
143
|
+
const gpcOverride = respectsGpc && ('marketing' === category || 'measurement' === category);
|
|
144
|
+
defaults[category] = {
|
|
145
|
+
granted: !gpcOverride,
|
|
146
|
+
required: false
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return defaults;
|
|
150
|
+
}
|
|
151
|
+
for (const category of categories)if ('*' !== category && 'necessary' !== category) defaults[category] = {
|
|
152
|
+
granted: preselected.has(category),
|
|
153
|
+
required: false
|
|
154
|
+
};
|
|
155
|
+
return defaults;
|
|
156
|
+
}
|
|
157
|
+
function unstable_resolveConsent(request, options, logger) {
|
|
158
|
+
const location = options.disableGeoLocation ? {
|
|
159
|
+
countryCode: null,
|
|
160
|
+
regionCode: null
|
|
161
|
+
} : getLocationFromHeaders(request.headers);
|
|
162
|
+
const jurisdiction = options.disableGeoLocation ? 'GDPR' : checkJurisdiction(location.countryCode, location.regionCode);
|
|
163
|
+
const gpc = '1' === request.headers.get('sec-gpc');
|
|
164
|
+
const hasExplicitPolicyPack = void 0 !== options.policyPacks;
|
|
165
|
+
const isExplicitEmptyPolicyPack = hasExplicitPolicyPack && (options.policyPacks?.length ?? 0) === 0;
|
|
166
|
+
const policyMatch = isExplicitEmptyPolicyPack ? void 0 : policy_resolvePolicySync({
|
|
167
|
+
policies: options.policyPacks,
|
|
168
|
+
countryCode: location.countryCode,
|
|
169
|
+
regionCode: location.regionCode,
|
|
170
|
+
jurisdiction
|
|
171
|
+
});
|
|
172
|
+
if (hasExplicitPolicyPack && !isExplicitEmptyPolicyPack && !policyMatch) logger?.warn('Policy packs configured but no policy matched', {
|
|
173
|
+
country: location.countryCode,
|
|
174
|
+
region: location.regionCode
|
|
175
|
+
});
|
|
176
|
+
const resolvedPolicy = hasExplicitPolicyPack ? policyMatch?.policy ?? resolveNoPolicyFallback() : resolveNoPolicyFallback();
|
|
177
|
+
const model = resolvedPolicy.model;
|
|
178
|
+
const showBanner = 'none' !== model && resolvedPolicy.ui?.mode !== 'none';
|
|
179
|
+
const defaults = resolveDefaultConsent(resolvedPolicy, gpc);
|
|
180
|
+
return {
|
|
181
|
+
jurisdiction,
|
|
182
|
+
location,
|
|
183
|
+
model,
|
|
184
|
+
policyId: resolvedPolicy.id,
|
|
185
|
+
defaults,
|
|
186
|
+
showBanner,
|
|
187
|
+
gpc
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export { unstable_c15tEdgeInit, unstable_resolveConsent };
|