@c15t/backend 2.0.0-rc.4 → 2.0.0-rc.6

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 (327) hide show
  1. package/dist/302.js +473 -0
  2. package/dist/364.js +1140 -0
  3. package/dist/583.js +540 -0
  4. package/dist/cache.cjs +1 -1
  5. package/dist/cache.js +4 -415
  6. package/dist/core.cjs +849 -96
  7. package/dist/core.js +147 -1817
  8. package/dist/db/adapters/drizzle.cjs +1 -1
  9. package/dist/db/adapters/drizzle.js +1 -2
  10. package/dist/db/adapters/kysely.cjs +1 -1
  11. package/dist/db/adapters/kysely.js +1 -2
  12. package/dist/db/adapters/mongo.cjs +1 -1
  13. package/dist/db/adapters/mongo.js +1 -2
  14. package/dist/db/adapters/prisma.cjs +1 -1
  15. package/dist/db/adapters/prisma.js +1 -2
  16. package/dist/db/adapters/typeorm.cjs +1 -1
  17. package/dist/db/adapters/typeorm.js +1 -2
  18. package/dist/db/adapters.cjs +1 -1
  19. package/dist/db/migrator.cjs +1 -1
  20. package/dist/db/schema.cjs +38 -1
  21. package/dist/db/schema.js +33 -2
  22. package/dist/define-config.cjs +1 -1
  23. package/dist/edge.cjs +1106 -0
  24. package/dist/edge.js +190 -0
  25. package/dist/router.cjs +629 -81
  26. package/dist/router.js +1 -1509
  27. package/dist/types/index.cjs +1 -1
  28. package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
  29. package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
  30. package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
  31. package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
  32. package/{dist → dist-types}/cache/gvl-resolver.d.ts +1 -2
  33. package/{dist → dist-types}/cache/index.d.ts +0 -1
  34. package/{dist → dist-types}/cache/keys.d.ts +0 -1
  35. package/{dist → dist-types}/cache/types.d.ts +0 -1
  36. package/{dist → dist-types}/core.d.ts +8 -1
  37. package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
  38. package/{dist → dist-types}/db/registry/consent-policy.d.ts +0 -1
  39. package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
  40. package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
  41. package/{dist → dist-types}/db/registry/index.d.ts +22 -2
  42. package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
  43. package/{dist → dist-types}/db/registry/subject.d.ts +0 -1
  44. package/{dist → dist-types}/db/registry/types.d.ts +1 -2
  45. package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
  46. package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
  47. package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
  48. package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
  49. package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
  50. package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
  51. package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +2 -3
  52. package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
  53. package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -1
  54. package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -1
  55. package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +2 -3
  56. package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +2 -3
  57. package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +2 -3
  58. package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +6 -3
  59. package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +2 -3
  60. package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +432 -17
  61. package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
  62. package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +2 -3
  63. package/{dist → dist-types}/db/schema/index.d.ts +862 -33
  64. package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
  65. package/{dist → dist-types}/define-config.d.ts +0 -1
  66. package/dist-types/edge/index.d.ts +5 -0
  67. package/dist-types/edge/init-handler.d.ts +38 -0
  68. package/dist-types/edge/resolve-consent.d.ts +80 -0
  69. package/dist-types/edge/types.d.ts +13 -0
  70. package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
  71. package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
  72. package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
  73. package/{dist → dist-types}/handlers/init/index.d.ts +4 -5
  74. package/dist-types/handlers/init/policy.d.ts +26 -0
  75. package/dist-types/handlers/init/resolve-init.d.ts +44 -0
  76. package/dist-types/handlers/init/translations.d.ts +48 -0
  77. package/dist-types/handlers/policy/snapshot.d.ts +99 -0
  78. package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
  79. package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
  80. package/{dist → dist-types}/handlers/subject/get.handler.d.ts +0 -1
  81. package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
  82. package/{dist → dist-types}/handlers/subject/list.handler.d.ts +0 -1
  83. package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -1
  84. package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
  85. package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +0 -1
  86. package/{dist → dist-types}/init.d.ts +0 -1
  87. package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
  88. package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
  89. package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
  90. package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
  91. package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +1 -2
  92. package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
  93. package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
  94. package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
  95. package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
  96. package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
  97. package/dist-types/policies/builder.d.ts +127 -0
  98. package/dist-types/policies/defaults.d.ts +2 -0
  99. package/dist-types/policies/matchers.d.ts +3 -0
  100. package/{dist → dist-types}/router.d.ts +0 -1
  101. package/{dist → dist-types}/routes/consent.d.ts +0 -1
  102. package/{src/routes/index.ts → dist-types/routes/index.d.ts} +0 -1
  103. package/{dist → dist-types}/routes/init.d.ts +0 -1
  104. package/{dist → dist-types}/routes/status.d.ts +0 -1
  105. package/{dist → dist-types}/routes/subject.d.ts +0 -1
  106. package/{dist → dist-types}/types/api.d.ts +0 -1
  107. package/{dist → dist-types}/types/index.d.ts +110 -6
  108. package/dist-types/utils/background.d.ts +6 -0
  109. package/{dist → dist-types}/utils/create-telemetry-options.d.ts +0 -1
  110. package/{dist → dist-types}/utils/env.d.ts +0 -1
  111. package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
  112. package/{dist → dist-types}/utils/instrumentation.d.ts +0 -1
  113. package/{dist → dist-types}/utils/logger.d.ts +1 -2
  114. package/{dist → dist-types}/utils/metrics.d.ts +0 -1
  115. package/dist-types/version.d.ts +1 -0
  116. package/docs/README.md +49 -0
  117. package/docs/api/configuration.md +197 -0
  118. package/docs/api/endpoints.md +211 -0
  119. package/docs/guides/caching.md +85 -0
  120. package/docs/guides/database-setup.md +128 -0
  121. package/docs/guides/edge-deployment.md +248 -0
  122. package/docs/guides/framework-integration.md +142 -0
  123. package/docs/guides/iab-tcf.md +89 -0
  124. package/docs/guides/observability.md +96 -0
  125. package/docs/guides/policy-packs.md +396 -0
  126. package/docs/quickstart.md +129 -0
  127. package/package.json +45 -31
  128. package/.turbo/turbo-build.log +0 -49
  129. package/CHANGELOG.md +0 -123
  130. package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
  131. package/dist/cache/adapters/index.d.ts.map +0 -1
  132. package/dist/cache/adapters/memory.d.ts.map +0 -1
  133. package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
  134. package/dist/cache/gvl-resolver.d.ts.map +0 -1
  135. package/dist/cache/index.d.ts.map +0 -1
  136. package/dist/cache/keys.d.ts.map +0 -1
  137. package/dist/cache/types.d.ts.map +0 -1
  138. package/dist/core.d.ts.map +0 -1
  139. package/dist/db/adapters/drizzle.d.ts +0 -2
  140. package/dist/db/adapters/drizzle.d.ts.map +0 -1
  141. package/dist/db/adapters/index.d.ts +0 -2
  142. package/dist/db/adapters/index.d.ts.map +0 -1
  143. package/dist/db/adapters/kysely.d.ts +0 -2
  144. package/dist/db/adapters/kysely.d.ts.map +0 -1
  145. package/dist/db/adapters/mongo.d.ts +0 -2
  146. package/dist/db/adapters/mongo.d.ts.map +0 -1
  147. package/dist/db/adapters/prisma.d.ts +0 -2
  148. package/dist/db/adapters/prisma.d.ts.map +0 -1
  149. package/dist/db/adapters/typeorm.d.ts +0 -2
  150. package/dist/db/adapters/typeorm.d.ts.map +0 -1
  151. package/dist/db/migrator/index.d.ts.map +0 -1
  152. package/dist/db/registry/consent-policy.d.ts.map +0 -1
  153. package/dist/db/registry/consent-purpose.d.ts.map +0 -1
  154. package/dist/db/registry/domain.d.ts.map +0 -1
  155. package/dist/db/registry/index.d.ts.map +0 -1
  156. package/dist/db/registry/subject.d.ts.map +0 -1
  157. package/dist/db/registry/types.d.ts.map +0 -1
  158. package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
  159. package/dist/db/registry/utils.d.ts.map +0 -1
  160. package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
  161. package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
  162. package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
  163. package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
  164. package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
  165. package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
  166. package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
  167. package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
  168. package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
  169. package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
  170. package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
  171. package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
  172. package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
  173. package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
  174. package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
  175. package/dist/db/schema/index.d.ts.map +0 -1
  176. package/dist/db/tenant-scope.d.ts.map +0 -1
  177. package/dist/define-config.d.ts.map +0 -1
  178. package/dist/handlers/consent/check.handler.d.ts.map +0 -1
  179. package/dist/handlers/consent/index.d.ts +0 -12
  180. package/dist/handlers/consent/index.d.ts.map +0 -1
  181. package/dist/handlers/init/geo.d.ts.map +0 -1
  182. package/dist/handlers/init/index.d.ts.map +0 -1
  183. package/dist/handlers/init/translations.d.ts +0 -26
  184. package/dist/handlers/init/translations.d.ts.map +0 -1
  185. package/dist/handlers/status/index.d.ts +0 -7
  186. package/dist/handlers/status/index.d.ts.map +0 -1
  187. package/dist/handlers/status/status.handler.d.ts.map +0 -1
  188. package/dist/handlers/subject/get.handler.d.ts.map +0 -1
  189. package/dist/handlers/subject/index.d.ts +0 -10
  190. package/dist/handlers/subject/index.d.ts.map +0 -1
  191. package/dist/handlers/subject/list.handler.d.ts.map +0 -1
  192. package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
  193. package/dist/handlers/subject/post.handler.d.ts.map +0 -1
  194. package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
  195. package/dist/init.d.ts.map +0 -1
  196. package/dist/middleware/auth/index.d.ts.map +0 -1
  197. package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
  198. package/dist/middleware/cors/cors.d.ts.map +0 -1
  199. package/dist/middleware/cors/index.d.ts +0 -30
  200. package/dist/middleware/cors/index.d.ts.map +0 -1
  201. package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
  202. package/dist/middleware/cors/process-cors.d.ts.map +0 -1
  203. package/dist/middleware/openapi/config.d.ts.map +0 -1
  204. package/dist/middleware/openapi/handlers.d.ts.map +0 -1
  205. package/dist/middleware/openapi/index.d.ts +0 -12
  206. package/dist/middleware/openapi/index.d.ts.map +0 -1
  207. package/dist/middleware/process-ip/index.d.ts.map +0 -1
  208. package/dist/router.d.ts.map +0 -1
  209. package/dist/routes/consent.d.ts.map +0 -1
  210. package/dist/routes/index.d.ts +0 -10
  211. package/dist/routes/index.d.ts.map +0 -1
  212. package/dist/routes/init.d.ts.map +0 -1
  213. package/dist/routes/status.d.ts.map +0 -1
  214. package/dist/routes/subject.d.ts.map +0 -1
  215. package/dist/types/api.d.ts.map +0 -1
  216. package/dist/types/index.d.ts.map +0 -1
  217. package/dist/utils/create-telemetry-options.d.ts.map +0 -1
  218. package/dist/utils/env.d.ts.map +0 -1
  219. package/dist/utils/extract-error-message.d.ts.map +0 -1
  220. package/dist/utils/index.d.ts +0 -4
  221. package/dist/utils/index.d.ts.map +0 -1
  222. package/dist/utils/instrumentation.d.ts.map +0 -1
  223. package/dist/utils/logger.d.ts.map +0 -1
  224. package/dist/utils/metrics.d.ts.map +0 -1
  225. package/dist/version.d.ts +0 -2
  226. package/dist/version.d.ts.map +0 -1
  227. package/knip.json +0 -31
  228. package/rslib.config.ts +0 -93
  229. package/src/cache/adapters/cloudflare-kv.ts +0 -71
  230. package/src/cache/adapters/index.ts +0 -22
  231. package/src/cache/adapters/memory.ts +0 -111
  232. package/src/cache/adapters/upstash-redis.ts +0 -113
  233. package/src/cache/gvl-resolver.ts +0 -289
  234. package/src/cache/index.ts +0 -34
  235. package/src/cache/keys.ts +0 -68
  236. package/src/cache/types.ts +0 -66
  237. package/src/core.ts +0 -369
  238. package/src/db/migrator/index.ts +0 -80
  239. package/src/db/registry/consent-policy.test.ts +0 -451
  240. package/src/db/registry/consent-policy.ts +0 -82
  241. package/src/db/registry/consent-purpose.test.ts +0 -428
  242. package/src/db/registry/consent-purpose.ts +0 -61
  243. package/src/db/registry/domain.test.ts +0 -445
  244. package/src/db/registry/domain.ts +0 -91
  245. package/src/db/registry/index.ts +0 -14
  246. package/src/db/registry/subject.test.ts +0 -371
  247. package/src/db/registry/subject.ts +0 -126
  248. package/src/db/registry/types.ts +0 -10
  249. package/src/db/registry/utils/generate-id.test.ts +0 -216
  250. package/src/db/registry/utils/generate-id.ts +0 -133
  251. package/src/db/registry/utils.ts +0 -133
  252. package/src/db/schema/1.0.0/audit-log.ts +0 -15
  253. package/src/db/schema/1.0.0/consent-policy.ts +0 -14
  254. package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
  255. package/src/db/schema/1.0.0/consent-record.ts +0 -10
  256. package/src/db/schema/1.0.0/consent.ts +0 -20
  257. package/src/db/schema/1.0.0/domain.ts +0 -12
  258. package/src/db/schema/1.0.0/index.ts +0 -48
  259. package/src/db/schema/1.0.0/subject.ts +0 -11
  260. package/src/db/schema/2.0.0/audit-log.ts +0 -18
  261. package/src/db/schema/2.0.0/consent-policy.ts +0 -28
  262. package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
  263. package/src/db/schema/2.0.0/consent.ts +0 -28
  264. package/src/db/schema/2.0.0/domain.ts +0 -12
  265. package/src/db/schema/2.0.0/index.ts +0 -47
  266. package/src/db/schema/2.0.0/subject.ts +0 -13
  267. package/src/db/schema/index.ts +0 -15
  268. package/src/db/tenant-scope.test.ts +0 -747
  269. package/src/db/tenant-scope.ts +0 -103
  270. package/src/define-config.ts +0 -19
  271. package/src/handlers/consent/check.handler.ts +0 -126
  272. package/src/handlers/init/geo.test.ts +0 -317
  273. package/src/handlers/init/geo.ts +0 -195
  274. package/src/handlers/init/index.test.ts +0 -205
  275. package/src/handlers/init/index.ts +0 -114
  276. package/src/handlers/init/translations.test.ts +0 -121
  277. package/src/handlers/init/translations.ts +0 -69
  278. package/src/handlers/status/status.handler.test.ts +0 -155
  279. package/src/handlers/status/status.handler.ts +0 -51
  280. package/src/handlers/subject/get.handler.ts +0 -92
  281. package/src/handlers/subject/list.handler.ts +0 -92
  282. package/src/handlers/subject/patch.handler.ts +0 -119
  283. package/src/handlers/subject/post.handler.test.ts +0 -294
  284. package/src/handlers/subject/post.handler.ts +0 -268
  285. package/src/handlers/utils/consent-enrichment.test.ts +0 -380
  286. package/src/handlers/utils/consent-enrichment.ts +0 -218
  287. package/src/init.test.ts +0 -122
  288. package/src/init.ts +0 -88
  289. package/src/middleware/auth/index.ts +0 -11
  290. package/src/middleware/auth/validate-api-key.test.ts +0 -86
  291. package/src/middleware/auth/validate-api-key.ts +0 -107
  292. package/src/middleware/cors/cors.test.ts +0 -135
  293. package/src/middleware/cors/cors.ts +0 -186
  294. package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
  295. package/src/middleware/cors/is-origin-trusted.ts +0 -130
  296. package/src/middleware/cors/process-cors.ts +0 -91
  297. package/src/middleware/openapi/config.ts +0 -29
  298. package/src/middleware/openapi/handlers.ts +0 -34
  299. package/src/middleware/process-ip/index.test.ts +0 -193
  300. package/src/middleware/process-ip/index.ts +0 -199
  301. package/src/router.ts +0 -15
  302. package/src/routes/consent.ts +0 -52
  303. package/src/routes/init.ts +0 -105
  304. package/src/routes/status.ts +0 -46
  305. package/src/routes/subject.ts +0 -152
  306. package/src/types/api.ts +0 -48
  307. package/src/types/index.ts +0 -391
  308. package/src/utils/create-telemetry-options.test.ts +0 -286
  309. package/src/utils/create-telemetry-options.ts +0 -229
  310. package/src/utils/env.ts +0 -84
  311. package/src/utils/extract-error-message.ts +0 -21
  312. package/src/utils/instrumentation.test.ts +0 -183
  313. package/src/utils/instrumentation.ts +0 -194
  314. package/src/utils/logger.ts +0 -41
  315. package/src/utils/metrics.test.ts +0 -311
  316. package/src/utils/metrics.ts +0 -402
  317. package/src/utils/telemetry-pii.test.ts +0 -323
  318. package/src/version.ts +0 -2
  319. package/tsconfig.json +0 -11
  320. package/vitest.config.ts +0 -28
  321. /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
  322. /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
  323. /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
  324. /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
  325. /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
  326. /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
  327. /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
