@c15t/backend 2.0.0-rc.3 → 2.0.0-rc.5

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.
Files changed (314) hide show
  1. package/dist/cache.cjs +4 -4
  2. package/dist/cache.js +4 -4
  3. package/dist/core.cjs +845 -87
  4. package/dist/core.js +821 -87
  5. package/dist/db/schema.cjs +37 -0
  6. package/dist/db/schema.js +33 -2
  7. package/dist/edge.cjs +1106 -0
  8. package/dist/edge.js +1069 -0
  9. package/dist/router.cjs +621 -71
  10. package/dist/router.js +621 -71
  11. package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
  12. package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
  13. package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
  14. package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
  15. package/{dist → dist-types}/cache/gvl-resolver.d.ts +1 -2
  16. package/{dist → dist-types}/cache/index.d.ts +0 -1
  17. package/{dist → dist-types}/cache/keys.d.ts +0 -1
  18. package/{dist → dist-types}/cache/types.d.ts +0 -1
  19. package/{dist → dist-types}/core.d.ts +8 -1
  20. package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
  21. package/{dist → dist-types}/db/registry/consent-policy.d.ts +0 -1
  22. package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
  23. package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
  24. package/{dist → dist-types}/db/registry/index.d.ts +22 -2
  25. package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
  26. package/{dist → dist-types}/db/registry/subject.d.ts +0 -1
  27. package/{dist → dist-types}/db/registry/types.d.ts +1 -2
  28. package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
  29. package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
  30. package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
  31. package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
  32. package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
  33. package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
  34. package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
  35. package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
  36. package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -1
  37. package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -1
  38. package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
  39. package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +1 -2
  40. package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
  41. package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +5 -2
  42. package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
  43. package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +432 -17
  44. package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
  45. package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -2
  46. package/{dist → dist-types}/db/schema/index.d.ts +862 -33
  47. package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
  48. package/dist-types/define-config.d.ts +17 -0
  49. package/dist-types/edge/index.d.ts +5 -0
  50. package/dist-types/edge/init-handler.d.ts +38 -0
  51. package/dist-types/edge/resolve-consent.d.ts +80 -0
  52. package/dist-types/edge/types.d.ts +13 -0
  53. package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
  54. package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
  55. package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
  56. package/{dist → dist-types}/handlers/init/index.d.ts +4 -5
  57. package/dist-types/handlers/init/policy.d.ts +26 -0
  58. package/dist-types/handlers/init/resolve-init.d.ts +44 -0
  59. package/dist-types/handlers/init/translations.d.ts +48 -0
  60. package/dist-types/handlers/policy/snapshot.d.ts +99 -0
  61. package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
  62. package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
  63. package/{dist → dist-types}/handlers/subject/get.handler.d.ts +0 -1
  64. package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
  65. package/{dist → dist-types}/handlers/subject/list.handler.d.ts +0 -1
  66. package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -1
  67. package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
  68. package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +0 -1
  69. package/{dist → dist-types}/init.d.ts +4 -7
  70. package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
  71. package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
  72. package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
  73. package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
  74. package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +1 -2
  75. package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
  76. package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
  77. package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
  78. package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
  79. package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
  80. package/dist-types/policies/builder.d.ts +127 -0
  81. package/dist-types/policies/defaults.d.ts +2 -0
  82. package/dist-types/policies/matchers.d.ts +3 -0
  83. package/{dist → dist-types}/router.d.ts +0 -1
  84. package/{dist → dist-types}/routes/consent.d.ts +0 -1
  85. package/{src/routes/index.ts → dist-types/routes/index.d.ts} +0 -1
  86. package/{dist → dist-types}/routes/init.d.ts +0 -1
  87. package/{dist → dist-types}/routes/status.d.ts +0 -1
  88. package/{dist → dist-types}/routes/subject.d.ts +0 -1
  89. package/{dist → dist-types}/types/api.d.ts +0 -1
  90. package/dist-types/types/index.d.ts +443 -0
  91. package/dist-types/utils/background.d.ts +6 -0
  92. package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
  93. package/{dist → dist-types}/utils/env.d.ts +0 -1
  94. package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
  95. package/{dist → dist-types}/utils/instrumentation.d.ts +0 -1
  96. package/{dist → dist-types}/utils/logger.d.ts +1 -2
  97. package/{dist → dist-types}/utils/metrics.d.ts +0 -1
  98. package/dist-types/version.d.ts +1 -0
  99. package/docs/README.md +49 -0
  100. package/docs/api/configuration.md +197 -0
  101. package/docs/api/endpoints.md +211 -0
  102. package/docs/guides/caching.md +85 -0
  103. package/docs/guides/database-setup.md +128 -0
  104. package/docs/guides/edge-deployment.md +248 -0
  105. package/docs/guides/framework-integration.md +142 -0
  106. package/docs/guides/iab-tcf.md +89 -0
  107. package/docs/guides/observability.md +96 -0
  108. package/docs/guides/policy-packs.md +396 -0
  109. package/docs/quickstart.md +129 -0
  110. package/package.json +37 -23
  111. package/.turbo/turbo-build.log +0 -49
  112. package/CHANGELOG.md +0 -115
  113. package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
  114. package/dist/cache/adapters/index.d.ts.map +0 -1
  115. package/dist/cache/adapters/memory.d.ts.map +0 -1
  116. package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
  117. package/dist/cache/gvl-resolver.d.ts.map +0 -1
  118. package/dist/cache/index.d.ts.map +0 -1
  119. package/dist/cache/keys.d.ts.map +0 -1
  120. package/dist/cache/types.d.ts.map +0 -1
  121. package/dist/core.d.ts.map +0 -1
  122. package/dist/db/adapters/drizzle.d.ts +0 -2
  123. package/dist/db/adapters/drizzle.d.ts.map +0 -1
  124. package/dist/db/adapters/index.d.ts +0 -2
  125. package/dist/db/adapters/index.d.ts.map +0 -1
  126. package/dist/db/adapters/kysely.d.ts +0 -2
  127. package/dist/db/adapters/kysely.d.ts.map +0 -1
  128. package/dist/db/adapters/mongo.d.ts +0 -2
  129. package/dist/db/adapters/mongo.d.ts.map +0 -1
  130. package/dist/db/adapters/prisma.d.ts +0 -2
  131. package/dist/db/adapters/prisma.d.ts.map +0 -1
  132. package/dist/db/adapters/typeorm.d.ts +0 -2
  133. package/dist/db/adapters/typeorm.d.ts.map +0 -1
  134. package/dist/db/migrator/index.d.ts.map +0 -1
  135. package/dist/db/registry/consent-policy.d.ts.map +0 -1
  136. package/dist/db/registry/consent-purpose.d.ts.map +0 -1
  137. package/dist/db/registry/domain.d.ts.map +0 -1
  138. package/dist/db/registry/index.d.ts.map +0 -1
  139. package/dist/db/registry/subject.d.ts.map +0 -1
  140. package/dist/db/registry/types.d.ts.map +0 -1
  141. package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
  142. package/dist/db/registry/utils.d.ts.map +0 -1
  143. package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
  144. package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
  145. package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
  146. package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
  147. package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
  148. package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
  149. package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
  150. package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
  151. package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
  152. package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
  153. package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
  154. package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
  155. package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
  156. package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
  157. package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
  158. package/dist/db/schema/index.d.ts.map +0 -1
  159. package/dist/db/tenant-scope.d.ts.map +0 -1
  160. package/dist/define-config.d.ts +0 -5
  161. package/dist/define-config.d.ts.map +0 -1
  162. package/dist/handlers/consent/check.handler.d.ts.map +0 -1
  163. package/dist/handlers/consent/index.d.ts +0 -12
  164. package/dist/handlers/consent/index.d.ts.map +0 -1
  165. package/dist/handlers/init/geo.d.ts.map +0 -1
  166. package/dist/handlers/init/index.d.ts.map +0 -1
  167. package/dist/handlers/init/translations.d.ts +0 -28
  168. package/dist/handlers/init/translations.d.ts.map +0 -1
  169. package/dist/handlers/status/index.d.ts +0 -7
  170. package/dist/handlers/status/index.d.ts.map +0 -1
  171. package/dist/handlers/status/status.handler.d.ts.map +0 -1
  172. package/dist/handlers/subject/get.handler.d.ts.map +0 -1
  173. package/dist/handlers/subject/index.d.ts +0 -10
  174. package/dist/handlers/subject/index.d.ts.map +0 -1
  175. package/dist/handlers/subject/list.handler.d.ts.map +0 -1
  176. package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
  177. package/dist/handlers/subject/post.handler.d.ts.map +0 -1
  178. package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
  179. package/dist/init.d.ts.map +0 -1
  180. package/dist/middleware/auth/index.d.ts.map +0 -1
  181. package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
  182. package/dist/middleware/cors/cors.d.ts.map +0 -1
  183. package/dist/middleware/cors/index.d.ts +0 -30
  184. package/dist/middleware/cors/index.d.ts.map +0 -1
  185. package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
  186. package/dist/middleware/cors/process-cors.d.ts.map +0 -1
  187. package/dist/middleware/openapi/config.d.ts.map +0 -1
  188. package/dist/middleware/openapi/handlers.d.ts.map +0 -1
  189. package/dist/middleware/openapi/index.d.ts +0 -12
  190. package/dist/middleware/openapi/index.d.ts.map +0 -1
  191. package/dist/middleware/process-ip/index.d.ts.map +0 -1
  192. package/dist/router.d.ts.map +0 -1
  193. package/dist/routes/consent.d.ts.map +0 -1
  194. package/dist/routes/index.d.ts +0 -10
  195. package/dist/routes/index.d.ts.map +0 -1
  196. package/dist/routes/init.d.ts.map +0 -1
  197. package/dist/routes/status.d.ts.map +0 -1
  198. package/dist/routes/subject.d.ts.map +0 -1
  199. package/dist/types/api.d.ts.map +0 -1
  200. package/dist/types/index.d.ts +0 -263
  201. package/dist/types/index.d.ts.map +0 -1
  202. package/dist/utils/create-telemetry-options.d.ts.map +0 -1
  203. package/dist/utils/env.d.ts.map +0 -1
  204. package/dist/utils/extract-error-message.d.ts.map +0 -1
  205. package/dist/utils/index.d.ts +0 -4
  206. package/dist/utils/index.d.ts.map +0 -1
  207. package/dist/utils/instrumentation.d.ts.map +0 -1
  208. package/dist/utils/logger.d.ts.map +0 -1
  209. package/dist/utils/metrics.d.ts.map +0 -1
  210. package/dist/version.d.ts +0 -2
  211. package/dist/version.d.ts.map +0 -1
  212. package/knip.json +0 -31
  213. package/rslib.config.ts +0 -93
  214. package/src/cache/adapters/cloudflare-kv.ts +0 -71
  215. package/src/cache/adapters/index.ts +0 -22
  216. package/src/cache/adapters/memory.ts +0 -111
  217. package/src/cache/adapters/upstash-redis.ts +0 -113
  218. package/src/cache/gvl-resolver.ts +0 -289
  219. package/src/cache/index.ts +0 -34
  220. package/src/cache/keys.ts +0 -68
  221. package/src/cache/types.ts +0 -66
  222. package/src/core.ts +0 -369
  223. package/src/db/migrator/index.ts +0 -80
  224. package/src/db/registry/consent-policy.test.ts +0 -451
  225. package/src/db/registry/consent-policy.ts +0 -82
  226. package/src/db/registry/consent-purpose.test.ts +0 -428
  227. package/src/db/registry/consent-purpose.ts +0 -61
  228. package/src/db/registry/domain.test.ts +0 -445
  229. package/src/db/registry/domain.ts +0 -91
  230. package/src/db/registry/index.ts +0 -14
  231. package/src/db/registry/subject.test.ts +0 -371
  232. package/src/db/registry/subject.ts +0 -126
  233. package/src/db/registry/types.ts +0 -10
  234. package/src/db/registry/utils/generate-id.test.ts +0 -216
  235. package/src/db/registry/utils/generate-id.ts +0 -133
  236. package/src/db/registry/utils.ts +0 -133
  237. package/src/db/schema/1.0.0/audit-log.ts +0 -15
  238. package/src/db/schema/1.0.0/consent-policy.ts +0 -14
  239. package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
  240. package/src/db/schema/1.0.0/consent-record.ts +0 -10
  241. package/src/db/schema/1.0.0/consent.ts +0 -20
  242. package/src/db/schema/1.0.0/domain.ts +0 -12
  243. package/src/db/schema/1.0.0/index.ts +0 -48
  244. package/src/db/schema/1.0.0/subject.ts +0 -11
  245. package/src/db/schema/2.0.0/audit-log.ts +0 -18
  246. package/src/db/schema/2.0.0/consent-policy.ts +0 -28
  247. package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
  248. package/src/db/schema/2.0.0/consent.ts +0 -28
  249. package/src/db/schema/2.0.0/domain.ts +0 -12
  250. package/src/db/schema/2.0.0/index.ts +0 -47
  251. package/src/db/schema/2.0.0/subject.ts +0 -13
  252. package/src/db/schema/index.ts +0 -15
  253. package/src/db/tenant-scope.test.ts +0 -747
  254. package/src/db/tenant-scope.ts +0 -103
  255. package/src/define-config.ts +0 -5
  256. package/src/handlers/consent/check.handler.ts +0 -126
  257. package/src/handlers/init/geo.test.ts +0 -317
  258. package/src/handlers/init/geo.ts +0 -195
  259. package/src/handlers/init/index.test.ts +0 -205
  260. package/src/handlers/init/index.ts +0 -114
  261. package/src/handlers/init/translations.test.ts +0 -121
  262. package/src/handlers/init/translations.ts +0 -72
  263. package/src/handlers/status/status.handler.test.ts +0 -155
  264. package/src/handlers/status/status.handler.ts +0 -51
  265. package/src/handlers/subject/get.handler.ts +0 -92
  266. package/src/handlers/subject/list.handler.ts +0 -92
  267. package/src/handlers/subject/patch.handler.ts +0 -119
  268. package/src/handlers/subject/post.handler.test.ts +0 -294
  269. package/src/handlers/subject/post.handler.ts +0 -268
  270. package/src/handlers/utils/consent-enrichment.test.ts +0 -380
  271. package/src/handlers/utils/consent-enrichment.ts +0 -218
  272. package/src/init.test.ts +0 -126
  273. package/src/init.ts +0 -87
  274. package/src/middleware/auth/index.ts +0 -11
  275. package/src/middleware/auth/validate-api-key.test.ts +0 -86
  276. package/src/middleware/auth/validate-api-key.ts +0 -107
  277. package/src/middleware/cors/cors.test.ts +0 -135
  278. package/src/middleware/cors/cors.ts +0 -186
  279. package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
  280. package/src/middleware/cors/is-origin-trusted.ts +0 -130
  281. package/src/middleware/cors/process-cors.ts +0 -91
  282. package/src/middleware/openapi/config.ts +0 -29
  283. package/src/middleware/openapi/handlers.ts +0 -34
  284. package/src/middleware/process-ip/index.test.ts +0 -195
  285. package/src/middleware/process-ip/index.ts +0 -199
  286. package/src/router.ts +0 -15
  287. package/src/routes/consent.ts +0 -52
  288. package/src/routes/init.ts +0 -105
  289. package/src/routes/status.ts +0 -46
  290. package/src/routes/subject.ts +0 -152
  291. package/src/types/api.ts +0 -48
  292. package/src/types/index.ts +0 -297
  293. package/src/utils/create-telemetry-options.test.ts +0 -302
  294. package/src/utils/create-telemetry-options.ts +0 -229
  295. package/src/utils/env.ts +0 -84
  296. package/src/utils/extract-error-message.ts +0 -21
  297. package/src/utils/instrumentation.test.ts +0 -185
  298. package/src/utils/instrumentation.ts +0 -196
  299. package/src/utils/logger.ts +0 -41
  300. package/src/utils/metrics.test.ts +0 -323
  301. package/src/utils/metrics.ts +0 -402
  302. package/src/utils/telemetry-pii.test.ts +0 -325
  303. package/src/version.ts +0 -2
  304. package/tsconfig.json +0 -11
  305. package/vitest.config.ts +0 -28
  306. /package/dist/{types.cjs → types/index.cjs} +0 -0
  307. /package/dist/{types.js → types/index.js} +0 -0
  308. /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
  309. /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
  310. /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
  311. /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
  312. /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
  313. /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
  314. /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
