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