@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.
Files changed (336) hide show
  1. package/README.md +3 -3
  2. package/dist/302.js +473 -0
  3. package/dist/583.js +540 -0
  4. package/dist/915.js +1771 -0
  5. package/dist/cache.cjs +5 -5
  6. package/dist/cache.js +4 -415
  7. package/dist/core.cjs +1356 -120
  8. package/dist/core.js +163 -1981
  9. package/dist/db/adapters/drizzle.cjs +1 -1
  10. package/dist/db/adapters/drizzle.js +1 -2
  11. package/dist/db/adapters/kysely.cjs +1 -1
  12. package/dist/db/adapters/kysely.js +1 -2
  13. package/dist/db/adapters/mongo.cjs +1 -1
  14. package/dist/db/adapters/mongo.js +1 -2
  15. package/dist/db/adapters/prisma.cjs +1 -1
  16. package/dist/db/adapters/prisma.js +1 -2
  17. package/dist/db/adapters/typeorm.cjs +1 -1
  18. package/dist/db/adapters/typeorm.js +1 -2
  19. package/dist/db/adapters.cjs +1 -1
  20. package/dist/db/migrator.cjs +1 -1
  21. package/dist/db/schema.cjs +43 -3
  22. package/dist/db/schema.js +35 -4
  23. package/dist/define-config.cjs +1 -1
  24. package/dist/edge.cjs +1106 -0
  25. package/dist/edge.js +190 -0
  26. package/dist/router.cjs +885 -123
  27. package/dist/router.js +1 -1507
  28. package/dist/{types.cjs → types/index.cjs} +1 -1
  29. package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
  30. package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
  31. package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
  32. package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
  33. package/{dist → dist-types}/cache/gvl-resolver.d.ts +0 -1
  34. package/{dist → dist-types}/cache/index.d.ts +0 -1
  35. package/{dist → dist-types}/cache/keys.d.ts +0 -1
  36. package/{dist → dist-types}/cache/types.d.ts +0 -1
  37. package/{dist → dist-types}/core.d.ts +8 -1
  38. package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
  39. package/dist-types/db/registry/consent-policy.d.ts +78 -0
  40. package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
  41. package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
  42. package/dist-types/db/registry/index.d.ts +118 -0
  43. package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
  44. package/{dist → dist-types}/db/registry/subject.d.ts +0 -2
  45. package/{dist → dist-types}/db/registry/types.d.ts +1 -1
  46. package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
  47. package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
  48. package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
  49. package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
  50. package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
  51. package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
  52. package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
  53. package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
  54. package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -32
  55. package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -2
  56. package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
  57. package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +3 -3
  58. package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
  59. package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +7 -2
  60. package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
  61. package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +455 -28
  62. package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
  63. package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -3
  64. package/{dist → dist-types}/db/schema/index.d.ts +908 -86
  65. package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
  66. package/dist-types/define-config.d.ts +17 -0
  67. package/dist-types/edge/index.d.ts +5 -0
  68. package/dist-types/edge/init-handler.d.ts +40 -0
  69. package/dist-types/edge/resolve-consent.d.ts +80 -0
  70. package/dist-types/edge/types.d.ts +13 -0
  71. package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
  72. package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
  73. package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
  74. package/{dist → dist-types}/handlers/init/index.d.ts +2 -3
  75. package/dist-types/handlers/init/policy.d.ts +26 -0
  76. package/dist-types/handlers/init/resolve-init.d.ts +44 -0
  77. package/dist-types/handlers/init/translations.d.ts +48 -0
  78. package/dist-types/handlers/legal-document/current.handler.d.ts +11 -0
  79. package/dist-types/handlers/legal-document/snapshot.d.ts +39 -0
  80. package/dist-types/handlers/policy/snapshot.d.ts +99 -0
  81. package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
  82. package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
  83. package/{dist → dist-types}/handlers/subject/get.handler.d.ts +3 -2
  84. package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
  85. package/{dist → dist-types}/handlers/subject/list.handler.d.ts +3 -2
  86. package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -2
  87. package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
  88. package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +3 -1
  89. package/{dist → dist-types}/init.d.ts +4 -7
  90. package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
  91. package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
  92. package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
  93. package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
  94. package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +0 -1
  95. package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
  96. package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
  97. package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
  98. package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
  99. package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
  100. package/dist-types/policies/builder.d.ts +127 -0
  101. package/dist-types/policies/defaults.d.ts +2 -0
  102. package/dist-types/policies/matchers.d.ts +3 -0
  103. package/{dist → dist-types}/router.d.ts +0 -1
  104. package/{dist → dist-types}/routes/consent.d.ts +0 -1
  105. package/{dist → dist-types}/routes/index.d.ts +1 -1
  106. package/{dist → dist-types}/routes/init.d.ts +0 -1
  107. package/dist-types/routes/legal-document.d.ts +7 -0
  108. package/{dist → dist-types}/routes/status.d.ts +0 -1
  109. package/{dist → dist-types}/routes/subject.d.ts +0 -1
  110. package/{dist → dist-types}/types/api.d.ts +0 -1
  111. package/dist-types/types/index.d.ts +464 -0
  112. package/dist-types/utils/background.d.ts +6 -0
  113. package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
  114. package/{dist → dist-types}/utils/env.d.ts +0 -1
  115. package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
  116. package/{dist → dist-types}/utils/instrumentation.d.ts +2 -3
  117. package/{dist → dist-types}/utils/logger.d.ts +0 -1
  118. package/{dist → dist-types}/utils/metrics.d.ts +0 -1
  119. package/dist-types/version.d.ts +1 -0
  120. package/docs/README.md +49 -0
  121. package/docs/api/configuration.md +208 -0
  122. package/docs/api/endpoints.md +211 -0
  123. package/docs/guides/caching.md +85 -0
  124. package/docs/guides/database-setup.md +128 -0
  125. package/docs/guides/edge-deployment.md +251 -0
  126. package/docs/guides/framework-integration.md +142 -0
  127. package/docs/guides/iab-tcf.md +89 -0
  128. package/docs/guides/observability.md +96 -0
  129. package/docs/guides/policy-packs.md +396 -0
  130. package/docs/quickstart.md +129 -0
  131. package/package.json +51 -37
  132. package/.turbo/turbo-build.log +0 -49
  133. package/CHANGELOG.md +0 -99
  134. package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
  135. package/dist/cache/adapters/index.d.ts.map +0 -1
  136. package/dist/cache/adapters/memory.d.ts.map +0 -1
  137. package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
  138. package/dist/cache/gvl-resolver.d.ts.map +0 -1
  139. package/dist/cache/index.d.ts.map +0 -1
  140. package/dist/cache/keys.d.ts.map +0 -1
  141. package/dist/cache/types.d.ts.map +0 -1
  142. package/dist/core.d.ts.map +0 -1
  143. package/dist/db/adapters/drizzle.d.ts +0 -2
  144. package/dist/db/adapters/drizzle.d.ts.map +0 -1
  145. package/dist/db/adapters/index.d.ts +0 -2
  146. package/dist/db/adapters/index.d.ts.map +0 -1
  147. package/dist/db/adapters/kysely.d.ts +0 -2
  148. package/dist/db/adapters/kysely.d.ts.map +0 -1
  149. package/dist/db/adapters/mongo.d.ts +0 -2
  150. package/dist/db/adapters/mongo.d.ts.map +0 -1
  151. package/dist/db/adapters/prisma.d.ts +0 -2
  152. package/dist/db/adapters/prisma.d.ts.map +0 -1
  153. package/dist/db/adapters/typeorm.d.ts +0 -2
  154. package/dist/db/adapters/typeorm.d.ts.map +0 -1
  155. package/dist/db/migrator/index.d.ts.map +0 -1
  156. package/dist/db/registry/consent-policy.d.ts +0 -23
  157. package/dist/db/registry/consent-policy.d.ts.map +0 -1
  158. package/dist/db/registry/consent-purpose.d.ts.map +0 -1
  159. package/dist/db/registry/domain.d.ts.map +0 -1
  160. package/dist/db/registry/index.d.ts +0 -57
  161. package/dist/db/registry/index.d.ts.map +0 -1
  162. package/dist/db/registry/subject.d.ts.map +0 -1
  163. package/dist/db/registry/types.d.ts.map +0 -1
  164. package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
  165. package/dist/db/registry/utils.d.ts.map +0 -1
  166. package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
  167. package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
  168. package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
  169. package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
  170. package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
  171. package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
  172. package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
  173. package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
  174. package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
  175. package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
  176. package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
  177. package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
  178. package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
  179. package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
  180. package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
  181. package/dist/db/schema/index.d.ts.map +0 -1
  182. package/dist/db/tenant-scope.d.ts.map +0 -1
  183. package/dist/define-config.d.ts +0 -5
  184. package/dist/define-config.d.ts.map +0 -1
  185. package/dist/handlers/consent/check.handler.d.ts.map +0 -1
  186. package/dist/handlers/consent/index.d.ts +0 -12
  187. package/dist/handlers/consent/index.d.ts.map +0 -1
  188. package/dist/handlers/init/geo.d.ts.map +0 -1
  189. package/dist/handlers/init/index.d.ts.map +0 -1
  190. package/dist/handlers/init/translations.d.ts +0 -28
  191. package/dist/handlers/init/translations.d.ts.map +0 -1
  192. package/dist/handlers/status/index.d.ts +0 -7
  193. package/dist/handlers/status/index.d.ts.map +0 -1
  194. package/dist/handlers/status/status.handler.d.ts.map +0 -1
  195. package/dist/handlers/subject/get.handler.d.ts.map +0 -1
  196. package/dist/handlers/subject/index.d.ts +0 -10
  197. package/dist/handlers/subject/index.d.ts.map +0 -1
  198. package/dist/handlers/subject/list.handler.d.ts.map +0 -1
  199. package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
  200. package/dist/handlers/subject/post.handler.d.ts.map +0 -1
  201. package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
  202. package/dist/init.d.ts.map +0 -1
  203. package/dist/middleware/auth/index.d.ts.map +0 -1
  204. package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
  205. package/dist/middleware/cors/cors.d.ts.map +0 -1
  206. package/dist/middleware/cors/index.d.ts +0 -30
  207. package/dist/middleware/cors/index.d.ts.map +0 -1
  208. package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
  209. package/dist/middleware/cors/process-cors.d.ts.map +0 -1
  210. package/dist/middleware/openapi/config.d.ts.map +0 -1
  211. package/dist/middleware/openapi/handlers.d.ts.map +0 -1
  212. package/dist/middleware/openapi/index.d.ts +0 -12
  213. package/dist/middleware/openapi/index.d.ts.map +0 -1
  214. package/dist/middleware/process-ip/index.d.ts.map +0 -1
  215. package/dist/router.d.ts.map +0 -1
  216. package/dist/routes/consent.d.ts.map +0 -1
  217. package/dist/routes/index.d.ts.map +0 -1
  218. package/dist/routes/init.d.ts.map +0 -1
  219. package/dist/routes/status.d.ts.map +0 -1
  220. package/dist/routes/subject.d.ts.map +0 -1
  221. package/dist/types/api.d.ts.map +0 -1
  222. package/dist/types/index.d.ts +0 -255
  223. package/dist/types/index.d.ts.map +0 -1
  224. package/dist/utils/create-telemetry-options.d.ts.map +0 -1
  225. package/dist/utils/env.d.ts.map +0 -1
  226. package/dist/utils/extract-error-message.d.ts.map +0 -1
  227. package/dist/utils/index.d.ts +0 -4
  228. package/dist/utils/index.d.ts.map +0 -1
  229. package/dist/utils/instrumentation.d.ts.map +0 -1
  230. package/dist/utils/logger.d.ts.map +0 -1
  231. package/dist/utils/metrics.d.ts.map +0 -1
  232. package/dist/version.d.ts +0 -2
  233. package/dist/version.d.ts.map +0 -1
  234. package/knip.json +0 -31
  235. package/rslib.config.ts +0 -93
  236. package/src/cache/adapters/cloudflare-kv.ts +0 -71
  237. package/src/cache/adapters/index.ts +0 -22
  238. package/src/cache/adapters/memory.ts +0 -111
  239. package/src/cache/adapters/upstash-redis.ts +0 -113
  240. package/src/cache/gvl-resolver.ts +0 -289
  241. package/src/cache/index.ts +0 -34
  242. package/src/cache/keys.ts +0 -68
  243. package/src/cache/types.ts +0 -66
  244. package/src/core.ts +0 -368
  245. package/src/db/migrator/index.ts +0 -80
  246. package/src/db/registry/consent-policy.test.ts +0 -451
  247. package/src/db/registry/consent-policy.ts +0 -82
  248. package/src/db/registry/consent-purpose.test.ts +0 -428
  249. package/src/db/registry/consent-purpose.ts +0 -61
  250. package/src/db/registry/domain.test.ts +0 -445
  251. package/src/db/registry/domain.ts +0 -91
  252. package/src/db/registry/index.ts +0 -14
  253. package/src/db/registry/subject.test.ts +0 -388
  254. package/src/db/registry/subject.ts +0 -129
  255. package/src/db/registry/types.ts +0 -10
  256. package/src/db/registry/utils/generate-id.test.ts +0 -216
  257. package/src/db/registry/utils/generate-id.ts +0 -133
  258. package/src/db/registry/utils.ts +0 -133
  259. package/src/db/schema/1.0.0/audit-log.ts +0 -15
  260. package/src/db/schema/1.0.0/consent-policy.ts +0 -14
  261. package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
  262. package/src/db/schema/1.0.0/consent-record.ts +0 -10
  263. package/src/db/schema/1.0.0/consent.ts +0 -20
  264. package/src/db/schema/1.0.0/domain.ts +0 -12
  265. package/src/db/schema/1.0.0/index.ts +0 -48
  266. package/src/db/schema/1.0.0/subject.ts +0 -12
  267. package/src/db/schema/2.0.0/audit-log.ts +0 -18
  268. package/src/db/schema/2.0.0/consent-policy.ts +0 -28
  269. package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
  270. package/src/db/schema/2.0.0/consent.ts +0 -26
  271. package/src/db/schema/2.0.0/domain.ts +0 -12
  272. package/src/db/schema/2.0.0/index.ts +0 -47
  273. package/src/db/schema/2.0.0/subject.ts +0 -14
  274. package/src/db/schema/index.ts +0 -15
  275. package/src/db/tenant-scope.test.ts +0 -750
  276. package/src/db/tenant-scope.ts +0 -103
  277. package/src/define-config.ts +0 -5
  278. package/src/handlers/consent/check.handler.ts +0 -126
  279. package/src/handlers/init/geo.test.ts +0 -317
  280. package/src/handlers/init/geo.ts +0 -195
  281. package/src/handlers/init/index.test.ts +0 -205
  282. package/src/handlers/init/index.ts +0 -114
  283. package/src/handlers/init/translations.test.ts +0 -121
  284. package/src/handlers/init/translations.ts +0 -72
  285. package/src/handlers/status/status.handler.test.ts +0 -155
  286. package/src/handlers/status/status.handler.ts +0 -51
  287. package/src/handlers/subject/get.handler.ts +0 -93
  288. package/src/handlers/subject/list.handler.ts +0 -93
  289. package/src/handlers/subject/patch.handler.ts +0 -122
  290. package/src/handlers/subject/post.handler.test.ts +0 -294
  291. package/src/handlers/subject/post.handler.ts +0 -254
  292. package/src/handlers/utils/consent-enrichment.test.ts +0 -380
  293. package/src/handlers/utils/consent-enrichment.ts +0 -218
  294. package/src/init.test.ts +0 -126
  295. package/src/init.ts +0 -87
  296. package/src/middleware/auth/index.ts +0 -11
  297. package/src/middleware/auth/validate-api-key.test.ts +0 -86
  298. package/src/middleware/auth/validate-api-key.ts +0 -107
  299. package/src/middleware/cors/cors.test.ts +0 -135
  300. package/src/middleware/cors/cors.ts +0 -186
  301. package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
  302. package/src/middleware/cors/is-origin-trusted.ts +0 -130
  303. package/src/middleware/cors/process-cors.ts +0 -91
  304. package/src/middleware/openapi/config.ts +0 -29
  305. package/src/middleware/openapi/handlers.ts +0 -34
  306. package/src/middleware/process-ip/index.test.ts +0 -195
  307. package/src/middleware/process-ip/index.ts +0 -199
  308. package/src/router.ts +0 -15
  309. package/src/routes/consent.ts +0 -52
  310. package/src/routes/index.ts +0 -10
  311. package/src/routes/init.ts +0 -102
  312. package/src/routes/status.ts +0 -46
  313. package/src/routes/subject.ts +0 -152
  314. package/src/types/api.ts +0 -48
  315. package/src/types/index.ts +0 -288
  316. package/src/utils/create-telemetry-options.test.ts +0 -302
  317. package/src/utils/create-telemetry-options.ts +0 -229
  318. package/src/utils/env.ts +0 -84
  319. package/src/utils/extract-error-message.ts +0 -21
  320. package/src/utils/instrumentation.test.ts +0 -185
  321. package/src/utils/instrumentation.ts +0 -196
  322. package/src/utils/logger.ts +0 -41
  323. package/src/utils/metrics.test.ts +0 -323
  324. package/src/utils/metrics.ts +0 -402
  325. package/src/utils/telemetry-pii.test.ts +0 -325
  326. package/src/version.ts +0 -2
  327. package/tsconfig.json +0 -11
  328. package/vitest.config.ts +0 -28
  329. /package/dist/{types.js → types/index.js} +0 -0
  330. /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
  331. /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
  332. /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
  333. /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
  334. /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
  335. /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
  336. /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
- }