@@ -1,41 +0,0 @@
1
- import { createLogger, type LoggerOptions } from '@c15t/logger';
2
- import { getTraceContext } from './create-telemetry-options';
3
-
4
- let globalLogger: ReturnType<typeof createLogger>;
5
-
6
- /**
7
- * Gets or creates a global logger instance
8
- *
9
- * @param options - Optional logger configuration options
10
- * @returns The global logger instance
11
- */
12
- export function getLogger(
13
- options?: LoggerOptions
14
- ): ReturnType<typeof createLogger> {
15
- if (!globalLogger) {
16
- globalLogger = createLogger({
17
- level: 'info',
18
- appName: 'c15t',
19
- getTraceContext,
20
- ...options,
21
- });
22
- }
23
- return globalLogger;
24
- }
25
-
26
- /**
27
- * Initializes the global logger with specific options
28
- *
29
- * @param options - Logger configuration options
30
- * @returns The initialized global logger instance
31
- */
32
- export function initLogger(
33
- options: LoggerOptions
34
- ): ReturnType<typeof createLogger> {
35
- globalLogger = createLogger({
36
- ...options,
37
- // Always include trace context for log correlation
38
- getTraceContext,
39
- });
40
- return globalLogger;
41
- }
@@ -1,311 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import type { C15TOptions } from '../types';
3
- import { type C15TMetrics, getMetrics, resetMetrics } from './metrics';
4
-
5
- // Mock the telemetry options
6
- vi.mock('./create-telemetry-options', () => ({
7
- isTelemetryEnabled: vi.fn((options) => options?.telemetry?.enabled === true),
8
- getMeter: vi.fn(() => ({
9
- createCounter: vi.fn(() => ({
10
- add: vi.fn(),
11
- })),
12
- createHistogram: vi.fn(() => ({
13
- record: vi.fn(),
14
- })),
15
- })),
16
- }));
17
-
18
- afterEach(() => {
19
- resetMetrics();
20
- vi.clearAllMocks();
21
- });
22
-
23
- describe('getMetrics', () => {
24
- it('returns null when telemetry is disabled', () => {
25
- const options: C15TOptions = {
26
- trustedOrigins: [],
27
- adapter: {} as C15TOptions['adapter'],
28
- };
29
-
30
- const metrics = getMetrics(options);
31
-
32
- expect(metrics).toBeNull();
33
- });
34
-
35
- it('returns C15TMetrics instance when telemetry is enabled', () => {
36
- const options: C15TOptions = {
37
- trustedOrigins: [],
38
- adapter: {} as C15TOptions['adapter'],
39
- telemetry: {
40
- enabled: true,
41
- },
42
- };
43
-
44
- const metrics = getMetrics(options);
45
-
46
- expect(metrics).toHaveProperty('recordHttpRequest');
47
- });
48
-
49
- it('returns same instance on subsequent calls', () => {
50
- const options: C15TOptions = {
51
- trustedOrigins: [],
52
- adapter: {} as C15TOptions['adapter'],
53
- telemetry: {
54
- enabled: true,
55
- },
56
- };
57
-
58
- const metrics1 = getMetrics(options);
59
- const metrics2 = getMetrics(options);
60
-
61
- expect(metrics1).toBe(metrics2);
62
- });
63
- });
64
-
65
- describe('C15TMetrics', () => {
66
- function createMetrics(): C15TMetrics {
67
- const options: C15TOptions = {
68
- trustedOrigins: [],
69
- adapter: {} as C15TOptions['adapter'],
70
- telemetry: {
71
- enabled: true,
72
- },
73
- };
74
- return getMetrics(options) as C15TMetrics;
75
- }
76
-
77
- describe('business metrics', () => {
78
- it('has consentCreated counter', () => {
79
- const metrics = createMetrics();
80
- expect(metrics.consentCreated).toBeDefined();
81
- });
82
-
83
- it('has consentAccepted counter', () => {
84
- const metrics = createMetrics();
85
- expect(metrics.consentAccepted).toBeDefined();
86
- });
87
-
88
- it('has consentRejected counter', () => {
89
- const metrics = createMetrics();
90
- expect(metrics.consentRejected).toBeDefined();
91
- });
92
-
93
- it('has subjectCreated counter', () => {
94
- const metrics = createMetrics();
95
- expect(metrics.subjectCreated).toBeDefined();
96
- });
97
-
98
- it('has subjectLinked counter', () => {
99
- const metrics = createMetrics();
100
- expect(metrics.subjectLinked).toBeDefined();
101
- });
102
-
103
- it('has consentCheckCount counter', () => {
104
- const metrics = createMetrics();
105
- expect(metrics.consentCheckCount).toBeDefined();
106
- });
107
-
108
- it('has initCount counter', () => {
109
- const metrics = createMetrics();
110
- expect(metrics.initCount).toBeDefined();
111
- });
112
- });
113
-
114
- describe('HTTP metrics', () => {
115
- it('has httpRequestDuration histogram', () => {
116
- const metrics = createMetrics();
117
- expect(metrics.httpRequestDuration).toBeDefined();
118
- });
119
-
120
- it('has httpRequestCount counter', () => {
121
- const metrics = createMetrics();
122
- expect(metrics.httpRequestCount).toBeDefined();
123
- });
124
-
125
- it('has httpErrorCount counter', () => {
126
- const metrics = createMetrics();
127
- expect(metrics.httpErrorCount).toBeDefined();
128
- });
129
- });
130
-
131
- describe('database metrics', () => {
132
- it('has dbQueryDuration histogram', () => {
133
- const metrics = createMetrics();
134
- expect(metrics.dbQueryDuration).toBeDefined();
135
- });
136
-
137
- it('has dbQueryCount counter', () => {
138
- const metrics = createMetrics();
139
- expect(metrics.dbQueryCount).toBeDefined();
140
- });
141
-
142
- it('has dbErrorCount counter', () => {
143
- const metrics = createMetrics();
144
- expect(metrics.dbErrorCount).toBeDefined();
145
- });
146
- });
147
-
148
- describe('cache metrics', () => {
149
- it('has cacheHit counter', () => {
150
- const metrics = createMetrics();
151
- expect(metrics.cacheHit).toBeDefined();
152
- });
153
-
154
- it('has cacheMiss counter', () => {
155
- const metrics = createMetrics();
156
- expect(metrics.cacheMiss).toBeDefined();
157
- });
158
-
159
- it('has cacheLatency histogram', () => {
160
- const metrics = createMetrics();
161
- expect(metrics.cacheLatency).toBeDefined();
162
- });
163
- });
164
-
165
- describe('GVL metrics', () => {
166
- it('has gvlFetchDuration histogram', () => {
167
- const metrics = createMetrics();
168
- expect(metrics.gvlFetchDuration).toBeDefined();
169
- });
170
-
171
- it('has gvlFetchCount counter', () => {
172
- const metrics = createMetrics();
173
- expect(metrics.gvlFetchCount).toBeDefined();
174
- });
175
-
176
- it('has gvlFetchError counter', () => {
177
- const metrics = createMetrics();
178
- expect(metrics.gvlFetchError).toBeDefined();
179
- });
180
- });
181
-
182
- describe('helper methods', () => {
183
- it('recordConsentCreated adds to counter with attributes', () => {
184
- const metrics = createMetrics();
185
- const addSpy = vi.spyOn(metrics.consentCreated, 'add');
186
-
187
- metrics.recordConsentCreated({
188
- type: 'cookie_banner',
189
- status: 'accepted',
190
- jurisdiction: 'GDPR',
191
- country: 'DE',
192
- region: 'BY',
193
- });
194
-
195
- expect(addSpy).toHaveBeenCalledWith(1, {
196
- type: 'cookie_banner',
197
- status: 'accepted',
198
- jurisdiction: 'GDPR',
199
- country: 'DE',
200
- region: 'BY',
201
- });
202
- });
203
-
204
- it('recordHttpRequest records both count and duration', () => {
205
- const metrics = createMetrics();
206
- const countSpy = vi.spyOn(metrics.httpRequestCount, 'add');
207
- const durationSpy = vi.spyOn(metrics.httpRequestDuration, 'record');
208
-
209
- metrics.recordHttpRequest(
210
- { method: 'GET', route: '/subjects', status: 200 },
211
- 42
212
- );
213
-
214
- expect(countSpy).toHaveBeenCalledWith(1, {
215
- method: 'GET',
216
- route: '/subjects',
217
- status: 200,
218
- });
219
- expect(durationSpy).toHaveBeenCalledWith(42, {
220
- method: 'GET',
221
- route: '/subjects',
222
- status: 200,
223
- });
224
- });
225
-
226
- it('recordHttpRequest records error when status >= 400', () => {
227
- const metrics = createMetrics();
228
- const errorSpy = vi.spyOn(metrics.httpErrorCount, 'add');
229
-
230
- metrics.recordHttpRequest(
231
- { method: 'POST', route: '/subjects', status: 500 },
232
- 100
233
- );
234
-
235
- expect(errorSpy).toHaveBeenCalledTimes(1);
236
- });
237
-
238
- it('recordCacheHit increments cache hit counter', () => {
239
- const metrics = createMetrics();
240
- const hitSpy = vi.spyOn(metrics.cacheHit, 'add');
241
-
242
- metrics.recordCacheHit('memory');
243
-
244
- expect(hitSpy).toHaveBeenCalledWith(1, { layer: 'memory' });
245
- });
246
-
247
- it('recordCacheMiss increments cache miss counter', () => {
248
- const metrics = createMetrics();
249
- const missSpy = vi.spyOn(metrics.cacheMiss, 'add');
250
-
251
- metrics.recordCacheMiss('external');
252
-
253
- expect(missSpy).toHaveBeenCalledWith(1, { layer: 'external' });
254
- });
255
-
256
- it('recordInit increments init counter with geo attributes', () => {
257
- const metrics = createMetrics();
258
- const initSpy = vi.spyOn(metrics.initCount, 'add');
259
-
260
- metrics.recordInit({
261
- jurisdiction: 'CCPA',
262
- country: 'US',
263
- region: 'CA',
264
- });
265
-
266
- expect(initSpy).toHaveBeenCalledWith(1, {
267
- jurisdiction: 'CCPA',
268
- country: 'US',
269
- region: 'CA',
270
- });
271
- });
272
- });
273
- });
274
-
275
- describe('getMetrics cached singleton', () => {
276
- it('returns cached instance without options after initialization', () => {
277
- const options: C15TOptions = {
278
- trustedOrigins: [],
279
- adapter: {} as C15TOptions['adapter'],
280
- telemetry: {
281
- enabled: true,
282
- },
283
- };
284
-
285
- // Initialize with options
286
- const metrics1 = getMetrics(options);
287
- expect(metrics1).not.toBeNull();
288
-
289
- // Call without options — should return cached instance
290
- const metrics2 = getMetrics();
291
- expect(metrics2).toBe(metrics1);
292
- });
293
- });
294
-
295
- describe('resetMetrics', () => {
296
- it('clears the metrics instance', () => {
297
- const options: C15TOptions = {
298
- trustedOrigins: [],
299
- adapter: {} as C15TOptions['adapter'],
300
- telemetry: {
301
- enabled: true,
302
- },
303
- };
304
-
305
- const metrics1 = getMetrics(options);
306
- resetMetrics();
307
- const metrics2 = getMetrics(options);
308
-
309
- expect(metrics1).not.toBe(metrics2);
310
- });
311
- });