@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,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,323 +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(
8
- (options) => options?.advanced?.telemetry?.enabled === true
9
- ),
10
- getMeter: vi.fn(() => ({
11
- createCounter: vi.fn(() => ({
12
- add: vi.fn(),
13
- })),
14
- createHistogram: vi.fn(() => ({
15
- record: vi.fn(),
16
- })),
17
- })),
18
- }));
19
-
20
- afterEach(() => {
21
- resetMetrics();
22
- vi.clearAllMocks();
23
- });
24
-
25
- describe('getMetrics', () => {
26
- it('returns null when telemetry is disabled', () => {
27
- const options: C15TOptions = {
28
- trustedOrigins: [],
29
- adapter: {} as C15TOptions['adapter'],
30
- };
31
-
32
- const metrics = getMetrics(options);
33
-
34
- expect(metrics).toBeNull();
35
- });
36
-
37
- it('returns C15TMetrics instance when telemetry is enabled', () => {
38
- const options: C15TOptions = {
39
- trustedOrigins: [],
40
- adapter: {} as C15TOptions['adapter'],
41
- advanced: {
42
- telemetry: {
43
- enabled: true,
44
- },
45
- },
46
- };
47
-
48
- const metrics = getMetrics(options);
49
-
50
- expect(metrics).toHaveProperty('recordHttpRequest');
51
- });
52
-
53
- it('returns same instance on subsequent calls', () => {
54
- const options: C15TOptions = {
55
- trustedOrigins: [],
56
- adapter: {} as C15TOptions['adapter'],
57
- advanced: {
58
- telemetry: {
59
- enabled: true,
60
- },
61
- },
62
- };
63
-
64
- const metrics1 = getMetrics(options);
65
- const metrics2 = getMetrics(options);
66
-
67
- expect(metrics1).toBe(metrics2);
68
- });
69
- });
70
-
71
- describe('C15TMetrics', () => {
72
- function createMetrics(): C15TMetrics {
73
- const options: C15TOptions = {
74
- trustedOrigins: [],
75
- adapter: {} as C15TOptions['adapter'],
76
- advanced: {
77
- telemetry: {
78
- enabled: true,
79
- },
80
- },
81
- };
82
- return getMetrics(options) as C15TMetrics;
83
- }
84
-
85
- describe('business metrics', () => {
86
- it('has consentCreated counter', () => {
87
- const metrics = createMetrics();
88
- expect(metrics.consentCreated).toBeDefined();
89
- });
90
-
91
- it('has consentAccepted counter', () => {
92
- const metrics = createMetrics();
93
- expect(metrics.consentAccepted).toBeDefined();
94
- });
95
-
96
- it('has consentRejected counter', () => {
97
- const metrics = createMetrics();
98
- expect(metrics.consentRejected).toBeDefined();
99
- });
100
-
101
- it('has subjectCreated counter', () => {
102
- const metrics = createMetrics();
103
- expect(metrics.subjectCreated).toBeDefined();
104
- });
105
-
106
- it('has subjectLinked counter', () => {
107
- const metrics = createMetrics();
108
- expect(metrics.subjectLinked).toBeDefined();
109
- });
110
-
111
- it('has consentCheckCount counter', () => {
112
- const metrics = createMetrics();
113
- expect(metrics.consentCheckCount).toBeDefined();
114
- });
115
-
116
- it('has initCount counter', () => {
117
- const metrics = createMetrics();
118
- expect(metrics.initCount).toBeDefined();
119
- });
120
- });
121
-
122
- describe('HTTP metrics', () => {
123
- it('has httpRequestDuration histogram', () => {
124
- const metrics = createMetrics();
125
- expect(metrics.httpRequestDuration).toBeDefined();
126
- });
127
-
128
- it('has httpRequestCount counter', () => {
129
- const metrics = createMetrics();
130
- expect(metrics.httpRequestCount).toBeDefined();
131
- });
132
-
133
- it('has httpErrorCount counter', () => {
134
- const metrics = createMetrics();
135
- expect(metrics.httpErrorCount).toBeDefined();
136
- });
137
- });
138
-
139
- describe('database metrics', () => {
140
- it('has dbQueryDuration histogram', () => {
141
- const metrics = createMetrics();
142
- expect(metrics.dbQueryDuration).toBeDefined();
143
- });
144
-
145
- it('has dbQueryCount counter', () => {
146
- const metrics = createMetrics();
147
- expect(metrics.dbQueryCount).toBeDefined();
148
- });
149
-
150
- it('has dbErrorCount counter', () => {
151
- const metrics = createMetrics();
152
- expect(metrics.dbErrorCount).toBeDefined();
153
- });
154
- });
155
-
156
- describe('cache metrics', () => {
157
- it('has cacheHit counter', () => {
158
- const metrics = createMetrics();
159
- expect(metrics.cacheHit).toBeDefined();
160
- });
161
-
162
- it('has cacheMiss counter', () => {
163
- const metrics = createMetrics();
164
- expect(metrics.cacheMiss).toBeDefined();
165
- });
166
-
167
- it('has cacheLatency histogram', () => {
168
- const metrics = createMetrics();
169
- expect(metrics.cacheLatency).toBeDefined();
170
- });
171
- });
172
-
173
- describe('GVL metrics', () => {
174
- it('has gvlFetchDuration histogram', () => {
175
- const metrics = createMetrics();
176
- expect(metrics.gvlFetchDuration).toBeDefined();
177
- });
178
-
179
- it('has gvlFetchCount counter', () => {
180
- const metrics = createMetrics();
181
- expect(metrics.gvlFetchCount).toBeDefined();
182
- });
183
-
184
- it('has gvlFetchError counter', () => {
185
- const metrics = createMetrics();
186
- expect(metrics.gvlFetchError).toBeDefined();
187
- });
188
- });
189
-
190
- describe('helper methods', () => {
191
- it('recordConsentCreated adds to counter with attributes', () => {
192
- const metrics = createMetrics();
193
- const addSpy = vi.spyOn(metrics.consentCreated, 'add');
194
-
195
- metrics.recordConsentCreated({
196
- type: 'cookie_banner',
197
- status: 'accepted',
198
- jurisdiction: 'GDPR',
199
- country: 'DE',
200
- region: 'BY',
201
- });
202
-
203
- expect(addSpy).toHaveBeenCalledWith(1, {
204
- type: 'cookie_banner',
205
- status: 'accepted',
206
- jurisdiction: 'GDPR',
207
- country: 'DE',
208
- region: 'BY',
209
- });
210
- });
211
-
212
- it('recordHttpRequest records both count and duration', () => {
213
- const metrics = createMetrics();
214
- const countSpy = vi.spyOn(metrics.httpRequestCount, 'add');
215
- const durationSpy = vi.spyOn(metrics.httpRequestDuration, 'record');
216
-
217
- metrics.recordHttpRequest(
218
- { method: 'GET', route: '/subjects', status: 200 },
219
- 42
220
- );
221
-
222
- expect(countSpy).toHaveBeenCalledWith(1, {
223
- method: 'GET',
224
- route: '/subjects',
225
- status: 200,
226
- });
227
- expect(durationSpy).toHaveBeenCalledWith(42, {
228
- method: 'GET',
229
- route: '/subjects',
230
- status: 200,
231
- });
232
- });
233
-
234
- it('recordHttpRequest records error when status >= 400', () => {
235
- const metrics = createMetrics();
236
- const errorSpy = vi.spyOn(metrics.httpErrorCount, 'add');
237
-
238
- metrics.recordHttpRequest(
239
- { method: 'POST', route: '/subjects', status: 500 },
240
- 100
241
- );
242
-
243
- expect(errorSpy).toHaveBeenCalledTimes(1);
244
- });
245
-
246
- it('recordCacheHit increments cache hit counter', () => {
247
- const metrics = createMetrics();
248
- const hitSpy = vi.spyOn(metrics.cacheHit, 'add');
249
-
250
- metrics.recordCacheHit('memory');
251
-
252
- expect(hitSpy).toHaveBeenCalledWith(1, { layer: 'memory' });
253
- });
254
-
255
- it('recordCacheMiss increments cache miss counter', () => {
256
- const metrics = createMetrics();
257
- const missSpy = vi.spyOn(metrics.cacheMiss, 'add');
258
-
259
- metrics.recordCacheMiss('external');
260
-
261
- expect(missSpy).toHaveBeenCalledWith(1, { layer: 'external' });
262
- });
263
-
264
- it('recordInit increments init counter with geo attributes', () => {
265
- const metrics = createMetrics();
266
- const initSpy = vi.spyOn(metrics.initCount, 'add');
267
-
268
- metrics.recordInit({
269
- jurisdiction: 'CCPA',
270
- country: 'US',
271
- region: 'CA',
272
- });
273
-
274
- expect(initSpy).toHaveBeenCalledWith(1, {
275
- jurisdiction: 'CCPA',
276
- country: 'US',
277
- region: 'CA',
278
- });
279
- });
280
- });
281
- });
282
-
283
- describe('getMetrics cached singleton', () => {
284
- it('returns cached instance without options after initialization', () => {
285
- const options: C15TOptions = {
286
- trustedOrigins: [],
287
- adapter: {} as C15TOptions['adapter'],
288
- advanced: {
289
- telemetry: {
290
- enabled: true,
291
- },
292
- },
293
- };
294
-
295
- // Initialize with options
296
- const metrics1 = getMetrics(options);
297
- expect(metrics1).not.toBeNull();
298
-
299
- // Call without options — should return cached instance
300
- const metrics2 = getMetrics();
301
- expect(metrics2).toBe(metrics1);
302
- });
303
- });
304
-
305
- describe('resetMetrics', () => {
306
- it('clears the metrics instance', () => {
307
- const options: C15TOptions = {
308
- trustedOrigins: [],
309
- adapter: {} as C15TOptions['adapter'],
310
- advanced: {
311
- telemetry: {
312
- enabled: true,
313
- },
314
- },
315
- };
316
-
317
- const metrics1 = getMetrics(options);
318
- resetMetrics();
319
- const metrics2 = getMetrics(options);
320
-
321
- expect(metrics1).not.toBe(metrics2);
322
- });
323
- });