@@ -1,402 +0,0 @@
1
- import type { Counter, Histogram, Meter } from '@opentelemetry/api';
2
- import type { C15TOptions } from '../types';
3
- import { getMeter, isTelemetryEnabled } from './create-telemetry-options';
4
-
5
- /**
6
- * Geographic attributes for consent metrics
7
- */
8
- export interface GeoAttributes {
9
- /** Legal framework (GDPR, CCPA, LGPD, etc.) */
10
- jurisdiction?: string;
11
- /** ISO country code (US, DE, FR, etc.) */
12
- country?: string;
13
- /** State/province code (CA, BY, etc.) */
14
- region?: string;
15
- /** Index signature for additional attributes */
16
- [key: string]: string | number | boolean | undefined;
17
- }
18
-
19
- /**
20
- * Consent metric attributes
21
- */
22
- export interface ConsentMetricAttributes extends GeoAttributes {
23
- /** Consent type (cookie_banner, privacy_policy, etc.) */
24
- type: string;
25
- /** Consent status (accepted, rejected, partial) */
26
- status?: string;
27
- }
28
-
29
- /**
30
- * HTTP metric attributes
31
- */
32
- export interface HttpMetricAttributes {
33
- /** HTTP method */
34
- method: string;
35
- /** Route pattern (e.g., /subjects/:id) */
36
- route: string;
37
- /** HTTP status code */
38
- status: number;
39
- /** Error type if applicable */
40
- errorType?: string;
41
- /** Index signature for additional attributes */
42
- [key: string]: string | number | boolean | undefined;
43
- }
44
-
45
- /**
46
- * Database metric attributes
47
- */
48
- export interface DbMetricAttributes {
49
- /** Operation type (find, create, update, delete) */
50
- operation: string;
51
- /** Entity type (consent, subject, audit_log, etc.) */
52
- entity: string;
53
- /** Error type if applicable */
54
- errorType?: string;
55
- /** Index signature for additional attributes */
56
- [key: string]: string | number | boolean | undefined;
57
- }
58
-
59
- /**
60
- * Cache metric attributes
61
- */
62
- export interface CacheMetricAttributes {
63
- /** Cache layer (bundled, memory, external) */
64
- layer: 'bundled' | 'memory' | 'external';
65
- /** Operation type (get, set, delete) */
66
- operation?: string;
67
- /** Index signature for additional attributes */
68
- [key: string]: string | number | boolean | undefined;
69
- }
70
-
71
- /**
72
- * GVL fetch metric attributes
73
- */
74
- export interface GvlMetricAttributes {
75
- /** Language code */
76
- language: string;
77
- /** Source of the data (cache, fetch) */
78
- source?: 'cache' | 'fetch';
79
- /** HTTP status code if fetched */
80
- status?: number;
81
- /** Error type if applicable */
82
- errorType?: string;
83
- /** Index signature for additional attributes */
84
- [key: string]: string | number | boolean | undefined;
85
- }
86
-
87
- /**
88
- * C15T Metrics container
89
- * Holds all metric instruments for the c15t backend
90
- */
91
- export interface C15TMetrics {
92
- // Business metrics
93
- readonly consentCreated: Counter;
94
- readonly consentAccepted: Counter;
95
- readonly consentRejected: Counter;
96
- readonly subjectCreated: Counter;
97
- readonly subjectLinked: Counter;
98
- readonly consentCheckCount: Counter;
99
- readonly initCount: Counter;
100
-
101
- // HTTP metrics
102
- readonly httpRequestDuration: Histogram;
103
- readonly httpRequestCount: Counter;
104
- readonly httpErrorCount: Counter;
105
-
106
- // Database metrics
107
- readonly dbQueryDuration: Histogram;
108
- readonly dbQueryCount: Counter;
109
- readonly dbErrorCount: Counter;
110
-
111
- // Cache metrics
112
- readonly cacheHit: Counter;
113
- readonly cacheMiss: Counter;
114
- readonly cacheLatency: Histogram;
115
-
116
- // GVL metrics
117
- readonly gvlFetchDuration: Histogram;
118
- readonly gvlFetchCount: Counter;
119
- readonly gvlFetchError: Counter;
120
-
121
- // Helper methods
122
- recordConsentCreated(attributes: ConsentMetricAttributes): void;
123
- recordConsentAccepted(
124
- attributes: Omit<ConsentMetricAttributes, 'status'>
125
- ): void;
126
- recordConsentRejected(
127
- attributes: Omit<ConsentMetricAttributes, 'status'>
128
- ): void;
129
- recordSubjectCreated(attributes: GeoAttributes & { domain?: string }): void;
130
- recordSubjectLinked(identityProvider?: string): void;
131
- recordConsentCheck(type: string, found: boolean): void;
132
- recordInit(attributes: GeoAttributes): void;
133
- recordHttpRequest(attributes: HttpMetricAttributes, durationMs: number): void;
134
- recordDbQuery(attributes: DbMetricAttributes, durationMs: number): void;
135
- recordDbError(attributes: DbMetricAttributes): void;
136
- recordCacheHit(layer: CacheMetricAttributes['layer']): void;
137
- recordCacheMiss(layer: CacheMetricAttributes['layer']): void;
138
- recordCacheLatency(
139
- attributes: CacheMetricAttributes,
140
- durationMs: number
141
- ): void;
142
- recordGvlFetch(attributes: GvlMetricAttributes, durationMs: number): void;
143
- recordGvlError(attributes: GvlMetricAttributes): void;
144
- }
145
-
146
- /**
147
- * Sanitize attributes - remove undefined values and convert to strings
148
- */
149
- function sanitizeAttributes<
150
- T extends Record<string, string | number | boolean | undefined>,
151
- >(attrs: T): Record<string, string | number | boolean> {
152
- return Object.fromEntries(
153
- Object.entries(attrs).filter(([_, v]) => v !== undefined && v !== null) as [
154
- string,
155
- string | number | boolean,
156
- ][]
157
- );
158
- }
159
-
160
- /**
161
- * Create a C15TMetrics instance from an OpenTelemetry Meter.
162
- *
163
- * @param meter - OpenTelemetry Meter to create instruments from
164
- * @returns C15TMetrics object with all instruments and helper methods
165
- */
166
- function createMetrics(meter: Meter): C15TMetrics {
167
- // Business metrics - High value for c15t
168
- const consentCreated = meter.createCounter('c15t.consent.created', {
169
- description: 'Number of consent submissions',
170
- unit: '1',
171
- });
172
-
173
- const consentAccepted = meter.createCounter('c15t.consent.accepted', {
174
- description: 'Number of consents accepted',
175
- unit: '1',
176
- });
177
-
178
- const consentRejected = meter.createCounter('c15t.consent.rejected', {
179
- description: 'Number of consents rejected',
180
- unit: '1',
181
- });
182
-
183
- const subjectCreated = meter.createCounter('c15t.subject.created', {
184
- description: 'Number of new subjects created',
185
- unit: '1',
186
- });
187
-
188
- const subjectLinked = meter.createCounter('c15t.subject.linked', {
189
- description: 'Number of subjects linked to external ID',
190
- unit: '1',
191
- });
192
-
193
- const consentCheckCount = meter.createCounter('c15t.consent_check.count', {
194
- description: 'Number of cross-device consent checks',
195
- unit: '1',
196
- });
197
-
198
- const initCount = meter.createCounter('c15t.init.count', {
199
- description: 'Number of init endpoint calls',
200
- unit: '1',
201
- });
202
-
203
- // HTTP metrics
204
- const httpRequestDuration = meter.createHistogram(
205
- 'c15t.http.request.duration',
206
- {
207
- description: 'HTTP request latency',
208
- unit: 'ms',
209
- }
210
- );
211
-
212
- const httpRequestCount = meter.createCounter('c15t.http.request.count', {
213
- description: 'Number of HTTP requests',
214
- unit: '1',
215
- });
216
-
217
- const httpErrorCount = meter.createCounter('c15t.http.error.count', {
218
- description: 'Number of HTTP errors',
219
- unit: '1',
220
- });
221
-
222
- // Database metrics
223
- const dbQueryDuration = meter.createHistogram('c15t.db.query.duration', {
224
- description: 'Database query latency',
225
- unit: 'ms',
226
- });
227
-
228
- const dbQueryCount = meter.createCounter('c15t.db.query.count', {
229
- description: 'Number of database queries',
230
- unit: '1',
231
- });
232
-
233
- const dbErrorCount = meter.createCounter('c15t.db.error.count', {
234
- description: 'Number of database errors',
235
- unit: '1',
236
- });
237
-
238
- // Cache metrics
239
- const cacheHit = meter.createCounter('c15t.cache.hit', {
240
- description: 'Number of cache hits',
241
- unit: '1',
242
- });
243
-
244
- const cacheMiss = meter.createCounter('c15t.cache.miss', {
245
- description: 'Number of cache misses',
246
- unit: '1',
247
- });
248
-
249
- const cacheLatency = meter.createHistogram('c15t.cache.latency', {
250
- description: 'Cache operation latency',
251
- unit: 'ms',
252
- });
253
-
254
- // GVL metrics
255
- const gvlFetchDuration = meter.createHistogram('c15t.gvl.fetch.duration', {
256
- description: 'GVL fetch latency',
257
- unit: 'ms',
258
- });
259
-
260
- const gvlFetchCount = meter.createCounter('c15t.gvl.fetch.count', {
261
- description: 'Number of GVL fetches',
262
- unit: '1',
263
- });
264
-
265
- const gvlFetchError = meter.createCounter('c15t.gvl.fetch.error', {
266
- description: 'Number of GVL fetch errors',
267
- unit: '1',
268
- });
269
-
270
- return {
271
- // Instruments
272
- consentCreated,
273
- consentAccepted,
274
- consentRejected,
275
- subjectCreated,
276
- subjectLinked,
277
- consentCheckCount,
278
- initCount,
279
- httpRequestDuration,
280
- httpRequestCount,
281
- httpErrorCount,
282
- dbQueryDuration,
283
- dbQueryCount,
284
- dbErrorCount,
285
- cacheHit,
286
- cacheMiss,
287
- cacheLatency,
288
- gvlFetchDuration,
289
- gvlFetchCount,
290
- gvlFetchError,
291
-
292
- // Helper methods
293
- recordConsentCreated(attributes: ConsentMetricAttributes): void {
294
- consentCreated.add(1, sanitizeAttributes(attributes));
295
- },
296
-
297
- recordConsentAccepted(
298
- attributes: Omit<ConsentMetricAttributes, 'status'>
299
- ): void {
300
- consentAccepted.add(1, sanitizeAttributes(attributes));
301
- },
302
-
303
- recordConsentRejected(
304
- attributes: Omit<ConsentMetricAttributes, 'status'>
305
- ): void {
306
- consentRejected.add(1, sanitizeAttributes(attributes));
307
- },
308
-
309
- recordSubjectCreated(
310
- attributes: GeoAttributes & { domain?: string }
311
- ): void {
312
- subjectCreated.add(1, sanitizeAttributes(attributes));
313
- },
314
-
315
- recordSubjectLinked(identityProvider?: string): void {
316
- subjectLinked.add(1, {
317
- identityProvider: identityProvider || 'unknown',
318
- });
319
- },
320
-
321
- recordConsentCheck(type: string, found: boolean): void {
322
- consentCheckCount.add(1, { type, found: String(found) });
323
- },
324
-
325
- recordInit(attributes: GeoAttributes): void {
326
- initCount.add(1, sanitizeAttributes(attributes));
327
- },
328
-
329
- recordHttpRequest(
330
- attributes: HttpMetricAttributes,
331
- durationMs: number
332
- ): void {
333
- const attrs = sanitizeAttributes(attributes);
334
- httpRequestCount.add(1, attrs);
335
- httpRequestDuration.record(durationMs, attrs);
336
-
337
- if (attributes.status >= 400) {
338
- httpErrorCount.add(1, attrs);
339
- }
340
- },
341
-
342
- recordDbQuery(attributes: DbMetricAttributes, durationMs: number): void {
343
- const attrs = sanitizeAttributes(attributes);
344
- dbQueryCount.add(1, attrs);
345
- dbQueryDuration.record(durationMs, attrs);
346
- },
347
-
348
- recordDbError(attributes: DbMetricAttributes): void {
349
- dbErrorCount.add(1, sanitizeAttributes(attributes));
350
- },
351
-
352
- recordCacheHit(layer: CacheMetricAttributes['layer']): void {
353
- cacheHit.add(1, { layer });
354
- },
355
-
356
- recordCacheMiss(layer: CacheMetricAttributes['layer']): void {
357
- cacheMiss.add(1, { layer });
358
- },
359
-
360
- recordCacheLatency(
361
- attributes: CacheMetricAttributes,
362
- durationMs: number
363
- ): void {
364
- cacheLatency.record(durationMs, sanitizeAttributes(attributes));
365
- },
366
-
367
- recordGvlFetch(attributes: GvlMetricAttributes, durationMs: number): void {
368
- const attrs = sanitizeAttributes(attributes);
369
- gvlFetchCount.add(1, attrs);
370
- gvlFetchDuration.record(durationMs, attrs);
371
- },
372
-
373
- recordGvlError(attributes: GvlMetricAttributes): void {
374
- gvlFetchError.add(1, sanitizeAttributes(attributes));
375
- },
376
- };
377
- }
378
-
379
- // Lazy-initialized metric instances
380
- let metricsInstance: C15TMetrics | null = null;
381
-
382
- /**
383
- * Get or create the metrics instance for the c15t backend.
384
- * Returns null if telemetry is not enabled.
385
- *
386
- * @param options - C15T options for telemetry configuration
387
- * @returns C15TMetrics instance or null if telemetry is disabled
388
- */
389
- export function getMetrics(options?: C15TOptions): C15TMetrics | null {
390
- if (metricsInstance) return metricsInstance;
391
- if (!isTelemetryEnabled(options)) return null;
392
-
393
- metricsInstance = createMetrics(getMeter(options));
394
- return metricsInstance;
395
- }
396
-
397
- /**
398
- * Reset the metrics instance (useful for testing)
399
- */
400
- export function resetMetrics(): void {
401
- metricsInstance = null;
402
- }