@c15t/backend 2.0.0-rc.0 → 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 +53 -39
  132. package/.turbo/turbo-build.log +0 -49
  133. package/CHANGELOG.md +0 -89
  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,34 +0,0 @@
1
- /**
2
- * Cache Module
3
- *
4
- * Multi-layer caching system with pluggable adapters for GVL and other data.
5
- *
6
- * @packageDocumentation
7
- */
8
-
9
- // Adapters
10
- export {
11
- clearMemoryCache,
12
- // Cloudflare KV
13
- createCloudflareKVAdapter,
14
- // Memory
15
- createMemoryCacheAdapter,
16
- // Upstash Redis
17
- createUpstashRedisAdapter,
18
- createUpstashRedisAdapterFromClient,
19
- getMemoryCacheSize,
20
- type KVNamespace,
21
- type UpstashRedisAdapterOptions,
22
- } from './adapters';
23
- // GVL Resolver
24
- export {
25
- createGVLResolver,
26
- type GVLResolver,
27
- type GVLResolverOptions,
28
- } from './gvl-resolver';
29
-
30
- // Cache Key Utilities
31
- export { createCacheKey, createGVLCacheKey } from './keys';
32
- // Types
33
- export type { CacheAdapter } from './types';
34
- export { GVL_TTL_MS, MEMORY_TTL_MS } from './types';
package/src/cache/keys.ts DELETED
@@ -1,68 +0,0 @@
1
- /**
2
- * Cache Key Utilities
3
- *
4
- * Functions for generating consistent cache keys with app name prefixing.
5
- *
6
- * @packageDocumentation
7
- */
8
-
9
- /**
10
- * Create a GVL cache key.
11
- *
12
- * Format: `{appName}:gvl:{language}:{sortedVendorIds}`
13
- *
14
- * @param appName - The application name for key prefixing
15
- * @param language - The language code (e.g., "en", "de")
16
- * @param vendorIds - Optional array of vendor IDs to include in the key
17
- * @returns A unique cache key for the GVL configuration
18
- *
19
- * @example
20
- * ```typescript
21
- * // All vendors
22
- * createGVLCacheKey('my-app', 'en');
23
- * // => 'my-app:gvl:en:all'
24
- *
25
- * // Specific vendors
26
- * createGVLCacheKey('my-app', 'de', [1, 10, 2]);
27
- * // => 'my-app:gvl:de:1,2,10'
28
- * ```
29
- *
30
- * @public
31
- */
32
- export function createGVLCacheKey(
33
- appName: string,
34
- language: string,
35
- vendorIds?: number[]
36
- ): string {
37
- const sortedIds = vendorIds
38
- ? [...vendorIds].sort((a, b) => a - b).join(',')
39
- : 'all';
40
- return `${appName}:gvl:${language}:${sortedIds}`;
41
- }
42
-
43
- /**
44
- * Create a generic cache key with namespace and parts.
45
- *
46
- * Format: `{appName}:{namespace}:{part1}:{part2}:...`
47
- *
48
- * @param appName - The application name for key prefixing
49
- * @param namespace - The cache namespace (e.g., "gvl", "translations")
50
- * @param parts - Additional key parts
51
- * @returns A namespaced cache key
52
- *
53
- * @example
54
- * ```typescript
55
- * createCacheKey('my-app', 'translations', 'en', 'banner');
56
- * // => 'my-app:translations:en:banner'
57
- * ```
58
- *
59
- * @public
60
- */
61
- export function createCacheKey(
62
- appName: string,
63
- namespace: string,
64
- ...parts: (string | number)[]
65
- ): string {
66
- const allParts = [appName, namespace, ...parts];
67
- return allParts.join(':');
68
- }
@@ -1,66 +0,0 @@
1
- /**
2
- * Cache Adapter Types
3
- *
4
- * Generic cache adapter interface for pluggable caching implementations.
5
- * Supports in-memory, Redis, Cloudflare KV, and custom adapters.
6
- *
7
- * @packageDocumentation
8
- */
9
-
10
- /**
11
- * Generic cache adapter interface.
12
- *
13
- * Implementations should handle serialization/deserialization internally.
14
- * All methods are async to support both sync (memory) and async (Redis/KV) backends.
15
- *
16
- * @public
17
- */
18
- export interface CacheAdapter {
19
- /**
20
- * Get a value from the cache.
21
- *
22
- * @param key - Cache key
23
- * @returns The cached value, or null if not found or expired
24
- */
25
- get<T>(key: string): Promise<T | null>;
26
-
27
- /**
28
- * Set a value in the cache.
29
- *
30
- * @param key - Cache key
31
- * @param value - Value to cache
32
- * @param ttlMs - Time to live in milliseconds (optional)
33
- */
34
- set<T>(key: string, value: T, ttlMs?: number): Promise<void>;
35
-
36
- /**
37
- * Delete a value from the cache.
38
- *
39
- * @param key - Cache key
40
- */
41
- delete(key: string): Promise<void>;
42
-
43
- /**
44
- * Check if a key exists in the cache.
45
- *
46
- * @param key - Cache key
47
- * @returns True if the key exists and is not expired
48
- */
49
- has(key: string): Promise<boolean>;
50
- }
51
-
52
- /**
53
- * Default TTL for GVL cache entries (3 days).
54
- * Matches the typical GVL update frequency.
55
- *
56
- * @public
57
- */
58
- export const GVL_TTL_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
59
-
60
- /**
61
- * Default TTL for in-memory cache entries (5 minutes).
62
- * Shorter TTL to handle worker restarts and keep memory usage low.
63
- *
64
- * @public
65
- */
66
- export const MEMORY_TTL_MS = 5 * 60 * 1000; // 5 minutes
package/src/core.ts DELETED
@@ -1,368 +0,0 @@
1
- import { createLogger } from '@c15t/logger';
2
- import { SpanStatusCode } from '@opentelemetry/api';
3
- import { apiReference } from '@scalar/hono-api-reference';
4
- import { Hono } from 'hono';
5
- import { cors } from 'hono/cors';
6
- import { HTTPException } from 'hono/http-exception';
7
- import { openAPIRouteHandler } from 'hono-openapi';
8
- import { validateRequestAuth } from '~/middleware/auth';
9
- import { createCORSOptions } from '~/middleware/cors';
10
- import { createOpenAPIConfig } from '~/middleware/openapi';
11
- import { getIpAddress } from '~/middleware/process-ip';
12
- import type { C15TContext, C15TOptions } from '~/types';
13
- import { init } from './init';
14
- import { createConsentRoutes } from './routes/consent';
15
- // Import route handlers
16
- import { createInitRoute } from './routes/init';
17
- import { createStatusRoute } from './routes/status';
18
- import { createSubjectRoutes } from './routes/subject';
19
- import {
20
- createRequestSpan,
21
- handleSpanError,
22
- withSpanContext,
23
- } from './utils/create-telemetry-options';
24
- import { extractErrorMessage } from './utils/extract-error-message';
25
- import { getMetrics } from './utils/metrics';
26
- import { version } from './version';
27
-
28
- /**
29
- * Type representing an API route
30
- */
31
- export type Route = {
32
- path: string;
33
- method: string;
34
- description?: string;
35
- };
36
-
37
- /**
38
- * Hono app type with c15t context
39
- */
40
- export type C15TApp = Hono<{ Variables: { c15tContext: C15TContext } }>;
41
-
42
- /**
43
- * Interface representing a configured c15t consent management instance.
44
- *
45
- * @remarks
46
- * The C15TInstance provides the main interface for interacting with the consent
47
- * management system. It includes methods for handling requests, accessing API
48
- * endpoints, and managing the system's configuration.
49
- */
50
- export interface C15TInstance {
51
- /**
52
- * Processes incoming HTTP requests and routes them to appropriate handlers.
53
- *
54
- * @param request - The incoming web request
55
- * @returns A Promise containing the HTTP response
56
- *
57
- * @example
58
- * ```typescript
59
- * try {
60
- * const response = await instance.handler(request);
61
- * sendResponse(response);
62
- * } catch (error) {
63
- * handleError(error);
64
- * }
65
- * ```
66
- */
67
- handler: (request: Request) => Promise<Response>;
68
-
69
- /**
70
- * The configuration options used for this instance.
71
- */
72
- options: C15TOptions;
73
-
74
- /**
75
- * Access to the underlying context.
76
- */
77
- $context: C15TContext;
78
-
79
- /**
80
- * Access to the Hono app for direct usage.
81
- */
82
- app: C15TApp;
83
-
84
- /**
85
- * Generates and returns the OpenAPI specification as a JSON object.
86
- *
87
- * @returns A Promise containing the OpenAPI specification
88
- */
89
- getOpenAPISpec: () => Promise<Record<string, unknown>>;
90
-
91
- /**
92
- * Returns an HTML document with the API documentation UI.
93
- *
94
- * @returns An HTML string with the API reference UI
95
- */
96
- getDocsUI: () => string;
97
- }
98
-
99
- /**
100
- * Creates a new c15t consent management instance.
101
- *
102
- * This version uses Hono as the HTTP framework with OpenAPI support.
103
- */
104
- export const c15tInstance = (options: C15TOptions): C15TInstance => {
105
- const context = init(options);
106
- const logger = createLogger(options.logger);
107
-
108
- // Create the Hono app
109
- const app = new Hono<{ Variables: { c15tContext: C15TContext } }>();
110
-
111
- // Set up OpenAPI configuration
112
- const openApiConfig = createOpenAPIConfig(options);
113
- const basePath = options.basePath || '/';
114
-
115
- // CORS middleware
116
- const corsOptions = createCORSOptions(options.trustedOrigins);
117
- app.use('*', cors(corsOptions));
118
-
119
- // Note: Compression disabled - causes issues with response passthrough in wrapper scenarios
120
- // app.use('*', compress());
121
-
122
- // Get metrics instance (null if telemetry is disabled)
123
- const metrics = getMetrics(options);
124
-
125
- // Context middleware - enriches each request with c15t context
126
- app.use('*', async (c, next) => {
127
- const request = c.req.raw;
128
- const startTime = Date.now();
129
-
130
- // Check API key authentication
131
- const apiKeyAuthenticated = validateRequestAuth(
132
- request.headers,
133
- options.advanced?.apiKeys
134
- );
135
-
136
- const enrichedContext: C15TContext = {
137
- ...context,
138
- ipAddress: getIpAddress(request, options),
139
- userAgent: request.headers.get('user-agent') || undefined,
140
- apiKeyAuthenticated,
141
- path: c.req.path,
142
- method: c.req.method,
143
- headers: request.headers,
144
- };
145
-
146
- c.set('c15tContext', enrichedContext);
147
-
148
- // Create a telemetry span for the request (if enabled)
149
- const span = createRequestSpan(c.req.method, c.req.path, options);
150
-
151
- const runNext = async () => {
152
- await next();
153
- };
154
-
155
- try {
156
- if (span) {
157
- await withSpanContext(span, runNext);
158
- // After routing, update span name with matched route pattern
159
- const matchedRoutes = c.req.matchedRoutes;
160
- const routePattern =
161
- matchedRoutes
162
- .map((r) => r.path)
163
- .filter((p) => p !== '/*')
164
- .pop() ?? c.req.path;
165
- span.updateName(`${c.req.method} ${routePattern}`);
166
- span.setAttribute('http.route', routePattern);
167
- span.setStatus({ code: SpanStatusCode.OK });
168
- } else {
169
- await runNext();
170
- }
171
- } catch (error) {
172
- if (span) {
173
- handleSpanError(span, error);
174
- }
175
- throw error;
176
- } finally {
177
- span?.end();
178
- }
179
-
180
- // Record HTTP metrics after request completes
181
- if (metrics) {
182
- const durationMs = Date.now() - startTime;
183
- // Use route pattern instead of raw path to avoid high cardinality
184
- const matchedRoutes = c.req.matchedRoutes;
185
- const routePattern =
186
- matchedRoutes
187
- .map((r) => r.path)
188
- .filter((p) => p !== '/*')
189
- .pop() ?? c.req.path;
190
- metrics.recordHttpRequest(
191
- {
192
- method: c.req.method,
193
- route: routePattern,
194
- status: c.res.status,
195
- },
196
- durationMs
197
- );
198
- }
199
- });
200
-
201
- // OpenAPI spec endpoint
202
- if (openApiConfig.enabled) {
203
- app.get(
204
- openApiConfig.specPath,
205
- openAPIRouteHandler(app, {
206
- documentation: {
207
- openapi: '3.1.0',
208
- info: {
209
- title: options.appName || 'c15t API',
210
- version,
211
- description: 'API for consent management',
212
- },
213
- servers: [{ url: basePath }],
214
- components: {
215
- securitySchemes: {
216
- bearerAuth: {
217
- type: 'http',
218
- scheme: 'bearer',
219
- },
220
- },
221
- },
222
- },
223
- })
224
- );
225
-
226
- // Docs UI endpoint
227
- // The spec URL needs to include the basePath since it's used by the browser
228
- const publicSpecUrl = `${basePath}${openApiConfig.specPath}`.replace(
229
- /\/+/g,
230
- '/'
231
- );
232
- app.get(
233
- openApiConfig.docsPath,
234
- apiReference({
235
- spec: {
236
- url: publicSpecUrl,
237
- },
238
- pageTitle: `${options.appName || 'c15t API'} Documentation`,
239
- })
240
- );
241
- }
242
-
243
- // Mount routes - using plural nouns for REST conventions
244
- app.route('/init', createInitRoute(options));
245
- app.route('/subjects', createSubjectRoutes());
246
- app.route('/consents', createConsentRoutes());
247
- app.route('/status', createStatusRoute());
248
-
249
- // Global error handler
250
- app.onError((err, c) => {
251
- const ctx = c.get('c15tContext');
252
- const log = ctx?.logger || logger;
253
-
254
- log.error('Request handling error:', extractErrorMessage(err));
255
-
256
- if (err instanceof HTTPException) {
257
- const cause = err.cause as
258
- | { code?: string; message?: string; [key: string]: unknown }
259
- | undefined;
260
- return c.json(
261
- {
262
- code: cause?.code || 'HTTP_ERROR',
263
- message: err.message,
264
- status: err.status,
265
- defined: true,
266
- data: {},
267
- },
268
- err.status
269
- );
270
- }
271
-
272
- return c.json(
273
- {
274
- code: 'INTERNAL_SERVER_ERROR',
275
- message: 'Internal server error',
276
- status: 500,
277
- defined: true,
278
- data: {},
279
- },
280
- 500
281
- );
282
- });
283
-
284
- // 404 handler
285
- app.notFound((c) => {
286
- return c.json(
287
- {
288
- code: 'NOT_FOUND',
289
- message: 'Not Found',
290
- status: 404,
291
- defined: true,
292
- data: {},
293
- },
294
- 404
295
- );
296
- });
297
-
298
- // Create the handler function
299
- const handler = async (request: Request): Promise<Response> => {
300
- logger?.debug?.('Incoming request', {
301
- method: request.method,
302
- url: request.url,
303
- });
304
-
305
- // Strip the basePath from the URL if present
306
- // This allows Hono routes to be defined without the basePath prefix
307
- let modifiedRequest = request;
308
- if (basePath && basePath !== '/') {
309
- const url = new URL(request.url);
310
- const normalizedBasePath = basePath.replace(/\/$/, ''); // Remove trailing slash
311
- if (url.pathname.startsWith(normalizedBasePath)) {
312
- const newPath = url.pathname.slice(normalizedBasePath.length) || '/';
313
- url.pathname = newPath;
314
- modifiedRequest = new Request(url.toString(), {
315
- method: request.method,
316
- headers: request.headers,
317
- body: request.body,
318
- duplex: 'half',
319
- } as RequestInit);
320
- }
321
- }
322
-
323
- return app.fetch(modifiedRequest);
324
- };
325
-
326
- // Create docs UI helper
327
- const getDocsUI = () => {
328
- const specUrl = `${basePath}${openApiConfig.specPath}`.replace(/\/+/g, '/');
329
- return `
330
- <!doctype html>
331
- <html>
332
- <head>
333
- <title>${options.appName || 'c15t API'} Documentation</title>
334
- <meta charset="utf-8" />
335
- <meta name="viewport" content="width=device-width, initial-scale=1" />
336
- <link rel="icon" type="image/svg+xml" href="https://c15t.com/icon.svg" />
337
- </head>
338
- <body>
339
- <script
340
- id="api-reference"
341
- data-url="${encodeURI(specUrl)}">
342
- </script>
343
- <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
344
- </body>
345
- </html>
346
- `;
347
- };
348
-
349
- // Return the instance
350
- return {
351
- options,
352
- $context: context,
353
- app,
354
- handler,
355
- getOpenAPISpec: async () => {
356
- // Generate OpenAPI spec by fetching from our own endpoint
357
- const specResponse = await app.fetch(
358
- new Request(`http://localhost${openApiConfig.specPath}`)
359
- );
360
- return specResponse.json() as Promise<Record<string, unknown>>;
361
- },
362
- getDocsUI,
363
- };
364
- };
365
-
366
- export { defineConfig } from './define-config';
367
- export type { C15TContext, C15TOptions } from './types';
368
- export { version } from './version';
@@ -1,80 +0,0 @@
1
- import type { InferFumaDB } from 'fumadb';
2
- import type { DB } from '~/db/schema';
3
-
4
- type DatabaseInstance = InferFumaDB<typeof DB>;
5
- type MigratorInstance = ReturnType<DatabaseInstance['createMigrator']>;
6
- type VersionTag = ReturnType<(typeof DB)['version']>;
7
-
8
- type MigrateToLatestResult = Awaited<
9
- ReturnType<MigratorInstance['migrateToLatest']>
10
- >;
11
- type MigrateToResult = Awaited<ReturnType<MigratorInstance['migrateTo']>>;
12
- type DownResult = Awaited<ReturnType<MigratorInstance['down']>>;
13
-
14
- export type MigrationResult =
15
- | MigrateToLatestResult
16
- | MigrateToResult
17
- | DownResult;
18
-
19
- export type ORMResult = {
20
- code: string;
21
- path: string;
22
- };
23
-
24
- interface BaseOptions {
25
- db: DatabaseInstance;
26
- schema: VersionTag | 'latest';
27
- }
28
-
29
- /**
30
- * Executes database migrations for supported adapters, or generates ORM schema
31
- * code for ORM-based adapters.
32
- *
33
- * - For 'kysely' and 'mongo', this function runs migrations using the
34
- * underlying migrator returned by `db.createMigrator()`.
35
- * - For 'drizzle', 'prisma', and 'typeorm', this function generates schema
36
- * code via `db.generateSchema()`.
37
- */
38
- export async function migrator(
39
- options: BaseOptions
40
- ): Promise<MigrationResult | ORMResult> {
41
- const { db } = options;
42
-
43
- let version: VersionTag | 'legacy';
44
- try {
45
- version = await db.version();
46
- } catch {
47
- // If FumaDB isn't initalized yet, we're in legacy mode
48
- version = 'legacy';
49
- }
50
-
51
- const migratorInstance = db.adapter?.createMigrationEngine
52
- ? db.createMigrator()
53
- : undefined;
54
-
55
- const schema = db.adapter?.generateSchema
56
- ? db.generateSchema(options.schema)
57
- : undefined;
58
-
59
- if (migratorInstance) {
60
- switch (options.schema) {
61
- case 'latest':
62
- return await migratorInstance.migrateToLatest({
63
- mode: version === 'legacy' ? 'from-database' : 'from-schema',
64
- });
65
- default:
66
- return await migratorInstance.migrateTo(options.schema, {
67
- mode: version === 'legacy' ? 'from-database' : 'from-schema',
68
- });
69
- }
70
- }
71
-
72
- if (schema) {
73
- return {
74
- code: schema.code,
75
- path: schema.path,
76
- };
77
- }
78
-
79
- throw new Error('Adapter does not support migrations or schema generation');
80
- }