@c15t/backend 2.0.0-rc.1 → 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 +51 -37
- package/.turbo/turbo-build.log +0 -49
- package/CHANGELOG.md +0 -99
- 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/cache.cjs
CHANGED
|
@@ -13,7 +13,7 @@ var __webpack_require__ = {};
|
|
|
13
13
|
})();
|
|
14
14
|
(()=>{
|
|
15
15
|
__webpack_require__.r = (exports1)=>{
|
|
16
|
-
if (
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
17
|
value: 'Module'
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports1, '__esModule', {
|
|
@@ -139,18 +139,18 @@ function extractErrorMessage(error) {
|
|
|
139
139
|
let cachedConfig = null;
|
|
140
140
|
let cachedDefaultAttributes = {};
|
|
141
141
|
function create_telemetry_options_isTelemetryEnabled(options) {
|
|
142
|
-
if (options) return options.
|
|
142
|
+
if (options) return options.telemetry?.enabled === true;
|
|
143
143
|
return cachedConfig?.enabled === true;
|
|
144
144
|
}
|
|
145
145
|
const create_telemetry_options_getTracer = (options)=>{
|
|
146
146
|
if (!create_telemetry_options_isTelemetryEnabled(options)) return api_namespaceObject.trace.getTracer('c15t-noop');
|
|
147
|
-
const tracer = options?.
|
|
147
|
+
const tracer = options?.telemetry?.tracer ?? cachedConfig?.tracer;
|
|
148
148
|
if (tracer) return tracer;
|
|
149
149
|
return api_namespaceObject.trace.getTracer(options?.appName ?? 'c15t');
|
|
150
150
|
};
|
|
151
151
|
const getMeter = (options)=>{
|
|
152
152
|
if (!create_telemetry_options_isTelemetryEnabled(options)) return api_namespaceObject.metrics.getMeter('c15t-noop');
|
|
153
|
-
const meter = options?.
|
|
153
|
+
const meter = options?.telemetry?.meter ?? cachedConfig?.meter;
|
|
154
154
|
if (meter) return meter;
|
|
155
155
|
return api_namespaceObject.metrics.getMeter(options?.appName ?? 'c15t');
|
|
156
156
|
};
|
|
@@ -180,7 +180,7 @@ async function executeWithSpan(span, operation) {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
function resolveDefaultAttributes(options) {
|
|
183
|
-
return options?.
|
|
183
|
+
return options?.telemetry?.defaultAttributes || getDefaultAttributes();
|
|
184
184
|
}
|
|
185
185
|
async function withExternalSpan(attributes, operation, options) {
|
|
186
186
|
if (!create_telemetry_options_isTelemetryEnabled(options)) return operation();
|
package/dist/cache.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Redis } from "@upstash/redis";
|
|
2
|
-
import {
|
|
3
|
-
const GVL_TTL_MS = 259200000;
|
|
2
|
+
import { GVL_TTL_MS } from "./302.js";
|
|
4
3
|
function createCloudflareKVAdapter(kv) {
|
|
5
4
|
return {
|
|
6
5
|
async get (key) {
|
|
@@ -24,44 +23,6 @@ function createCloudflareKVAdapter(kv) {
|
|
|
24
23
|
}
|
|
25
24
|
};
|
|
26
25
|
}
|
|
27
|
-
const memory_memoryCache = new Map();
|
|
28
|
-
function createMemoryCacheAdapter() {
|
|
29
|
-
return {
|
|
30
|
-
async get (key) {
|
|
31
|
-
const entry = memory_memoryCache.get(key);
|
|
32
|
-
if (!entry) return null;
|
|
33
|
-
if (Date.now() > entry.expiresAt) {
|
|
34
|
-
memory_memoryCache.delete(key);
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
return entry.value;
|
|
38
|
-
},
|
|
39
|
-
async set (key, value, ttlMs = 300000) {
|
|
40
|
-
memory_memoryCache.set(key, {
|
|
41
|
-
value,
|
|
42
|
-
expiresAt: Date.now() + ttlMs
|
|
43
|
-
});
|
|
44
|
-
},
|
|
45
|
-
async delete (key) {
|
|
46
|
-
memory_memoryCache.delete(key);
|
|
47
|
-
},
|
|
48
|
-
async has (key) {
|
|
49
|
-
const entry = memory_memoryCache.get(key);
|
|
50
|
-
if (!entry) return false;
|
|
51
|
-
if (Date.now() > entry.expiresAt) {
|
|
52
|
-
memory_memoryCache.delete(key);
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function clearMemoryCache() {
|
|
60
|
-
memory_memoryCache.clear();
|
|
61
|
-
}
|
|
62
|
-
function getMemoryCacheSize() {
|
|
63
|
-
return memory_memoryCache.size;
|
|
64
|
-
}
|
|
65
26
|
function createUpstashRedisAdapter(options) {
|
|
66
27
|
const client = new Redis({
|
|
67
28
|
url: options.url,
|
|
@@ -90,378 +51,6 @@ function createUpstashRedisAdapterFromClient(client) {
|
|
|
90
51
|
}
|
|
91
52
|
};
|
|
92
53
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return `AggregateError: ${inner}`;
|
|
97
|
-
}
|
|
98
|
-
if (error instanceof Error) return error.message || error.name;
|
|
99
|
-
return String(error);
|
|
100
|
-
}
|
|
101
|
-
let cachedConfig = null;
|
|
102
|
-
let cachedDefaultAttributes = {};
|
|
103
|
-
function create_telemetry_options_isTelemetryEnabled(options) {
|
|
104
|
-
if (options) return options.advanced?.telemetry?.enabled === true;
|
|
105
|
-
return cachedConfig?.enabled === true;
|
|
106
|
-
}
|
|
107
|
-
const create_telemetry_options_getTracer = (options)=>{
|
|
108
|
-
if (!create_telemetry_options_isTelemetryEnabled(options)) return api_trace.getTracer('c15t-noop');
|
|
109
|
-
const tracer = options?.advanced?.telemetry?.tracer ?? cachedConfig?.tracer;
|
|
110
|
-
if (tracer) return tracer;
|
|
111
|
-
return api_trace.getTracer(options?.appName ?? 'c15t');
|
|
112
|
-
};
|
|
113
|
-
const getMeter = (options)=>{
|
|
114
|
-
if (!create_telemetry_options_isTelemetryEnabled(options)) return metrics.getMeter('c15t-noop');
|
|
115
|
-
const meter = options?.advanced?.telemetry?.meter ?? cachedConfig?.meter;
|
|
116
|
-
if (meter) return meter;
|
|
117
|
-
return metrics.getMeter(options?.appName ?? 'c15t');
|
|
118
|
-
};
|
|
119
|
-
function getDefaultAttributes() {
|
|
120
|
-
return cachedDefaultAttributes;
|
|
121
|
-
}
|
|
122
|
-
const handleSpanError = (span, error)=>{
|
|
123
|
-
span.setStatus({
|
|
124
|
-
code: api_SpanStatusCode.ERROR,
|
|
125
|
-
message: extractErrorMessage(error)
|
|
126
|
-
});
|
|
127
|
-
if (error instanceof Error) span.setAttribute('error.type', error.name);
|
|
128
|
-
};
|
|
129
|
-
const withSpanContext = async (span, operation)=>context["with"](api_trace.setSpan(context.active(), span), operation);
|
|
130
|
-
async function executeWithSpan(span, operation) {
|
|
131
|
-
try {
|
|
132
|
-
const result = await withSpanContext(span, operation);
|
|
133
|
-
span.setStatus({
|
|
134
|
-
code: api_SpanStatusCode.OK
|
|
135
|
-
});
|
|
136
|
-
return result;
|
|
137
|
-
} catch (error) {
|
|
138
|
-
handleSpanError(span, error);
|
|
139
|
-
throw error;
|
|
140
|
-
} finally{
|
|
141
|
-
span.end();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function resolveDefaultAttributes(options) {
|
|
145
|
-
return options?.advanced?.telemetry?.defaultAttributes || getDefaultAttributes();
|
|
146
|
-
}
|
|
147
|
-
async function withExternalSpan(attributes, operation, options) {
|
|
148
|
-
if (!create_telemetry_options_isTelemetryEnabled(options)) return operation();
|
|
149
|
-
const tracer = create_telemetry_options_getTracer(options);
|
|
150
|
-
const url = new URL(attributes.url);
|
|
151
|
-
const spanName = `HTTP ${attributes.method} ${url.hostname}`;
|
|
152
|
-
const span = tracer.startSpan(spanName, {
|
|
153
|
-
kind: api_SpanKind.CLIENT,
|
|
154
|
-
attributes: {
|
|
155
|
-
'http.method': attributes.method,
|
|
156
|
-
'http.url': `${url.origin}${url.pathname}`,
|
|
157
|
-
'http.host': url.hostname,
|
|
158
|
-
...resolveDefaultAttributes(options),
|
|
159
|
-
...Object.fromEntries(Object.entries(attributes).filter(([key])=>![
|
|
160
|
-
'url',
|
|
161
|
-
'method'
|
|
162
|
-
].includes(key)))
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
return executeWithSpan(span, operation);
|
|
166
|
-
}
|
|
167
|
-
async function withCacheSpan(operation, layer, fn, options) {
|
|
168
|
-
if (!create_telemetry_options_isTelemetryEnabled(options)) return fn();
|
|
169
|
-
const tracer = create_telemetry_options_getTracer(options);
|
|
170
|
-
const spanName = `cache.${layer}.${operation}`;
|
|
171
|
-
const span = tracer.startSpan(spanName, {
|
|
172
|
-
kind: api_SpanKind.CLIENT,
|
|
173
|
-
attributes: {
|
|
174
|
-
'cache.operation': operation,
|
|
175
|
-
'cache.layer': layer,
|
|
176
|
-
...resolveDefaultAttributes(options)
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
return executeWithSpan(span, fn);
|
|
180
|
-
}
|
|
181
|
-
function sanitizeAttributes(attrs) {
|
|
182
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, v])=>null != v));
|
|
183
|
-
}
|
|
184
|
-
function createMetrics(meter) {
|
|
185
|
-
const consentCreated = meter.createCounter('c15t.consent.created', {
|
|
186
|
-
description: 'Number of consent submissions',
|
|
187
|
-
unit: '1'
|
|
188
|
-
});
|
|
189
|
-
const consentAccepted = meter.createCounter('c15t.consent.accepted', {
|
|
190
|
-
description: 'Number of consents accepted',
|
|
191
|
-
unit: '1'
|
|
192
|
-
});
|
|
193
|
-
const consentRejected = meter.createCounter('c15t.consent.rejected', {
|
|
194
|
-
description: 'Number of consents rejected',
|
|
195
|
-
unit: '1'
|
|
196
|
-
});
|
|
197
|
-
const subjectCreated = meter.createCounter('c15t.subject.created', {
|
|
198
|
-
description: 'Number of new subjects created',
|
|
199
|
-
unit: '1'
|
|
200
|
-
});
|
|
201
|
-
const subjectLinked = meter.createCounter('c15t.subject.linked', {
|
|
202
|
-
description: 'Number of subjects linked to external ID',
|
|
203
|
-
unit: '1'
|
|
204
|
-
});
|
|
205
|
-
const consentCheckCount = meter.createCounter('c15t.consent_check.count', {
|
|
206
|
-
description: 'Number of cross-device consent checks',
|
|
207
|
-
unit: '1'
|
|
208
|
-
});
|
|
209
|
-
const initCount = meter.createCounter('c15t.init.count', {
|
|
210
|
-
description: 'Number of init endpoint calls',
|
|
211
|
-
unit: '1'
|
|
212
|
-
});
|
|
213
|
-
const httpRequestDuration = meter.createHistogram('c15t.http.request.duration', {
|
|
214
|
-
description: 'HTTP request latency',
|
|
215
|
-
unit: 'ms'
|
|
216
|
-
});
|
|
217
|
-
const httpRequestCount = meter.createCounter('c15t.http.request.count', {
|
|
218
|
-
description: 'Number of HTTP requests',
|
|
219
|
-
unit: '1'
|
|
220
|
-
});
|
|
221
|
-
const httpErrorCount = meter.createCounter('c15t.http.error.count', {
|
|
222
|
-
description: 'Number of HTTP errors',
|
|
223
|
-
unit: '1'
|
|
224
|
-
});
|
|
225
|
-
const dbQueryDuration = meter.createHistogram('c15t.db.query.duration', {
|
|
226
|
-
description: 'Database query latency',
|
|
227
|
-
unit: 'ms'
|
|
228
|
-
});
|
|
229
|
-
const dbQueryCount = meter.createCounter('c15t.db.query.count', {
|
|
230
|
-
description: 'Number of database queries',
|
|
231
|
-
unit: '1'
|
|
232
|
-
});
|
|
233
|
-
const dbErrorCount = meter.createCounter('c15t.db.error.count', {
|
|
234
|
-
description: 'Number of database errors',
|
|
235
|
-
unit: '1'
|
|
236
|
-
});
|
|
237
|
-
const cacheHit = meter.createCounter('c15t.cache.hit', {
|
|
238
|
-
description: 'Number of cache hits',
|
|
239
|
-
unit: '1'
|
|
240
|
-
});
|
|
241
|
-
const cacheMiss = meter.createCounter('c15t.cache.miss', {
|
|
242
|
-
description: 'Number of cache misses',
|
|
243
|
-
unit: '1'
|
|
244
|
-
});
|
|
245
|
-
const cacheLatency = meter.createHistogram('c15t.cache.latency', {
|
|
246
|
-
description: 'Cache operation latency',
|
|
247
|
-
unit: 'ms'
|
|
248
|
-
});
|
|
249
|
-
const gvlFetchDuration = meter.createHistogram('c15t.gvl.fetch.duration', {
|
|
250
|
-
description: 'GVL fetch latency',
|
|
251
|
-
unit: 'ms'
|
|
252
|
-
});
|
|
253
|
-
const gvlFetchCount = meter.createCounter('c15t.gvl.fetch.count', {
|
|
254
|
-
description: 'Number of GVL fetches',
|
|
255
|
-
unit: '1'
|
|
256
|
-
});
|
|
257
|
-
const gvlFetchError = meter.createCounter('c15t.gvl.fetch.error', {
|
|
258
|
-
description: 'Number of GVL fetch errors',
|
|
259
|
-
unit: '1'
|
|
260
|
-
});
|
|
261
|
-
return {
|
|
262
|
-
consentCreated,
|
|
263
|
-
consentAccepted,
|
|
264
|
-
consentRejected,
|
|
265
|
-
subjectCreated,
|
|
266
|
-
subjectLinked,
|
|
267
|
-
consentCheckCount,
|
|
268
|
-
initCount,
|
|
269
|
-
httpRequestDuration,
|
|
270
|
-
httpRequestCount,
|
|
271
|
-
httpErrorCount,
|
|
272
|
-
dbQueryDuration,
|
|
273
|
-
dbQueryCount,
|
|
274
|
-
dbErrorCount,
|
|
275
|
-
cacheHit,
|
|
276
|
-
cacheMiss,
|
|
277
|
-
cacheLatency,
|
|
278
|
-
gvlFetchDuration,
|
|
279
|
-
gvlFetchCount,
|
|
280
|
-
gvlFetchError,
|
|
281
|
-
recordConsentCreated (attributes) {
|
|
282
|
-
consentCreated.add(1, sanitizeAttributes(attributes));
|
|
283
|
-
},
|
|
284
|
-
recordConsentAccepted (attributes) {
|
|
285
|
-
consentAccepted.add(1, sanitizeAttributes(attributes));
|
|
286
|
-
},
|
|
287
|
-
recordConsentRejected (attributes) {
|
|
288
|
-
consentRejected.add(1, sanitizeAttributes(attributes));
|
|
289
|
-
},
|
|
290
|
-
recordSubjectCreated (attributes) {
|
|
291
|
-
subjectCreated.add(1, sanitizeAttributes(attributes));
|
|
292
|
-
},
|
|
293
|
-
recordSubjectLinked (identityProvider) {
|
|
294
|
-
subjectLinked.add(1, {
|
|
295
|
-
identityProvider: identityProvider || 'unknown'
|
|
296
|
-
});
|
|
297
|
-
},
|
|
298
|
-
recordConsentCheck (type, found) {
|
|
299
|
-
consentCheckCount.add(1, {
|
|
300
|
-
type,
|
|
301
|
-
found: String(found)
|
|
302
|
-
});
|
|
303
|
-
},
|
|
304
|
-
recordInit (attributes) {
|
|
305
|
-
initCount.add(1, sanitizeAttributes(attributes));
|
|
306
|
-
},
|
|
307
|
-
recordHttpRequest (attributes, durationMs) {
|
|
308
|
-
const attrs = sanitizeAttributes(attributes);
|
|
309
|
-
httpRequestCount.add(1, attrs);
|
|
310
|
-
httpRequestDuration.record(durationMs, attrs);
|
|
311
|
-
if (attributes.status >= 400) httpErrorCount.add(1, attrs);
|
|
312
|
-
},
|
|
313
|
-
recordDbQuery (attributes, durationMs) {
|
|
314
|
-
const attrs = sanitizeAttributes(attributes);
|
|
315
|
-
dbQueryCount.add(1, attrs);
|
|
316
|
-
dbQueryDuration.record(durationMs, attrs);
|
|
317
|
-
},
|
|
318
|
-
recordDbError (attributes) {
|
|
319
|
-
dbErrorCount.add(1, sanitizeAttributes(attributes));
|
|
320
|
-
},
|
|
321
|
-
recordCacheHit (layer) {
|
|
322
|
-
cacheHit.add(1, {
|
|
323
|
-
layer
|
|
324
|
-
});
|
|
325
|
-
},
|
|
326
|
-
recordCacheMiss (layer) {
|
|
327
|
-
cacheMiss.add(1, {
|
|
328
|
-
layer
|
|
329
|
-
});
|
|
330
|
-
},
|
|
331
|
-
recordCacheLatency (attributes, durationMs) {
|
|
332
|
-
cacheLatency.record(durationMs, sanitizeAttributes(attributes));
|
|
333
|
-
},
|
|
334
|
-
recordGvlFetch (attributes, durationMs) {
|
|
335
|
-
const attrs = sanitizeAttributes(attributes);
|
|
336
|
-
gvlFetchCount.add(1, attrs);
|
|
337
|
-
gvlFetchDuration.record(durationMs, attrs);
|
|
338
|
-
},
|
|
339
|
-
recordGvlError (attributes) {
|
|
340
|
-
gvlFetchError.add(1, sanitizeAttributes(attributes));
|
|
341
|
-
}
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
let metricsInstance = null;
|
|
345
|
-
function getMetrics(options) {
|
|
346
|
-
if (metricsInstance) return metricsInstance;
|
|
347
|
-
if (!create_telemetry_options_isTelemetryEnabled(options)) return null;
|
|
348
|
-
metricsInstance = createMetrics(getMeter(options));
|
|
349
|
-
return metricsInstance;
|
|
350
|
-
}
|
|
351
|
-
function createGVLCacheKey(appName, language, vendorIds) {
|
|
352
|
-
const sortedIds = vendorIds ? [
|
|
353
|
-
...vendorIds
|
|
354
|
-
].sort((a, b)=>a - b).join(',') : 'all';
|
|
355
|
-
return `${appName}:gvl:${language}:${sortedIds}`;
|
|
356
|
-
}
|
|
357
|
-
function createCacheKey(appName, namespace, ...parts) {
|
|
358
|
-
const allParts = [
|
|
359
|
-
appName,
|
|
360
|
-
namespace,
|
|
361
|
-
...parts
|
|
362
|
-
];
|
|
363
|
-
return allParts.join(':');
|
|
364
|
-
}
|
|
365
|
-
const GVL_ENDPOINT = 'https://gvl.consent.io';
|
|
366
|
-
const inflightRequests = new Map();
|
|
367
|
-
async function fetchGVLWithLanguage(language, vendorIds, endpoint = GVL_ENDPOINT) {
|
|
368
|
-
const sortedVendorIds = vendorIds ? [
|
|
369
|
-
...vendorIds
|
|
370
|
-
].sort((a, b)=>a - b) : [];
|
|
371
|
-
const dedupeKey = `${endpoint}|${language}|${sortedVendorIds.join(',')}`;
|
|
372
|
-
const existingRequest = inflightRequests.get(dedupeKey);
|
|
373
|
-
if (existingRequest) return existingRequest;
|
|
374
|
-
const url = new URL(endpoint);
|
|
375
|
-
if (sortedVendorIds.length > 0) url.searchParams.set('vendorIds', sortedVendorIds.join(','));
|
|
376
|
-
const promise = (async ()=>{
|
|
377
|
-
const fetchStart = Date.now();
|
|
378
|
-
try {
|
|
379
|
-
const gvl = await withExternalSpan({
|
|
380
|
-
url: url.toString(),
|
|
381
|
-
method: 'GET'
|
|
382
|
-
}, async ()=>{
|
|
383
|
-
const response = await fetch(url.toString(), {
|
|
384
|
-
headers: {
|
|
385
|
-
'Accept-Language': language
|
|
386
|
-
}
|
|
387
|
-
});
|
|
388
|
-
if (204 === response.status) return null;
|
|
389
|
-
if (!response.ok) throw new Error(`Failed to fetch GVL: ${response.status} ${response.statusText}`);
|
|
390
|
-
const text = await response.text();
|
|
391
|
-
const trimmed = text.trim().replace(/^\uFEFF/, '');
|
|
392
|
-
let parsed;
|
|
393
|
-
try {
|
|
394
|
-
parsed = JSON.parse(trimmed);
|
|
395
|
-
} catch {
|
|
396
|
-
let depth = 0;
|
|
397
|
-
let end = -1;
|
|
398
|
-
const start = trimmed.indexOf('{');
|
|
399
|
-
if (start >= 0) for(let i = start; i < trimmed.length; i++){
|
|
400
|
-
const c = trimmed[i];
|
|
401
|
-
if ('{' === c) depth++;
|
|
402
|
-
else if ('}' === c) {
|
|
403
|
-
depth--;
|
|
404
|
-
if (0 === depth) {
|
|
405
|
-
end = i + 1;
|
|
406
|
-
break;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
if (end > 0) parsed = JSON.parse(trimmed.slice(0, end));
|
|
411
|
-
else throw new SyntaxError('Invalid GVL response: not valid JSON');
|
|
412
|
-
}
|
|
413
|
-
if (!parsed.vendorListVersion || !parsed.purposes || !parsed.vendors) throw new Error('Invalid GVL response: missing required fields');
|
|
414
|
-
return parsed;
|
|
415
|
-
});
|
|
416
|
-
getMetrics()?.recordGvlFetch({
|
|
417
|
-
language,
|
|
418
|
-
source: 'fetch',
|
|
419
|
-
status: 200
|
|
420
|
-
}, Date.now() - fetchStart);
|
|
421
|
-
return gvl;
|
|
422
|
-
} catch (error) {
|
|
423
|
-
getMetrics()?.recordGvlError({
|
|
424
|
-
language,
|
|
425
|
-
errorType: error instanceof Error ? error.name : 'UnknownError'
|
|
426
|
-
});
|
|
427
|
-
throw error;
|
|
428
|
-
} finally{
|
|
429
|
-
inflightRequests.delete(dedupeKey);
|
|
430
|
-
}
|
|
431
|
-
})();
|
|
432
|
-
inflightRequests.set(dedupeKey, promise);
|
|
433
|
-
return promise;
|
|
434
|
-
}
|
|
435
|
-
function createGVLResolver(options) {
|
|
436
|
-
const { appName, bundled, cacheAdapter, vendorIds, endpoint } = options;
|
|
437
|
-
const memoryCache = createMemoryCacheAdapter();
|
|
438
|
-
return {
|
|
439
|
-
async get (language) {
|
|
440
|
-
const cacheKey = createGVLCacheKey(appName, language, vendorIds);
|
|
441
|
-
if (bundled?.[language]) return bundled[language];
|
|
442
|
-
const memoryHit = await withCacheSpan('get', 'memory', ()=>memoryCache.get(cacheKey));
|
|
443
|
-
if (memoryHit) {
|
|
444
|
-
getMetrics()?.recordCacheHit('memory');
|
|
445
|
-
return memoryHit;
|
|
446
|
-
}
|
|
447
|
-
getMetrics()?.recordCacheMiss('memory');
|
|
448
|
-
if (cacheAdapter) {
|
|
449
|
-
const externalHit = await withCacheSpan('get', 'external', ()=>cacheAdapter.get(cacheKey));
|
|
450
|
-
if (externalHit) {
|
|
451
|
-
getMetrics()?.recordCacheHit('external');
|
|
452
|
-
await withCacheSpan('set', 'memory', ()=>memoryCache.set(cacheKey, externalHit, 300000));
|
|
453
|
-
return externalHit;
|
|
454
|
-
}
|
|
455
|
-
getMetrics()?.recordCacheMiss('external');
|
|
456
|
-
}
|
|
457
|
-
const gvl = await fetchGVLWithLanguage(language, vendorIds, endpoint);
|
|
458
|
-
if (gvl) {
|
|
459
|
-
await withCacheSpan('set', 'memory', ()=>memoryCache.set(cacheKey, gvl, 300000));
|
|
460
|
-
if (cacheAdapter) await withCacheSpan('set', 'external', ()=>cacheAdapter.set(cacheKey, gvl, GVL_TTL_MS));
|
|
461
|
-
}
|
|
462
|
-
return gvl;
|
|
463
|
-
}
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
var __webpack_exports__MEMORY_TTL_MS = 300000;
|
|
467
|
-
export { GVL_TTL_MS, clearMemoryCache, createCacheKey, createCloudflareKVAdapter, createGVLCacheKey, createGVLResolver, createMemoryCacheAdapter, createUpstashRedisAdapter, createUpstashRedisAdapterFromClient, getMemoryCacheSize, __webpack_exports__MEMORY_TTL_MS as MEMORY_TTL_MS };
|
|
54
|
+
var cache_MEMORY_TTL_MS = 300000;
|
|
55
|
+
export { GVL_TTL_MS, clearMemoryCache, createCacheKey, createGVLCacheKey, createGVLResolver, createMemoryCacheAdapter, getMemoryCacheSize } from "./302.js";
|
|
56
|
+
export { cache_MEMORY_TTL_MS as MEMORY_TTL_MS, createCloudflareKVAdapter, createUpstashRedisAdapter, createUpstashRedisAdapterFromClient };
|