@openora/core 0.4.1-canary.15 → 0.4.1-canary.151

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 (2288) hide show
  1. package/README.md +10 -10
  2. package/bin/migrate.mjs +55 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/admin-console/__tests__/backoffice.router.test.js +82 -51
  5. package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
  6. package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts +2 -0
  7. package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts.map +1 -0
  8. package/dist/admin-console/__tests__/backoffice.service.int.test.js +334 -0
  9. package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -0
  10. package/dist/admin-console/contract/index.d.ts +302 -28
  11. package/dist/admin-console/contract/index.d.ts.map +1 -1
  12. package/dist/admin-console/contract/index.js +74 -6
  13. package/dist/admin-console/contract/index.js.map +1 -1
  14. package/dist/admin-console/plugin.d.ts +182 -1
  15. package/dist/admin-console/plugin.d.ts.map +1 -1
  16. package/dist/admin-console/plugin.js +6 -6
  17. package/dist/admin-console/plugin.js.map +1 -1
  18. package/dist/admin-console/router/index.d.ts +135 -18
  19. package/dist/admin-console/router/index.d.ts.map +1 -1
  20. package/dist/admin-console/router/index.js +18 -2
  21. package/dist/admin-console/router/index.js.map +1 -1
  22. package/dist/admin-console/service/backoffice.service.d.ts +70 -10
  23. package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
  24. package/dist/admin-console/service/backoffice.service.js +67 -11
  25. package/dist/admin-console/service/backoffice.service.js.map +1 -1
  26. package/dist/analytics/__tests__/analytics.contract.test.d.ts +2 -0
  27. package/dist/analytics/__tests__/analytics.contract.test.d.ts.map +1 -0
  28. package/dist/analytics/__tests__/analytics.contract.test.js +36 -0
  29. package/dist/analytics/__tests__/analytics.contract.test.js.map +1 -0
  30. package/dist/analytics/__tests__/analytics.router.test.d.ts +2 -0
  31. package/dist/analytics/__tests__/analytics.router.test.d.ts.map +1 -0
  32. package/dist/analytics/__tests__/analytics.router.test.js +56 -0
  33. package/dist/analytics/__tests__/analytics.router.test.js.map +1 -0
  34. package/dist/analytics/__tests__/financial-analytics.service.test.d.ts +2 -0
  35. package/dist/analytics/__tests__/financial-analytics.service.test.d.ts.map +1 -0
  36. package/dist/analytics/__tests__/financial-analytics.service.test.js +87 -0
  37. package/dist/analytics/__tests__/financial-analytics.service.test.js.map +1 -0
  38. package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts +2 -0
  39. package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts.map +1 -0
  40. package/dist/analytics/__tests__/funnel-analytics.service.test.js +42 -0
  41. package/dist/analytics/__tests__/funnel-analytics.service.test.js.map +1 -0
  42. package/dist/analytics/contract/financial.d.ts +121 -0
  43. package/dist/analytics/contract/financial.d.ts.map +1 -0
  44. package/dist/analytics/contract/financial.js +45 -0
  45. package/dist/analytics/contract/financial.js.map +1 -0
  46. package/dist/analytics/contract/funnel.d.ts +52 -0
  47. package/dist/analytics/contract/funnel.d.ts.map +1 -0
  48. package/dist/analytics/contract/funnel.js +24 -0
  49. package/dist/analytics/contract/funnel.js.map +1 -0
  50. package/dist/analytics/contract/index.d.ts +68 -0
  51. package/dist/analytics/contract/index.d.ts.map +1 -0
  52. package/dist/analytics/contract/index.js +9 -0
  53. package/dist/analytics/contract/index.js.map +1 -0
  54. package/dist/analytics/index.d.ts +2 -0
  55. package/dist/analytics/index.d.ts.map +1 -0
  56. package/dist/analytics/index.js +2 -0
  57. package/dist/analytics/index.js.map +1 -0
  58. package/dist/analytics/plugin.d.ts +184 -0
  59. package/dist/analytics/plugin.d.ts.map +1 -0
  60. package/dist/analytics/plugin.js +13 -0
  61. package/dist/analytics/plugin.js.map +1 -0
  62. package/dist/analytics/router/index.d.ts +69 -0
  63. package/dist/analytics/router/index.d.ts.map +1 -0
  64. package/dist/analytics/router/index.js +24 -0
  65. package/dist/analytics/router/index.js.map +1 -0
  66. package/dist/analytics/server.d.ts +5 -0
  67. package/dist/analytics/server.d.ts.map +1 -0
  68. package/dist/analytics/server.js +5 -0
  69. package/dist/analytics/server.js.map +1 -0
  70. package/dist/analytics/service/financial-analytics.service.d.ts +14 -0
  71. package/dist/analytics/service/financial-analytics.service.d.ts.map +1 -0
  72. package/dist/analytics/service/financial-analytics.service.js +146 -0
  73. package/dist/analytics/service/financial-analytics.service.js.map +1 -0
  74. package/dist/analytics/service/funnel-analytics.service.d.ts +11 -0
  75. package/dist/analytics/service/funnel-analytics.service.d.ts.map +1 -0
  76. package/dist/analytics/service/funnel-analytics.service.js +83 -0
  77. package/dist/analytics/service/funnel-analytics.service.js.map +1 -0
  78. package/dist/audit/__tests__/audit.service.int.test.d.ts +2 -0
  79. package/dist/audit/__tests__/audit.service.int.test.d.ts.map +1 -0
  80. package/dist/audit/__tests__/audit.service.int.test.js +906 -0
  81. package/dist/audit/__tests__/audit.service.int.test.js.map +1 -0
  82. package/dist/audit/__tests__/map-event.test.d.ts +2 -0
  83. package/dist/audit/__tests__/map-event.test.d.ts.map +1 -0
  84. package/dist/audit/__tests__/map-event.test.js +196 -0
  85. package/dist/audit/__tests__/map-event.test.js.map +1 -0
  86. package/dist/audit/contract/index.d.ts +154 -10
  87. package/dist/audit/contract/index.d.ts.map +1 -1
  88. package/dist/audit/contract/index.js +45 -5
  89. package/dist/audit/contract/index.js.map +1 -1
  90. package/dist/audit/migrate.d.ts.map +1 -1
  91. package/dist/audit/migrate.js +12 -0
  92. package/dist/audit/migrate.js.map +1 -1
  93. package/dist/audit/plugin.d.ts +183 -1
  94. package/dist/audit/plugin.d.ts.map +1 -1
  95. package/dist/audit/plugin.js +587 -50
  96. package/dist/audit/plugin.js.map +1 -1
  97. package/dist/audit/router/index.d.ts +73 -5
  98. package/dist/audit/router/index.d.ts.map +1 -1
  99. package/dist/audit/router/index.js +2 -5
  100. package/dist/audit/router/index.js.map +1 -1
  101. package/dist/audit/service/audit.service.d.ts +40 -14
  102. package/dist/audit/service/audit.service.d.ts.map +1 -1
  103. package/dist/audit/service/audit.service.js +86 -11
  104. package/dist/audit/service/audit.service.js.map +1 -1
  105. package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts +2 -0
  106. package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts.map +1 -0
  107. package/dist/casino/gaming/__tests__/admin-reporting.int.test.js +126 -0
  108. package/dist/casino/gaming/__tests__/admin-reporting.int.test.js.map +1 -0
  109. package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts +2 -0
  110. package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts.map +1 -0
  111. package/dist/casino/gaming/__tests__/gaming.service.int.test.js +429 -0
  112. package/dist/casino/gaming/__tests__/gaming.service.int.test.js.map +1 -0
  113. package/dist/casino/gaming/adapters/mock/mock-game-adapter.d.ts.map +1 -1
  114. package/dist/casino/gaming/adapters/mock/mock-game-adapter.js +3 -1
  115. package/dist/casino/gaming/adapters/mock/mock-game-adapter.js.map +1 -1
  116. package/dist/casino/gaming/admin-reporting.d.ts +9 -0
  117. package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
  118. package/dist/casino/gaming/admin-reporting.js +79 -0
  119. package/dist/casino/gaming/admin-reporting.js.map +1 -0
  120. package/dist/casino/gaming/contract/index.d.ts +21 -2
  121. package/dist/casino/gaming/contract/index.d.ts.map +1 -1
  122. package/dist/casino/gaming/contract/index.js +10 -2
  123. package/dist/casino/gaming/contract/index.js.map +1 -1
  124. package/dist/casino/gaming/drizzle/migrations/0002_yummy_lifeguard.sql +4 -0
  125. package/dist/casino/gaming/drizzle/migrations/0003_wealthy_greymalkin.sql +2 -0
  126. package/dist/casino/gaming/drizzle/migrations/0004_serious_storm.sql +4 -0
  127. package/dist/casino/gaming/drizzle/migrations/meta/0002_snapshot.json +237 -0
  128. package/dist/casino/gaming/drizzle/migrations/meta/0003_snapshot.json +259 -0
  129. package/dist/casino/gaming/drizzle/migrations/meta/0004_snapshot.json +259 -0
  130. package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +21 -0
  131. package/dist/casino/gaming/plugin.d.ts +183 -1
  132. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  133. package/dist/casino/gaming/plugin.js +15 -5
  134. package/dist/casino/gaming/plugin.js.map +1 -1
  135. package/dist/casino/gaming/router/index.d.ts +12 -1
  136. package/dist/casino/gaming/router/index.d.ts.map +1 -1
  137. package/dist/casino/gaming/router/index.js +7 -2
  138. package/dist/casino/gaming/router/index.js.map +1 -1
  139. package/dist/casino/gaming/schema/index.d.ts +35 -0
  140. package/dist/casino/gaming/schema/index.d.ts.map +1 -1
  141. package/dist/casino/gaming/schema/index.js +19 -4
  142. package/dist/casino/gaming/schema/index.js.map +1 -1
  143. package/dist/casino/gaming/service/gaming.service.d.ts +48 -7
  144. package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
  145. package/dist/casino/gaming/service/gaming.service.js +147 -21
  146. package/dist/casino/gaming/service/gaming.service.js.map +1 -1
  147. package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts +2 -0
  148. package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts.map +1 -0
  149. package/dist/casino/lobby/__tests__/lobby.cache.int.test.js +56 -0
  150. package/dist/casino/lobby/__tests__/lobby.cache.int.test.js.map +1 -0
  151. package/dist/casino/lobby/plugin.d.ts +181 -1
  152. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  153. package/dist/casino/lobby/plugin.js +3 -3
  154. package/dist/casino/lobby/plugin.js.map +1 -1
  155. package/dist/casino/lobby/service/lobby.service.d.ts +3 -1
  156. package/dist/casino/lobby/service/lobby.service.d.ts.map +1 -1
  157. package/dist/casino/server.d.ts +1 -0
  158. package/dist/casino/server.d.ts.map +1 -1
  159. package/dist/casino/server.js +1 -0
  160. package/dist/casino/server.js.map +1 -1
  161. package/dist/cms/__tests__/cms.reads.int.test.d.ts +2 -0
  162. package/dist/cms/__tests__/cms.reads.int.test.d.ts.map +1 -0
  163. package/dist/cms/__tests__/cms.reads.int.test.js +66 -0
  164. package/dist/cms/__tests__/cms.reads.int.test.js.map +1 -0
  165. package/dist/cms/__tests__/cms.router.int.test.d.ts +2 -0
  166. package/dist/cms/__tests__/cms.router.int.test.d.ts.map +1 -0
  167. package/dist/cms/__tests__/cms.router.int.test.js +356 -0
  168. package/dist/cms/__tests__/cms.router.int.test.js.map +1 -0
  169. package/dist/cms/__tests__/cms.service.int.test.d.ts +2 -0
  170. package/dist/cms/__tests__/cms.service.int.test.d.ts.map +1 -0
  171. package/dist/cms/__tests__/cms.service.int.test.js +908 -0
  172. package/dist/cms/__tests__/cms.service.int.test.js.map +1 -0
  173. package/dist/cms/contract/index.d.ts +413 -42
  174. package/dist/cms/contract/index.d.ts.map +1 -1
  175. package/dist/cms/contract/index.js +161 -35
  176. package/dist/cms/contract/index.js.map +1 -1
  177. package/dist/cms/drizzle/migrations/0001_steep_starjammers.sql +29 -0
  178. package/dist/cms/drizzle/migrations/0002_naive_kingpin.sql +14 -0
  179. package/dist/cms/drizzle/migrations/0003_worthless_titanium_man.sql +2 -0
  180. package/dist/cms/drizzle/migrations/meta/0001_snapshot.json +303 -0
  181. package/dist/cms/drizzle/migrations/meta/0002_snapshot.json +412 -0
  182. package/dist/cms/drizzle/migrations/meta/0003_snapshot.json +442 -0
  183. package/dist/cms/drizzle/migrations/meta/_journal.json +21 -0
  184. package/dist/cms/moderation/validate-banner-image-url.d.ts +8 -0
  185. package/dist/cms/moderation/validate-banner-image-url.d.ts.map +1 -0
  186. package/dist/cms/moderation/validate-banner-image-url.js +20 -0
  187. package/dist/cms/moderation/validate-banner-image-url.js.map +1 -0
  188. package/dist/cms/plugin.d.ts +181 -1
  189. package/dist/cms/plugin.d.ts.map +1 -1
  190. package/dist/cms/plugin.js +5 -5
  191. package/dist/cms/plugin.js.map +1 -1
  192. package/dist/cms/router/index.d.ts +219 -37
  193. package/dist/cms/router/index.d.ts.map +1 -1
  194. package/dist/cms/router/index.js +83 -21
  195. package/dist/cms/router/index.js.map +1 -1
  196. package/dist/cms/schema/index.d.ts +283 -28
  197. package/dist/cms/schema/index.d.ts.map +1 -1
  198. package/dist/cms/schema/index.js +57 -7
  199. package/dist/cms/schema/index.js.map +1 -1
  200. package/dist/cms/server.d.ts +1 -1
  201. package/dist/cms/server.d.ts.map +1 -1
  202. package/dist/cms/server.js +1 -1
  203. package/dist/cms/server.js.map +1 -1
  204. package/dist/cms/service/cms.service.d.ts +229 -45
  205. package/dist/cms/service/cms.service.d.ts.map +1 -1
  206. package/dist/cms/service/cms.service.js +702 -67
  207. package/dist/cms/service/cms.service.js.map +1 -1
  208. package/dist/common/errors/__tests__/errors.mapper.test.d.ts +2 -0
  209. package/dist/common/errors/__tests__/errors.mapper.test.d.ts.map +1 -0
  210. package/dist/common/errors/__tests__/errors.mapper.test.js +59 -0
  211. package/dist/common/errors/__tests__/errors.mapper.test.js.map +1 -0
  212. package/dist/common/errors/errors.classes.js +3 -3
  213. package/dist/common/errors/errors.classes.js.map +1 -1
  214. package/dist/common/errors/errors.mapper.js +1 -1
  215. package/dist/common/errors/errors.mapper.js.map +1 -1
  216. package/dist/compliance/__tests__/assert.test.d.ts +2 -0
  217. package/dist/compliance/__tests__/assert.test.d.ts.map +1 -0
  218. package/dist/compliance/__tests__/assert.test.js +34 -0
  219. package/dist/compliance/__tests__/assert.test.js.map +1 -0
  220. package/dist/compliance/__tests__/compliance.service.int.test.d.ts +2 -0
  221. package/dist/compliance/__tests__/compliance.service.int.test.d.ts.map +1 -0
  222. package/dist/compliance/__tests__/compliance.service.int.test.js +81 -0
  223. package/dist/compliance/__tests__/compliance.service.int.test.js.map +1 -0
  224. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts +2 -0
  225. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts.map +1 -0
  226. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js +82 -0
  227. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js.map +1 -0
  228. package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts +2 -0
  229. package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts.map +1 -0
  230. package/dist/compliance/__tests__/kyc-admin.router.int.test.js +198 -0
  231. package/dist/compliance/__tests__/kyc-admin.router.int.test.js.map +1 -0
  232. package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts +2 -0
  233. package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts.map +1 -0
  234. package/dist/compliance/__tests__/kyc-webhook.router.int.test.js +177 -0
  235. package/dist/compliance/__tests__/kyc-webhook.router.int.test.js.map +1 -0
  236. package/dist/compliance/__tests__/kyc.service.int.test.d.ts +2 -0
  237. package/dist/compliance/__tests__/kyc.service.int.test.d.ts.map +1 -0
  238. package/dist/compliance/__tests__/kyc.service.int.test.js +397 -0
  239. package/dist/compliance/__tests__/kyc.service.int.test.js.map +1 -0
  240. package/dist/compliance/__tests__/limits.contract.test.d.ts +2 -0
  241. package/dist/compliance/__tests__/limits.contract.test.d.ts.map +1 -0
  242. package/dist/compliance/__tests__/limits.contract.test.js +83 -0
  243. package/dist/compliance/__tests__/limits.contract.test.js.map +1 -0
  244. package/dist/compliance/__tests__/rg-eval.test.js +28 -1
  245. package/dist/compliance/__tests__/rg-eval.test.js.map +1 -1
  246. package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts +2 -0
  247. package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts.map +1 -0
  248. package/dist/compliance/__tests__/rg-monitoring.service.int.test.js +512 -0
  249. package/dist/compliance/__tests__/rg-monitoring.service.int.test.js.map +1 -0
  250. package/dist/compliance/__tests__/rg-self-service.int.test.d.ts +2 -0
  251. package/dist/compliance/__tests__/rg-self-service.int.test.d.ts.map +1 -0
  252. package/dist/compliance/__tests__/rg-self-service.int.test.js +539 -0
  253. package/dist/compliance/__tests__/rg-self-service.int.test.js.map +1 -0
  254. package/dist/compliance/__tests__/rg.contract.test.js +60 -20
  255. package/dist/compliance/__tests__/rg.contract.test.js.map +1 -1
  256. package/dist/compliance/__tests__/rg.router.int.test.d.ts +2 -0
  257. package/dist/compliance/__tests__/rg.router.int.test.d.ts.map +1 -0
  258. package/dist/compliance/__tests__/rg.router.int.test.js +325 -0
  259. package/dist/compliance/__tests__/rg.router.int.test.js.map +1 -0
  260. package/dist/compliance/__tests__/rg.service.int.test.d.ts +2 -0
  261. package/dist/compliance/__tests__/rg.service.int.test.d.ts.map +1 -0
  262. package/dist/compliance/__tests__/rg.service.int.test.js +747 -0
  263. package/dist/compliance/__tests__/rg.service.int.test.js.map +1 -0
  264. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts +16 -3
  265. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts.map +1 -1
  266. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js +47 -5
  267. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js.map +1 -1
  268. package/dist/compliance/adapters/rg-limit-gate.d.ts +17 -0
  269. package/dist/compliance/adapters/rg-limit-gate.d.ts.map +1 -0
  270. package/dist/compliance/adapters/rg-limit-gate.js +107 -0
  271. package/dist/compliance/adapters/rg-limit-gate.js.map +1 -0
  272. package/dist/compliance/contract/index.d.ts +1316 -121
  273. package/dist/compliance/contract/index.d.ts.map +1 -1
  274. package/dist/compliance/contract/index.js +102 -8
  275. package/dist/compliance/contract/index.js.map +1 -1
  276. package/dist/compliance/contract/limits.d.ts +52 -0
  277. package/dist/compliance/contract/limits.d.ts.map +1 -1
  278. package/dist/compliance/contract/limits.js +27 -7
  279. package/dist/compliance/contract/limits.js.map +1 -1
  280. package/dist/compliance/contract/rg.d.ts +337 -7
  281. package/dist/compliance/contract/rg.d.ts.map +1 -1
  282. package/dist/compliance/contract/rg.js +61 -15
  283. package/dist/compliance/contract/rg.js.map +1 -1
  284. package/dist/compliance/drizzle/migrations/0002_condemned_monster_badoon.sql +3 -0
  285. package/dist/compliance/drizzle/migrations/0003_public_spirit.sql +1 -0
  286. package/dist/compliance/drizzle/migrations/0004_military_silk_fever.sql +2 -0
  287. package/dist/compliance/drizzle/migrations/0005_reflective_magma.sql +13 -0
  288. package/dist/compliance/drizzle/migrations/0006_backfill_session_limit_currency.sql +15 -0
  289. package/dist/compliance/drizzle/migrations/0007_romantic_toxin.sql +6 -0
  290. package/dist/compliance/drizzle/migrations/meta/0002_snapshot.json +673 -0
  291. package/dist/compliance/drizzle/migrations/meta/0003_snapshot.json +679 -0
  292. package/dist/compliance/drizzle/migrations/meta/0004_snapshot.json +679 -0
  293. package/dist/compliance/drizzle/migrations/meta/0005_snapshot.json +754 -0
  294. package/dist/compliance/drizzle/migrations/meta/0006_snapshot.json +754 -0
  295. package/dist/compliance/drizzle/migrations/meta/0007_snapshot.json +785 -0
  296. package/dist/compliance/drizzle/migrations/meta/_journal.json +42 -0
  297. package/dist/compliance/plugin.d.ts +184 -1
  298. package/dist/compliance/plugin.d.ts.map +1 -1
  299. package/dist/compliance/plugin.js +85 -14
  300. package/dist/compliance/plugin.js.map +1 -1
  301. package/dist/compliance/router/index.d.ts +851 -65
  302. package/dist/compliance/router/index.d.ts.map +1 -1
  303. package/dist/compliance/router/index.js +106 -23
  304. package/dist/compliance/router/index.js.map +1 -1
  305. package/dist/compliance/schema/index.d.ts +224 -4
  306. package/dist/compliance/schema/index.d.ts.map +1 -1
  307. package/dist/compliance/schema/index.js +38 -5
  308. package/dist/compliance/schema/index.js.map +1 -1
  309. package/dist/compliance/service/compliance.service.d.ts +23 -33
  310. package/dist/compliance/service/compliance.service.d.ts.map +1 -1
  311. package/dist/compliance/service/compliance.service.js +20 -37
  312. package/dist/compliance/service/compliance.service.js.map +1 -1
  313. package/dist/compliance/service/kyc.service.d.ts +228 -10
  314. package/dist/compliance/service/kyc.service.d.ts.map +1 -1
  315. package/dist/compliance/service/kyc.service.js +566 -62
  316. package/dist/compliance/service/kyc.service.js.map +1 -1
  317. package/dist/compliance/service/rg-eval.d.ts +7 -2
  318. package/dist/compliance/service/rg-eval.d.ts.map +1 -1
  319. package/dist/compliance/service/rg-eval.js +10 -2
  320. package/dist/compliance/service/rg-eval.js.map +1 -1
  321. package/dist/compliance/service/rg-monitoring.service.d.ts +24 -6
  322. package/dist/compliance/service/rg-monitoring.service.d.ts.map +1 -1
  323. package/dist/compliance/service/rg-monitoring.service.js +109 -20
  324. package/dist/compliance/service/rg-monitoring.service.js.map +1 -1
  325. package/dist/compliance/service/rg-self-service.service.d.ts +84 -0
  326. package/dist/compliance/service/rg-self-service.service.d.ts.map +1 -0
  327. package/dist/compliance/service/rg-self-service.service.js +449 -0
  328. package/dist/compliance/service/rg-self-service.service.js.map +1 -0
  329. package/dist/compliance/service/rg.service.d.ts +103 -15
  330. package/dist/compliance/service/rg.service.d.ts.map +1 -1
  331. package/dist/compliance/service/rg.service.js +325 -61
  332. package/dist/compliance/service/rg.service.js.map +1 -1
  333. package/dist/contracts/__tests__/compose-contract.test.d.ts +2 -0
  334. package/dist/contracts/__tests__/compose-contract.test.d.ts.map +1 -0
  335. package/dist/contracts/__tests__/compose-contract.test.js +27 -0
  336. package/dist/contracts/__tests__/compose-contract.test.js.map +1 -0
  337. package/dist/contracts/__tests__/identity.test.d.ts +2 -0
  338. package/dist/contracts/__tests__/identity.test.d.ts.map +1 -0
  339. package/dist/contracts/__tests__/identity.test.js +50 -0
  340. package/dist/contracts/__tests__/identity.test.js.map +1 -0
  341. package/dist/contracts/__tests__/player.test.d.ts +2 -0
  342. package/dist/contracts/__tests__/player.test.d.ts.map +1 -0
  343. package/dist/contracts/__tests__/player.test.js +51 -0
  344. package/dist/contracts/__tests__/player.test.js.map +1 -0
  345. package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts +2 -0
  346. package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts.map +1 -0
  347. package/dist/contracts/adapters/__tests__/rate-limit.test.js +13 -0
  348. package/dist/contracts/adapters/__tests__/rate-limit.test.js.map +1 -0
  349. package/dist/contracts/adapters/__tests__/token.test.d.ts +2 -0
  350. package/dist/contracts/adapters/__tests__/token.test.d.ts.map +1 -0
  351. package/dist/contracts/adapters/__tests__/token.test.js +14 -0
  352. package/dist/contracts/adapters/__tests__/token.test.js.map +1 -0
  353. package/dist/contracts/adapters/admin-game-reporting.d.ts +43 -0
  354. package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -0
  355. package/dist/contracts/adapters/admin-game-reporting.js +17 -0
  356. package/dist/contracts/adapters/admin-game-reporting.js.map +1 -0
  357. package/dist/contracts/adapters/admin-permission.d.ts +11 -0
  358. package/dist/contracts/adapters/admin-permission.d.ts.map +1 -1
  359. package/dist/contracts/adapters/admin-permission.js +6 -4
  360. package/dist/contracts/adapters/admin-permission.js.map +1 -1
  361. package/dist/contracts/adapters/admin-player-activity.d.ts +51 -0
  362. package/dist/contracts/adapters/admin-player-activity.d.ts.map +1 -0
  363. package/dist/contracts/adapters/admin-player-activity.js +3 -0
  364. package/dist/contracts/adapters/admin-player-activity.js.map +1 -0
  365. package/dist/contracts/adapters/admin-role-assignment-directory.d.ts +12 -0
  366. package/dist/contracts/adapters/admin-role-assignment-directory.d.ts.map +1 -0
  367. package/dist/contracts/adapters/admin-role-assignment-directory.js +3 -0
  368. package/dist/contracts/adapters/admin-role-assignment-directory.js.map +1 -0
  369. package/dist/contracts/adapters/admin-security.d.ts +27 -0
  370. package/dist/contracts/adapters/admin-security.d.ts.map +1 -0
  371. package/dist/contracts/adapters/admin-security.js +9 -0
  372. package/dist/contracts/adapters/admin-security.js.map +1 -0
  373. package/dist/contracts/adapters/admin-user-directory.d.ts +52 -4
  374. package/dist/contracts/adapters/admin-user-directory.d.ts.map +1 -1
  375. package/dist/contracts/adapters/admin-user-directory.js +8 -0
  376. package/dist/contracts/adapters/admin-user-directory.js.map +1 -1
  377. package/dist/contracts/adapters/admin-wallet-reporting.d.ts +11 -0
  378. package/dist/contracts/adapters/admin-wallet-reporting.d.ts.map +1 -1
  379. package/dist/contracts/adapters/admin-wallet-reporting.js +9 -0
  380. package/dist/contracts/adapters/admin-wallet-reporting.js.map +1 -1
  381. package/dist/contracts/adapters/aggregator.d.ts +12 -0
  382. package/dist/contracts/adapters/aggregator.d.ts.map +1 -1
  383. package/dist/contracts/adapters/aggregator.js +5 -3
  384. package/dist/contracts/adapters/aggregator.js.map +1 -1
  385. package/dist/contracts/adapters/audit.d.ts +30 -4
  386. package/dist/contracts/adapters/audit.d.ts.map +1 -1
  387. package/dist/contracts/adapters/audit.js.map +1 -1
  388. package/dist/contracts/adapters/broker.d.ts +23 -0
  389. package/dist/contracts/adapters/broker.d.ts.map +1 -1
  390. package/dist/contracts/adapters/broker.js +8 -6
  391. package/dist/contracts/adapters/broker.js.map +1 -1
  392. package/dist/contracts/adapters/cache.d.ts +11 -0
  393. package/dist/contracts/adapters/cache.d.ts.map +1 -1
  394. package/dist/contracts/adapters/cache.js +8 -6
  395. package/dist/contracts/adapters/cache.js.map +1 -1
  396. package/dist/contracts/adapters/chat-block-writer.d.ts +18 -0
  397. package/dist/contracts/adapters/chat-block-writer.d.ts.map +1 -0
  398. package/dist/contracts/adapters/chat-block-writer.js +7 -0
  399. package/dist/contracts/adapters/chat-block-writer.js.map +1 -0
  400. package/dist/contracts/adapters/chat-moderation.d.ts +75 -0
  401. package/dist/contracts/adapters/chat-moderation.d.ts.map +1 -0
  402. package/dist/contracts/adapters/chat-moderation.js +3 -0
  403. package/dist/contracts/adapters/chat-moderation.js.map +1 -0
  404. package/dist/contracts/adapters/chat-room-access.d.ts +6 -0
  405. package/dist/contracts/adapters/chat-room-access.d.ts.map +1 -0
  406. package/dist/contracts/adapters/chat-room-access.js +3 -0
  407. package/dist/contracts/adapters/chat-room-access.js.map +1 -0
  408. package/dist/contracts/adapters/chat-system-writer.d.ts +19 -0
  409. package/dist/contracts/adapters/chat-system-writer.d.ts.map +1 -0
  410. package/dist/contracts/adapters/chat-system-writer.js +3 -0
  411. package/dist/contracts/adapters/chat-system-writer.js.map +1 -0
  412. package/dist/contracts/adapters/email-template.d.ts +12 -0
  413. package/dist/contracts/adapters/email-template.d.ts.map +1 -0
  414. package/dist/contracts/adapters/email-template.js +3 -0
  415. package/dist/contracts/adapters/email-template.js.map +1 -0
  416. package/dist/contracts/adapters/error-tracking.d.ts +12 -0
  417. package/dist/contracts/adapters/error-tracking.d.ts.map +1 -0
  418. package/dist/contracts/adapters/error-tracking.js +3 -0
  419. package/dist/contracts/adapters/error-tracking.js.map +1 -0
  420. package/dist/contracts/adapters/exchange-rate-provider.d.ts +14 -0
  421. package/dist/contracts/adapters/exchange-rate-provider.d.ts.map +1 -0
  422. package/dist/contracts/adapters/exchange-rate-provider.js +5 -0
  423. package/dist/contracts/adapters/exchange-rate-provider.js.map +1 -0
  424. package/dist/contracts/adapters/exchange-rate-reader.d.ts +16 -0
  425. package/dist/contracts/adapters/exchange-rate-reader.d.ts.map +1 -0
  426. package/dist/contracts/adapters/exchange-rate-reader.js +3 -0
  427. package/dist/contracts/adapters/exchange-rate-reader.js.map +1 -0
  428. package/dist/contracts/adapters/game.d.ts +13 -1
  429. package/dist/contracts/adapters/game.d.ts.map +1 -1
  430. package/dist/contracts/adapters/game.js +4 -2
  431. package/dist/contracts/adapters/game.js.map +1 -1
  432. package/dist/contracts/adapters/gaming-commands.d.ts +25 -0
  433. package/dist/contracts/adapters/gaming-commands.d.ts.map +1 -0
  434. package/dist/contracts/adapters/gaming-commands.js +8 -0
  435. package/dist/contracts/adapters/gaming-commands.js.map +1 -0
  436. package/dist/contracts/adapters/geo-check-commands.d.ts +8 -0
  437. package/dist/contracts/adapters/geo-check-commands.d.ts.map +1 -0
  438. package/dist/contracts/adapters/geo-check-commands.js +3 -0
  439. package/dist/contracts/adapters/geo-check-commands.js.map +1 -0
  440. package/dist/contracts/adapters/geo-ip.d.ts +4 -0
  441. package/dist/contracts/adapters/geo-ip.d.ts.map +1 -1
  442. package/dist/contracts/adapters/geo-ip.js +4 -2
  443. package/dist/contracts/adapters/geo-ip.js.map +1 -1
  444. package/dist/contracts/adapters/identity-reader.d.ts +20 -4
  445. package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
  446. package/dist/contracts/adapters/identity-reader.js.map +1 -1
  447. package/dist/contracts/adapters/identity.d.ts +15 -0
  448. package/dist/contracts/adapters/identity.d.ts.map +1 -1
  449. package/dist/contracts/adapters/identity.js +5 -2
  450. package/dist/contracts/adapters/identity.js.map +1 -1
  451. package/dist/contracts/adapters/index.d.ts +72 -21
  452. package/dist/contracts/adapters/index.d.ts.map +1 -1
  453. package/dist/contracts/adapters/index.js +37 -13
  454. package/dist/contracts/adapters/index.js.map +1 -1
  455. package/dist/contracts/adapters/job-queue.d.ts +55 -0
  456. package/dist/contracts/adapters/job-queue.d.ts.map +1 -1
  457. package/dist/contracts/adapters/job-queue.js +11 -9
  458. package/dist/contracts/adapters/job-queue.js.map +1 -1
  459. package/dist/contracts/adapters/kyc.d.ts +110 -11
  460. package/dist/contracts/adapters/kyc.d.ts.map +1 -1
  461. package/dist/contracts/adapters/kyc.js +23 -0
  462. package/dist/contracts/adapters/kyc.js.map +1 -1
  463. package/dist/contracts/adapters/login-enforcement.d.ts +8 -0
  464. package/dist/contracts/adapters/login-enforcement.d.ts.map +1 -1
  465. package/dist/contracts/adapters/login-enforcement.js +8 -6
  466. package/dist/contracts/adapters/login-enforcement.js.map +1 -1
  467. package/dist/contracts/adapters/mail.d.ts +30 -0
  468. package/dist/contracts/adapters/mail.d.ts.map +1 -0
  469. package/dist/contracts/adapters/mail.js +4 -0
  470. package/dist/contracts/adapters/mail.js.map +1 -0
  471. package/dist/contracts/adapters/outbox.d.ts +14 -0
  472. package/dist/contracts/adapters/outbox.d.ts.map +1 -1
  473. package/dist/contracts/adapters/outbox.js +14 -12
  474. package/dist/contracts/adapters/outbox.js.map +1 -1
  475. package/dist/contracts/adapters/payment.d.ts +141 -3
  476. package/dist/contracts/adapters/payment.d.ts.map +1 -1
  477. package/dist/contracts/adapters/payment.js +11 -3
  478. package/dist/contracts/adapters/payment.js.map +1 -1
  479. package/dist/contracts/adapters/play-eligibility.d.ts +15 -0
  480. package/dist/contracts/adapters/play-eligibility.d.ts.map +1 -0
  481. package/dist/contracts/adapters/play-eligibility.js +3 -0
  482. package/dist/contracts/adapters/play-eligibility.js.map +1 -0
  483. package/dist/contracts/adapters/player-activity.d.ts +6 -0
  484. package/dist/contracts/adapters/player-activity.d.ts.map +1 -0
  485. package/dist/contracts/adapters/player-activity.js +3 -0
  486. package/dist/contracts/adapters/player-activity.js.map +1 -0
  487. package/dist/contracts/adapters/player-provisioning.d.ts +29 -0
  488. package/dist/contracts/adapters/player-provisioning.d.ts.map +1 -0
  489. package/dist/contracts/adapters/player-provisioning.js +3 -0
  490. package/dist/contracts/adapters/player-provisioning.js.map +1 -0
  491. package/dist/contracts/adapters/player-tags.d.ts +4 -0
  492. package/dist/contracts/adapters/player-tags.d.ts.map +1 -1
  493. package/dist/contracts/adapters/player-tags.js.map +1 -1
  494. package/dist/contracts/adapters/rate-limit.d.ts +42 -3
  495. package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
  496. package/dist/contracts/adapters/rate-limit.js +30 -6
  497. package/dist/contracts/adapters/rate-limit.js.map +1 -1
  498. package/dist/contracts/adapters/realtime.d.ts +156 -7
  499. package/dist/contracts/adapters/realtime.d.ts.map +1 -1
  500. package/dist/contracts/adapters/realtime.js +33 -10
  501. package/dist/contracts/adapters/realtime.js.map +1 -1
  502. package/dist/contracts/adapters/rg-limits.d.ts +47 -0
  503. package/dist/contracts/adapters/rg-limits.d.ts.map +1 -0
  504. package/dist/contracts/adapters/rg-limits.js +18 -0
  505. package/dist/contracts/adapters/rg-limits.js.map +1 -0
  506. package/dist/contracts/adapters/rng.d.ts +11 -0
  507. package/dist/contracts/adapters/rng.d.ts.map +1 -1
  508. package/dist/contracts/adapters/rng.js +11 -9
  509. package/dist/contracts/adapters/rng.js.map +1 -1
  510. package/dist/contracts/adapters/sms.d.ts +15 -0
  511. package/dist/contracts/adapters/sms.d.ts.map +1 -0
  512. package/dist/contracts/adapters/sms.js +9 -0
  513. package/dist/contracts/adapters/sms.js.map +1 -0
  514. package/dist/contracts/adapters/social-commands.d.ts +12 -0
  515. package/dist/contracts/adapters/social-commands.d.ts.map +1 -0
  516. package/dist/contracts/adapters/social-commands.js +7 -0
  517. package/dist/contracts/adapters/social-commands.js.map +1 -0
  518. package/dist/contracts/adapters/swap.d.ts +80 -0
  519. package/dist/contracts/adapters/swap.d.ts.map +1 -0
  520. package/dist/contracts/adapters/swap.js +5 -0
  521. package/dist/contracts/adapters/swap.js.map +1 -0
  522. package/dist/contracts/adapters/tag-evaluation-commands.d.ts +20 -0
  523. package/dist/contracts/adapters/tag-evaluation-commands.d.ts.map +1 -0
  524. package/dist/contracts/adapters/tag-evaluation-commands.js +13 -0
  525. package/dist/contracts/adapters/tag-evaluation-commands.js.map +1 -0
  526. package/dist/contracts/adapters/token.d.ts +28 -5
  527. package/dist/contracts/adapters/token.d.ts.map +1 -1
  528. package/dist/contracts/adapters/token.js +10 -8
  529. package/dist/contracts/adapters/token.js.map +1 -1
  530. package/dist/contracts/adapters/wallet-asset-catalog.d.ts +34 -0
  531. package/dist/contracts/adapters/wallet-asset-catalog.d.ts.map +1 -0
  532. package/dist/contracts/adapters/wallet-asset-catalog.js +3 -0
  533. package/dist/contracts/adapters/wallet-asset-catalog.js.map +1 -0
  534. package/dist/contracts/adapters/wallet-commands.d.ts +25 -0
  535. package/dist/contracts/adapters/wallet-commands.d.ts.map +1 -1
  536. package/dist/contracts/adapters/wallet-commands.js.map +1 -1
  537. package/dist/contracts/adapters/wallet-reader.d.ts +43 -1
  538. package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
  539. package/dist/contracts/adapters/wallet-reader.js.map +1 -1
  540. package/dist/contracts/kit.d.ts +15 -0
  541. package/dist/contracts/kit.d.ts.map +1 -1
  542. package/dist/contracts/kit.js +1 -0
  543. package/dist/contracts/kit.js.map +1 -1
  544. package/dist/contracts/schemas/__tests__/common-schemas.test.js +33 -4
  545. package/dist/contracts/schemas/__tests__/common-schemas.test.js.map +1 -1
  546. package/dist/contracts/schemas/__tests__/events.test.d.ts +2 -0
  547. package/dist/contracts/schemas/__tests__/events.test.d.ts.map +1 -0
  548. package/dist/contracts/schemas/__tests__/events.test.js +192 -0
  549. package/dist/contracts/schemas/__tests__/events.test.js.map +1 -0
  550. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts +2 -0
  551. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts.map +1 -0
  552. package/dist/contracts/schemas/__tests__/igaming-config.test.js +38 -0
  553. package/dist/contracts/schemas/__tests__/igaming-config.test.js.map +1 -0
  554. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts +2 -0
  555. package/dist/contracts/schemas/__tests__/platform-config.test.d.ts.map +1 -0
  556. package/dist/contracts/schemas/__tests__/platform-config.test.js +16 -0
  557. package/dist/contracts/schemas/__tests__/platform-config.test.js.map +1 -0
  558. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
  559. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
  560. package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
  561. package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
  562. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts +2 -0
  563. package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts.map +1 -0
  564. package/dist/contracts/schemas/__tests__/tag-schemas.test.js +42 -0
  565. package/dist/contracts/schemas/__tests__/tag-schemas.test.js.map +1 -0
  566. package/dist/contracts/schemas/chat-attachment.d.ts +20 -0
  567. package/dist/contracts/schemas/chat-attachment.d.ts.map +1 -0
  568. package/dist/contracts/schemas/chat-attachment.js +14 -0
  569. package/dist/contracts/schemas/chat-attachment.js.map +1 -0
  570. package/dist/contracts/schemas/chat-command-metadata.d.ts +73 -0
  571. package/dist/contracts/schemas/chat-command-metadata.d.ts.map +1 -0
  572. package/dist/contracts/schemas/chat-command-metadata.js +67 -0
  573. package/dist/contracts/schemas/chat-command-metadata.js.map +1 -0
  574. package/dist/contracts/schemas/chat-command.d.ts +224 -0
  575. package/dist/contracts/schemas/chat-command.d.ts.map +1 -0
  576. package/dist/contracts/schemas/chat-command.js +55 -0
  577. package/dist/contracts/schemas/chat-command.js.map +1 -0
  578. package/dist/contracts/schemas/common.d.ts +36 -0
  579. package/dist/contracts/schemas/common.d.ts.map +1 -1
  580. package/dist/contracts/schemas/common.js +67 -2
  581. package/dist/contracts/schemas/common.js.map +1 -1
  582. package/dist/contracts/schemas/compliance.d.ts +23 -1
  583. package/dist/contracts/schemas/compliance.d.ts.map +1 -1
  584. package/dist/contracts/schemas/compliance.js +12 -0
  585. package/dist/contracts/schemas/compliance.js.map +1 -1
  586. package/dist/contracts/schemas/display-currency.d.ts +14 -0
  587. package/dist/contracts/schemas/display-currency.d.ts.map +1 -0
  588. package/dist/contracts/schemas/display-currency.js +45 -0
  589. package/dist/contracts/schemas/display-currency.js.map +1 -0
  590. package/dist/contracts/schemas/events.d.ts +934 -7
  591. package/dist/contracts/schemas/events.d.ts.map +1 -1
  592. package/dist/contracts/schemas/events.js +594 -69
  593. package/dist/contracts/schemas/events.js.map +1 -1
  594. package/dist/contracts/schemas/game.d.ts +9 -0
  595. package/dist/contracts/schemas/game.d.ts.map +1 -0
  596. package/dist/contracts/schemas/game.js +4 -0
  597. package/dist/contracts/schemas/game.js.map +1 -0
  598. package/dist/contracts/schemas/iam.d.ts +31 -0
  599. package/dist/contracts/schemas/iam.d.ts.map +1 -1
  600. package/dist/contracts/schemas/iam.js +34 -0
  601. package/dist/contracts/schemas/iam.js.map +1 -1
  602. package/dist/contracts/schemas/identity.d.ts +196 -4
  603. package/dist/contracts/schemas/identity.d.ts.map +1 -1
  604. package/dist/contracts/schemas/identity.js +186 -8
  605. package/dist/contracts/schemas/identity.js.map +1 -1
  606. package/dist/contracts/schemas/igaming-config.d.ts +31 -1
  607. package/dist/contracts/schemas/igaming-config.d.ts.map +1 -1
  608. package/dist/contracts/schemas/igaming-config.js +9 -1
  609. package/dist/contracts/schemas/igaming-config.js.map +1 -1
  610. package/dist/contracts/schemas/index.d.ts +7 -0
  611. package/dist/contracts/schemas/index.d.ts.map +1 -1
  612. package/dist/contracts/schemas/index.js +7 -0
  613. package/dist/contracts/schemas/index.js.map +1 -1
  614. package/dist/contracts/schemas/mail.d.ts +188 -0
  615. package/dist/contracts/schemas/mail.d.ts.map +1 -0
  616. package/dist/contracts/schemas/mail.js +80 -0
  617. package/dist/contracts/schemas/mail.js.map +1 -0
  618. package/dist/contracts/schemas/platform-config.d.ts +211 -32
  619. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  620. package/dist/contracts/schemas/platform-config.js +239 -7
  621. package/dist/contracts/schemas/platform-config.js.map +1 -1
  622. package/dist/contracts/schemas/player.d.ts +96 -4
  623. package/dist/contracts/schemas/player.d.ts.map +1 -1
  624. package/dist/contracts/schemas/player.js +83 -9
  625. package/dist/contracts/schemas/player.js.map +1 -1
  626. package/dist/contracts/schemas/reporting.d.ts +20 -0
  627. package/dist/contracts/schemas/reporting.d.ts.map +1 -0
  628. package/dist/contracts/schemas/reporting.js +13 -0
  629. package/dist/contracts/schemas/reporting.js.map +1 -0
  630. package/dist/contracts/schemas/tag.d.ts +86 -2
  631. package/dist/contracts/schemas/tag.d.ts.map +1 -1
  632. package/dist/contracts/schemas/tag.js +13 -1
  633. package/dist/contracts/schemas/tag.js.map +1 -1
  634. package/dist/contracts/schemas/wallet-tx.d.ts +50 -3
  635. package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
  636. package/dist/contracts/schemas/wallet-tx.js +50 -3
  637. package/dist/contracts/schemas/wallet-tx.js.map +1 -1
  638. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts +2 -0
  639. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts.map +1 -0
  640. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js +155 -0
  641. package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js.map +1 -0
  642. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts +2 -0
  643. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts.map +1 -0
  644. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js +81 -0
  645. package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js.map +1 -0
  646. package/dist/engagement/chat/__tests__/chat.router.test.d.ts +2 -0
  647. package/dist/engagement/chat/__tests__/chat.router.test.d.ts.map +1 -0
  648. package/dist/engagement/chat/__tests__/chat.router.test.js +44 -0
  649. package/dist/engagement/chat/__tests__/chat.router.test.js.map +1 -0
  650. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts +2 -0
  651. package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts.map +1 -0
  652. package/dist/engagement/chat/__tests__/chat.service.int.test.js +2349 -0
  653. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -0
  654. package/dist/engagement/chat/__tests__/contract.test.d.ts +2 -0
  655. package/dist/engagement/chat/__tests__/contract.test.d.ts.map +1 -0
  656. package/dist/engagement/chat/__tests__/contract.test.js +44 -0
  657. package/dist/engagement/chat/__tests__/contract.test.js.map +1 -0
  658. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts +2 -0
  659. package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts.map +1 -0
  660. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js +100 -0
  661. package/dist/engagement/chat/__tests__/global-chat-room.int.test.js.map +1 -0
  662. package/dist/engagement/chat/__tests__/moderation.test.js +2 -0
  663. package/dist/engagement/chat/__tests__/moderation.test.js.map +1 -1
  664. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts +2 -0
  665. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts.map +1 -0
  666. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js +736 -0
  667. package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js.map +1 -0
  668. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts +2 -0
  669. package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts.map +1 -0
  670. package/dist/engagement/chat/__tests__/validate-attachment.test.js +38 -0
  671. package/dist/engagement/chat/__tests__/validate-attachment.test.js.map +1 -0
  672. package/dist/engagement/chat/contract/constants.d.ts +15 -0
  673. package/dist/engagement/chat/contract/constants.d.ts.map +1 -0
  674. package/dist/engagement/chat/contract/constants.js +20 -0
  675. package/dist/engagement/chat/contract/constants.js.map +1 -0
  676. package/dist/engagement/chat/contract/index.d.ts +2190 -16
  677. package/dist/engagement/chat/contract/index.d.ts.map +1 -1
  678. package/dist/engagement/chat/contract/index.js +457 -12
  679. package/dist/engagement/chat/contract/index.js.map +1 -1
  680. package/dist/engagement/chat/drizzle/migrations/0001_cloudy_groot.sql +32 -0
  681. package/dist/engagement/chat/drizzle/migrations/0002_steep_zodiak.sql +3 -0
  682. package/dist/engagement/chat/drizzle/migrations/0003_stormy_king_bedlam.sql +9 -0
  683. package/dist/engagement/chat/drizzle/migrations/0004_panoramic_robin_chapel.sql +6 -0
  684. package/dist/engagement/chat/drizzle/migrations/0005_tranquil_gwen_stacy.sql +100 -0
  685. package/dist/engagement/chat/drizzle/migrations/0006_tiny_ultron.sql +3 -0
  686. package/dist/engagement/chat/drizzle/migrations/0007_seed_global_chat_room.sql +8 -0
  687. package/dist/engagement/chat/drizzle/migrations/0008_robust_korvac.sql +1 -0
  688. package/dist/engagement/chat/drizzle/migrations/0009_massive_bill_hollister.sql +1 -0
  689. package/dist/engagement/chat/drizzle/migrations/0010_backfill_role_assigned_at.sql +9 -0
  690. package/dist/engagement/chat/drizzle/migrations/0011_light_changeling.sql +1 -0
  691. package/dist/engagement/chat/drizzle/migrations/0012_strange_mephisto.sql +3 -0
  692. package/dist/engagement/chat/drizzle/migrations/0013_chilly_sprite.sql +6 -0
  693. package/dist/engagement/chat/drizzle/migrations/0014_chat_moderation_expiry_recorded.sql +19 -0
  694. package/dist/engagement/chat/drizzle/migrations/meta/0001_snapshot.json +557 -0
  695. package/dist/engagement/chat/drizzle/migrations/meta/0002_snapshot.json +576 -0
  696. package/dist/engagement/chat/drizzle/migrations/meta/0003_snapshot.json +652 -0
  697. package/dist/engagement/chat/drizzle/migrations/meta/0004_snapshot.json +666 -0
  698. package/dist/engagement/chat/drizzle/migrations/meta/0005_snapshot.json +1422 -0
  699. package/dist/engagement/chat/drizzle/migrations/meta/0006_snapshot.json +1456 -0
  700. package/dist/engagement/chat/drizzle/migrations/meta/0007_snapshot.json +1456 -0
  701. package/dist/engagement/chat/drizzle/migrations/meta/0008_snapshot.json +1462 -0
  702. package/dist/engagement/chat/drizzle/migrations/meta/0009_snapshot.json +1468 -0
  703. package/dist/engagement/chat/drizzle/migrations/meta/0010_snapshot.json +1468 -0
  704. package/dist/engagement/chat/drizzle/migrations/meta/0011_snapshot.json +1489 -0
  705. package/dist/engagement/chat/drizzle/migrations/meta/0012_snapshot.json +1517 -0
  706. package/dist/engagement/chat/drizzle/migrations/meta/0013_snapshot.json +1517 -0
  707. package/dist/engagement/chat/drizzle/migrations/meta/0014_snapshot.json +1544 -0
  708. package/dist/engagement/chat/drizzle/migrations/meta/_journal.json +98 -0
  709. package/dist/engagement/chat/index.d.ts +1 -2
  710. package/dist/engagement/chat/index.d.ts.map +1 -1
  711. package/dist/engagement/chat/index.js +1 -2
  712. package/dist/engagement/chat/index.js.map +1 -1
  713. package/dist/engagement/chat/moderation/index.d.ts +1 -0
  714. package/dist/engagement/chat/moderation/index.d.ts.map +1 -1
  715. package/dist/engagement/chat/moderation/index.js +1 -0
  716. package/dist/engagement/chat/moderation/index.js.map +1 -1
  717. package/dist/engagement/chat/moderation/profanity.d.ts.map +1 -1
  718. package/dist/engagement/chat/moderation/profanity.js +2 -0
  719. package/dist/engagement/chat/moderation/profanity.js.map +1 -1
  720. package/dist/engagement/chat/moderation/validate-attachment.d.ts +9 -0
  721. package/dist/engagement/chat/moderation/validate-attachment.d.ts.map +1 -0
  722. package/dist/engagement/chat/moderation/validate-attachment.js +27 -0
  723. package/dist/engagement/chat/moderation/validate-attachment.js.map +1 -0
  724. package/dist/engagement/chat/plugin.d.ts +183 -1
  725. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  726. package/dist/engagement/chat/plugin.js +211 -5
  727. package/dist/engagement/chat/plugin.js.map +1 -1
  728. package/dist/engagement/chat/router/index.d.ts +1662 -16
  729. package/dist/engagement/chat/router/index.d.ts.map +1 -1
  730. package/dist/engagement/chat/router/index.js +302 -27
  731. package/dist/engagement/chat/router/index.js.map +1 -1
  732. package/dist/engagement/chat/schema/index.d.ts +1621 -0
  733. package/dist/engagement/chat/schema/index.d.ts.map +1 -1
  734. package/dist/engagement/chat/schema/index.js +192 -4
  735. package/dist/engagement/chat/schema/index.js.map +1 -1
  736. package/dist/engagement/chat/service/chat-ban.service.d.ts +26 -0
  737. package/dist/engagement/chat/service/chat-ban.service.d.ts.map +1 -0
  738. package/dist/engagement/chat/service/chat-ban.service.js +144 -0
  739. package/dist/engagement/chat/service/chat-ban.service.js.map +1 -0
  740. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts +14 -0
  741. package/dist/engagement/chat/service/chat-message-moderation.service.d.ts.map +1 -0
  742. package/dist/engagement/chat/service/chat-message-moderation.service.js +48 -0
  743. package/dist/engagement/chat/service/chat-message-moderation.service.js.map +1 -0
  744. package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts +22 -0
  745. package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts.map +1 -0
  746. package/dist/engagement/chat/service/chat-moderation-expiry.service.js +80 -0
  747. package/dist/engagement/chat/service/chat-moderation-expiry.service.js.map +1 -0
  748. package/dist/engagement/chat/service/chat-moderation.service.d.ts +30 -0
  749. package/dist/engagement/chat/service/chat-moderation.service.d.ts.map +1 -0
  750. package/dist/engagement/chat/service/chat-moderation.service.js +40 -0
  751. package/dist/engagement/chat/service/chat-moderation.service.js.map +1 -0
  752. package/dist/engagement/chat/service/chat-mute.service.d.ts +26 -0
  753. package/dist/engagement/chat/service/chat-mute.service.d.ts.map +1 -0
  754. package/dist/engagement/chat/service/chat-mute.service.js +159 -0
  755. package/dist/engagement/chat/service/chat-mute.service.js.map +1 -0
  756. package/dist/engagement/chat/service/chat-room-ban.service.d.ts +29 -0
  757. package/dist/engagement/chat/service/chat-room-ban.service.d.ts.map +1 -0
  758. package/dist/engagement/chat/service/chat-room-ban.service.js +107 -0
  759. package/dist/engagement/chat/service/chat-room-ban.service.js.map +1 -0
  760. package/dist/engagement/chat/service/chat-room-membership.service.d.ts +107 -0
  761. package/dist/engagement/chat/service/chat-room-membership.service.d.ts.map +1 -0
  762. package/dist/engagement/chat/service/chat-room-membership.service.js +536 -0
  763. package/dist/engagement/chat/service/chat-room-membership.service.js.map +1 -0
  764. package/dist/engagement/chat/service/chat-room-mute.service.d.ts +25 -0
  765. package/dist/engagement/chat/service/chat-room-mute.service.d.ts.map +1 -0
  766. package/dist/engagement/chat/service/chat-room-mute.service.js +89 -0
  767. package/dist/engagement/chat/service/chat-room-mute.service.js.map +1 -0
  768. package/dist/engagement/chat/service/chat-room-purge.service.d.ts +13 -0
  769. package/dist/engagement/chat/service/chat-room-purge.service.d.ts.map +1 -0
  770. package/dist/engagement/chat/service/chat-room-purge.service.js +75 -0
  771. package/dist/engagement/chat/service/chat-room-purge.service.js.map +1 -0
  772. package/dist/engagement/chat/service/chat.service.d.ts +1144 -35
  773. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  774. package/dist/engagement/chat/service/chat.service.js +1243 -70
  775. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  776. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts +42 -0
  777. package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts.map +1 -0
  778. package/dist/engagement/chat/service/errors/chat-moderation.errors.js +32 -0
  779. package/dist/engagement/chat/service/errors/chat-moderation.errors.js.map +1 -0
  780. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts +2 -0
  781. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts.map +1 -0
  782. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js +98 -0
  783. package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js.map +1 -0
  784. package/dist/engagement/chat-commands/contract/index.d.ts +201 -0
  785. package/dist/engagement/chat-commands/contract/index.d.ts.map +1 -0
  786. package/dist/engagement/chat-commands/contract/index.js +70 -0
  787. package/dist/engagement/chat-commands/contract/index.js.map +1 -0
  788. package/dist/engagement/chat-commands/drizzle/migrations/0000_daffy_lady_bullseye.sql +24 -0
  789. package/dist/engagement/chat-commands/drizzle/migrations/0001_sturdy_barracuda.sql +1 -0
  790. package/dist/engagement/chat-commands/drizzle/migrations/0002_single_currency_command_limits.sql +45 -0
  791. package/dist/engagement/chat-commands/drizzle/migrations/meta/0000_snapshot.json +164 -0
  792. package/dist/engagement/chat-commands/drizzle/migrations/meta/0001_snapshot.json +83 -0
  793. package/dist/engagement/chat-commands/drizzle/migrations/meta/0002_snapshot.json +83 -0
  794. package/dist/engagement/chat-commands/drizzle/migrations/meta/_journal.json +27 -0
  795. package/dist/engagement/chat-commands/drizzle.config.d.ts +4 -0
  796. package/dist/engagement/chat-commands/drizzle.config.d.ts.map +1 -0
  797. package/dist/engagement/chat-commands/drizzle.config.js +21 -0
  798. package/dist/engagement/chat-commands/drizzle.config.js.map +1 -0
  799. package/dist/engagement/chat-commands/migrate.d.ts +2 -0
  800. package/dist/engagement/chat-commands/migrate.d.ts.map +1 -0
  801. package/dist/engagement/chat-commands/migrate.js +20 -0
  802. package/dist/engagement/chat-commands/migrate.js.map +1 -0
  803. package/dist/engagement/chat-commands/plugin.d.ts +184 -0
  804. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -0
  805. package/dist/engagement/chat-commands/plugin.js +15 -0
  806. package/dist/engagement/chat-commands/plugin.js.map +1 -0
  807. package/dist/engagement/chat-commands/router/index.d.ts +137 -0
  808. package/dist/engagement/chat-commands/router/index.d.ts.map +1 -0
  809. package/dist/engagement/chat-commands/router/index.js +24 -0
  810. package/dist/engagement/chat-commands/router/index.js.map +1 -0
  811. package/dist/engagement/chat-commands/schema/index.d.ts +140 -0
  812. package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -0
  813. package/dist/engagement/chat-commands/schema/index.js +13 -0
  814. package/dist/engagement/chat-commands/schema/index.js.map +1 -0
  815. package/dist/engagement/chat-commands/seed/index.d.ts +3 -0
  816. package/dist/engagement/chat-commands/seed/index.d.ts.map +1 -0
  817. package/dist/engagement/chat-commands/seed/index.js +66 -0
  818. package/dist/engagement/chat-commands/seed/index.js.map +1 -0
  819. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts +2 -0
  820. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts.map +1 -0
  821. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js +157 -0
  822. package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js.map +1 -0
  823. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts +60 -0
  824. package/dist/engagement/chat-commands/service/chat-commands.service.d.ts.map +1 -0
  825. package/dist/engagement/chat-commands/service/chat-commands.service.js +147 -0
  826. package/dist/engagement/chat-commands/service/chat-commands.service.js.map +1 -0
  827. package/dist/engagement/contracts.d.ts +2 -0
  828. package/dist/engagement/contracts.d.ts.map +1 -1
  829. package/dist/engagement/contracts.js +2 -0
  830. package/dist/engagement/contracts.js.map +1 -1
  831. package/dist/engagement/index.d.ts +2 -0
  832. package/dist/engagement/index.d.ts.map +1 -1
  833. package/dist/engagement/index.js +2 -0
  834. package/dist/engagement/index.js.map +1 -1
  835. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts +2 -0
  836. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts.map +1 -0
  837. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js +184 -0
  838. package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js.map +1 -0
  839. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts +2 -0
  840. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts.map +1 -0
  841. package/dist/engagement/notifications/__tests__/notification-event-map.test.js +319 -0
  842. package/dist/engagement/notifications/__tests__/notification-event-map.test.js.map +1 -0
  843. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts +2 -0
  844. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts.map +1 -0
  845. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js +148 -0
  846. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js.map +1 -0
  847. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts +2 -0
  848. package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts.map +1 -0
  849. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +298 -0
  850. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -0
  851. package/dist/engagement/notifications/contract/index.d.ts +126 -13
  852. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  853. package/dist/engagement/notifications/contract/index.js +46 -5
  854. package/dist/engagement/notifications/contract/index.js.map +1 -1
  855. package/dist/engagement/notifications/drizzle/migrations/0001_classy_pixie.sql +1 -0
  856. package/dist/engagement/notifications/drizzle/migrations/0002_open_madame_web.sql +2 -0
  857. package/dist/engagement/notifications/drizzle/migrations/meta/0001_snapshot.json +98 -0
  858. package/dist/engagement/notifications/drizzle/migrations/meta/0002_snapshot.json +119 -0
  859. package/dist/engagement/notifications/drizzle/migrations/meta/_journal.json +14 -0
  860. package/dist/engagement/notifications/plugin.d.ts +200 -1
  861. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  862. package/dist/engagement/notifications/plugin.js +431 -47
  863. package/dist/engagement/notifications/plugin.js.map +1 -1
  864. package/dist/engagement/notifications/react/notifications.d.ts +20 -0
  865. package/dist/engagement/notifications/react/notifications.d.ts.map +1 -0
  866. package/dist/engagement/notifications/react/notifications.js +39 -0
  867. package/dist/engagement/notifications/react/notifications.js.map +1 -0
  868. package/dist/engagement/notifications/router/index.d.ts +74 -13
  869. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  870. package/dist/engagement/notifications/router/index.js +37 -16
  871. package/dist/engagement/notifications/router/index.js.map +1 -1
  872. package/dist/engagement/notifications/schema/index.d.ts +36 -0
  873. package/dist/engagement/notifications/schema/index.d.ts.map +1 -1
  874. package/dist/engagement/notifications/schema/index.js +7 -2
  875. package/dist/engagement/notifications/schema/index.js.map +1 -1
  876. package/dist/engagement/notifications/service/notifications.service.d.ts +33 -21
  877. package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
  878. package/dist/engagement/notifications/service/notifications.service.js +41 -11
  879. package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
  880. package/dist/engagement/react.d.ts +1 -1
  881. package/dist/engagement/react.d.ts.map +1 -1
  882. package/dist/engagement/react.js +2 -2
  883. package/dist/engagement/react.js.map +1 -1
  884. package/dist/engagement/server.d.ts +2 -0
  885. package/dist/engagement/server.d.ts.map +1 -1
  886. package/dist/engagement/server.js +2 -0
  887. package/dist/engagement/server.js.map +1 -1
  888. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts +2 -0
  889. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts.map +1 -0
  890. package/dist/engagement/social/__tests__/social.plugin.int.test.js +100 -0
  891. package/dist/engagement/social/__tests__/social.plugin.int.test.js.map +1 -0
  892. package/dist/engagement/social/__tests__/social.router.int.test.d.ts +2 -0
  893. package/dist/engagement/social/__tests__/social.router.int.test.d.ts.map +1 -0
  894. package/dist/engagement/social/__tests__/social.router.int.test.js +215 -0
  895. package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -0
  896. package/dist/engagement/social/__tests__/social.service.int.test.d.ts +2 -0
  897. package/dist/engagement/social/__tests__/social.service.int.test.d.ts.map +1 -0
  898. package/dist/engagement/social/__tests__/social.service.int.test.js +810 -0
  899. package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -0
  900. package/dist/engagement/social/contract/index.d.ts +187 -0
  901. package/dist/engagement/social/contract/index.d.ts.map +1 -0
  902. package/dist/engagement/social/contract/index.js +107 -0
  903. package/dist/engagement/social/contract/index.js.map +1 -0
  904. package/dist/engagement/social/drizzle/migrations/0000_fine_jamie_braddock.sql +24 -0
  905. package/dist/engagement/social/drizzle/migrations/0001_lame_eddie_brock.sql +10 -0
  906. package/dist/engagement/social/drizzle/migrations/0002_foamy_saracen.sql +1 -0
  907. package/dist/engagement/social/drizzle/migrations/0003_fuzzy_shadow_king.sql +4 -0
  908. package/dist/engagement/social/drizzle/migrations/0004_friendship-cancel-constraint.sql +2 -0
  909. package/dist/engagement/social/drizzle/migrations/meta/0000_snapshot.json +232 -0
  910. package/dist/engagement/social/drizzle/migrations/meta/0001_snapshot.json +129 -0
  911. package/dist/engagement/social/drizzle/migrations/meta/0002_snapshot.json +134 -0
  912. package/dist/engagement/social/drizzle/migrations/meta/0003_snapshot.json +145 -0
  913. package/dist/engagement/social/drizzle/migrations/meta/0004_snapshot.json +145 -0
  914. package/dist/engagement/social/drizzle/migrations/meta/_journal.json +41 -0
  915. package/dist/engagement/social/drizzle.config.d.ts +4 -0
  916. package/dist/engagement/social/drizzle.config.d.ts.map +1 -0
  917. package/dist/engagement/social/drizzle.config.js +21 -0
  918. package/dist/engagement/social/drizzle.config.js.map +1 -0
  919. package/dist/engagement/social/index.d.ts +3 -0
  920. package/dist/engagement/social/index.d.ts.map +1 -0
  921. package/dist/engagement/social/index.js +6 -0
  922. package/dist/engagement/social/index.js.map +1 -0
  923. package/dist/engagement/social/migrate.d.ts +5 -0
  924. package/dist/engagement/social/migrate.d.ts.map +1 -0
  925. package/dist/engagement/social/migrate.js +17 -0
  926. package/dist/engagement/social/migrate.js.map +1 -0
  927. package/dist/engagement/social/plugin.d.ts +184 -0
  928. package/dist/engagement/social/plugin.d.ts.map +1 -0
  929. package/dist/engagement/social/plugin.js +17 -0
  930. package/dist/engagement/social/plugin.js.map +1 -0
  931. package/dist/engagement/social/router/index.d.ts +98 -0
  932. package/dist/engagement/social/router/index.d.ts.map +1 -0
  933. package/dist/engagement/social/router/index.js +68 -0
  934. package/dist/engagement/social/router/index.js.map +1 -0
  935. package/dist/engagement/social/schema/index.d.ts +145 -0
  936. package/dist/engagement/social/schema/index.d.ts.map +1 -0
  937. package/dist/engagement/social/schema/index.js +24 -0
  938. package/dist/engagement/social/schema/index.js.map +1 -0
  939. package/dist/engagement/social/service/social.service.d.ts +73 -0
  940. package/dist/engagement/social/service/social.service.d.ts.map +1 -0
  941. package/dist/engagement/social/service/social.service.js +479 -0
  942. package/dist/engagement/social/service/social.service.js.map +1 -0
  943. package/dist/fx/contracts.d.ts +2 -0
  944. package/dist/fx/contracts.d.ts.map +1 -0
  945. package/dist/fx/contracts.js +2 -0
  946. package/dist/fx/contracts.js.map +1 -0
  947. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts +2 -0
  948. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts.map +1 -0
  949. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js +236 -0
  950. package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js.map +1 -0
  951. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts +2 -0
  952. package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts.map +1 -0
  953. package/dist/fx/exchange-rate/__tests__/select-provider.test.js +26 -0
  954. package/dist/fx/exchange-rate/__tests__/select-provider.test.js.map +1 -0
  955. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts +59 -0
  956. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts.map +1 -0
  957. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js +212 -0
  958. package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js.map +1 -0
  959. package/dist/fx/exchange-rate/contract/index.d.ts +44 -0
  960. package/dist/fx/exchange-rate/contract/index.d.ts.map +1 -0
  961. package/dist/fx/exchange-rate/contract/index.js +30 -0
  962. package/dist/fx/exchange-rate/contract/index.js.map +1 -0
  963. package/dist/fx/exchange-rate/drizzle/migrations/0000_hot_trauma.sql +10 -0
  964. package/dist/fx/exchange-rate/drizzle/migrations/meta/0000_snapshot.json +92 -0
  965. package/dist/fx/exchange-rate/drizzle/migrations/meta/_journal.json +13 -0
  966. package/dist/fx/exchange-rate/drizzle.config.d.ts +4 -0
  967. package/dist/fx/exchange-rate/drizzle.config.d.ts.map +1 -0
  968. package/dist/fx/exchange-rate/drizzle.config.js +18 -0
  969. package/dist/fx/exchange-rate/drizzle.config.js.map +1 -0
  970. package/dist/fx/exchange-rate/index.d.ts +3 -0
  971. package/dist/fx/exchange-rate/index.d.ts.map +1 -0
  972. package/dist/fx/exchange-rate/index.js +3 -0
  973. package/dist/fx/exchange-rate/index.js.map +1 -0
  974. package/dist/fx/exchange-rate/migrate.d.ts +5 -0
  975. package/dist/fx/exchange-rate/migrate.d.ts.map +1 -0
  976. package/dist/fx/exchange-rate/migrate.js +14 -0
  977. package/dist/fx/exchange-rate/migrate.js.map +1 -0
  978. package/dist/fx/exchange-rate/plugin.d.ts +183 -0
  979. package/dist/fx/exchange-rate/plugin.d.ts.map +1 -0
  980. package/dist/fx/exchange-rate/plugin.js +42 -0
  981. package/dist/fx/exchange-rate/plugin.js.map +1 -0
  982. package/dist/fx/exchange-rate/react/exchange-rate.d.ts +12 -0
  983. package/dist/fx/exchange-rate/react/exchange-rate.d.ts.map +1 -0
  984. package/dist/fx/exchange-rate/react/exchange-rate.js +17 -0
  985. package/dist/fx/exchange-rate/react/exchange-rate.js.map +1 -0
  986. package/dist/fx/exchange-rate/router/index.d.ts +22 -0
  987. package/dist/fx/exchange-rate/router/index.d.ts.map +1 -0
  988. package/dist/fx/exchange-rate/router/index.js +18 -0
  989. package/dist/fx/exchange-rate/router/index.js.map +1 -0
  990. package/dist/fx/exchange-rate/schema/index.d.ts +116 -0
  991. package/dist/fx/exchange-rate/schema/index.d.ts.map +1 -0
  992. package/dist/fx/exchange-rate/schema/index.js +18 -0
  993. package/dist/fx/exchange-rate/schema/index.js.map +1 -0
  994. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts +22 -0
  995. package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts.map +1 -0
  996. package/dist/fx/exchange-rate/service/exchange-rate.service.js +38 -0
  997. package/dist/fx/exchange-rate/service/exchange-rate.service.js.map +1 -0
  998. package/dist/fx/index.d.ts +2 -0
  999. package/dist/fx/index.d.ts.map +1 -0
  1000. package/dist/fx/index.js +2 -0
  1001. package/dist/fx/index.js.map +1 -0
  1002. package/dist/fx/react.d.ts +2 -0
  1003. package/dist/fx/react.d.ts.map +1 -0
  1004. package/dist/fx/react.js +2 -0
  1005. package/dist/fx/react.js.map +1 -0
  1006. package/dist/fx/server.d.ts +2 -0
  1007. package/dist/fx/server.d.ts.map +1 -0
  1008. package/dist/fx/server.js +2 -0
  1009. package/dist/fx/server.js.map +1 -0
  1010. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts +2 -0
  1011. package/dist/iam/__tests__/admin-player-activity.int.test.d.ts.map +1 -0
  1012. package/dist/iam/__tests__/admin-player-activity.int.test.js +119 -0
  1013. package/dist/iam/__tests__/admin-player-activity.int.test.js.map +1 -0
  1014. package/dist/iam/__tests__/iam.service.int.test.d.ts +2 -0
  1015. package/dist/iam/__tests__/iam.service.int.test.d.ts.map +1 -0
  1016. package/dist/iam/__tests__/iam.service.int.test.js +580 -0
  1017. package/dist/iam/__tests__/iam.service.int.test.js.map +1 -0
  1018. package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
  1019. package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
  1020. package/dist/iam/adapters/admin-player-activity.js +106 -0
  1021. package/dist/iam/adapters/admin-player-activity.js.map +1 -0
  1022. package/dist/iam/adapters/admin-role-assignment-directory.d.ts +8 -0
  1023. package/dist/iam/adapters/admin-role-assignment-directory.d.ts.map +1 -0
  1024. package/dist/iam/adapters/admin-role-assignment-directory.js +23 -0
  1025. package/dist/iam/adapters/admin-role-assignment-directory.js.map +1 -0
  1026. package/dist/iam/contract/index.d.ts +58 -0
  1027. package/dist/iam/contract/index.d.ts.map +1 -1
  1028. package/dist/iam/contract/index.js +30 -4
  1029. package/dist/iam/contract/index.js.map +1 -1
  1030. package/dist/iam/plugin.d.ts +183 -1
  1031. package/dist/iam/plugin.d.ts.map +1 -1
  1032. package/dist/iam/plugin.js +10 -5
  1033. package/dist/iam/plugin.js.map +1 -1
  1034. package/dist/iam/router/index.d.ts +37 -0
  1035. package/dist/iam/router/index.d.ts.map +1 -1
  1036. package/dist/iam/router/index.js +7 -1
  1037. package/dist/iam/router/index.js.map +1 -1
  1038. package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
  1039. package/dist/iam/seed/data/default-admin-roles.js +5 -0
  1040. package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
  1041. package/dist/iam/service/iam.service.d.ts +55 -26
  1042. package/dist/iam/service/iam.service.d.ts.map +1 -1
  1043. package/dist/iam/service/iam.service.js +122 -17
  1044. package/dist/iam/service/iam.service.js.map +1 -1
  1045. package/dist/mail/__tests__/default-email-template-renderer.test.d.ts +2 -0
  1046. package/dist/mail/__tests__/default-email-template-renderer.test.d.ts.map +1 -0
  1047. package/dist/mail/__tests__/default-email-template-renderer.test.js +119 -0
  1048. package/dist/mail/__tests__/default-email-template-renderer.test.js.map +1 -0
  1049. package/dist/mail/__tests__/mail.service.test.d.ts +2 -0
  1050. package/dist/mail/__tests__/mail.service.test.d.ts.map +1 -0
  1051. package/dist/mail/__tests__/mail.service.test.js +215 -0
  1052. package/dist/mail/__tests__/mail.service.test.js.map +1 -0
  1053. package/dist/mail/adapters/default-email-template-renderer.d.ts +5 -0
  1054. package/dist/mail/adapters/default-email-template-renderer.d.ts.map +1 -0
  1055. package/dist/mail/adapters/default-email-template-renderer.js +118 -0
  1056. package/dist/mail/adapters/default-email-template-renderer.js.map +1 -0
  1057. package/dist/mail/adapters/stdout-email-sender.d.ts +5 -0
  1058. package/dist/mail/adapters/stdout-email-sender.d.ts.map +1 -0
  1059. package/dist/mail/adapters/stdout-email-sender.js +8 -0
  1060. package/dist/mail/adapters/stdout-email-sender.js.map +1 -0
  1061. package/dist/mail/contract/index.d.ts +133 -0
  1062. package/dist/mail/contract/index.d.ts.map +1 -0
  1063. package/dist/mail/contract/index.js +17 -0
  1064. package/dist/mail/contract/index.js.map +1 -0
  1065. package/dist/mail/index.d.ts +5 -0
  1066. package/dist/mail/index.d.ts.map +1 -0
  1067. package/dist/mail/index.js +5 -0
  1068. package/dist/mail/index.js.map +1 -0
  1069. package/dist/mail/plugin.d.ts +183 -0
  1070. package/dist/mail/plugin.d.ts.map +1 -0
  1071. package/dist/mail/plugin.js +66 -0
  1072. package/dist/mail/plugin.js.map +1 -0
  1073. package/dist/mail/service/mail-payload.service.d.ts +8 -0
  1074. package/dist/mail/service/mail-payload.service.d.ts.map +1 -0
  1075. package/dist/mail/service/mail-payload.service.js +43 -0
  1076. package/dist/mail/service/mail-payload.service.js.map +1 -0
  1077. package/dist/mail/service/mail.service.d.ts +30 -0
  1078. package/dist/mail/service/mail.service.d.ts.map +1 -0
  1079. package/dist/mail/service/mail.service.js +152 -0
  1080. package/dist/mail/service/mail.service.js.map +1 -0
  1081. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts +2 -0
  1082. package/dist/pam/identity/__tests__/admin-security.int.test.d.ts.map +1 -0
  1083. package/dist/pam/identity/__tests__/admin-security.int.test.js +137 -0
  1084. package/dist/pam/identity/__tests__/admin-security.int.test.js.map +1 -0
  1085. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts +2 -0
  1086. package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts.map +1 -0
  1087. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js +234 -0
  1088. package/dist/pam/identity/__tests__/admin-user-directory.int.test.js.map +1 -0
  1089. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts +2 -0
  1090. package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts.map +1 -0
  1091. package/dist/pam/identity/__tests__/device-fingerprint.test.js +105 -0
  1092. package/dist/pam/identity/__tests__/device-fingerprint.test.js.map +1 -0
  1093. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts +2 -0
  1094. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts.map +1 -0
  1095. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +197 -0
  1096. package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -0
  1097. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts +2 -0
  1098. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts.map +1 -0
  1099. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +119 -0
  1100. package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -0
  1101. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts +2 -0
  1102. package/dist/pam/identity/__tests__/identity.service.int.test.d.ts.map +1 -0
  1103. package/dist/pam/identity/__tests__/identity.service.int.test.js +915 -0
  1104. package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -0
  1105. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts +2 -0
  1106. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts.map +1 -0
  1107. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js +99 -0
  1108. package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js.map +1 -0
  1109. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts +2 -0
  1110. package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts.map +1 -0
  1111. package/dist/pam/identity/__tests__/phone-login.service.int.test.js +394 -0
  1112. package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -0
  1113. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts +2 -0
  1114. package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts.map +1 -0
  1115. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js +273 -0
  1116. package/dist/pam/identity/__tests__/phone-verification.service.int.test.js.map +1 -0
  1117. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts +2 -0
  1118. package/dist/pam/identity/__tests__/play-eligibility.test.d.ts.map +1 -0
  1119. package/dist/pam/identity/__tests__/play-eligibility.test.js +30 -0
  1120. package/dist/pam/identity/__tests__/play-eligibility.test.js.map +1 -0
  1121. package/dist/pam/identity/__tests__/rg-guard.test.d.ts +2 -0
  1122. package/dist/pam/identity/__tests__/rg-guard.test.d.ts.map +1 -0
  1123. package/dist/pam/identity/__tests__/rg-guard.test.js +21 -0
  1124. package/dist/pam/identity/__tests__/rg-guard.test.js.map +1 -0
  1125. package/dist/pam/identity/__tests__/session.service.int.test.d.ts +2 -0
  1126. package/dist/pam/identity/__tests__/session.service.int.test.d.ts.map +1 -0
  1127. package/dist/pam/identity/__tests__/session.service.int.test.js +88 -0
  1128. package/dist/pam/identity/__tests__/session.service.int.test.js.map +1 -0
  1129. package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts +2 -0
  1130. package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts.map +1 -0
  1131. package/dist/pam/identity/__tests__/two-factor-delivery.test.js +23 -0
  1132. package/dist/pam/identity/__tests__/two-factor-delivery.test.js.map +1 -0
  1133. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts +2 -0
  1134. package/dist/pam/identity/__tests__/user-commands.int.test.d.ts.map +1 -0
  1135. package/dist/pam/identity/__tests__/user-commands.int.test.js +33 -0
  1136. package/dist/pam/identity/__tests__/user-commands.int.test.js.map +1 -0
  1137. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts +2 -0
  1138. package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts.map +1 -0
  1139. package/dist/pam/identity/__tests__/username-backfill.int.test.js +103 -0
  1140. package/dist/pam/identity/__tests__/username-backfill.int.test.js.map +1 -0
  1141. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts +2 -0
  1142. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts.map +1 -0
  1143. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js +171 -0
  1144. package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js.map +1 -0
  1145. package/dist/pam/identity/adapters/identity-reader.service.d.ts +9 -4
  1146. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  1147. package/dist/pam/identity/adapters/identity-reader.service.js +61 -2
  1148. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  1149. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts +3 -3
  1150. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts.map +1 -1
  1151. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js +3 -3
  1152. package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js.map +1 -1
  1153. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts +8 -0
  1154. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts.map +1 -0
  1155. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js +7 -0
  1156. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js.map +1 -0
  1157. package/dist/pam/identity/admin-user-directory.d.ts +40 -8
  1158. package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
  1159. package/dist/pam/identity/admin-user-directory.js +92 -35
  1160. package/dist/pam/identity/admin-user-directory.js.map +1 -1
  1161. package/dist/pam/identity/contract/index.d.ts +397 -16
  1162. package/dist/pam/identity/contract/index.d.ts.map +1 -1
  1163. package/dist/pam/identity/contract/index.js +187 -7
  1164. package/dist/pam/identity/contract/index.js.map +1 -1
  1165. package/dist/pam/identity/drizzle/migrations/0001_rainy_peter_quill.sql +18 -0
  1166. package/dist/pam/identity/drizzle/migrations/0002_outstanding_patriot.sql +1 -0
  1167. package/dist/pam/identity/drizzle/migrations/0003_open_shotgun.sql +1 -0
  1168. package/dist/pam/identity/drizzle/migrations/0004_round_giant_girl.sql +1 -0
  1169. package/dist/pam/identity/drizzle/migrations/0005_daily_black_tom.sql +1 -0
  1170. package/dist/pam/identity/drizzle/migrations/0006_brave_sabra.sql +1 -0
  1171. package/dist/pam/identity/drizzle/migrations/0007_fuzzy_barracuda.sql +44 -0
  1172. package/dist/pam/identity/drizzle/migrations/0008_pink_bucky.sql +23 -0
  1173. package/dist/pam/identity/drizzle/migrations/0009_hard_sauron.sql +2 -0
  1174. package/dist/pam/identity/drizzle/migrations/0010_lying_young_avengers.sql +19 -0
  1175. package/dist/pam/identity/drizzle/migrations/0011_useful_the_executioner.sql +2 -0
  1176. package/dist/pam/identity/drizzle/migrations/0012_worried_nuke.sql +2 -0
  1177. package/dist/pam/identity/drizzle/migrations/0013_backfill_two_factor_method.sql +6 -0
  1178. package/dist/pam/identity/drizzle/migrations/meta/0001_snapshot.json +684 -0
  1179. package/dist/pam/identity/drizzle/migrations/meta/0002_snapshot.json +690 -0
  1180. package/dist/pam/identity/drizzle/migrations/meta/0003_snapshot.json +695 -0
  1181. package/dist/pam/identity/drizzle/migrations/meta/0004_snapshot.json +680 -0
  1182. package/dist/pam/identity/drizzle/migrations/meta/0005_snapshot.json +695 -0
  1183. package/dist/pam/identity/drizzle/migrations/meta/0006_snapshot.json +701 -0
  1184. package/dist/pam/identity/drizzle/migrations/meta/0007_snapshot.json +737 -0
  1185. package/dist/pam/identity/drizzle/migrations/meta/0008_snapshot.json +913 -0
  1186. package/dist/pam/identity/drizzle/migrations/meta/0009_snapshot.json +926 -0
  1187. package/dist/pam/identity/drizzle/migrations/meta/0010_snapshot.json +1066 -0
  1188. package/dist/pam/identity/drizzle/migrations/meta/0011_snapshot.json +1078 -0
  1189. package/dist/pam/identity/drizzle/migrations/meta/0012_snapshot.json +1090 -0
  1190. package/dist/pam/identity/drizzle/migrations/meta/0013_snapshot.json +1090 -0
  1191. package/dist/pam/identity/drizzle/migrations/meta/_journal.json +91 -0
  1192. package/dist/pam/identity/plugin.d.ts +182 -1
  1193. package/dist/pam/identity/plugin.d.ts.map +1 -1
  1194. package/dist/pam/identity/plugin.js +133 -18
  1195. package/dist/pam/identity/plugin.js.map +1 -1
  1196. package/dist/pam/identity/react/account.d.ts +78 -13
  1197. package/dist/pam/identity/react/account.d.ts.map +1 -1
  1198. package/dist/pam/identity/react/account.js +76 -6
  1199. package/dist/pam/identity/react/account.js.map +1 -1
  1200. package/dist/pam/identity/react/auth.d.ts +22 -13
  1201. package/dist/pam/identity/react/auth.d.ts.map +1 -1
  1202. package/dist/pam/identity/router/index.d.ts +348 -17
  1203. package/dist/pam/identity/router/index.d.ts.map +1 -1
  1204. package/dist/pam/identity/router/index.js +139 -14
  1205. package/dist/pam/identity/router/index.js.map +1 -1
  1206. package/dist/pam/identity/schema/index.d.ts +807 -0
  1207. package/dist/pam/identity/schema/index.d.ts.map +1 -1
  1208. package/dist/pam/identity/schema/index.js +107 -3
  1209. package/dist/pam/identity/schema/index.js.map +1 -1
  1210. package/dist/pam/identity/service/admin-security.service.d.ts +84 -0
  1211. package/dist/pam/identity/service/admin-security.service.d.ts.map +1 -0
  1212. package/dist/pam/identity/service/admin-security.service.js +280 -0
  1213. package/dist/pam/identity/service/admin-security.service.js.map +1 -0
  1214. package/dist/pam/identity/service/capture-timezone.service.d.ts +10 -0
  1215. package/dist/pam/identity/service/capture-timezone.service.d.ts.map +1 -0
  1216. package/dist/pam/identity/service/capture-timezone.service.js +21 -0
  1217. package/dist/pam/identity/service/capture-timezone.service.js.map +1 -0
  1218. package/dist/pam/identity/service/device-fingerprint.service.d.ts +32 -0
  1219. package/dist/pam/identity/service/device-fingerprint.service.d.ts.map +1 -0
  1220. package/dist/pam/identity/service/device-fingerprint.service.js +79 -0
  1221. package/dist/pam/identity/service/device-fingerprint.service.js.map +1 -0
  1222. package/dist/pam/identity/service/fresh-reauthentication.service.d.ts +21 -0
  1223. package/dist/pam/identity/service/fresh-reauthentication.service.d.ts.map +1 -0
  1224. package/dist/pam/identity/service/fresh-reauthentication.service.js +45 -0
  1225. package/dist/pam/identity/service/fresh-reauthentication.service.js.map +1 -0
  1226. package/dist/pam/identity/service/identity.service.d.ts +194 -40
  1227. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  1228. package/dist/pam/identity/service/identity.service.js +1311 -142
  1229. package/dist/pam/identity/service/identity.service.js.map +1 -1
  1230. package/dist/pam/identity/service/lockout-policy.service.d.ts +30 -0
  1231. package/dist/pam/identity/service/lockout-policy.service.d.ts.map +1 -0
  1232. package/dist/pam/identity/service/lockout-policy.service.js +40 -0
  1233. package/dist/pam/identity/service/lockout-policy.service.js.map +1 -0
  1234. package/dist/pam/identity/service/phone-login.service.d.ts +65 -0
  1235. package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -0
  1236. package/dist/pam/identity/service/phone-login.service.js +393 -0
  1237. package/dist/pam/identity/service/phone-login.service.js.map +1 -0
  1238. package/dist/pam/identity/service/phone-verification.service.d.ts +37 -0
  1239. package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
  1240. package/dist/pam/identity/service/phone-verification.service.js +221 -0
  1241. package/dist/pam/identity/service/phone-verification.service.js.map +1 -0
  1242. package/dist/pam/identity/service/play-eligibility.service.d.ts +8 -0
  1243. package/dist/pam/identity/service/play-eligibility.service.d.ts.map +1 -0
  1244. package/dist/pam/identity/service/play-eligibility.service.js +21 -0
  1245. package/dist/pam/identity/service/play-eligibility.service.js.map +1 -0
  1246. package/dist/pam/identity/service/rg-guard.service.d.ts +37 -0
  1247. package/dist/pam/identity/service/rg-guard.service.d.ts.map +1 -0
  1248. package/dist/pam/identity/service/rg-guard.service.js +60 -0
  1249. package/dist/pam/identity/service/rg-guard.service.js.map +1 -0
  1250. package/dist/pam/identity/service/security-controls.service.d.ts +4 -0
  1251. package/dist/pam/identity/service/security-controls.service.d.ts.map +1 -0
  1252. package/dist/pam/identity/service/security-controls.service.js +31 -0
  1253. package/dist/pam/identity/service/security-controls.service.js.map +1 -0
  1254. package/dist/pam/identity/service/session.service.d.ts +63 -6
  1255. package/dist/pam/identity/service/session.service.d.ts.map +1 -1
  1256. package/dist/pam/identity/service/session.service.js +113 -21
  1257. package/dist/pam/identity/service/session.service.js.map +1 -1
  1258. package/dist/pam/identity/service/trusted-device.service.d.ts +56 -0
  1259. package/dist/pam/identity/service/trusted-device.service.d.ts.map +1 -0
  1260. package/dist/pam/identity/service/trusted-device.service.js +157 -0
  1261. package/dist/pam/identity/service/trusted-device.service.js.map +1 -0
  1262. package/dist/pam/identity/service/two-factor-challenge.service.d.ts +36 -0
  1263. package/dist/pam/identity/service/two-factor-challenge.service.d.ts.map +1 -0
  1264. package/dist/pam/identity/service/two-factor-challenge.service.js +30 -0
  1265. package/dist/pam/identity/service/two-factor-challenge.service.js.map +1 -0
  1266. package/dist/pam/identity/service/two-factor-delivery.service.d.ts +67 -0
  1267. package/dist/pam/identity/service/two-factor-delivery.service.d.ts.map +1 -0
  1268. package/dist/pam/identity/service/two-factor-delivery.service.js +135 -0
  1269. package/dist/pam/identity/service/two-factor-delivery.service.js.map +1 -0
  1270. package/dist/pam/identity/service/two-factor-lockout.service.d.ts +25 -0
  1271. package/dist/pam/identity/service/two-factor-lockout.service.d.ts.map +1 -0
  1272. package/dist/pam/identity/service/two-factor-lockout.service.js +121 -0
  1273. package/dist/pam/identity/service/two-factor-lockout.service.js.map +1 -0
  1274. package/dist/pam/identity/service/user-commands.service.d.ts +11 -0
  1275. package/dist/pam/identity/service/user-commands.service.d.ts.map +1 -0
  1276. package/dist/pam/identity/service/user-commands.service.js +32 -0
  1277. package/dist/pam/identity/service/user-commands.service.js.map +1 -0
  1278. package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts +3 -0
  1279. package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts.map +1 -0
  1280. package/dist/pam/identity/service/withdrawal-pin-hash.service.js +10 -0
  1281. package/dist/pam/identity/service/withdrawal-pin-hash.service.js.map +1 -0
  1282. package/dist/pam/identity/service/withdrawal-pin.service.d.ts +34 -0
  1283. package/dist/pam/identity/service/withdrawal-pin.service.d.ts.map +1 -0
  1284. package/dist/pam/identity/service/withdrawal-pin.service.js +130 -0
  1285. package/dist/pam/identity/service/withdrawal-pin.service.js.map +1 -0
  1286. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts +2 -0
  1287. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts.map +1 -0
  1288. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js +81 -0
  1289. package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js.map +1 -0
  1290. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts +2 -0
  1291. package/dist/pam/player-management/__tests__/player.router.int.test.d.ts.map +1 -0
  1292. package/dist/pam/player-management/__tests__/player.router.int.test.js +107 -0
  1293. package/dist/pam/player-management/__tests__/player.router.int.test.js.map +1 -0
  1294. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts +2 -0
  1295. package/dist/pam/player-management/__tests__/player.service.int.test.d.ts.map +1 -0
  1296. package/dist/pam/player-management/__tests__/player.service.int.test.js +479 -0
  1297. package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -0
  1298. package/dist/pam/player-management/contract/index.d.ts +125 -15
  1299. package/dist/pam/player-management/contract/index.d.ts.map +1 -1
  1300. package/dist/pam/player-management/contract/index.js +35 -5
  1301. package/dist/pam/player-management/contract/index.js.map +1 -1
  1302. package/dist/pam/player-management/plugin.d.ts +182 -1
  1303. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  1304. package/dist/pam/player-management/plugin.js +11 -8
  1305. package/dist/pam/player-management/plugin.js.map +1 -1
  1306. package/dist/pam/player-management/router/index.d.ts +95 -15
  1307. package/dist/pam/player-management/router/index.d.ts.map +1 -1
  1308. package/dist/pam/player-management/router/index.js +54 -17
  1309. package/dist/pam/player-management/router/index.js.map +1 -1
  1310. package/dist/pam/player-management/service/kyc-status-writer.d.ts +5 -7
  1311. package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
  1312. package/dist/pam/player-management/service/kyc-status-writer.js +23 -19
  1313. package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
  1314. package/dist/pam/player-management/service/player.service.d.ts +65 -22
  1315. package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
  1316. package/dist/pam/player-management/service/player.service.js +148 -43
  1317. package/dist/pam/player-management/service/player.service.js.map +1 -1
  1318. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts +2 -0
  1319. package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts.map +1 -0
  1320. package/dist/pam/player-note/__tests__/player-note.router.int.test.js +52 -0
  1321. package/dist/pam/player-note/__tests__/player-note.router.int.test.js.map +1 -0
  1322. package/dist/pam/player-note/contract/index.d.ts +14 -0
  1323. package/dist/pam/player-note/contract/index.d.ts.map +1 -1
  1324. package/dist/pam/player-note/contract/index.js +8 -2
  1325. package/dist/pam/player-note/contract/index.js.map +1 -1
  1326. package/dist/pam/player-note/plugin.d.ts +182 -1
  1327. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  1328. package/dist/pam/player-note/plugin.js +6 -4
  1329. package/dist/pam/player-note/plugin.js.map +1 -1
  1330. package/dist/pam/player-note/router/index.d.ts +10 -1
  1331. package/dist/pam/player-note/router/index.d.ts.map +1 -1
  1332. package/dist/pam/player-note/router/index.js +20 -3
  1333. package/dist/pam/player-note/router/index.js.map +1 -1
  1334. package/dist/pam/player-note/service/player-note.service.d.ts +5 -3
  1335. package/dist/pam/player-note/service/player-note.service.d.ts.map +1 -1
  1336. package/dist/pam/player-note/service/player-note.service.js +5 -3
  1337. package/dist/pam/player-note/service/player-note.service.js.map +1 -1
  1338. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts +2 -0
  1339. package/dist/pam/profile/__tests__/profile.service.int.test.d.ts.map +1 -0
  1340. package/dist/pam/profile/__tests__/profile.service.int.test.js +296 -0
  1341. package/dist/pam/profile/__tests__/profile.service.int.test.js.map +1 -0
  1342. package/dist/pam/profile/contract/index.d.ts +74 -36
  1343. package/dist/pam/profile/contract/index.d.ts.map +1 -1
  1344. package/dist/pam/profile/contract/index.js +16 -1
  1345. package/dist/pam/profile/contract/index.js.map +1 -1
  1346. package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
  1347. package/dist/pam/profile/drizzle/migrations/0002_sour_alex_wilder.sql +7 -0
  1348. package/dist/pam/profile/drizzle/migrations/0003_absurd_morbius.sql +4 -0
  1349. package/dist/pam/profile/drizzle/migrations/0004_fuzzy_korvac.sql +1 -0
  1350. package/dist/pam/profile/drizzle/migrations/0005_moaning_rachel_grey.sql +2 -0
  1351. package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
  1352. package/dist/pam/profile/drizzle/migrations/meta/0002_snapshot.json +200 -0
  1353. package/dist/pam/profile/drizzle/migrations/meta/0003_snapshot.json +224 -0
  1354. package/dist/pam/profile/drizzle/migrations/meta/0004_snapshot.json +230 -0
  1355. package/dist/pam/profile/drizzle/migrations/meta/0005_snapshot.json +242 -0
  1356. package/dist/pam/profile/drizzle/migrations/meta/_journal.json +35 -0
  1357. package/dist/pam/profile/migrate.d.ts.map +1 -1
  1358. package/dist/pam/profile/migrate.js +3 -1
  1359. package/dist/pam/profile/migrate.js.map +1 -1
  1360. package/dist/pam/profile/plugin.d.ts +182 -1
  1361. package/dist/pam/profile/plugin.d.ts.map +1 -1
  1362. package/dist/pam/profile/plugin.js +8 -4
  1363. package/dist/pam/profile/plugin.js.map +1 -1
  1364. package/dist/pam/profile/react/profile.d.ts +34 -6
  1365. package/dist/pam/profile/react/profile.d.ts.map +1 -1
  1366. package/dist/pam/profile/react/profile.js +12 -0
  1367. package/dist/pam/profile/react/profile.js.map +1 -1
  1368. package/dist/pam/profile/router/index.d.ts +32 -4
  1369. package/dist/pam/profile/router/index.d.ts.map +1 -1
  1370. package/dist/pam/profile/router/index.js +4 -1
  1371. package/dist/pam/profile/router/index.js.map +1 -1
  1372. package/dist/pam/profile/schema/index.d.ts +193 -6
  1373. package/dist/pam/profile/schema/index.d.ts.map +1 -1
  1374. package/dist/pam/profile/schema/index.js +22 -10
  1375. package/dist/pam/profile/schema/index.js.map +1 -1
  1376. package/dist/pam/profile/service/profile.service.d.ts +55 -8
  1377. package/dist/pam/profile/service/profile.service.d.ts.map +1 -1
  1378. package/dist/pam/profile/service/profile.service.js +128 -23
  1379. package/dist/pam/profile/service/profile.service.js.map +1 -1
  1380. package/dist/pam/react.d.ts +2 -2
  1381. package/dist/pam/react.d.ts.map +1 -1
  1382. package/dist/pam/react.js +2 -2
  1383. package/dist/pam/react.js.map +1 -1
  1384. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts +2 -0
  1385. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts.map +1 -0
  1386. package/dist/pam/shared/__tests__/shared-mappers.test.js +61 -0
  1387. package/dist/pam/shared/__tests__/shared-mappers.test.js.map +1 -0
  1388. package/dist/pam/shared/language.d.ts +3 -1
  1389. package/dist/pam/shared/language.d.ts.map +1 -1
  1390. package/dist/pam/shared/language.js +6 -0
  1391. package/dist/pam/shared/language.js.map +1 -1
  1392. package/dist/pam/shared/otp.d.ts +3 -0
  1393. package/dist/pam/shared/otp.d.ts.map +1 -0
  1394. package/dist/pam/shared/otp.js +11 -0
  1395. package/dist/pam/shared/otp.js.map +1 -0
  1396. package/dist/pam/shared/player-mapper.d.ts +14 -4
  1397. package/dist/pam/shared/player-mapper.d.ts.map +1 -1
  1398. package/dist/pam/shared/player-mapper.js +14 -5
  1399. package/dist/pam/shared/player-mapper.js.map +1 -1
  1400. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts +2 -0
  1401. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts.map +1 -0
  1402. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js +77 -0
  1403. package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js.map +1 -0
  1404. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts +2 -0
  1405. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts.map +1 -0
  1406. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js +1024 -0
  1407. package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js.map +1 -0
  1408. package/dist/pam/tag/__tests__/tag-mappers.test.js +25 -0
  1409. package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
  1410. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts +2 -0
  1411. package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts.map +1 -0
  1412. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js +145 -0
  1413. package/dist/pam/tag/__tests__/tag-rule.service.int.test.js.map +1 -0
  1414. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts +2 -0
  1415. package/dist/pam/tag/__tests__/tag.router.int.test.d.ts.map +1 -0
  1416. package/dist/pam/tag/__tests__/tag.router.int.test.js +222 -0
  1417. package/dist/pam/tag/__tests__/tag.router.int.test.js.map +1 -0
  1418. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts +2 -0
  1419. package/dist/pam/tag/__tests__/tag.service.int.test.d.ts.map +1 -0
  1420. package/dist/pam/tag/__tests__/tag.service.int.test.js +571 -0
  1421. package/dist/pam/tag/__tests__/tag.service.int.test.js.map +1 -0
  1422. package/dist/pam/tag/contract/index.d.ts +139 -1
  1423. package/dist/pam/tag/contract/index.d.ts.map +1 -1
  1424. package/dist/pam/tag/contract/index.js +12 -2
  1425. package/dist/pam/tag/contract/index.js.map +1 -1
  1426. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts +37 -0
  1427. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts.map +1 -0
  1428. package/dist/pam/tag/contract/player-tag-assign-metadata.js +20 -0
  1429. package/dist/pam/tag/contract/player-tag-assign-metadata.js.map +1 -0
  1430. package/dist/pam/tag/drizzle/migrations/0002_silent_skaar.sql +4 -0
  1431. package/dist/pam/tag/drizzle/migrations/0003_overconfident_guardian.sql +3 -0
  1432. package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
  1433. package/dist/pam/tag/drizzle/migrations/meta/0002_snapshot.json +335 -0
  1434. package/dist/pam/tag/drizzle/migrations/meta/0003_snapshot.json +343 -0
  1435. package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
  1436. package/dist/pam/tag/drizzle/migrations/meta/_journal.json +21 -0
  1437. package/dist/pam/tag/migrate.d.ts.map +1 -1
  1438. package/dist/pam/tag/migrate.js +34 -0
  1439. package/dist/pam/tag/migrate.js.map +1 -1
  1440. package/dist/pam/tag/plugin.d.ts +182 -1
  1441. package/dist/pam/tag/plugin.d.ts.map +1 -1
  1442. package/dist/pam/tag/plugin.js +46 -19
  1443. package/dist/pam/tag/plugin.js.map +1 -1
  1444. package/dist/pam/tag/router/index.d.ts +114 -1
  1445. package/dist/pam/tag/router/index.d.ts.map +1 -1
  1446. package/dist/pam/tag/router/index.js +38 -9
  1447. package/dist/pam/tag/router/index.js.map +1 -1
  1448. package/dist/pam/tag/schema/index.d.ts +32 -3
  1449. package/dist/pam/tag/schema/index.d.ts.map +1 -1
  1450. package/dist/pam/tag/schema/index.js +15 -2
  1451. package/dist/pam/tag/schema/index.js.map +1 -1
  1452. package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
  1453. package/dist/pam/tag/seed/data/default-tag-rules.js +42 -0
  1454. package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
  1455. package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
  1456. package/dist/pam/tag/seed/data/default-tags.js +6 -0
  1457. package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
  1458. package/dist/pam/tag/service/tag-evaluation.service.d.ts +147 -17
  1459. package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
  1460. package/dist/pam/tag/service/tag-evaluation.service.js +491 -48
  1461. package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
  1462. package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
  1463. package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
  1464. package/dist/pam/tag/service/tag-mappers.js +1 -0
  1465. package/dist/pam/tag/service/tag-mappers.js.map +1 -1
  1466. package/dist/pam/tag/service/tag-rule.service.d.ts +8 -6
  1467. package/dist/pam/tag/service/tag-rule.service.d.ts.map +1 -1
  1468. package/dist/pam/tag/service/tag-rule.service.js +8 -2
  1469. package/dist/pam/tag/service/tag-rule.service.js.map +1 -1
  1470. package/dist/pam/tag/service/tag.service.d.ts +162 -16
  1471. package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
  1472. package/dist/pam/tag/service/tag.service.js +297 -30
  1473. package/dist/pam/tag/service/tag.service.js.map +1 -1
  1474. package/dist/react/context/__tests__/realtime-client.test.d.ts +2 -0
  1475. package/dist/react/context/__tests__/realtime-client.test.d.ts.map +1 -0
  1476. package/dist/react/context/__tests__/realtime-client.test.js +75 -0
  1477. package/dist/react/context/__tests__/realtime-client.test.js.map +1 -0
  1478. package/dist/react/context/realtime-client.d.ts +15 -0
  1479. package/dist/react/context/realtime-client.d.ts.map +1 -1
  1480. package/dist/react/context/realtime-client.js.map +1 -1
  1481. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts +2 -0
  1482. package/dist/react/hooks/__tests__/use-event-stream.test.d.ts.map +1 -0
  1483. package/dist/react/hooks/__tests__/use-event-stream.test.js +153 -0
  1484. package/dist/react/hooks/__tests__/use-event-stream.test.js.map +1 -0
  1485. package/dist/react/hooks/use-event-stream.d.ts +3 -3
  1486. package/dist/react/hooks/use-event-stream.d.ts.map +1 -1
  1487. package/dist/react/hooks/use-event-stream.js +60 -28
  1488. package/dist/react/hooks/use-event-stream.js.map +1 -1
  1489. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts +2 -0
  1490. package/dist/server/auth/__tests__/admin-guard.int.test.d.ts.map +1 -0
  1491. package/dist/server/auth/__tests__/admin-guard.int.test.js +199 -0
  1492. package/dist/server/auth/__tests__/admin-guard.int.test.js.map +1 -0
  1493. package/dist/server/auth/__tests__/auth.test.d.ts +2 -0
  1494. package/dist/server/auth/__tests__/auth.test.d.ts.map +1 -0
  1495. package/dist/server/auth/__tests__/auth.test.js +150 -0
  1496. package/dist/server/auth/__tests__/auth.test.js.map +1 -0
  1497. package/dist/server/auth/__tests__/permission-levels.test.d.ts +2 -0
  1498. package/dist/server/auth/__tests__/permission-levels.test.d.ts.map +1 -0
  1499. package/dist/server/auth/__tests__/permission-levels.test.js +89 -0
  1500. package/dist/server/auth/__tests__/permission-levels.test.js.map +1 -0
  1501. package/dist/server/auth/__tests__/permissions.test.d.ts +2 -0
  1502. package/dist/server/auth/__tests__/permissions.test.d.ts.map +1 -0
  1503. package/dist/server/auth/__tests__/permissions.test.js +15 -0
  1504. package/dist/server/auth/__tests__/permissions.test.js.map +1 -0
  1505. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts +2 -0
  1506. package/dist/server/auth/__tests__/session-resolver.int.test.d.ts.map +1 -0
  1507. package/dist/server/auth/__tests__/session-resolver.int.test.js +59 -0
  1508. package/dist/server/auth/__tests__/session-resolver.int.test.js.map +1 -0
  1509. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts +2 -0
  1510. package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts.map +1 -0
  1511. package/dist/server/auth/__tests__/sign-session-cookie.test.js +59 -0
  1512. package/dist/server/auth/__tests__/sign-session-cookie.test.js.map +1 -0
  1513. package/dist/server/auth/admin-guard.d.ts +13 -10
  1514. package/dist/server/auth/admin-guard.d.ts.map +1 -1
  1515. package/dist/server/auth/admin-guard.js +106 -44
  1516. package/dist/server/auth/admin-guard.js.map +1 -1
  1517. package/dist/server/auth/auth.d.ts +48 -5
  1518. package/dist/server/auth/auth.d.ts.map +1 -1
  1519. package/dist/server/auth/auth.js +78 -19
  1520. package/dist/server/auth/auth.js.map +1 -1
  1521. package/dist/server/auth/index.d.ts +3 -1
  1522. package/dist/server/auth/index.d.ts.map +1 -1
  1523. package/dist/server/auth/index.js +1 -0
  1524. package/dist/server/auth/index.js.map +1 -1
  1525. package/dist/server/auth/permissions.d.ts +133 -14
  1526. package/dist/server/auth/permissions.d.ts.map +1 -1
  1527. package/dist/server/auth/permissions.js +15 -20
  1528. package/dist/server/auth/permissions.js.map +1 -1
  1529. package/dist/server/auth/session-resolver.d.ts +4 -0
  1530. package/dist/server/auth/session-resolver.d.ts.map +1 -1
  1531. package/dist/server/auth/session-resolver.js +9 -2
  1532. package/dist/server/auth/session-resolver.js.map +1 -1
  1533. package/dist/server/auth/sign-session-cookie.d.ts +18 -0
  1534. package/dist/server/auth/sign-session-cookie.d.ts.map +1 -0
  1535. package/dist/server/auth/sign-session-cookie.js +15 -0
  1536. package/dist/server/auth/sign-session-cookie.js.map +1 -0
  1537. package/dist/server/db/__tests__/migrate.test.d.ts +2 -0
  1538. package/dist/server/db/__tests__/migrate.test.d.ts.map +1 -0
  1539. package/dist/server/db/__tests__/migrate.test.js +158 -0
  1540. package/dist/server/db/__tests__/migrate.test.js.map +1 -0
  1541. package/dist/server/db/__tests__/query-helpers.test.js +186 -1
  1542. package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
  1543. package/dist/server/db/__tests__/zod-jsonb.test.d.ts +2 -0
  1544. package/dist/server/db/__tests__/zod-jsonb.test.d.ts.map +1 -0
  1545. package/dist/server/db/__tests__/zod-jsonb.test.js +56 -0
  1546. package/dist/server/db/__tests__/zod-jsonb.test.js.map +1 -0
  1547. package/dist/server/db/drizzle.service.d.ts.map +1 -1
  1548. package/dist/server/db/drizzle.service.js +8 -0
  1549. package/dist/server/db/drizzle.service.js.map +1 -1
  1550. package/dist/server/db/index.d.ts +2 -1
  1551. package/dist/server/db/index.d.ts.map +1 -1
  1552. package/dist/server/db/index.js +2 -1
  1553. package/dist/server/db/index.js.map +1 -1
  1554. package/dist/server/db/migrate.d.ts +38 -0
  1555. package/dist/server/db/migrate.d.ts.map +1 -1
  1556. package/dist/server/db/migrate.js +81 -12
  1557. package/dist/server/db/migrate.js.map +1 -1
  1558. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts +2 -0
  1559. package/dist/server/db/outbox/__tests__/relay.int.test.d.ts.map +1 -0
  1560. package/dist/server/db/outbox/__tests__/relay.int.test.js +183 -0
  1561. package/dist/server/db/outbox/__tests__/relay.int.test.js.map +1 -0
  1562. package/dist/server/db/query-helpers.d.ts +9 -0
  1563. package/dist/server/db/query-helpers.d.ts.map +1 -1
  1564. package/dist/server/db/query-helpers.js +74 -0
  1565. package/dist/server/db/query-helpers.js.map +1 -1
  1566. package/dist/server/db/zod-jsonb.d.ts +52 -0
  1567. package/dist/server/db/zod-jsonb.d.ts.map +1 -0
  1568. package/dist/server/db/zod-jsonb.js +52 -0
  1569. package/dist/server/db/zod-jsonb.js.map +1 -0
  1570. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts +2 -0
  1571. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts.map +1 -0
  1572. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js +240 -0
  1573. package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js.map +1 -0
  1574. package/dist/server/kernel/__tests__/cache.int.test.d.ts +2 -0
  1575. package/dist/server/kernel/__tests__/cache.int.test.d.ts.map +1 -0
  1576. package/dist/server/kernel/__tests__/cache.int.test.js +52 -0
  1577. package/dist/server/kernel/__tests__/cache.int.test.js.map +1 -0
  1578. package/dist/server/kernel/__tests__/domain-error.test.d.ts +2 -0
  1579. package/dist/server/kernel/__tests__/domain-error.test.d.ts.map +1 -0
  1580. package/dist/server/kernel/__tests__/domain-error.test.js +35 -0
  1581. package/dist/server/kernel/__tests__/domain-error.test.js.map +1 -0
  1582. package/dist/server/kernel/__tests__/error-reporter.test.d.ts +2 -0
  1583. package/dist/server/kernel/__tests__/error-reporter.test.d.ts.map +1 -0
  1584. package/dist/server/kernel/__tests__/error-reporter.test.js +52 -0
  1585. package/dist/server/kernel/__tests__/error-reporter.test.js.map +1 -0
  1586. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts +2 -0
  1587. package/dist/server/kernel/__tests__/event-bus.int.test.d.ts.map +1 -0
  1588. package/dist/server/kernel/__tests__/event-bus.int.test.js +201 -0
  1589. package/dist/server/kernel/__tests__/event-bus.int.test.js.map +1 -0
  1590. package/dist/server/kernel/__tests__/helpers.test.js +26 -0
  1591. package/dist/server/kernel/__tests__/helpers.test.js.map +1 -1
  1592. package/dist/server/kernel/__tests__/logger.test.d.ts +2 -0
  1593. package/dist/server/kernel/__tests__/logger.test.d.ts.map +1 -0
  1594. package/dist/server/kernel/__tests__/logger.test.js +44 -0
  1595. package/dist/server/kernel/__tests__/logger.test.js.map +1 -0
  1596. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts +2 -0
  1597. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts.map +1 -0
  1598. package/dist/server/kernel/__tests__/orpc-error-map.test.js +54 -0
  1599. package/dist/server/kernel/__tests__/orpc-error-map.test.js.map +1 -0
  1600. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts +2 -0
  1601. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts.map +1 -0
  1602. package/dist/server/kernel/__tests__/platform-config-loader.test.js +112 -0
  1603. package/dist/server/kernel/__tests__/platform-config-loader.test.js.map +1 -0
  1604. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts +2 -0
  1605. package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts.map +1 -0
  1606. package/dist/server/kernel/__tests__/rate-limiter.int.test.js +44 -0
  1607. package/dist/server/kernel/__tests__/rate-limiter.int.test.js.map +1 -0
  1608. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts +2 -0
  1609. package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts.map +1 -0
  1610. package/dist/server/kernel/__tests__/redis-cache.int.test.js +49 -0
  1611. package/dist/server/kernel/__tests__/redis-cache.int.test.js.map +1 -0
  1612. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts +2 -0
  1613. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts.map +1 -0
  1614. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js +251 -0
  1615. package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js.map +1 -0
  1616. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts +2 -0
  1617. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts.map +1 -0
  1618. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js +61 -0
  1619. package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js.map +1 -0
  1620. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts +2 -0
  1621. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts.map +1 -0
  1622. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js +190 -0
  1623. package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js.map +1 -0
  1624. package/dist/server/kernel/__tests__/request-context.test.d.ts +2 -0
  1625. package/dist/server/kernel/__tests__/request-context.test.d.ts.map +1 -0
  1626. package/dist/server/kernel/__tests__/request-context.test.js +64 -0
  1627. package/dist/server/kernel/__tests__/request-context.test.js.map +1 -0
  1628. package/dist/server/kernel/__tests__/router-utils.test.d.ts +2 -0
  1629. package/dist/server/kernel/__tests__/router-utils.test.d.ts.map +1 -0
  1630. package/dist/server/kernel/__tests__/router-utils.test.js +87 -0
  1631. package/dist/server/kernel/__tests__/router-utils.test.js.map +1 -0
  1632. package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
  1633. package/dist/server/kernel/bullmq-job-queue.js +27 -4
  1634. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  1635. package/dist/server/kernel/cache.d.ts +0 -12
  1636. package/dist/server/kernel/cache.d.ts.map +1 -1
  1637. package/dist/server/kernel/cache.js +0 -55
  1638. package/dist/server/kernel/cache.js.map +1 -1
  1639. package/dist/server/kernel/container.d.ts +7 -6
  1640. package/dist/server/kernel/container.d.ts.map +1 -1
  1641. package/dist/server/kernel/container.js +3 -0
  1642. package/dist/server/kernel/container.js.map +1 -1
  1643. package/dist/server/kernel/domain-error.d.ts +15 -5
  1644. package/dist/server/kernel/domain-error.d.ts.map +1 -1
  1645. package/dist/server/kernel/domain-error.js +4 -2
  1646. package/dist/server/kernel/domain-error.js.map +1 -1
  1647. package/dist/server/kernel/error-reporter.d.ts +5 -0
  1648. package/dist/server/kernel/error-reporter.d.ts.map +1 -0
  1649. package/dist/server/kernel/error-reporter.js +20 -0
  1650. package/dist/server/kernel/error-reporter.js.map +1 -0
  1651. package/dist/server/kernel/event-bus.d.ts +2 -18
  1652. package/dist/server/kernel/event-bus.d.ts.map +1 -1
  1653. package/dist/server/kernel/event-bus.js +28 -44
  1654. package/dist/server/kernel/event-bus.js.map +1 -1
  1655. package/dist/server/kernel/event-stream.d.ts.map +1 -1
  1656. package/dist/server/kernel/event-stream.js +19 -4
  1657. package/dist/server/kernel/event-stream.js.map +1 -1
  1658. package/dist/server/kernel/index.d.ts +10 -8
  1659. package/dist/server/kernel/index.d.ts.map +1 -1
  1660. package/dist/server/kernel/index.js +8 -7
  1661. package/dist/server/kernel/index.js.map +1 -1
  1662. package/dist/server/kernel/logger.d.ts.map +1 -1
  1663. package/dist/server/kernel/logger.js +51 -2
  1664. package/dist/server/kernel/logger.js.map +1 -1
  1665. package/dist/server/kernel/orpc-error-map.d.ts.map +1 -1
  1666. package/dist/server/kernel/orpc-error-map.js +4 -1
  1667. package/dist/server/kernel/orpc-error-map.js.map +1 -1
  1668. package/dist/server/kernel/rate-limiter.d.ts +2 -10
  1669. package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
  1670. package/dist/server/kernel/rate-limiter.js +0 -34
  1671. package/dist/server/kernel/rate-limiter.js.map +1 -1
  1672. package/dist/server/kernel/realtime-authorizer.d.ts +2 -4
  1673. package/dist/server/kernel/realtime-authorizer.d.ts.map +1 -1
  1674. package/dist/server/kernel/realtime-authorizer.js +3 -2
  1675. package/dist/server/kernel/realtime-authorizer.js.map +1 -1
  1676. package/dist/server/kernel/redis-cache.d.ts +3 -0
  1677. package/dist/server/kernel/redis-cache.d.ts.map +1 -1
  1678. package/dist/server/kernel/redis-cache.js +10 -0
  1679. package/dist/server/kernel/redis-cache.js.map +1 -1
  1680. package/dist/server/kernel/redis-client.d.ts.map +1 -1
  1681. package/dist/server/kernel/redis-client.js +5 -1
  1682. package/dist/server/kernel/redis-client.js.map +1 -1
  1683. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts +51 -0
  1684. package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts.map +1 -0
  1685. package/dist/server/kernel/redis-pubsub-realtime-transport.js +0 -0
  1686. package/dist/server/kernel/redis-pubsub-realtime-transport.js.map +1 -0
  1687. package/dist/server/kernel/redis-rate-limiter.d.ts +1 -0
  1688. package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
  1689. package/dist/server/kernel/redis-rate-limiter.js +11 -0
  1690. package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
  1691. package/dist/server/kernel/redis-streams-broker.d.ts +65 -0
  1692. package/dist/server/kernel/redis-streams-broker.d.ts.map +1 -0
  1693. package/dist/server/kernel/redis-streams-broker.js +203 -0
  1694. package/dist/server/kernel/redis-streams-broker.js.map +1 -0
  1695. package/dist/server/kernel/request-context.d.ts +4 -0
  1696. package/dist/server/kernel/request-context.d.ts.map +1 -1
  1697. package/dist/server/kernel/request-context.js +4 -0
  1698. package/dist/server/kernel/request-context.js.map +1 -1
  1699. package/dist/server/kernel/router-utils.d.ts +7 -0
  1700. package/dist/server/kernel/router-utils.d.ts.map +1 -1
  1701. package/dist/server/kernel/router-utils.js +31 -2
  1702. package/dist/server/kernel/router-utils.js.map +1 -1
  1703. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts +2 -0
  1704. package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts.map +1 -0
  1705. package/dist/server/plugin-host/__tests__/core-plugins.test.js +27 -0
  1706. package/dist/server/plugin-host/__tests__/core-plugins.test.js.map +1 -0
  1707. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts +2 -0
  1708. package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts.map +1 -0
  1709. package/dist/server/plugin-host/__tests__/load-plugins.test.js +31 -0
  1710. package/dist/server/plugin-host/__tests__/load-plugins.test.js.map +1 -0
  1711. package/dist/server/plugin-host/__tests__/module-registry.test.js.map +1 -1
  1712. package/dist/server/plugin-host/__tests__/required-ports.test.js +1 -0
  1713. package/dist/server/plugin-host/__tests__/required-ports.test.js.map +1 -1
  1714. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts +2 -0
  1715. package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts.map +1 -0
  1716. package/dist/server/plugin-host/__tests__/typed-plugin.test.js +82 -0
  1717. package/dist/server/plugin-host/__tests__/typed-plugin.test.js.map +1 -0
  1718. package/dist/server/plugin-host/core-plugins.d.ts +16 -0
  1719. package/dist/server/plugin-host/core-plugins.d.ts.map +1 -0
  1720. package/dist/server/plugin-host/core-plugins.js +42 -0
  1721. package/dist/server/plugin-host/core-plugins.js.map +1 -0
  1722. package/dist/server/plugin-host/define-plugin.d.ts +24 -24
  1723. package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
  1724. package/dist/server/plugin-host/define-plugin.js +1 -3
  1725. package/dist/server/plugin-host/define-plugin.js.map +1 -1
  1726. package/dist/server/plugin-host/index.d.ts +3 -3
  1727. package/dist/server/plugin-host/index.d.ts.map +1 -1
  1728. package/dist/server/plugin-host/index.js +2 -2
  1729. package/dist/server/plugin-host/index.js.map +1 -1
  1730. package/dist/server/plugin-host/load-extensions.d.ts +2 -2
  1731. package/dist/server/plugin-host/load-extensions.js +2 -2
  1732. package/dist/server/plugin-host/load-plugins.d.ts +7 -3
  1733. package/dist/server/plugin-host/load-plugins.d.ts.map +1 -1
  1734. package/dist/server/plugin-host/load-plugins.js +10 -2
  1735. package/dist/server/plugin-host/load-plugins.js.map +1 -1
  1736. package/dist/server/plugin-host/module-registry.d.ts +9 -14
  1737. package/dist/server/plugin-host/module-registry.d.ts.map +1 -1
  1738. package/dist/server/plugin-host/module-registry.js +2 -9
  1739. package/dist/server/plugin-host/module-registry.js.map +1 -1
  1740. package/dist/server/runtime/__tests__/create-app.test.d.ts +2 -0
  1741. package/dist/server/runtime/__tests__/create-app.test.d.ts.map +1 -0
  1742. package/dist/server/runtime/__tests__/create-app.test.js +155 -0
  1743. package/dist/server/runtime/__tests__/create-app.test.js.map +1 -0
  1744. package/dist/server/runtime/assert-durable-seams.d.ts +19 -0
  1745. package/dist/server/runtime/assert-durable-seams.d.ts.map +1 -0
  1746. package/dist/server/runtime/assert-durable-seams.js +37 -0
  1747. package/dist/server/runtime/assert-durable-seams.js.map +1 -0
  1748. package/dist/server/runtime/core-token-catalog.d.ts +181 -0
  1749. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -0
  1750. package/dist/server/runtime/core-token-catalog.js +70 -0
  1751. package/dist/server/runtime/core-token-catalog.js.map +1 -0
  1752. package/dist/server/runtime/create-app.d.ts +20 -23
  1753. package/dist/server/runtime/create-app.d.ts.map +1 -1
  1754. package/dist/server/runtime/create-app.js +142 -84
  1755. package/dist/server/runtime/create-app.js.map +1 -1
  1756. package/dist/server/runtime/index.d.ts +3 -4
  1757. package/dist/server/runtime/index.d.ts.map +1 -1
  1758. package/dist/server/runtime/index.js +1 -3
  1759. package/dist/server/runtime/index.js.map +1 -1
  1760. package/dist/testing/global-setup.d.ts +15 -0
  1761. package/dist/testing/global-setup.d.ts.map +1 -0
  1762. package/dist/testing/global-setup.js +33 -0
  1763. package/dist/testing/global-setup.js.map +1 -0
  1764. package/dist/testing/index.d.ts +6 -0
  1765. package/dist/testing/index.d.ts.map +1 -0
  1766. package/dist/testing/index.js +6 -0
  1767. package/dist/testing/index.js.map +1 -0
  1768. package/dist/testing/mock.d.ts +58 -15
  1769. package/dist/testing/mock.d.ts.map +1 -1
  1770. package/dist/testing/mock.js +163 -39
  1771. package/dist/testing/mock.js.map +1 -1
  1772. package/dist/testing/real-infra.d.ts +68 -0
  1773. package/dist/testing/real-infra.d.ts.map +1 -0
  1774. package/dist/testing/real-infra.js +151 -0
  1775. package/dist/testing/real-infra.js.map +1 -0
  1776. package/dist/testing/realtime-transport-conformance.d.ts +35 -0
  1777. package/dist/testing/realtime-transport-conformance.d.ts.map +1 -0
  1778. package/dist/testing/realtime-transport-conformance.js +94 -0
  1779. package/dist/testing/realtime-transport-conformance.js.map +1 -0
  1780. package/dist/testing/seed-player.d.ts +113 -0
  1781. package/dist/testing/seed-player.d.ts.map +1 -0
  1782. package/dist/testing/seed-player.js +43 -0
  1783. package/dist/testing/seed-player.js.map +1 -0
  1784. package/dist/testing/seed-wallet.d.ts +9 -0
  1785. package/dist/testing/seed-wallet.d.ts.map +1 -0
  1786. package/dist/testing/seed-wallet.js +27 -0
  1787. package/dist/testing/seed-wallet.js.map +1 -0
  1788. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts +2 -0
  1789. package/dist/wallet/__tests__/admin-reporting.int.test.d.ts.map +1 -0
  1790. package/dist/wallet/__tests__/admin-reporting.int.test.js +236 -0
  1791. package/dist/wallet/__tests__/admin-reporting.int.test.js.map +1 -0
  1792. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts +2 -0
  1793. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts.map +1 -0
  1794. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js +163 -0
  1795. package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js.map +1 -0
  1796. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts +2 -0
  1797. package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts.map +1 -0
  1798. package/dist/wallet/__tests__/bonus-rollover.int.test.js +444 -0
  1799. package/dist/wallet/__tests__/bonus-rollover.int.test.js.map +1 -0
  1800. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
  1801. package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
  1802. package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
  1803. package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
  1804. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
  1805. package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
  1806. package/dist/wallet/__tests__/custody-sweep.service.int.test.js +274 -0
  1807. package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
  1808. package/dist/wallet/__tests__/deposit-gate.test.d.ts +2 -0
  1809. package/dist/wallet/__tests__/deposit-gate.test.d.ts.map +1 -0
  1810. package/dist/wallet/__tests__/deposit-gate.test.js +46 -0
  1811. package/dist/wallet/__tests__/deposit-gate.test.js.map +1 -0
  1812. package/dist/wallet/__tests__/rail-for.test.d.ts +2 -0
  1813. package/dist/wallet/__tests__/rail-for.test.d.ts.map +1 -0
  1814. package/dist/wallet/__tests__/rail-for.test.js +29 -0
  1815. package/dist/wallet/__tests__/rail-for.test.js.map +1 -0
  1816. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts +2 -0
  1817. package/dist/wallet/__tests__/reconciliation-diff.test.d.ts.map +1 -0
  1818. package/dist/wallet/__tests__/reconciliation-diff.test.js +49 -0
  1819. package/dist/wallet/__tests__/reconciliation-diff.test.js.map +1 -0
  1820. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts +2 -0
  1821. package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts.map +1 -0
  1822. package/dist/wallet/__tests__/reconciliation.service.int.test.js +618 -0
  1823. package/dist/wallet/__tests__/reconciliation.service.int.test.js.map +1 -0
  1824. package/dist/wallet/__tests__/settlement-network.test.d.ts +2 -0
  1825. package/dist/wallet/__tests__/settlement-network.test.d.ts.map +1 -0
  1826. package/dist/wallet/__tests__/settlement-network.test.js +54 -0
  1827. package/dist/wallet/__tests__/settlement-network.test.js.map +1 -0
  1828. package/dist/wallet/__tests__/swap.service.int.test.d.ts +2 -0
  1829. package/dist/wallet/__tests__/swap.service.int.test.d.ts.map +1 -0
  1830. package/dist/wallet/__tests__/swap.service.int.test.js +398 -0
  1831. package/dist/wallet/__tests__/swap.service.int.test.js.map +1 -0
  1832. package/dist/wallet/__tests__/wallet-address-format.test.d.ts +2 -0
  1833. package/dist/wallet/__tests__/wallet-address-format.test.d.ts.map +1 -0
  1834. package/dist/wallet/__tests__/wallet-address-format.test.js +102 -0
  1835. package/dist/wallet/__tests__/wallet-address-format.test.js.map +1 -0
  1836. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts +2 -0
  1837. package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts.map +1 -0
  1838. package/dist/wallet/__tests__/wallet-asset.router.int.test.js +263 -0
  1839. package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -0
  1840. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts +2 -0
  1841. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts.map +1 -0
  1842. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +137 -0
  1843. package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -0
  1844. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts +2 -0
  1845. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts.map +1 -0
  1846. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +205 -0
  1847. package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -0
  1848. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts +2 -0
  1849. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts.map +1 -0
  1850. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +900 -0
  1851. package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -0
  1852. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts +2 -0
  1853. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts.map +1 -0
  1854. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js +38 -0
  1855. package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js.map +1 -0
  1856. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts +2 -0
  1857. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts.map +1 -0
  1858. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js +114 -0
  1859. package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js.map +1 -0
  1860. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts +2 -0
  1861. package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts.map +1 -0
  1862. package/dist/wallet/__tests__/wallet-commands.service.int.test.js +419 -0
  1863. package/dist/wallet/__tests__/wallet-commands.service.int.test.js.map +1 -0
  1864. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts +2 -0
  1865. package/dist/wallet/__tests__/wallet-currency-code.test.d.ts.map +1 -0
  1866. package/dist/wallet/__tests__/wallet-currency-code.test.js +48 -0
  1867. package/dist/wallet/__tests__/wallet-currency-code.test.js.map +1 -0
  1868. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts +2 -0
  1869. package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts.map +1 -0
  1870. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js +129 -0
  1871. package/dist/wallet/__tests__/wallet-custody-routes.router.test.js.map +1 -0
  1872. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts +2 -0
  1873. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts.map +1 -0
  1874. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js +104 -0
  1875. package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js.map +1 -0
  1876. package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts +2 -0
  1877. package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts.map +1 -0
  1878. package/dist/wallet/__tests__/wallet-reader.service.int.test.js +111 -0
  1879. package/dist/wallet/__tests__/wallet-reader.service.int.test.js.map +1 -0
  1880. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts +2 -0
  1881. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts.map +1 -0
  1882. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js +93 -0
  1883. package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js.map +1 -0
  1884. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts +2 -0
  1885. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts.map +1 -0
  1886. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js +37 -0
  1887. package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js.map +1 -0
  1888. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts +2 -0
  1889. package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts.map +1 -0
  1890. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +311 -0
  1891. package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -0
  1892. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts +2 -0
  1893. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts.map +1 -0
  1894. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js +64 -0
  1895. package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js.map +1 -0
  1896. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts +2 -0
  1897. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts.map +1 -0
  1898. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js +179 -0
  1899. package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js.map +1 -0
  1900. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts +2 -0
  1901. package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts.map +1 -0
  1902. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js +117 -0
  1903. package/dist/wallet/__tests__/wallet.rate-limit.int.test.js.map +1 -0
  1904. package/dist/wallet/__tests__/wallet.router.int.test.d.ts +2 -0
  1905. package/dist/wallet/__tests__/wallet.router.int.test.d.ts.map +1 -0
  1906. package/dist/wallet/__tests__/wallet.router.int.test.js +104 -0
  1907. package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -0
  1908. package/dist/wallet/__tests__/wallet.service.int.test.d.ts +2 -0
  1909. package/dist/wallet/__tests__/wallet.service.int.test.d.ts.map +1 -0
  1910. package/dist/wallet/__tests__/wallet.service.int.test.js +1674 -0
  1911. package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -0
  1912. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts +14 -0
  1913. package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts.map +1 -0
  1914. package/dist/wallet/adapters/wallet-asset-catalog.service.js +37 -0
  1915. package/dist/wallet/adapters/wallet-asset-catalog.service.js.map +1 -0
  1916. package/dist/wallet/adapters/wallet-reader.service.d.ts +8 -1
  1917. package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
  1918. package/dist/wallet/adapters/wallet-reader.service.js +52 -1
  1919. package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
  1920. package/dist/wallet/admin-reporting.d.ts +3 -3
  1921. package/dist/wallet/admin-reporting.d.ts.map +1 -1
  1922. package/dist/wallet/admin-reporting.js +11 -3
  1923. package/dist/wallet/admin-reporting.js.map +1 -1
  1924. package/dist/wallet/contract/index.d.ts +1018 -19
  1925. package/dist/wallet/contract/index.d.ts.map +1 -1
  1926. package/dist/wallet/contract/index.js +513 -15
  1927. package/dist/wallet/contract/index.js.map +1 -1
  1928. package/dist/wallet/drizzle/migrations/0003_certain_ogun.sql +2 -0
  1929. package/dist/wallet/drizzle/migrations/0004_reflective_shriek.sql +2 -0
  1930. package/dist/wallet/drizzle/migrations/0005_gigantic_dust.sql +10 -0
  1931. package/dist/wallet/drizzle/migrations/0006_lush_morg.sql +1 -0
  1932. package/dist/wallet/drizzle/migrations/0007_bouncy_swordsman.sql +17 -0
  1933. package/dist/wallet/drizzle/migrations/0008_gorgeous_colonel_america.sql +1 -0
  1934. package/dist/wallet/drizzle/migrations/0009_smooth_sue_storm.sql +17 -0
  1935. package/dist/wallet/drizzle/migrations/0010_worthless_quasimodo.sql +84 -0
  1936. package/dist/wallet/drizzle/migrations/0011_premium_natasha_romanoff.sql +30 -0
  1937. package/dist/wallet/drizzle/migrations/0012_long_wong.sql +15 -0
  1938. package/dist/wallet/drizzle/migrations/0013_polite_peter_parker.sql +1 -0
  1939. package/dist/wallet/drizzle/migrations/0014_abandoned_madripoor.sql +20 -0
  1940. package/dist/wallet/drizzle/migrations/0015_right_oracle.sql +3 -0
  1941. package/dist/wallet/drizzle/migrations/0016_curly_ben_urich.sql +2 -0
  1942. package/dist/wallet/drizzle/migrations/0017_workable_wolf_cub.sql +2 -0
  1943. package/dist/wallet/drizzle/migrations/0018_marvelous_demogoblin.sql +3 -0
  1944. package/dist/wallet/drizzle/migrations/0019_awesome_drax.sql +2 -0
  1945. package/dist/wallet/drizzle/migrations/0020_salty_infant_terrible.sql +1 -0
  1946. package/dist/wallet/drizzle/migrations/0021_mean_chameleon.sql +3 -0
  1947. package/dist/wallet/drizzle/migrations/0022_natural_exodus.sql +1 -0
  1948. package/dist/wallet/drizzle/migrations/meta/0003_snapshot.json +567 -0
  1949. package/dist/wallet/drizzle/migrations/meta/0004_snapshot.json +631 -0
  1950. package/dist/wallet/drizzle/migrations/meta/0006_snapshot.json +638 -0
  1951. package/dist/wallet/drizzle/migrations/meta/0007_snapshot.json +723 -0
  1952. package/dist/wallet/drizzle/migrations/meta/0008_snapshot.json +716 -0
  1953. package/dist/wallet/drizzle/migrations/meta/0009_snapshot.json +895 -0
  1954. package/dist/wallet/drizzle/migrations/meta/0010_snapshot.json +1565 -0
  1955. package/dist/wallet/drizzle/migrations/meta/0011_snapshot.json +1777 -0
  1956. package/dist/wallet/drizzle/migrations/meta/0012_snapshot.json +1907 -0
  1957. package/dist/wallet/drizzle/migrations/meta/0013_snapshot.json +1913 -0
  1958. package/dist/wallet/drizzle/migrations/meta/0014_snapshot.json +1925 -0
  1959. package/dist/wallet/drizzle/migrations/meta/0015_snapshot.json +1937 -0
  1960. package/dist/wallet/drizzle/migrations/meta/0016_snapshot.json +1943 -0
  1961. package/dist/wallet/drizzle/migrations/meta/0017_snapshot.json +1945 -0
  1962. package/dist/wallet/drizzle/migrations/meta/0018_snapshot.json +1967 -0
  1963. package/dist/wallet/drizzle/migrations/meta/0019_snapshot.json +1973 -0
  1964. package/dist/wallet/drizzle/migrations/meta/0020_snapshot.json +1979 -0
  1965. package/dist/wallet/drizzle/migrations/meta/0021_snapshot.json +1986 -0
  1966. package/dist/wallet/drizzle/migrations/meta/0022_snapshot.json +1987 -0
  1967. package/dist/wallet/drizzle/migrations/meta/_journal.json +140 -0
  1968. package/dist/wallet/index.d.ts.map +1 -1
  1969. package/dist/wallet/index.js +0 -2
  1970. package/dist/wallet/index.js.map +1 -1
  1971. package/dist/wallet/migrate.d.ts +0 -1
  1972. package/dist/wallet/migrate.d.ts.map +1 -1
  1973. package/dist/wallet/migrate.js +0 -4
  1974. package/dist/wallet/migrate.js.map +1 -1
  1975. package/dist/wallet/plugin.d.ts +183 -1
  1976. package/dist/wallet/plugin.d.ts.map +1 -1
  1977. package/dist/wallet/plugin.js +223 -19
  1978. package/dist/wallet/plugin.js.map +1 -1
  1979. package/dist/wallet/router/index.d.ts +557 -12
  1980. package/dist/wallet/router/index.d.ts.map +1 -1
  1981. package/dist/wallet/router/index.js +270 -36
  1982. package/dist/wallet/router/index.js.map +1 -1
  1983. package/dist/wallet/schema/index.d.ts +1990 -9
  1984. package/dist/wallet/schema/index.d.ts.map +1 -1
  1985. package/dist/wallet/schema/index.js +290 -7
  1986. package/dist/wallet/schema/index.js.map +1 -1
  1987. package/dist/wallet/seed/index.d.ts +3 -0
  1988. package/dist/wallet/seed/index.d.ts.map +1 -0
  1989. package/dist/wallet/seed/index.js +3 -0
  1990. package/dist/wallet/seed/index.js.map +1 -0
  1991. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts +11 -0
  1992. package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts.map +1 -0
  1993. package/dist/wallet/seed/seed-auto-withdrawal-config.js +16 -0
  1994. package/dist/wallet/seed/seed-auto-withdrawal-config.js.map +1 -0
  1995. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts +3 -0
  1996. package/dist/wallet/seed/seed-bonus-rollover-config.d.ts.map +1 -0
  1997. package/dist/wallet/seed/seed-bonus-rollover-config.js +8 -0
  1998. package/dist/wallet/seed/seed-bonus-rollover-config.js.map +1 -0
  1999. package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
  2000. package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
  2001. package/dist/wallet/service/custody-sweep.service.js +388 -0
  2002. package/dist/wallet/service/custody-sweep.service.js.map +1 -0
  2003. package/dist/wallet/service/reconciliation-finding.service.d.ts +68 -0
  2004. package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
  2005. package/dist/wallet/service/reconciliation-finding.service.js +82 -0
  2006. package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
  2007. package/dist/wallet/service/reconciliation.service.d.ts +143 -0
  2008. package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
  2009. package/dist/wallet/service/reconciliation.service.js +685 -0
  2010. package/dist/wallet/service/reconciliation.service.js.map +1 -0
  2011. package/dist/wallet/service/swap.service.d.ts +78 -0
  2012. package/dist/wallet/service/swap.service.d.ts.map +1 -0
  2013. package/dist/wallet/service/swap.service.js +336 -0
  2014. package/dist/wallet/service/swap.service.js.map +1 -0
  2015. package/dist/wallet/service/wallet-commands.service.d.ts +19 -4
  2016. package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
  2017. package/dist/wallet/service/wallet-commands.service.js +238 -31
  2018. package/dist/wallet/service/wallet-commands.service.js.map +1 -1
  2019. package/dist/wallet/service/wallet.service.d.ts +679 -30
  2020. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  2021. package/dist/wallet/service/wallet.service.js +1351 -155
  2022. package/dist/wallet/service/wallet.service.js.map +1 -1
  2023. package/generators/src/config.ts +547 -0
  2024. package/generators/src/templates/adapter.hbs +19 -0
  2025. package/generators/src/templates/contract.hbs +19 -0
  2026. package/generators/src/templates/job-worker.hbs +34 -0
  2027. package/generators/src/templates/module/drizzle.config.hbs +22 -0
  2028. package/generators/src/templates/module/index.hbs +5 -0
  2029. package/generators/src/templates/module/migrate.hbs +17 -0
  2030. package/generators/src/templates/module/plugin.hbs +19 -0
  2031. package/generators/src/templates/module/router.hbs +19 -0
  2032. package/generators/src/templates/module/schema.hbs +14 -0
  2033. package/generators/src/templates/module/service.hbs +26 -0
  2034. package/generators/src/templates/plugin.hbs +20 -0
  2035. package/package.json +168 -11
  2036. package/dist/admin-console/__tests__/backoffice.service.test.d.ts +0 -2
  2037. package/dist/admin-console/__tests__/backoffice.service.test.d.ts.map +0 -1
  2038. package/dist/admin-console/__tests__/backoffice.service.test.js +0 -156
  2039. package/dist/admin-console/__tests__/backoffice.service.test.js.map +0 -1
  2040. package/dist/audit/__tests__/audit.service.test.d.ts +0 -2
  2041. package/dist/audit/__tests__/audit.service.test.d.ts.map +0 -1
  2042. package/dist/audit/__tests__/audit.service.test.js +0 -442
  2043. package/dist/audit/__tests__/audit.service.test.js.map +0 -1
  2044. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts +0 -2
  2045. package/dist/casino/gaming/__tests__/gaming.service.test.d.ts.map +0 -1
  2046. package/dist/casino/gaming/__tests__/gaming.service.test.js +0 -55
  2047. package/dist/casino/gaming/__tests__/gaming.service.test.js.map +0 -1
  2048. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts +0 -2
  2049. package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts.map +0 -1
  2050. package/dist/casino/lobby/__tests__/lobby.cache.test.js +0 -47
  2051. package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +0 -1
  2052. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts +0 -2
  2053. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts.map +0 -1
  2054. package/dist/casino/lobby/__tests__/lobby.service.test.js +0 -11
  2055. package/dist/casino/lobby/__tests__/lobby.service.test.js.map +0 -1
  2056. package/dist/cms/__tests__/cms.cache.test.d.ts +0 -2
  2057. package/dist/cms/__tests__/cms.cache.test.d.ts.map +0 -1
  2058. package/dist/cms/__tests__/cms.cache.test.js +0 -87
  2059. package/dist/cms/__tests__/cms.cache.test.js.map +0 -1
  2060. package/dist/cms/__tests__/cms.router.test.d.ts +0 -2
  2061. package/dist/cms/__tests__/cms.router.test.d.ts.map +0 -1
  2062. package/dist/cms/__tests__/cms.router.test.js +0 -51
  2063. package/dist/cms/__tests__/cms.router.test.js.map +0 -1
  2064. package/dist/cms/__tests__/cms.service.test.d.ts +0 -2
  2065. package/dist/cms/__tests__/cms.service.test.d.ts.map +0 -1
  2066. package/dist/cms/__tests__/cms.service.test.js +0 -17
  2067. package/dist/cms/__tests__/cms.service.test.js.map +0 -1
  2068. package/dist/compliance/__tests__/compliance.service.test.d.ts +0 -2
  2069. package/dist/compliance/__tests__/compliance.service.test.d.ts.map +0 -1
  2070. package/dist/compliance/__tests__/compliance.service.test.js +0 -96
  2071. package/dist/compliance/__tests__/compliance.service.test.js.map +0 -1
  2072. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts +0 -2
  2073. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts.map +0 -1
  2074. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +0 -25
  2075. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +0 -1
  2076. package/dist/compliance/__tests__/kyc.service.test.d.ts +0 -2
  2077. package/dist/compliance/__tests__/kyc.service.test.d.ts.map +0 -1
  2078. package/dist/compliance/__tests__/kyc.service.test.js +0 -177
  2079. package/dist/compliance/__tests__/kyc.service.test.js.map +0 -1
  2080. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts +0 -2
  2081. package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts.map +0 -1
  2082. package/dist/compliance/__tests__/rg-monitoring.service.test.js +0 -110
  2083. package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +0 -1
  2084. package/dist/compliance/__tests__/rg.router.test.d.ts +0 -2
  2085. package/dist/compliance/__tests__/rg.router.test.d.ts.map +0 -1
  2086. package/dist/compliance/__tests__/rg.router.test.js +0 -66
  2087. package/dist/compliance/__tests__/rg.router.test.js.map +0 -1
  2088. package/dist/compliance/__tests__/rg.service.test.d.ts +0 -2
  2089. package/dist/compliance/__tests__/rg.service.test.d.ts.map +0 -1
  2090. package/dist/compliance/__tests__/rg.service.test.js +0 -212
  2091. package/dist/compliance/__tests__/rg.service.test.js.map +0 -1
  2092. package/dist/contracts/adapters/email.d.ts +0 -10
  2093. package/dist/contracts/adapters/email.d.ts.map +0 -1
  2094. package/dist/contracts/adapters/email.js +0 -8
  2095. package/dist/contracts/adapters/email.js.map +0 -1
  2096. package/dist/contracts/adapters/notification.d.ts +0 -6
  2097. package/dist/contracts/adapters/notification.d.ts.map +0 -1
  2098. package/dist/contracts/adapters/notification.js +0 -8
  2099. package/dist/contracts/adapters/notification.js.map +0 -1
  2100. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts +0 -2
  2101. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts.map +0 -1
  2102. package/dist/contracts/schemas/__tests__/identity-schemas.test.js +0 -38
  2103. package/dist/contracts/schemas/__tests__/identity-schemas.test.js.map +0 -1
  2104. package/dist/engagement/chat/__tests__/chat.service.test.d.ts +0 -2
  2105. package/dist/engagement/chat/__tests__/chat.service.test.d.ts.map +0 -1
  2106. package/dist/engagement/chat/__tests__/chat.service.test.js +0 -170
  2107. package/dist/engagement/chat/__tests__/chat.service.test.js.map +0 -1
  2108. package/dist/engagement/chat/react/use-chat-stream.d.ts +0 -26
  2109. package/dist/engagement/chat/react/use-chat-stream.d.ts.map +0 -1
  2110. package/dist/engagement/chat/react/use-chat-stream.js +0 -54
  2111. package/dist/engagement/chat/react/use-chat-stream.js.map +0 -1
  2112. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts +0 -2
  2113. package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts.map +0 -1
  2114. package/dist/engagement/notifications/__tests__/notifications.service.test.js +0 -84
  2115. package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +0 -1
  2116. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts +0 -5
  2117. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts.map +0 -1
  2118. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js +0 -6
  2119. package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js.map +0 -1
  2120. package/dist/iam/__tests__/iam.service.test.d.ts +0 -2
  2121. package/dist/iam/__tests__/iam.service.test.d.ts.map +0 -1
  2122. package/dist/iam/__tests__/iam.service.test.js +0 -744
  2123. package/dist/iam/__tests__/iam.service.test.js.map +0 -1
  2124. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts +0 -2
  2125. package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts.map +0 -1
  2126. package/dist/pam/identity/__tests__/admin-user-directory.test.js +0 -93
  2127. package/dist/pam/identity/__tests__/admin-user-directory.test.js.map +0 -1
  2128. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts +0 -2
  2129. package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts.map +0 -1
  2130. package/dist/pam/identity/__tests__/identity.rate-limit.test.js +0 -127
  2131. package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +0 -1
  2132. package/dist/pam/identity/__tests__/identity.service.test.d.ts +0 -2
  2133. package/dist/pam/identity/__tests__/identity.service.test.d.ts.map +0 -1
  2134. package/dist/pam/identity/__tests__/identity.service.test.js +0 -292
  2135. package/dist/pam/identity/__tests__/identity.service.test.js.map +0 -1
  2136. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts +0 -2
  2137. package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts.map +0 -1
  2138. package/dist/pam/identity/__tests__/login-enforcement.service.test.js +0 -41
  2139. package/dist/pam/identity/__tests__/login-enforcement.service.test.js.map +0 -1
  2140. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts +0 -2
  2141. package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts.map +0 -1
  2142. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +0 -38
  2143. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +0 -1
  2144. package/dist/pam/player-management/__tests__/player.router.test.d.ts +0 -2
  2145. package/dist/pam/player-management/__tests__/player.router.test.d.ts.map +0 -1
  2146. package/dist/pam/player-management/__tests__/player.router.test.js +0 -57
  2147. package/dist/pam/player-management/__tests__/player.router.test.js.map +0 -1
  2148. package/dist/pam/player-management/__tests__/player.service.test.d.ts +0 -2
  2149. package/dist/pam/player-management/__tests__/player.service.test.d.ts.map +0 -1
  2150. package/dist/pam/player-management/__tests__/player.service.test.js +0 -144
  2151. package/dist/pam/player-management/__tests__/player.service.test.js.map +0 -1
  2152. package/dist/pam/profile/__tests__/profile.service.test.d.ts +0 -2
  2153. package/dist/pam/profile/__tests__/profile.service.test.d.ts.map +0 -1
  2154. package/dist/pam/profile/__tests__/profile.service.test.js +0 -48
  2155. package/dist/pam/profile/__tests__/profile.service.test.js.map +0 -1
  2156. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts +0 -2
  2157. package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts.map +0 -1
  2158. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +0 -38
  2159. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +0 -1
  2160. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts +0 -2
  2161. package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts.map +0 -1
  2162. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +0 -269
  2163. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +0 -1
  2164. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts +0 -2
  2165. package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts.map +0 -1
  2166. package/dist/pam/tag/__tests__/tag-rule.service.test.js +0 -149
  2167. package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +0 -1
  2168. package/dist/pam/tag/__tests__/tag.router.test.d.ts +0 -2
  2169. package/dist/pam/tag/__tests__/tag.router.test.d.ts.map +0 -1
  2170. package/dist/pam/tag/__tests__/tag.router.test.js +0 -38
  2171. package/dist/pam/tag/__tests__/tag.router.test.js.map +0 -1
  2172. package/dist/pam/tag/__tests__/tag.service.test.d.ts +0 -2
  2173. package/dist/pam/tag/__tests__/tag.service.test.d.ts.map +0 -1
  2174. package/dist/pam/tag/__tests__/tag.service.test.js +0 -262
  2175. package/dist/pam/tag/__tests__/tag.service.test.js.map +0 -1
  2176. package/dist/server/auth/__tests__/admin-guard.test.d.ts +0 -2
  2177. package/dist/server/auth/__tests__/admin-guard.test.d.ts.map +0 -1
  2178. package/dist/server/auth/__tests__/admin-guard.test.js +0 -133
  2179. package/dist/server/auth/__tests__/admin-guard.test.js.map +0 -1
  2180. package/dist/server/auth/__tests__/session-resolver.test.d.ts +0 -2
  2181. package/dist/server/auth/__tests__/session-resolver.test.d.ts.map +0 -1
  2182. package/dist/server/auth/__tests__/session-resolver.test.js +0 -27
  2183. package/dist/server/auth/__tests__/session-resolver.test.js.map +0 -1
  2184. package/dist/server/db/outbox/__tests__/relay.test.d.ts +0 -2
  2185. package/dist/server/db/outbox/__tests__/relay.test.d.ts.map +0 -1
  2186. package/dist/server/db/outbox/__tests__/relay.test.js +0 -124
  2187. package/dist/server/db/outbox/__tests__/relay.test.js.map +0 -1
  2188. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts +0 -2
  2189. package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts.map +0 -1
  2190. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js +0 -190
  2191. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js.map +0 -1
  2192. package/dist/server/kernel/__tests__/cache.test.d.ts +0 -2
  2193. package/dist/server/kernel/__tests__/cache.test.d.ts.map +0 -1
  2194. package/dist/server/kernel/__tests__/cache.test.js +0 -84
  2195. package/dist/server/kernel/__tests__/cache.test.js.map +0 -1
  2196. package/dist/server/kernel/__tests__/event-bus.test.d.ts +0 -2
  2197. package/dist/server/kernel/__tests__/event-bus.test.d.ts.map +0 -1
  2198. package/dist/server/kernel/__tests__/event-bus.test.js +0 -116
  2199. package/dist/server/kernel/__tests__/event-bus.test.js.map +0 -1
  2200. package/dist/server/kernel/__tests__/job-queue.test.d.ts +0 -2
  2201. package/dist/server/kernel/__tests__/job-queue.test.d.ts.map +0 -1
  2202. package/dist/server/kernel/__tests__/job-queue.test.js +0 -135
  2203. package/dist/server/kernel/__tests__/job-queue.test.js.map +0 -1
  2204. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts +0 -2
  2205. package/dist/server/kernel/__tests__/rate-limiter.test.d.ts.map +0 -1
  2206. package/dist/server/kernel/__tests__/rate-limiter.test.js +0 -74
  2207. package/dist/server/kernel/__tests__/rate-limiter.test.js.map +0 -1
  2208. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts +0 -2
  2209. package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts.map +0 -1
  2210. package/dist/server/kernel/__tests__/realtime-authorizer.test.js +0 -19
  2211. package/dist/server/kernel/__tests__/realtime-authorizer.test.js.map +0 -1
  2212. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts +0 -2
  2213. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +0 -1
  2214. package/dist/server/kernel/__tests__/realtime-transport.test.js +0 -50
  2215. package/dist/server/kernel/__tests__/realtime-transport.test.js.map +0 -1
  2216. package/dist/server/kernel/__tests__/redis-cache.test.d.ts +0 -2
  2217. package/dist/server/kernel/__tests__/redis-cache.test.d.ts.map +0 -1
  2218. package/dist/server/kernel/__tests__/redis-cache.test.js +0 -49
  2219. package/dist/server/kernel/__tests__/redis-cache.test.js.map +0 -1
  2220. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts +0 -2
  2221. package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts.map +0 -1
  2222. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js +0 -56
  2223. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js.map +0 -1
  2224. package/dist/server/kernel/job-queue.d.ts +0 -40
  2225. package/dist/server/kernel/job-queue.d.ts.map +0 -1
  2226. package/dist/server/kernel/job-queue.js +0 -200
  2227. package/dist/server/kernel/job-queue.js.map +0 -1
  2228. package/dist/server/kernel/realtime-transport.d.ts +0 -8
  2229. package/dist/server/kernel/realtime-transport.d.ts.map +0 -1
  2230. package/dist/server/kernel/realtime-transport.js +0 -57
  2231. package/dist/server/kernel/realtime-transport.js.map +0 -1
  2232. package/dist/server/runtime/openapi.d.ts +0 -15
  2233. package/dist/server/runtime/openapi.d.ts.map +0 -1
  2234. package/dist/server/runtime/openapi.js +0 -26
  2235. package/dist/server/runtime/openapi.js.map +0 -1
  2236. package/dist/wallet/__tests__/admin-reporting.test.d.ts +0 -2
  2237. package/dist/wallet/__tests__/admin-reporting.test.d.ts.map +0 -1
  2238. package/dist/wallet/__tests__/admin-reporting.test.js +0 -124
  2239. package/dist/wallet/__tests__/admin-reporting.test.js.map +0 -1
  2240. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts +0 -2
  2241. package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts.map +0 -1
  2242. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +0 -100
  2243. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +0 -1
  2244. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts +0 -2
  2245. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts.map +0 -1
  2246. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +0 -517
  2247. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +0 -1
  2248. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts +0 -2
  2249. package/dist/wallet/__tests__/wallet-commands.service.test.d.ts.map +0 -1
  2250. package/dist/wallet/__tests__/wallet-commands.service.test.js +0 -176
  2251. package/dist/wallet/__tests__/wallet-commands.service.test.js.map +0 -1
  2252. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts +0 -2
  2253. package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts.map +0 -1
  2254. package/dist/wallet/__tests__/wallet-kyc-gate.test.js +0 -61
  2255. package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +0 -1
  2256. package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts +0 -2
  2257. package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts.map +0 -1
  2258. package/dist/wallet/__tests__/wallet-webhook.router.test.js +0 -78
  2259. package/dist/wallet/__tests__/wallet-webhook.router.test.js.map +0 -1
  2260. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts +0 -2
  2261. package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts.map +0 -1
  2262. package/dist/wallet/__tests__/wallet.rate-limit.test.js +0 -34
  2263. package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +0 -1
  2264. package/dist/wallet/__tests__/wallet.router.test.d.ts +0 -2
  2265. package/dist/wallet/__tests__/wallet.router.test.d.ts.map +0 -1
  2266. package/dist/wallet/__tests__/wallet.router.test.js +0 -45
  2267. package/dist/wallet/__tests__/wallet.router.test.js.map +0 -1
  2268. package/dist/wallet/__tests__/wallet.service.test.d.ts +0 -2
  2269. package/dist/wallet/__tests__/wallet.service.test.d.ts.map +0 -1
  2270. package/dist/wallet/__tests__/wallet.service.test.js +0 -971
  2271. package/dist/wallet/__tests__/wallet.service.test.js.map +0 -1
  2272. package/turbo-generators/src/config.ts +0 -478
  2273. package/turbo-generators/src/templates/adapter.hbs +0 -19
  2274. package/turbo-generators/src/templates/contract.hbs +0 -18
  2275. package/turbo-generators/src/templates/job-worker.hbs +0 -34
  2276. package/turbo-generators/src/templates/module/agents.hbs +0 -67
  2277. package/turbo-generators/src/templates/module/drizzle.config.hbs +0 -22
  2278. package/turbo-generators/src/templates/module/index.hbs +0 -5
  2279. package/turbo-generators/src/templates/module/migrate.hbs +0 -15
  2280. package/turbo-generators/src/templates/module/package.json.hbs +0 -62
  2281. package/turbo-generators/src/templates/module/plugin.hbs +0 -20
  2282. package/turbo-generators/src/templates/module/router.hbs +0 -19
  2283. package/turbo-generators/src/templates/module/schema.hbs +0 -21
  2284. package/turbo-generators/src/templates/module/service.hbs +0 -26
  2285. package/turbo-generators/src/templates/module/tsconfig.json.hbs +0 -8
  2286. package/turbo-generators/src/templates/plugin.hbs +0 -20
  2287. /package/{turbo-generators → generators}/src/templates/adr.hbs +0 -0
  2288. /package/{turbo-generators → generators}/src/templates/config.hbs +0 -0
@@ -1,9 +1,18 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { ORPCError } from '@orpc/server';
2
- import { createAuth, assertRateLimit, findOneOrThrow, makeNotFoundError, } from '@openora/core/server';
3
+ import { createAuth, assertRateLimit, extractClientMeta, getCurrentClientMeta, findOneOrThrow, makeConflictError, makeNotFoundError, createLogger, } from '@openora/core/server';
3
4
  import { parseCookies } from 'better-auth/cookies';
4
- import { eq, sql } from 'drizzle-orm';
5
+ import { and, eq, isNull, sql } from 'drizzle-orm';
6
+ import * as z from 'zod';
5
7
  import { user, session, account, verification, twoFactor } from '../schema/index.js';
8
+ import { captureTimezone } from './capture-timezone.service.js';
9
+ import { maskEmail, maskPhone, } from './two-factor-delivery.service.js';
10
+ import { RATE_LIMIT_KEYS, makeRateLimitKey } from '@openora/core/contracts';
6
11
  import { assertSupportedLanguage } from '../../shared/language.js';
12
+ import { assertAccountNotBlocked } from './rg-guard.service.js';
13
+ import { DEFAULT_LOCKOUT_DURATION_MS, DEFAULT_MAX_LOGIN_ATTEMPTS, computeLockoutTier, createAccountLockedError, hasFailedLoginWindowExpired, makeLoginSecurityState, } from './lockout-policy.service.js';
14
+ import { getSecurityControls } from './security-controls.service.js';
15
+ import { resolveChallengeMethod, verifyChallengeCode } from './two-factor-challenge.service.js';
7
16
  function nodeHeadersToHeaders(nodeHeaders) {
8
17
  const headers = new Headers();
9
18
  for (const [key, value] of Object.entries(nodeHeaders)) {
@@ -14,15 +23,6 @@ function nodeHeadersToHeaders(nodeHeaders) {
14
23
  }
15
24
  return headers;
16
25
  }
17
- export function createAccountLockedError(lockoutUntil) {
18
- return new ORPCError('UNAUTHORIZED', {
19
- message: 'Account is temporarily locked. Please try again later.',
20
- data: {
21
- code: 'ACCOUNT_LOCKED',
22
- lockoutUntil: lockoutUntil.toISOString(),
23
- },
24
- });
25
- }
26
26
  function toIso(value) {
27
27
  return value instanceof Date ? value.toISOString() : value;
28
28
  }
@@ -31,22 +31,18 @@ function toUser(u) {
31
31
  id: u.id,
32
32
  email: u.email,
33
33
  name: u.name,
34
+ username: u.username,
34
35
  emailVerified: u.emailVerified,
35
36
  theme: u.theme ?? 'system',
36
37
  language: u.language ?? 'en',
38
+ twoFactorEnabled: u.twoFactorEnabled ?? false,
37
39
  createdAt: toIso(u.createdAt),
38
40
  updatedAt: toIso(u.updatedAt),
39
41
  };
40
42
  return u.image !== undefined ? { ...base, image: u.image } : base;
41
43
  }
42
- function forwardCookies(authResponse, resHeaders) {
43
- const cookies = authResponse.headers.getSetCookie?.() ?? [];
44
- for (const cookie of cookies) {
45
- resHeaders.append('set-cookie', cookie);
46
- }
47
- }
48
- function clientIp(headers) {
49
- return headers.get('x-forwarded-for')?.split(',')[0]?.trim() || headers.get('x-real-ip') || null;
44
+ function makeLoginRateLimitKey(email) {
45
+ return `login:${email.toLowerCase()}`;
50
46
  }
51
47
  // Key on the `.two_factor` cookie VALUE, never the raw Cookie header: an attacker can
52
48
  // otherwise churn the rate-limit key each retry by appending unrelated cookie pairs.
@@ -62,31 +58,98 @@ function twoFactorPendingCookieValue(headers) {
62
58
  }
63
59
  return undefined;
64
60
  }
61
+ // A web Response exposes Set-Cookie as full attribute strings; a request carries only
62
+ // the name=value pairs.
63
+ function requestCookieHeader(res) {
64
+ return (res.headers.getSetCookie?.() ?? [])
65
+ .map((cookie) => {
66
+ const [pair = ''] = cookie.split(';');
67
+ return pair.trim();
68
+ })
69
+ .filter((pair) => pair.length > 0)
70
+ .join('; ');
71
+ }
72
+ function hasTrustDeviceCookie(headers) {
73
+ const cookieHeader = headers.get('cookie');
74
+ if (!cookieHeader) {
75
+ return false;
76
+ }
77
+ for (const [name] of parseCookies(cookieHeader)) {
78
+ if (name.endsWith('.trust_device')) {
79
+ return true;
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ // Drops the one pair and leaves every other byte alone: the cookies that stay carry
85
+ // signed, percent-encoded values better-auth re-verifies exactly as the browser sent them.
86
+ function withoutTrustDeviceCookie(headers) {
87
+ const cookieHeader = headers.get('cookie');
88
+ if (!cookieHeader) {
89
+ return headers;
90
+ }
91
+ const kept = cookieHeader
92
+ .split(';')
93
+ .map((pair) => pair.trim())
94
+ .filter((pair) => {
95
+ const [name = ''] = pair.split('=');
96
+ return !name.endsWith('.trust_device');
97
+ });
98
+ const next = new Headers(headers);
99
+ if (kept.length === 0) {
100
+ next.delete('cookie');
101
+ }
102
+ else {
103
+ next.set('cookie', kept.join('; '));
104
+ }
105
+ return next;
106
+ }
65
107
  const SUCCESS = { success: true };
66
108
  export const UserNotFoundError = makeNotFoundError('User');
109
+ export const UsernameConflictError = makeConflictError('Username', 'Username is already in use');
110
+ const BetterAuthErrorBodySchema = z.object({
111
+ message: z.string().optional(),
112
+ code: z.string().optional(),
113
+ });
67
114
  // better-auth calls use `asResponse: true`, which returns an error *Response*
68
115
  // (4xx/5xx) rather than throwing. Surface those as ORPCErrors so oRPC maps them
69
116
  // to the right HTTP status instead of the handler silently returning success.
70
117
  // Only reads the body on failure, so a subsequent res.json() on success is safe.
71
- async function ensureOk(res) {
118
+ // 401 -> UNAUTHORIZED (bad credentials), 403 -> FORBIDDEN (better-auth's
119
+ // TOO_MANY_ATTEMPTS on checkVerificationOTP/resetPasswordEmailOTP), else BAD_REQUEST.
120
+ // `opts.genericMessage` lets a BAD_REQUEST *or* FORBIDDEN caller opt into a fixed
121
+ // message instead of better-auth's raw one - some better-auth 400s (eg
122
+ // checkVerificationOTP's USER_NOT_FOUND-before-INVALID_OTP ordering) leak account
123
+ // existence otherwise. When genericMessage is set, a 403 is masked down to
124
+ // BAD_REQUEST too, so a caller can't tell "too many attempts" apart from "wrong code".
125
+ async function ensureOk(res, opts) {
72
126
  if (res.ok) {
73
127
  return;
74
128
  }
129
+ const code = res.status === 401 ? 'UNAUTHORIZED' : res.status === 403 ? 'FORBIDDEN' : 'BAD_REQUEST';
130
+ if ((code === 'BAD_REQUEST' || code === 'FORBIDDEN') && opts?.genericMessage) {
131
+ throw new ORPCError(code === 'FORBIDDEN' ? 'BAD_REQUEST' : code, {
132
+ message: opts.genericMessage,
133
+ });
134
+ }
75
135
  let message = `Request failed (${res.status})`;
76
- try {
77
- const parsed = JSON.parse(await res.text());
78
- if (parsed.message) {
79
- message = parsed.message;
136
+ let betterAuthCode;
137
+ const body = BetterAuthErrorBodySchema.safeParse(await res.json().catch(() => null));
138
+ if (body.success) {
139
+ if (body.data.message) {
140
+ message = body.data.message;
141
+ }
142
+ if (body.data.code) {
143
+ betterAuthCode = body.data.code;
80
144
  }
81
145
  }
82
- catch {
83
- // non-JSON body - keep the default message
84
- }
85
- throw new ORPCError(res.status === 401 ? 'UNAUTHORIZED' : 'BAD_REQUEST', { message });
146
+ throw new ORPCError(code, {
147
+ message,
148
+ ...(betterAuthCode ? { data: { code: betterAuthCode } } : {}),
149
+ });
86
150
  }
87
- const DEFAULT_MAX_LOGIN_ATTEMPTS = 5;
88
- const DEFAULT_LOCKOUT_DURATION_MS = 15 * 60 * 1000;
89
151
  const MINUTE_MS = 60 * 1000;
152
+ export const SESSION_DURATION_IN_SECONDS = 30 * 24 * 60 * 60; // 30 days
90
153
  // Coarse abuse throttles keyed by the caller identifier the context provides (email/
91
154
  // token/session), NOT IP. The lockout above is a per-account credential-failure
92
155
  // counter; these bound raw request volume on each brute-force surface. An overlay
@@ -96,29 +159,62 @@ const MINUTE_MS = 60 * 1000;
96
159
  // throttles (register/resend/etc.) keep the default fail-open.
97
160
  const LOGIN_RATE_LIMIT = { limit: 10, windowMs: 5 * MINUTE_MS, onUnavailable: 'deny' };
98
161
  const REGISTER_RATE_LIMIT = { limit: 5, windowMs: 15 * MINUTE_MS };
162
+ // Keyed on the caller, not the handle: the abuse shape here is enumerating many
163
+ // usernames from one client, not probing one username repeatedly.
164
+ const USERNAME_AVAILABILITY_RATE_LIMIT = { limit: 30, windowMs: MINUTE_MS };
99
165
  const PASSWORD_RESET_REQUEST_RATE_LIMIT = { limit: 3, windowMs: 15 * MINUTE_MS };
100
166
  const PASSWORD_RESET_RATE_LIMIT = {
101
167
  limit: 5,
102
168
  windowMs: 15 * MINUTE_MS,
103
169
  onUnavailable: 'deny',
104
170
  };
171
+ const PASSWORD_RESET_VERIFY_RATE_LIMIT = {
172
+ limit: 5,
173
+ windowMs: 5 * MINUTE_MS,
174
+ onUnavailable: 'deny',
175
+ };
105
176
  const VERIFY_2FA_RATE_LIMIT = { limit: 5, windowMs: 5 * MINUTE_MS, onUnavailable: 'deny' };
106
- const EMAIL_VERIFICATION_RATE_LIMIT = { limit: 3, windowMs: 15 * MINUTE_MS };
107
- const VERIFY_EMAIL_RATE_LIMIT = { limit: 5, windowMs: 15 * MINUTE_MS };
177
+ // Fails closed with the verify budget below: better-auth issues a fresh code (and a fresh
178
+ // 3-attempt counter) per resend, so an unbounded resend loop is an unbounded guess budget.
179
+ const EMAIL_VERIFICATION_RATE_LIMIT = {
180
+ limit: 3,
181
+ windowMs: 15 * MINUTE_MS,
182
+ onUnavailable: 'deny',
183
+ };
184
+ // Fails closed like the other secret-guessing budgets: the emailed code is six digits,
185
+ // so an unthrottled window is a brute-force window, not a degraded-UX window.
186
+ const VERIFY_EMAIL_RATE_LIMIT = {
187
+ limit: 5,
188
+ windowMs: 15 * MINUTE_MS,
189
+ onUnavailable: 'deny',
190
+ };
108
191
  const CHANGE_PASSWORD_RATE_LIMIT = { limit: 5, windowMs: 15 * MINUTE_MS };
109
192
  const TWO_FACTOR_PASSWORD_RATE_LIMIT = { limit: 5, windowMs: 5 * MINUTE_MS };
110
- // Mirrors better-auth session.expiresIn (server/auth/auth.ts); used only as a fallback
111
- // when the sign-in response omits an explicit session expiry.
112
- const SESSION_TTL_MS = 30 * 24 * 60 * 60 * 1000;
193
+ // Fails closed: every call spends real money on an `sms` enrolment and fills a mailbox
194
+ // on an `email` one, and better-auth issues a fresh code per send, so an unbounded
195
+ // resend loop is both a toll-fraud channel and an unbounded guess budget.
196
+ const SEND_2FA_OTP_RATE_LIMIT = {
197
+ limit: 3,
198
+ windowMs: 5 * MINUTE_MS,
199
+ onUnavailable: 'deny',
200
+ };
201
+ const FAKE_LOGIN_SHADOW_TTL_MS = 7 * 24 * 60 * 60 * 1000;
202
+ function loginShadowKey(email) {
203
+ return `login-shadow:${email}`;
204
+ }
205
+ const loginShadowLogger = createLogger('login-shadow');
206
+ const identityLogger = createLogger('identity');
207
+ function hasErrorCode(error, code) {
208
+ if (typeof error !== 'object' || error === null || !('data' in error)) {
209
+ return false;
210
+ }
211
+ const data = error.data;
212
+ return typeof data === 'object' && data !== null && 'code' in data && data.code === code;
213
+ }
113
214
  function computeLockoutState({ attempts, maxAttempts, durationMs, nowMs, }) {
114
215
  const isLocking = attempts >= maxAttempts;
115
216
  return { isLocking, lockoutUntil: isLocking ? new Date(nowMs + durationMs) : null };
116
217
  }
117
- // A finite rgBlockedUntil in the past = a lapsed cooling-off; a null one = indefinite
118
- // (self-exclusion / permanent). Blocked only while set and not elapsed.
119
- function isRgBlocked(u) {
120
- return u.rgBlocked && (u.rgBlockedUntil === null || u.rgBlockedUntil > new Date());
121
- }
122
218
  /**
123
219
  * Thin wrapper over the shared better-auth instance (register/login/2FA/
124
220
  * password/email flows) that layers on platform-specific policy better-auth
@@ -132,44 +228,293 @@ export class IdentityService {
132
228
  auth;
133
229
  drizzle;
134
230
  events;
135
- email;
231
+ identityReader;
232
+ mailDispatch;
136
233
  options;
137
234
  limiter;
138
235
  platformConfig;
139
- constructor({ drizzle, events, email, options, limiter, platformConfig }) {
236
+ playerProvisioning;
237
+ geoCheck;
238
+ cache;
239
+ // Addresses whose reset code is being sent because a sign-up hit an existing account.
240
+ // Held only for the duration of that send: `requestPasswordResetEmailOTP` drives
241
+ // `sendVerificationOTP` -> `render` inside the same await, so the flag is read before
242
+ // the `finally` clears it. Not cache-backed - it never has to outlive the call or
243
+ // cross a process.
244
+ existingAccountSignUps = new Set();
245
+ trustedDevices;
246
+ twoFactorLockout;
247
+ twoFactorDelivery;
248
+ sessions;
249
+ constructor({ drizzle, events, identityReader, mailDispatch, options, limiter, platformConfig, geoCheck, playerProvisioning, cache, trustedDevices, twoFactorLockout, twoFactorDelivery, sessions, }) {
140
250
  this.drizzle = drizzle;
141
251
  this.events = events;
142
- this.email = email;
252
+ this.identityReader = identityReader;
253
+ this.mailDispatch = mailDispatch;
143
254
  this.options = options;
144
255
  this.limiter = limiter;
145
256
  this.platformConfig = platformConfig;
257
+ this.geoCheck = geoCheck;
258
+ this.playerProvisioning = playerProvisioning;
259
+ this.cache = cache;
260
+ this.trustedDevices = trustedDevices;
261
+ this.twoFactorLockout = twoFactorLockout;
262
+ this.twoFactorDelivery = twoFactorDelivery;
263
+ this.sessions = sessions;
146
264
  this.auth = createAuth({
147
265
  db: drizzle.db,
148
266
  schema: { user, session, account, verification, twoFactor },
149
- ...(email ? { sendEmail: (args) => email.send(args) } : {}),
267
+ ...(mailDispatch
268
+ ? {
269
+ dispatchOtpMail: async ({ to, template }) => {
270
+ const idempotencyKey = `otp:${template.key}:${randomUUID()}`;
271
+ const recipient = await this.findUserByEmail(to);
272
+ if (recipient) {
273
+ await mailDispatch.toUser({ userId: recipient.id, template, idempotencyKey });
274
+ return;
275
+ }
276
+ await mailDispatch.toAddress({ email: to, template, idempotencyKey });
277
+ },
278
+ }
279
+ : {}),
280
+ // Binds the plugin's OTP hook to the transport fan-out. Without it better-auth
281
+ // still mints codes for the `email`/`sms` methods and drops them on the floor.
282
+ twoFactor: { sendOtp: (args) => twoFactorDelivery.deliver(args) },
283
+ requireEmailVerification: this.platformConfig?.registration?.requireEmailVerification ?? false,
284
+ isExistingAccountSignUp: (lookupEmail) => this.existingAccountSignUps.has(lookupEmail.toLowerCase()),
285
+ isAdminPasswordReset: (lookupEmail) => this.isAdminPasswordReset(lookupEmail),
286
+ onExistingUserSignUp: async (existing) => {
287
+ const key = existing.email.toLowerCase();
288
+ this.existingAccountSignUps.add(key);
289
+ try {
290
+ const response = await this.api.requestPasswordResetEmailOTP({
291
+ body: { email: existing.email },
292
+ headers: new Headers(),
293
+ asResponse: true,
294
+ });
295
+ await ensureOk(response);
296
+ }
297
+ finally {
298
+ this.existingAccountSignUps.delete(key);
299
+ }
300
+ },
301
+ onPasswordReset: async (resetUser) => {
302
+ await this.drizzle.db
303
+ .update(user)
304
+ .set({ passwordMeetsPolicy: true })
305
+ .where(eq(user.id, resetUser.id));
306
+ this.events.emit('identity.password.reset', {
307
+ userId: resetUser.id,
308
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(resetUser.id),
309
+ ...getCurrentClientMeta(),
310
+ });
311
+ await this.clearLockout(resetUser.id);
312
+ },
150
313
  });
151
314
  }
315
+ async findUserByEmail(email) {
316
+ const [row] = await this.drizzle.db
317
+ .select({ id: user.id })
318
+ .from(user)
319
+ .where(eq(user.email, email.toLowerCase()))
320
+ .limit(1);
321
+ return row;
322
+ }
152
323
  get api() {
153
324
  // Library boundary: the admin/organization plugin endpoints aren't on better-auth's
154
325
  // base `api` type. Sanctioned cast, see conventions.
155
326
  return this.auth.api;
156
327
  }
328
+ forwardCookies(authResponse, resHeaders) {
329
+ const cookies = authResponse.headers.getSetCookie?.() ?? [];
330
+ for (const cookie of cookies) {
331
+ resHeaders.append('set-cookie', cookie);
332
+ }
333
+ }
157
334
  async currentUserId(headers) {
158
335
  const session = await this.auth.api.getSession({ headers });
159
336
  return session?.user?.id ?? null;
160
337
  }
161
- async register(input, reqHeaders, resHeaders) {
162
- await assertRateLimit(this.limiter, `register:${input.email.toLowerCase()}`, REGISTER_RATE_LIMIT);
338
+ async securityControlsFor(userId) {
339
+ const controls = await getSecurityControls(this.drizzle, userId);
340
+ if (!controls) {
341
+ throw new UserNotFoundError(userId);
342
+ }
343
+ return controls;
344
+ }
345
+ // Same gate as password login and phone login, from the one shared implementation.
346
+ assertAccountNotBlocked(account, meta) {
347
+ return assertAccountNotBlocked({ drizzle: this.drizzle, events: this.events }, account, meta, {
348
+ revokeSessions: true,
349
+ errorData: { rgBlocked: { code: 'RG_BLOCKED' }, suspended: { code: 'ACCOUNT_SUSPENDED' } },
350
+ });
351
+ }
352
+ /**
353
+ * Emitted on every registration attempt that produced no account. The audit trail is
354
+ * the one place that records what actually happened - the HTTP response deliberately
355
+ * does not, because a truthful answer on a known address is an enumeration oracle.
356
+ */
357
+ emitRegistrationFailed(reason, input, { ip, userAgent }) {
358
+ this.events.emit('identity.user.registration.failed', {
359
+ email: input.email,
360
+ username: input.username,
361
+ reason,
362
+ ip,
363
+ userAgent,
364
+ });
365
+ }
366
+ async register(input, reqHeaders) {
367
+ // Read before the config guard: a rejected attempt is audited too, and an audit row
368
+ // with no origin is barely a record.
369
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
370
+ const meta = { ip, userAgent };
371
+ const registration = this.platformConfig?.registration;
372
+ const provisioning = this.playerProvisioning;
373
+ if (!registration || !provisioning) {
374
+ this.emitRegistrationFailed('registration_disabled', input, meta);
375
+ throw new ORPCError('FORBIDDEN', { message: 'Registration is unavailable' });
376
+ }
377
+ // `assertRateLimit` throws and is shared by a dozen call sites, so the emit wraps it
378
+ // here rather than moving into it.
379
+ try {
380
+ await assertRateLimit(this.limiter, `register:${input.email.toLowerCase()}`, REGISTER_RATE_LIMIT);
381
+ await assertRateLimit(this.limiter, `register-ip:${ip ?? 'unknown'}`, REGISTER_RATE_LIMIT);
382
+ }
383
+ catch (err) {
384
+ this.emitRegistrationFailed('rate_limited', input, meta);
385
+ throw err;
386
+ }
387
+ if (this.geoCheck && !(await this.geoCheck.checkRegistration(ip)).allowed) {
388
+ this.emitRegistrationFailed('geo_blocked', input, meta);
389
+ throw new ORPCError('FORBIDDEN', { message: 'Registration is unavailable' });
390
+ }
163
391
  const headers = nodeHeadersToHeaders(reqHeaders);
164
- const authResponse = await this.auth.api.signUpEmail({
165
- body: { email: input.email, password: input.password, name: input.name },
392
+ const authResponse = await this.api.signUpEmail({
393
+ body: {
394
+ email: input.email,
395
+ password: input.password,
396
+ name: input.username,
397
+ username: input.username,
398
+ },
166
399
  headers,
167
400
  asResponse: true,
168
401
  });
169
- forwardCookies(authResponse, resHeaders);
402
+ if (!authResponse.ok) {
403
+ // The `lower(username)` unique index is the only arbiter - a pre-flight check
404
+ // could not close the race anyway, so the taken handle is read off the failure.
405
+ if (await this.findUserIdByUsername(input.username)) {
406
+ this.emitRegistrationFailed('username_taken', input, meta);
407
+ throw new UsernameConflictError();
408
+ }
409
+ // `ensureOk` always throws on a non-ok response, so emitting first needs no catch.
410
+ this.emitRegistrationFailed('error', input, meta);
411
+ await ensureOk(authResponse, { genericMessage: 'Registration is unavailable' });
412
+ }
170
413
  const body = (await authResponse.json());
171
- this.events.emit('identity.user.registered', { userId: body.user.id });
172
- return { user: toUser(body.user) };
414
+ // A known address gets an indistinguishable success response (and a reset mail)
415
+ // rather than a new account, so only a genuinely new user is provisioned.
416
+ if ((await this.findUserIdByEmail(input.email)) !== body.user.id) {
417
+ // The known-address branch: no account was created, so the attempt failed even
418
+ // though the caller is told it succeeded. Only the audit trail says so.
419
+ this.emitRegistrationFailed('email_already_registered', input, meta);
420
+ return { status: 'check-email' };
421
+ }
422
+ await this.drizzle.db
423
+ .update(user)
424
+ .set({ passwordMeetsPolicy: true })
425
+ .where(eq(user.id, body.user.id));
426
+ let consent;
427
+ try {
428
+ consent = await this.recordRegistrationConsent(provisioning, body.user.id, registration.termsVersion, { ip, userAgent });
429
+ }
430
+ catch (err) {
431
+ this.emitRegistrationFailed('error', input, meta);
432
+ throw err;
433
+ }
434
+ const { playerId, consentStored } = consent;
435
+ // After the consent write, which is what materialises the player row the zone lands on.
436
+ // No session yet, but the browser is here now and a first login may be days away.
437
+ await captureTimezone(this.playerProvisioning, body.user.id, input.timezone);
438
+ this.events.emit('identity.user.registered', {
439
+ userId: body.user.id,
440
+ playerId: playerId ?? (await this.identityReader.getPlayerIdByUserIdSafe(body.user.id)),
441
+ // Only claimed when the consent row was actually written - a discarded capture
442
+ // must not leave an audit trail implying evidence that does not exist.
443
+ ...(consentStored
444
+ ? {
445
+ termsVersion: registration.termsVersion,
446
+ acceptedTerms: input.acceptedTerms,
447
+ acceptedAge: input.acceptedAge,
448
+ }
449
+ : {}),
450
+ ip,
451
+ userAgent,
452
+ });
453
+ // Sent here rather than by better-auth's sendOnSignUp hook: that hook also fires on
454
+ // the synthetic duplicate-email response, mailing a live code to an address whose
455
+ // owner never asked for it - and `verifyEmail` signs that code's bearer in.
456
+ // A mail failure is logged, never surfaced: the account exists either way and the
457
+ // player can ask for a new code, so failing the call here would only mislead them.
458
+ const otpResponse = await this.api.sendVerificationOTP({
459
+ body: { email: input.email, type: 'email-verification' },
460
+ headers,
461
+ asResponse: true,
462
+ });
463
+ if (!otpResponse.ok) {
464
+ identityLogger.error({ userId: body.user.id, status: otpResponse.status }, 'verification code could not be sent - player must request a new one');
465
+ }
466
+ return { status: 'check-email' };
467
+ }
468
+ async findUserIdByUsername(username) {
469
+ const [row] = await this.drizzle.db
470
+ .select({ id: user.id })
471
+ .from(user)
472
+ .where(eq(sql `lower(${user.username})`, username.toLowerCase()))
473
+ .limit(1);
474
+ return row?.id ?? null;
475
+ }
476
+ async findUserIdByEmail(email) {
477
+ const [row] = await this.drizzle.db
478
+ .select({ id: user.id })
479
+ .from(user)
480
+ .where(eq(user.email, email.toLowerCase()))
481
+ .limit(1);
482
+ return row?.id ?? null;
483
+ }
484
+ /**
485
+ * Better Auth commits the user inside its own transaction before returning, so a
486
+ * failure here would otherwise leave an account with no consent record. The user is
487
+ * deleted instead (sessions and accounts cascade), making registration all-or-nothing.
488
+ */
489
+ async recordRegistrationConsent(provisioning, userId, termsVersion, { ip, userAgent }) {
490
+ const now = new Date();
491
+ let outcome;
492
+ try {
493
+ outcome = await provisioning.createForRegistration({
494
+ userId,
495
+ termsVersion,
496
+ termsAcceptedAt: now,
497
+ ageAcceptedAt: now,
498
+ registrationIp: ip,
499
+ registrationUserAgent: userAgent,
500
+ });
501
+ }
502
+ catch (err) {
503
+ identityLogger.error({ err, userId }, 'registration consent write failed - rolling back user');
504
+ await this.drizzle.db.delete(user).where(eq(user.id, userId));
505
+ throw new ORPCError('INTERNAL_SERVER_ERROR', { message: 'Registration is unavailable' });
506
+ }
507
+ if (!outcome.created) {
508
+ // A player row already existed, so this consent capture was discarded. Never
509
+ // silent: the acceptance evidence is a compliance record.
510
+ identityLogger.error({ userId, termsVersion }, 'registration consent not stored - player row already existed');
511
+ }
512
+ return { playerId: outcome.playerId ?? null, consentStored: outcome.created };
513
+ }
514
+ async usernameAvailable(username, reqHeaders) {
515
+ const { ip } = extractClientMeta(reqHeaders);
516
+ await assertRateLimit(this.limiter, `check-username:${ip ?? 'unknown'}`, USERNAME_AVAILABILITY_RATE_LIMIT);
517
+ return { available: !(await this.findUserIdByUsername(username)) };
173
518
  }
174
519
  /**
175
520
  * Credentials are verified FIRST; the RG login block is checked only AFTER
@@ -184,12 +529,11 @@ export class IdentityService {
184
529
  * read a stale count and slip past the lockout threshold.
185
530
  */
186
531
  async login(input, reqHeaders, resHeaders) {
532
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
187
533
  const headers = nodeHeadersToHeaders(reqHeaders);
188
- const ip = clientIp(headers);
189
- const userAgent = headers.get('user-agent') || null;
190
534
  // better-auth lowercases emails on write, so the lockout lookup must match on the same form.
191
535
  const email = input.email.toLowerCase();
192
- await assertRateLimit(this.limiter, `login:${email}`, LOGIN_RATE_LIMIT);
536
+ await assertRateLimit(this.limiter, makeLoginRateLimitKey(email), LOGIN_RATE_LIMIT);
193
537
  const configLockoutEnabled = this.options?.lockout?.enabled ?? true;
194
538
  // Read once for the lockout budget, the admin-bypass check, and the RG login gate
195
539
  // (indexed email lookup). Read unconditionally - the RG gate runs even when lockout
@@ -199,6 +543,9 @@ export class IdentityService {
199
543
  id: user.id,
200
544
  failedLoginAttempts: user.failedLoginAttempts,
201
545
  lockoutUntil: user.lockoutUntil,
546
+ lockoutCount: user.lockoutCount,
547
+ lastLockoutAt: user.lastLockoutAt,
548
+ lastFailedLoginAt: user.lastFailedLoginAt,
202
549
  role: user.role,
203
550
  rgBlocked: user.rgBlocked,
204
551
  rgBlockedUntil: user.rgBlockedUntil,
@@ -210,8 +557,9 @@ export class IdentityService {
210
557
  const isAdmin = existingUser?.role === 'admin';
211
558
  const bypassForAdmins = this.options?.lockout?.bypassForAdmins ?? false;
212
559
  const lockoutEnabled = configLockoutEnabled && !(isAdmin && bypassForAdmins);
560
+ const nowMs = Date.now();
213
561
  if (lockoutEnabled && existingUser?.lockoutUntil) {
214
- if (new Date(existingUser.lockoutUntil) > new Date()) {
562
+ if (new Date(existingUser.lockoutUntil) > new Date(nowMs)) {
215
563
  throw createAccountLockedError(new Date(existingUser.lockoutUntil));
216
564
  }
217
565
  // Lock window elapsed: clear it so the next failure starts from a fresh budget
@@ -219,78 +567,188 @@ export class IdentityService {
219
567
  await this.clearLockout(existingUser.id);
220
568
  existingUser = { ...existingUser, failedLoginAttempts: 0, lockoutUntil: null };
221
569
  }
570
+ if (lockoutEnabled &&
571
+ existingUser &&
572
+ hasFailedLoginWindowExpired(existingUser.lastFailedLoginAt, existingUser.lastLockoutAt, nowMs)) {
573
+ await this.resetLockoutTier(existingUser.id);
574
+ existingUser = {
575
+ ...existingUser,
576
+ failedLoginAttempts: 0,
577
+ lockoutUntil: null,
578
+ lockoutCount: 0,
579
+ lastLockoutAt: null,
580
+ lastFailedLoginAt: null,
581
+ };
582
+ }
583
+ let fakeLoginShadow;
584
+ if (lockoutEnabled && !existingUser) {
585
+ fakeLoginShadow = await this.loginShadowGet(loginShadowKey(email));
586
+ if (fakeLoginShadow?.lastFailedLoginAt) {
587
+ const lastFailedLoginAt = new Date(fakeLoginShadow.lastFailedLoginAt);
588
+ if (hasFailedLoginWindowExpired(lastFailedLoginAt, null, nowMs)) {
589
+ fakeLoginShadow = {
590
+ failedAttempts: 0,
591
+ lockoutUntil: null,
592
+ lockoutCount: 0,
593
+ lastLockoutAt: null,
594
+ lastFailedLoginAt: null,
595
+ };
596
+ }
597
+ }
598
+ if (fakeLoginShadow?.lockoutUntil) {
599
+ if (new Date(fakeLoginShadow.lockoutUntil) > new Date()) {
600
+ throw createAccountLockedError(new Date(fakeLoginShadow.lockoutUntil));
601
+ }
602
+ fakeLoginShadow = { ...fakeLoginShadow, failedAttempts: 0, lockoutUntil: null };
603
+ }
604
+ }
605
+ // better-auth honours its trust-device cookie on its own and offers no way to revoke
606
+ // one. The revocable half of a trusted device is the row this module keeps, so a login
607
+ // presenting the cookie without a live row has to fall back to the full challenge.
608
+ let signInHeaders = headers;
609
+ if (existingUser && this.trustedDevices && hasTrustDeviceCookie(headers)) {
610
+ const trusted = await this.trustedDevices.isTrusted(existingUser.id, userAgent);
611
+ if (!trusted) {
612
+ signInHeaders = withoutTrustDeviceCookie(headers);
613
+ }
614
+ }
222
615
  try {
223
616
  const authResponse = await this.auth.api.signInEmail({
224
617
  body: { email, password: input.password, rememberMe: input.rememberMe },
225
- headers,
618
+ headers: signInHeaders,
226
619
  asResponse: true,
227
620
  });
228
621
  await ensureOk(authResponse);
229
- // RG login block, applied only AFTER credentials verify so a pre-auth probe can't
230
- // distinguish a restricted account from a wrong password. Kill the session
231
- // better-auth just issued and never forward its cookie. Cooling-off auto-expires
232
- // here once rgBlockedUntil elapses (no unblock job).
233
- if (existingUser && isRgBlocked(existingUser)) {
234
- await this.drizzle.db
235
- .update(session)
236
- .set({ expiresAt: new Date() })
237
- .where(eq(session.userId, existingUser.id));
238
- this.events.emit('rg.exclusion.login_blocked', { userId: existingUser.id, ip, userAgent });
239
- throw new ORPCError('FORBIDDEN', {
240
- message: 'Account access is currently restricted (responsible gambling).',
241
- });
242
- }
243
- forwardCookies(authResponse, resHeaders);
622
+ // RG and backoffice blocks, applied only AFTER credentials verify so a pre-auth
623
+ // probe can't distinguish a restricted account from a wrong password. Resolves
624
+ // playerId once, so the eventual login success event can carry it too.
625
+ const playerId = existingUser
626
+ ? await this.assertAccountNotBlocked(existingUser, { ip, userAgent })
627
+ : null;
628
+ this.forwardCookies(authResponse, resHeaders);
244
629
  const body = (await authResponse.json());
245
630
  if (body.twoFactorRedirect || !body.user || !body.token) {
246
- return { twoFactorRedirect: true };
631
+ // The challenge screen has to know whether to ask for an authenticator code or
632
+ // to push one, and there is no session yet to read the account's method from.
633
+ // Naming it here reveals nothing the challenge would not show anyway.
634
+ return {
635
+ twoFactorRedirect: true,
636
+ ...(existingUser
637
+ ? { twoFactorMethod: await this.resolveTwoFactorMethod(existingUser.id) }
638
+ : {}),
639
+ };
247
640
  }
248
641
  if (lockoutEnabled && existingUser) {
249
642
  await this.clearLockout(existingUser.id);
250
643
  }
251
- this.events.emit('identity.user.login', { userId: body.user.id, ip, userAgent });
644
+ await this.drizzle.db
645
+ .update(session)
646
+ .set({ ipAddress: ip, userAgent })
647
+ .where(eq(session.token, body.token));
648
+ this.events.emit('identity.user.login', {
649
+ userId: body.user.id,
650
+ playerId,
651
+ ip,
652
+ userAgent,
653
+ });
654
+ this.events.emit('identity.authentication.succeeded', {
655
+ userId: body.user.id,
656
+ playerId,
657
+ method: 'password',
658
+ ip,
659
+ userAgent,
660
+ });
661
+ await captureTimezone(this.playerProvisioning, body.user.id, input.timezone);
662
+ const sessionDurationSeconds = this.auth.options.session?.expiresIn ?? SESSION_DURATION_IN_SECONDS;
252
663
  const expiresAt = body.session?.expiresAt
253
664
  ? toIso(body.session.expiresAt)
254
- : new Date(Date.now() + SESSION_TTL_MS).toISOString();
665
+ : new Date(Date.now() + sessionDurationSeconds * 1000).toISOString();
255
666
  return {
256
667
  user: toUser(body.user),
257
668
  session: { token: body.token, expiresAt },
669
+ security: makeLoginSecurityState({
670
+ failedLoginAttempts: 0,
671
+ maxAttempts: this.options?.lockout?.maxAttempts ?? DEFAULT_MAX_LOGIN_ATTEMPTS,
672
+ lockoutUntil: null,
673
+ }),
258
674
  };
259
675
  }
260
676
  catch (error) {
261
677
  // An RG block is not a credential failure - surface it as-is, without touching the
262
- // lockout budget or emitting login.failed (the RG event was already emitted).
263
- if (error instanceof ORPCError && error.code === 'FORBIDDEN') {
678
+ // lockout budget or emitting login.failed (the RG event was already emitted). Match on
679
+ // the RG_BLOCKED marker, not the bare FORBIDDEN code - ensureOk also maps a banned-user
680
+ // 403 (better-auth's admin plugin) to FORBIDDEN, and that path must still fall through
681
+ // to the generic branch below to emit login.failed.
682
+ if (error instanceof ORPCError &&
683
+ error.code === 'FORBIDDEN' &&
684
+ (hasErrorCode(error, 'RG_BLOCKED') || hasErrorCode(error, 'ACCOUNT_SUSPENDED'))) {
264
685
  throw error;
265
686
  }
266
687
  // Only a genuine credential rejection counts toward lockout - a transient DB/network
267
688
  // error must never lock the account out.
268
- const isCredentialFailure = error instanceof ORPCError && error.code === 'UNAUTHORIZED';
689
+ const isAccountLocked = error instanceof ORPCError &&
690
+ error.code === 'UNAUTHORIZED' &&
691
+ hasErrorCode(error, 'ACCOUNT_LOCKED');
692
+ const isCredentialFailure = error instanceof ORPCError && error.code === 'UNAUTHORIZED' && !isAccountLocked;
693
+ let attemptsRemaining;
269
694
  if (lockoutEnabled && existingUser && isCredentialFailure) {
270
695
  const maxAttempts = this.options?.lockout?.maxAttempts ?? DEFAULT_MAX_LOGIN_ATTEMPTS;
271
- const durationMs = this.options?.lockout?.durationMs ?? DEFAULT_LOCKOUT_DURATION_MS;
696
+ const fallbackDurationMs = this.options?.lockout?.durationMs ?? DEFAULT_LOCKOUT_DURATION_MS;
272
697
  // Atomic increment: concurrent failures can't each read a stale count and slip past
273
698
  // the threshold (the read-modify-write this replaces was bypassable under load).
274
699
  const [row] = await this.drizzle.db
275
700
  .update(user)
276
- .set({ failedLoginAttempts: sql `${user.failedLoginAttempts} + 1` })
701
+ .set({
702
+ failedLoginAttempts: sql `${user.failedLoginAttempts} + 1`,
703
+ lastFailedLoginAt: new Date(),
704
+ })
277
705
  .where(eq(user.id, existingUser.id))
278
706
  .returning({ failedLoginAttempts: user.failedLoginAttempts });
279
707
  const newAttempts = row?.failedLoginAttempts ?? existingUser.failedLoginAttempts + 1;
280
- const { isLocking, lockoutUntil } = computeLockoutState({
708
+ attemptsRemaining = Math.max(maxAttempts - newAttempts, 0);
709
+ const { isLocking } = computeLockoutState({
281
710
  attempts: newAttempts,
282
711
  maxAttempts,
283
- durationMs,
712
+ durationMs: fallbackDurationMs,
284
713
  nowMs: Date.now(),
285
714
  });
286
- if (isLocking && lockoutUntil) {
287
- await this.drizzle.db
715
+ if (isLocking) {
716
+ const nowMs = Date.now();
717
+ // Escalate the lockout duration for repeat offenders inside the 24h window.
718
+ const { tier, durationMs } = computeLockoutTier({
719
+ lockoutCount: existingUser.lockoutCount ?? 0,
720
+ lastFailedLoginAt: existingUser.lastFailedLoginAt ?? null,
721
+ fallbackLastLockoutAt: existingUser.lastLockoutAt ?? null,
722
+ nowMs,
723
+ fallbackDurationMs,
724
+ });
725
+ const lockoutUntil = new Date(nowMs + durationMs);
726
+ const [lockoutRow] = await this.drizzle.db
288
727
  .update(user)
289
- .set({ lockoutUntil })
290
- .where(eq(user.id, existingUser.id));
728
+ .set({ lockoutUntil, lockoutCount: tier, lastLockoutAt: new Date(nowMs) })
729
+ // Only the first request that reaches the threshold creates the lockout.
730
+ // Other concurrent failures must observe and return the winner's lockout
731
+ // instead of overwriting its tier or emitting a duplicate event.
732
+ .where(and(eq(user.id, existingUser.id), isNull(user.lockoutUntil)))
733
+ .returning({ lockoutUntil: user.lockoutUntil });
734
+ if (!lockoutRow) {
735
+ const [current] = await this.drizzle.db
736
+ .select({ lockoutUntil: user.lockoutUntil })
737
+ .from(user)
738
+ .where(eq(user.id, existingUser.id))
739
+ .limit(1);
740
+ if (current?.lockoutUntil) {
741
+ throw createAccountLockedError(current.lockoutUntil);
742
+ }
743
+ throw new ORPCError('INTERNAL_SERVER_ERROR', {
744
+ message: 'Unable to establish account lockout.',
745
+ });
746
+ }
747
+ await this.limiter?.reset(makeLoginRateLimitKey(email));
291
748
  this.events.emit('identity.user.lockout.triggered', {
292
749
  userId: existingUser.id,
293
750
  email,
751
+ tier,
294
752
  lockoutUntil: lockoutUntil.toISOString(),
295
753
  ip,
296
754
  userAgent,
@@ -298,8 +756,69 @@ export class IdentityService {
298
756
  throw createAccountLockedError(lockoutUntil);
299
757
  }
300
758
  }
759
+ else if (lockoutEnabled && !existingUser && isCredentialFailure) {
760
+ const maxAttempts = this.options?.lockout?.maxAttempts ?? DEFAULT_MAX_LOGIN_ATTEMPTS;
761
+ const fallbackDurationMs = this.options?.lockout?.durationMs ?? DEFAULT_LOCKOUT_DURATION_MS;
762
+ const newAttempts = (fakeLoginShadow?.failedAttempts ?? 0) + 1;
763
+ attemptsRemaining = Math.max(maxAttempts - newAttempts, 0);
764
+ const { isLocking } = computeLockoutState({
765
+ attempts: newAttempts,
766
+ maxAttempts,
767
+ durationMs: fallbackDurationMs,
768
+ nowMs: Date.now(),
769
+ });
770
+ if (isLocking) {
771
+ const nowMs = Date.now();
772
+ const { tier, durationMs } = computeLockoutTier({
773
+ lockoutCount: fakeLoginShadow?.lockoutCount ?? 0,
774
+ lastFailedLoginAt: fakeLoginShadow?.lastFailedLoginAt
775
+ ? new Date(fakeLoginShadow.lastFailedLoginAt)
776
+ : null,
777
+ fallbackLastLockoutAt: fakeLoginShadow?.lastLockoutAt
778
+ ? new Date(fakeLoginShadow.lastLockoutAt)
779
+ : null,
780
+ nowMs,
781
+ fallbackDurationMs,
782
+ });
783
+ const lockoutUntil = new Date(nowMs + durationMs);
784
+ await this.loginShadowSet(loginShadowKey(email), {
785
+ failedAttempts: newAttempts,
786
+ lockoutUntil: lockoutUntil.toISOString(),
787
+ lockoutCount: tier,
788
+ lastLockoutAt: new Date(nowMs).toISOString(),
789
+ lastFailedLoginAt: new Date(nowMs).toISOString(),
790
+ });
791
+ await this.limiter?.reset(makeLoginRateLimitKey(email));
792
+ throw createAccountLockedError(lockoutUntil);
793
+ }
794
+ await this.loginShadowSet(loginShadowKey(email), {
795
+ failedAttempts: newAttempts,
796
+ lockoutUntil: null,
797
+ lockoutCount: fakeLoginShadow?.lockoutCount ?? 0,
798
+ lastLockoutAt: fakeLoginShadow?.lastLockoutAt ?? null,
799
+ lastFailedLoginAt: new Date().toISOString(),
800
+ });
801
+ }
301
802
  const reason = isCredentialFailure ? 'invalid_credentials' : 'error';
302
- this.events.emit('identity.user.login.failed', { email, reason, ip, userAgent });
803
+ this.events.emit('identity.user.login.failed', {
804
+ email,
805
+ reason,
806
+ ip,
807
+ userAgent,
808
+ ...(attemptsRemaining !== undefined ? { attemptsRemaining } : {}),
809
+ });
810
+ if (isCredentialFailure && error instanceof ORPCError && attemptsRemaining !== undefined) {
811
+ const maxAttempts = this.options?.lockout?.maxAttempts ?? DEFAULT_MAX_LOGIN_ATTEMPTS;
812
+ const security = makeLoginSecurityState({
813
+ failedLoginAttempts: attemptsRemaining === undefined ? 0 : maxAttempts - attemptsRemaining,
814
+ maxAttempts,
815
+ lockoutUntil: null,
816
+ });
817
+ throw new ORPCError('UNAUTHORIZED', {
818
+ message: error.message,
819
+ data: { ...error.data, ...security },
820
+ });
821
+ }
303
822
  throw error;
304
823
  }
305
824
  }
@@ -309,7 +828,95 @@ export class IdentityService {
309
828
  .set({ failedLoginAttempts: 0, lockoutUntil: null })
310
829
  .where(eq(user.id, userId));
311
830
  }
312
- async unlockUser(userId, actorId) {
831
+ resetLockoutTier(userId) {
832
+ return this.drizzle.db
833
+ .update(user)
834
+ .set({
835
+ failedLoginAttempts: 0,
836
+ lockoutUntil: null,
837
+ lockoutCount: 0,
838
+ lastLockoutAt: null,
839
+ lastFailedLoginAt: null,
840
+ })
841
+ .where(eq(user.id, userId));
842
+ }
843
+ async loginShadowGet(key) {
844
+ if (!this.cache) {
845
+ return undefined;
846
+ }
847
+ try {
848
+ return await this.cache.get(key);
849
+ }
850
+ catch (err) {
851
+ loginShadowLogger.warn({ key, err }, 'login shadow cache read failed');
852
+ return undefined;
853
+ }
854
+ }
855
+ async loginShadowSet(key, value) {
856
+ if (!this.cache) {
857
+ return;
858
+ }
859
+ try {
860
+ await this.cache.set(key, value, { ttlMs: FAKE_LOGIN_SHADOW_TTL_MS });
861
+ }
862
+ catch (err) {
863
+ loginShadowLogger.warn({ key, err }, 'login shadow cache write failed');
864
+ }
865
+ }
866
+ adminPasswordResetMarkerKey(email) {
867
+ return `admin-password-reset:${email.toLowerCase()}`;
868
+ }
869
+ async isAdminPasswordReset(email) {
870
+ if (!this.cache) {
871
+ return false;
872
+ }
873
+ const key = this.adminPasswordResetMarkerKey(email);
874
+ try {
875
+ const isAdmin = (await this.cache.get(key)) === true;
876
+ if (isAdmin) {
877
+ await this.cache.delete(key);
878
+ }
879
+ return isAdmin;
880
+ }
881
+ catch (err) {
882
+ identityLogger.warn({ err }, 'admin password reset marker cache read failed');
883
+ return false;
884
+ }
885
+ }
886
+ async adminRequestPasswordReset(userId, actorId, meta) {
887
+ const existingUser = findOneOrThrow(await this.drizzle.db
888
+ .select({ id: user.id, email: user.email })
889
+ .from(user)
890
+ .where(eq(user.id, userId))
891
+ .limit(1), new UserNotFoundError(userId));
892
+ const email = existingUser.email.toLowerCase();
893
+ try {
894
+ await this.cache?.set(this.adminPasswordResetMarkerKey(email), true, { ttlMs: 120_000 });
895
+ }
896
+ catch (err) {
897
+ identityLogger.warn({ email, err }, 'admin password reset marker cache write failed');
898
+ }
899
+ // Mirrors requestPasswordReset - the send failure is swallowed the same way.
900
+ try {
901
+ await this.api.requestPasswordResetEmailOTP({
902
+ body: { email },
903
+ headers: new Headers(),
904
+ asResponse: true,
905
+ });
906
+ }
907
+ catch {
908
+ // intentionally ignored
909
+ }
910
+ this.events.emit('identity.password.admin_reset_requested', {
911
+ userId,
912
+ email,
913
+ actorId,
914
+ ip: meta?.ip ?? null,
915
+ userAgent: meta?.userAgent ?? null,
916
+ });
917
+ return SUCCESS;
918
+ }
919
+ async unlockUser(userId, actorId, meta) {
313
920
  const existingUser = findOneOrThrow(await this.drizzle.db
314
921
  .select({
315
922
  id: user.id,
@@ -321,6 +928,7 @@ export class IdentityService {
321
928
  .where(eq(user.id, userId))
322
929
  .limit(1), new UserNotFoundError(userId));
323
930
  await this.clearLockout(userId);
931
+ await this.limiter?.reset(makeLoginRateLimitKey(existingUser.email));
324
932
  this.events.emit('identity.user.unlocked', {
325
933
  userId,
326
934
  email: existingUser.email,
@@ -329,18 +937,26 @@ export class IdentityService {
329
937
  previousLockoutUntil: existingUser.lockoutUntil
330
938
  ? existingUser.lockoutUntil.toISOString()
331
939
  : null,
940
+ ip: meta?.ip ?? null,
941
+ userAgent: meta?.userAgent ?? null,
332
942
  });
333
943
  return SUCCESS;
334
944
  }
335
945
  async logout(reqHeaders, resHeaders) {
946
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
336
947
  const headers = nodeHeadersToHeaders(reqHeaders);
337
948
  // Resolve the user BEFORE signOut so the audit log can attribute the logout.
338
949
  const session = await this.auth.api.getSession({ headers });
339
950
  const userId = session?.user?.id;
340
951
  const authResponse = await this.auth.api.signOut({ headers, asResponse: true });
341
- forwardCookies(authResponse, resHeaders);
952
+ this.forwardCookies(authResponse, resHeaders);
342
953
  if (userId) {
343
- this.events.emit('identity.user.logout', { userId });
954
+ this.events.emit('identity.user.logout', {
955
+ userId,
956
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
957
+ ip,
958
+ userAgent,
959
+ });
344
960
  }
345
961
  return SUCCESS;
346
962
  }
@@ -352,61 +968,420 @@ export class IdentityService {
352
968
  }
353
969
  return toUser(session.user);
354
970
  }
971
+ /**
972
+ * Starts enrolment. All three methods share the one secret better-auth mints here;
973
+ * `method` only decides how the code that activates it arrives, and is written
974
+ * before the send so the delivery hook knows where to route. better-auth flips
975
+ * `twoFactorEnabled` only once the first code clears, so abandoning a first
976
+ * enrolment leaves the account unprotected exactly as it was.
977
+ *
978
+ * A transport failure on the first send throws (see `sendOtpForCurrentMethod`)
979
+ * after `two_factor_method` is already written, but that write is inert on its
980
+ * own: `twoFactorStatus` reports it only once `enabled` is true, and the CONFLICT
981
+ * guard below only fires once it is. The caller recovers by retrying either
982
+ * `sendTwoFactorOtp` (resend) or this route again - both read the method that was
983
+ * already persisted, so neither loses the player's choice.
984
+ */
355
985
  async enableTwoFactor(input, reqHeaders, resHeaders) {
356
986
  const headers = nodeHeadersToHeaders(reqHeaders);
357
987
  const userId = await this.currentUserId(headers);
358
988
  await assertRateLimit(this.limiter, `enable2fa:${userId ?? 'anonymous'}`, TWO_FACTOR_PASSWORD_RATE_LIMIT);
989
+ if (!userId) {
990
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
991
+ }
992
+ await this.assertMethodAvailable(userId, input.method);
993
+ // There is no switch-in-place: a player changes method by disabling and enrolling
994
+ // again. better-auth's enable leg deletes and recreates the `twoFactor` row with a
995
+ // fresh secret and fresh backup codes, and marks it verified straight away when one
996
+ // was already verified - so re-running it on a live account destroys the working
997
+ // authenticator the moment the call lands, and abandoning the step strands the
998
+ // player on a secret they never scanned with `two_factor_enabled` still true.
999
+ if (await this.isTwoFactorEnabled(userId)) {
1000
+ throw new ORPCError('CONFLICT', {
1001
+ message: 'Two-factor authentication is already enabled. Disable it first to change method.',
1002
+ });
1003
+ }
359
1004
  const res = await this.api.enableTwoFactor({
360
1005
  body: { password: input.password },
361
1006
  headers,
362
1007
  asResponse: true,
363
1008
  });
364
1009
  await ensureOk(res);
365
- forwardCookies(res, resHeaders);
1010
+ this.forwardCookies(res, resHeaders);
366
1011
  const body = (await res.json());
367
- return { totpUri: body.totpURI, backupCodes: body.backupCodes };
1012
+ await this.setTwoFactorMethod(userId, input.method);
1013
+ if (input.method === 'app') {
1014
+ return { totpUri: body.totpURI, backupCodes: body.backupCodes };
1015
+ }
1016
+ // The first code has to reach the player before they can activate the method, so
1017
+ // the send belongs to enrolment rather than a separate call the client must know
1018
+ // to make. "Resend code" then replays it through sendTwoFactorOtp.
1019
+ const masked = await this.sendOtpForCurrentMethod(userId, headers, resHeaders);
1020
+ return { backupCodes: body.backupCodes, maskedDestination: masked };
1021
+ }
1022
+ /**
1023
+ * Re-sends the one-time code for an account on the `email` or `sms` method - the
1024
+ * "Resend code" action during enrolment, and the send leg of a login challenge.
1025
+ * Resolves its subject from a live session first and the pending-challenge cookie
1026
+ * second, because at login there is no session yet.
1027
+ */
1028
+ async sendTwoFactorOtp(reqHeaders, resHeaders) {
1029
+ const headers = nodeHeadersToHeaders(reqHeaders);
1030
+ const pendingCookie = twoFactorPendingCookieValue(headers);
1031
+ const userId = (await this.currentUserId(headers)) ??
1032
+ (await this.twoFactorLockout?.resolvePendingUserId(pendingCookie));
1033
+ if (!userId) {
1034
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
1035
+ }
1036
+ await assertRateLimit(this.limiter, `send2faOtp:${userId}`, SEND_2FA_OTP_RATE_LIMIT);
1037
+ // An account inside a lockout window cannot spend a code, so minting one only
1038
+ // hands out fresh guesses - and, on `sms`, bills the operator for them.
1039
+ await this.twoFactorLockout?.assertNotLocked(userId);
1040
+ return { maskedDestination: await this.sendOtpForCurrentMethod(userId, headers, resHeaders) };
1041
+ }
1042
+ /** Whether a second factor is active, which method it uses, and where a code can go. */
1043
+ async twoFactorStatus(reqHeaders) {
1044
+ const headers = nodeHeadersToHeaders(reqHeaders);
1045
+ const userId = await this.currentUserId(headers);
1046
+ if (!userId) {
1047
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
1048
+ }
1049
+ const [row] = await this.drizzle.db
1050
+ .select({
1051
+ email: user.email,
1052
+ phoneNumber: user.phoneNumber,
1053
+ phoneVerified: user.phoneVerified,
1054
+ twoFactorEnabled: user.twoFactorEnabled,
1055
+ twoFactorMethod: user.twoFactorMethod,
1056
+ })
1057
+ .from(user)
1058
+ .where(eq(user.id, userId))
1059
+ .limit(1);
1060
+ if (!row) {
1061
+ throw new UserNotFoundError(userId);
1062
+ }
1063
+ const enabled = row.twoFactorEnabled ?? false;
1064
+ return {
1065
+ enabled,
1066
+ // The column outlives an abandoned enrolment, so an account that never cleared
1067
+ // its first code must still read as having no active method.
1068
+ method: enabled ? (row.twoFactorMethod ?? null) : null,
1069
+ maskedEmail: maskEmail(row.email),
1070
+ maskedPhone: row.phoneVerified && row.phoneNumber ? maskPhone(row.phoneNumber) : null,
1071
+ };
1072
+ }
1073
+ /**
1074
+ * Rejects a method the account cannot actually receive a code on. Enrolling into
1075
+ * `sms` without a verified phone would mint a secret the player can never clear,
1076
+ * locking them out of their own account at the next login.
1077
+ */
1078
+ async assertMethodAvailable(userId, method) {
1079
+ if (method === 'app') {
1080
+ return;
1081
+ }
1082
+ const [row] = await this.drizzle.db
1083
+ .select({
1084
+ emailVerified: user.emailVerified,
1085
+ phoneNumber: user.phoneNumber,
1086
+ phoneVerified: user.phoneVerified,
1087
+ })
1088
+ .from(user)
1089
+ .where(eq(user.id, userId))
1090
+ .limit(1);
1091
+ // A code can only guard the account if the address it goes to is one the account
1092
+ // has proven it holds. `registration.requireEmailVerification` is off by default,
1093
+ // so an unverified or mistyped address would otherwise enrol and lock the player
1094
+ // out at the next login - the same failure the phone check already prevents.
1095
+ if (method === 'email' && !row?.emailVerified) {
1096
+ throw new ORPCError('BAD_REQUEST', {
1097
+ message: 'Verify your email address before using email for two-factor authentication',
1098
+ });
1099
+ }
1100
+ if (method === 'sms' && (!row?.phoneNumber || !row.phoneVerified)) {
1101
+ throw new ORPCError('BAD_REQUEST', {
1102
+ message: 'Add and verify a phone number before using SMS for two-factor authentication',
1103
+ });
1104
+ }
1105
+ }
1106
+ /**
1107
+ * The account's delivery method, defaulting to `app`: an enrolment that predates the
1108
+ * column reads as null, and every one of those was an authenticator.
1109
+ */
1110
+ async resolveTwoFactorMethod(userId) {
1111
+ const [row] = await this.drizzle.db
1112
+ .select({ twoFactorMethod: user.twoFactorMethod })
1113
+ .from(user)
1114
+ .where(eq(user.id, userId))
1115
+ .limit(1);
1116
+ return row?.twoFactorMethod ?? 'app';
1117
+ }
1118
+ async isTwoFactorEnabled(userId) {
1119
+ const [row] = await this.drizzle.db
1120
+ .select({ twoFactorEnabled: user.twoFactorEnabled })
1121
+ .from(user)
1122
+ .where(eq(user.id, userId))
1123
+ .limit(1);
1124
+ return row?.twoFactorEnabled ?? false;
1125
+ }
1126
+ async setTwoFactorMethod(userId, method) {
1127
+ await this.drizzle.db.update(user).set({ twoFactorMethod: method }).where(eq(user.id, userId));
1128
+ }
1129
+ verifyChallengeCode(method, body, headers) {
1130
+ return verifyChallengeCode(this.api, method, body, headers);
1131
+ }
1132
+ async sendOtpForCurrentMethod(userId, headers, resHeaders) {
1133
+ const destination = await this.twoFactorDelivery.describeDestination(userId);
1134
+ if (!destination) {
1135
+ throw new ORPCError('BAD_REQUEST', {
1136
+ message: 'This account does not receive two-factor codes by email or SMS',
1137
+ });
1138
+ }
1139
+ const res = await this.api.sendTwoFactorOTP({ body: {}, headers, asResponse: true });
1140
+ await ensureOk(res);
1141
+ // A 200 here means the code was minted, not that it left the building: the send
1142
+ // hook is wrapped in `.catch(logger.error)` upstream. Telling the player a code is
1143
+ // on its way when the transport just failed strands them on a screen waiting for
1144
+ // something that is never coming.
1145
+ const failure = this.twoFactorDelivery.takeFailure(userId);
1146
+ if (failure) {
1147
+ throw new ORPCError('SERVICE_UNAVAILABLE', {
1148
+ message: 'Could not send your verification code. Please try again.',
1149
+ cause: failure,
1150
+ });
1151
+ }
1152
+ this.forwardCookies(res, resHeaders);
1153
+ return destination.masked;
368
1154
  }
369
1155
  async verifyTwoFactor(input, reqHeaders, resHeaders) {
1156
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
370
1157
  const headers = nodeHeadersToHeaders(reqHeaders);
371
- const twoFactorKey = (await this.currentUserId(headers)) ?? twoFactorPendingCookieValue(headers) ?? 'anonymous';
1158
+ const pendingCookie = twoFactorPendingCookieValue(headers);
1159
+ const sessionUserId = await this.currentUserId(headers);
1160
+ const twoFactorKey = sessionUserId ?? pendingCookie ?? 'anonymous';
372
1161
  await assertRateLimit(this.limiter, `verify2fa:${twoFactorKey}`, VERIFY_2FA_RATE_LIMIT);
373
- const res = await this.api.verifyTOTP({
374
- body: { code: input.code },
375
- headers,
376
- asResponse: true,
377
- });
1162
+ const challengedUserId = sessionUserId ?? (await this.twoFactorLockout?.resolvePendingUserId(pendingCookie));
1163
+ if (challengedUserId) {
1164
+ await this.twoFactorLockout?.assertNotLocked(challengedUserId);
1165
+ }
1166
+ // A backup code is a single-use recovery credential, not a second factor to bind a
1167
+ // browser to: it clears the challenge but never buys the trust window. A pushed
1168
+ // `otp` is a real factor and does, the same as a live authenticator code.
1169
+ const trustDevice = input.trustDevice && input.method !== 'backup_code' && this.trustedDevices !== undefined;
1170
+ const body = { code: input.code, trustDevice };
1171
+ const res = await this.verifyChallengeCode(input.method, body, headers);
1172
+ if (!res.ok && challengedUserId) {
1173
+ await this.twoFactorLockout?.recordFailure(challengedUserId, { ip, userAgent });
1174
+ }
378
1175
  await ensureOk(res);
379
- forwardCookies(res, resHeaders);
380
- const userId = await this.currentUserId(headers);
1176
+ if (challengedUserId) {
1177
+ await this.twoFactorLockout?.reset(challengedUserId);
1178
+ }
1179
+ this.forwardCookies(res, resHeaders);
1180
+ // better-auth rotates the session on a successful challenge, so the request cookie is
1181
+ // already dead here - the actor is the identity resolved before the call.
1182
+ const userId = challengedUserId ?? (await this.currentUserId(headers));
381
1183
  if (userId) {
382
- this.events.emit('identity.2fa.enabled', { userId });
1184
+ const playerId = await this.identityReader.getPlayerIdByUserIdSafe(userId);
1185
+ // A challenge answered from a live session is the enrolment step: better-auth only
1186
+ // flips twoFactorEnabled once the first code clears. Every later verification is a
1187
+ // sign-in, which carries the pending cookie instead and must not re-announce setup.
1188
+ if (sessionUserId) {
1189
+ this.events.emit('identity.2fa.enabled', {
1190
+ userId,
1191
+ playerId,
1192
+ method: input.method,
1193
+ ip,
1194
+ userAgent,
1195
+ });
1196
+ }
1197
+ this.events.emit('identity.2fa.verified', {
1198
+ userId,
1199
+ playerId,
1200
+ method: input.method,
1201
+ trustedDevice: trustDevice,
1202
+ ip,
1203
+ userAgent,
1204
+ });
1205
+ if (!sessionUserId) {
1206
+ this.events.emit('identity.authentication.succeeded', {
1207
+ userId,
1208
+ playerId,
1209
+ method: input.method,
1210
+ ip,
1211
+ userAgent,
1212
+ });
1213
+ }
1214
+ if (trustDevice) {
1215
+ await this.trustedDevices?.trust(userId, { ip, userAgent });
1216
+ }
1217
+ await captureTimezone(this.playerProvisioning, userId, input.timezone);
383
1218
  }
384
1219
  return SUCCESS;
385
1220
  }
1221
+ /**
1222
+ * Grants this browser its trust window without a sign-out. better-auth issues the
1223
+ * trust cookie only on the sign-in leg of a challenge, so the grant has to replay
1224
+ * that leg: the account proves its password and a fresh second factor, and the
1225
+ * cookies better-auth returns are the ones the browser keeps.
1226
+ */
1227
+ async trustCurrentDevice(input, reqHeaders, resHeaders) {
1228
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
1229
+ const headers = nodeHeadersToHeaders(reqHeaders);
1230
+ const userId = await this.currentUserId(headers);
1231
+ if (!userId) {
1232
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
1233
+ }
1234
+ await assertRateLimit(this.limiter, `trustDevice:${userId}`, TWO_FACTOR_PASSWORD_RATE_LIMIT);
1235
+ const [account] = await this.drizzle.db
1236
+ .select({ email: user.email })
1237
+ .from(user)
1238
+ .where(eq(user.id, userId))
1239
+ .limit(1);
1240
+ if (!account) {
1241
+ throw new UserNotFoundError(userId);
1242
+ }
1243
+ const signIn = await this.auth.api.signInEmail({
1244
+ body: { email: account.email, password: input.password },
1245
+ headers: withoutTrustDeviceCookie(headers),
1246
+ asResponse: true,
1247
+ });
1248
+ await ensureOk(signIn);
1249
+ const signInBody = (await signIn.json());
1250
+ if (signInBody.twoFactorRedirect !== true) {
1251
+ throw new ORPCError('BAD_REQUEST', {
1252
+ message: 'Two-factor authentication is not enabled for this account',
1253
+ });
1254
+ }
1255
+ // Only the cookies the challenge just issued: leaving the live session cookie in
1256
+ // place makes better-auth treat the call as a settings change and skip the trust.
1257
+ const challengeHeaders = new Headers(headers);
1258
+ challengeHeaders.set('cookie', requestCookieHeader(signIn));
1259
+ await this.twoFactorLockout?.assertNotLocked(userId);
1260
+ // Authenticator accounts only. This route replays a fresh sign-in leg, and
1261
+ // better-auth keys a pushed code by the pending-challenge cookie that leg mints -
1262
+ // so an `email`/`sms` account has no code that can answer this challenge, and
1263
+ // letting the call through would only spend its lockout budget on a credential it
1264
+ // is impossible to present. Refusing says so instead of failing as a wrong code.
1265
+ const challengeMethod = await resolveChallengeMethod(this.drizzle, userId);
1266
+ if (challengeMethod !== 'totp') {
1267
+ throw new ORPCError('CONFLICT', {
1268
+ message: 'Trusting this device requires an authenticator app.',
1269
+ });
1270
+ }
1271
+ const verified = await this.verifyChallengeCode(challengeMethod, { code: input.code, trustDevice: true }, challengeHeaders);
1272
+ if (!verified.ok) {
1273
+ await this.twoFactorLockout?.recordFailure(userId, { ip, userAgent });
1274
+ }
1275
+ await ensureOk(verified);
1276
+ await this.twoFactorLockout?.reset(userId);
1277
+ this.forwardCookies(verified, resHeaders);
1278
+ await this.trustedDevices?.trust(userId, { ip, userAgent });
1279
+ const playerId = await this.identityReader.getPlayerIdByUserIdSafe(userId);
1280
+ this.events.emit('identity.2fa.verified', {
1281
+ userId,
1282
+ playerId,
1283
+ method: challengeMethod,
1284
+ trustedDevice: true,
1285
+ ip,
1286
+ userAgent,
1287
+ });
1288
+ // The challenge leg above ran without a session cookie, so better-auth minted a new
1289
+ // session and this response carries it. That is a new authenticated session like any
1290
+ // other, and the security alert has to see it.
1291
+ this.events.emit('identity.authentication.succeeded', {
1292
+ userId,
1293
+ playerId,
1294
+ method: 'totp',
1295
+ ip,
1296
+ userAgent,
1297
+ });
1298
+ return SUCCESS;
1299
+ }
1300
+ /**
1301
+ * A step-up gate for the self-service routes that change standing 2FA state: the
1302
+ * caller has to clear a live authenticator code, not just the account password.
1303
+ * Routed through TwoFactorLockoutService so a hijacked session plus a reused
1304
+ * password cannot grind the second factor here the way the password-only paths let it.
1305
+ */
1306
+ async assertFreshSecondFactor(userId, headers, meta, code) {
1307
+ await this.twoFactorLockout?.assertNotLocked(userId);
1308
+ const res = await this.verifyChallengeCode(await resolveChallengeMethod(this.drizzle, userId), { code, trustDevice: false }, headers);
1309
+ if (!res.ok) {
1310
+ await this.twoFactorLockout?.recordFailure(userId, meta);
1311
+ }
1312
+ await ensureOk(res, { genericMessage: 'Invalid authenticator code' });
1313
+ await this.twoFactorLockout?.reset(userId);
1314
+ }
1315
+ async regenerateBackupCodes(input, reqHeaders, resHeaders) {
1316
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
1317
+ const headers = nodeHeadersToHeaders(reqHeaders);
1318
+ const userId = await this.currentUserId(headers);
1319
+ await assertRateLimit(this.limiter, `backupCodes:${userId ?? 'anonymous'}`, TWO_FACTOR_PASSWORD_RATE_LIMIT);
1320
+ if (!userId) {
1321
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
1322
+ }
1323
+ await this.assertFreshSecondFactor(userId, headers, { ip, userAgent }, input.code);
1324
+ const res = await this.api.generateBackupCodes({
1325
+ body: { password: input.password },
1326
+ headers,
1327
+ asResponse: true,
1328
+ });
1329
+ await ensureOk(res);
1330
+ this.forwardCookies(res, resHeaders);
1331
+ const body = (await res.json());
1332
+ // The old set is void the moment a new one is minted, so any device still trusted
1333
+ // off the old recovery flow re-verifies on its next login.
1334
+ await this.trustedDevices?.revokeAllForUser(userId, userId);
1335
+ this.events.emit('identity.2fa.backup_codes_regenerated', {
1336
+ userId,
1337
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
1338
+ ip,
1339
+ userAgent,
1340
+ });
1341
+ return { backupCodes: body.backupCodes };
1342
+ }
386
1343
  async disableTwoFactor(input, reqHeaders, resHeaders) {
1344
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
387
1345
  const headers = nodeHeadersToHeaders(reqHeaders);
388
1346
  const userId = await this.currentUserId(headers);
389
1347
  await assertRateLimit(this.limiter, `disable2fa:${userId ?? 'anonymous'}`, TWO_FACTOR_PASSWORD_RATE_LIMIT);
1348
+ if (!userId) {
1349
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in' });
1350
+ }
1351
+ await this.assertFreshSecondFactor(userId, headers, { ip, userAgent }, input.code);
1352
+ // Read before the teardown clears it, so the audit trail records which method the
1353
+ // account was actually protected by rather than a blank.
1354
+ const disabledMethod = await resolveChallengeMethod(this.drizzle, userId);
390
1355
  const res = await this.api.disableTwoFactor({
391
1356
  body: { password: input.password },
392
1357
  headers,
393
1358
  asResponse: true,
394
1359
  });
395
1360
  await ensureOk(res);
396
- forwardCookies(res, resHeaders);
397
- if (userId) {
398
- this.events.emit('identity.2fa.disabled', { userId });
399
- }
1361
+ this.forwardCookies(res, resHeaders);
1362
+ await this.setTwoFactorMethod(userId, null);
1363
+ // Dropping the second factor takes every standing bypass with it, the same teardown
1364
+ // a Super Admin reset performs - a browser must not keep the access 2FA was guarding.
1365
+ await this.trustedDevices?.revokeAllForUser(userId, userId);
1366
+ await this.sessions?.revokeAllSessions(userId, userId, { ip, userAgent });
1367
+ this.events.emit('identity.2fa.disabled', {
1368
+ userId,
1369
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
1370
+ method: disabledMethod,
1371
+ ip,
1372
+ userAgent,
1373
+ });
400
1374
  return SUCCESS;
401
1375
  }
402
1376
  async requestPasswordReset(input) {
403
- await assertRateLimit(this.limiter, `pwreset-req:${input.email.toLowerCase()}`, PASSWORD_RESET_REQUEST_RATE_LIMIT);
404
- // Always returns success - never reveal whether the email exists. The reset
405
- // email (if any) is delivered through the sendEmail hook -> notifications.
406
- // Any underlying error is swallowed for the same anti-enumeration reason.
1377
+ const email = input.email.toLowerCase();
1378
+ await assertRateLimit(this.limiter, makeRateLimitKey(RATE_LIMIT_KEYS.PASSWORD_RESET_REQUEST, email), PASSWORD_RESET_REQUEST_RATE_LIMIT);
1379
+ // Always returns success - never reveal whether the email exists. The reset OTP
1380
+ // (if any) is enqueued through better-auth's emailOTP hook -> MAIL_DISPATCH. Any
1381
+ // underlying error is swallowed for the same anti-enumeration reason.
407
1382
  try {
408
- await this.api.requestPasswordReset({
409
- body: { email: input.email, redirectTo: '/reset-password' },
1383
+ await this.api.requestPasswordResetEmailOTP({
1384
+ body: { email },
410
1385
  headers: new Headers(),
411
1386
  asResponse: true,
412
1387
  });
@@ -416,22 +1391,30 @@ export class IdentityService {
416
1391
  }
417
1392
  return SUCCESS;
418
1393
  }
1394
+ async verifyPasswordResetOtp(input) {
1395
+ const email = input.email.toLowerCase();
1396
+ await assertRateLimit(this.limiter, makeRateLimitKey(RATE_LIMIT_KEYS.PASSWORD_RESET_VERIFY, email), PASSWORD_RESET_VERIFY_RATE_LIMIT);
1397
+ const res = await this.api.checkVerificationOTP({
1398
+ body: { email, type: 'forget-password', otp: input.otp },
1399
+ headers: new Headers(),
1400
+ asResponse: true,
1401
+ });
1402
+ await ensureOk(res, { genericMessage: 'Invalid or expired verification code' });
1403
+ return SUCCESS;
1404
+ }
419
1405
  async resetPassword(input) {
420
- // Key on the token - the only identifier the input carries - to bound retries
421
- // against a single reset token.
422
- await assertRateLimit(this.limiter, `pwreset:${input.token}`, PASSWORD_RESET_RATE_LIMIT);
423
- const res = await this.api.resetPassword({
424
- body: { newPassword: input.newPassword, token: input.token },
1406
+ const email = input.email.toLowerCase();
1407
+ await assertRateLimit(this.limiter, makeRateLimitKey(RATE_LIMIT_KEYS.PASSWORD_RESET, email), PASSWORD_RESET_RATE_LIMIT);
1408
+ const res = await this.api.resetPasswordEmailOTP({
1409
+ body: { email, otp: input.otp, password: input.newPassword },
425
1410
  headers: new Headers(),
426
1411
  asResponse: true,
427
1412
  });
428
- await ensureOk(res);
429
- const body = (await res.json().catch(() => ({})));
430
- if (body.user?.id) {
431
- this.events.emit('identity.password.reset', { userId: body.user.id });
432
- // Password reset clears any lockout - the user has proven identity via email/phone.
433
- await this.clearLockout(body.user.id);
434
- }
1413
+ await ensureOk(res, { genericMessage: 'Invalid or expired verification code' });
1414
+ // better-auth's resetPasswordEmailOTP internally invokes the onPasswordReset hook
1415
+ // (wired in the constructor above), which emits `identity.password.reset` and
1416
+ // clears the lockout - do not duplicate that here (was double-emitting/double-
1417
+ // clearing on every real reset).
435
1418
  return SUCCESS;
436
1419
  }
437
1420
  async changePassword(input, reqHeaders, resHeaders) {
@@ -444,49 +1427,230 @@ export class IdentityService {
444
1427
  asResponse: true,
445
1428
  });
446
1429
  await ensureOk(res);
447
- forwardCookies(res, resHeaders);
1430
+ this.forwardCookies(res, resHeaders);
1431
+ if (userId) {
1432
+ await this.drizzle.db
1433
+ .update(user)
1434
+ .set({ passwordMeetsPolicy: true })
1435
+ .where(eq(user.id, userId));
1436
+ }
448
1437
  return SUCCESS;
449
1438
  }
450
- async sendEmailVerification(reqHeaders) {
451
- const headers = nodeHeadersToHeaders(reqHeaders);
452
- const session = await this.auth.api.getSession({ headers });
453
- const email = session?.user?.email;
454
- if (email) {
455
- await assertRateLimit(this.limiter, `email-verify:${email.toLowerCase()}`, EMAIL_VERIFICATION_RATE_LIMIT);
456
- await this.api.sendVerificationEmail({ body: { email }, headers, asResponse: true });
1439
+ async getSecurityControls(reqHeaders) {
1440
+ const userId = await this.currentUserId(nodeHeadersToHeaders(reqHeaders));
1441
+ if (!userId) {
1442
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in.' });
1443
+ }
1444
+ return this.securityControlsFor(userId);
1445
+ }
1446
+ async setLoginWithdrawalAlerts(input, reqHeaders) {
1447
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
1448
+ const userId = await this.currentUserId(nodeHeadersToHeaders(reqHeaders));
1449
+ if (!userId) {
1450
+ throw new ORPCError('UNAUTHORIZED', { message: 'Not signed in.' });
1451
+ }
1452
+ const [caller] = await this.drizzle.db
1453
+ .select({ role: user.role })
1454
+ .from(user)
1455
+ .where(eq(user.id, userId))
1456
+ .limit(1);
1457
+ if (caller?.role !== 'player') {
1458
+ // A service-level denial still owes the audit log the same signal AdminGuard emits,
1459
+ // since this check rejects before any shared guard runs (docs/standards/audit.md).
1460
+ this.events.emit('identity.user.unauthorized_access', {
1461
+ userId,
1462
+ playerId: null,
1463
+ resource: 'identity.security.login_withdrawal_alerts',
1464
+ action: 'set',
1465
+ ...(caller?.role ? { role: caller.role } : {}),
1466
+ ip,
1467
+ userAgent,
1468
+ });
1469
+ throw new ORPCError('FORBIDDEN', {
1470
+ message: 'Only players can set this preference.',
1471
+ });
1472
+ }
1473
+ const before = await this.securityControlsFor(userId);
1474
+ if (input.enabled && !before.emailVerified) {
1475
+ throw new ORPCError('UNPROCESSABLE_CONTENT', {
1476
+ message: 'Verify your email before enabling security alerts.',
1477
+ });
1478
+ }
1479
+ if (before.loginWithdrawalAlertsEnabled === input.enabled) {
1480
+ return before;
1481
+ }
1482
+ await this.drizzle.db
1483
+ .update(user)
1484
+ .set({ loginWithdrawalAlertsEnabled: input.enabled })
1485
+ .where(eq(user.id, userId));
1486
+ this.events.emit('identity.security.login_withdrawal_alerts.updated', {
1487
+ userId,
1488
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
1489
+ previousEnabled: before.loginWithdrawalAlertsEnabled,
1490
+ enabled: input.enabled,
1491
+ ip,
1492
+ userAgent,
1493
+ });
1494
+ return { ...before, loginWithdrawalAlertsEnabled: input.enabled };
1495
+ }
1496
+ /**
1497
+ * Resends the registration code. Unauthenticated by design - the player has no session
1498
+ * until the code is verified - so it answers SUCCESS for every address and only mails a
1499
+ * code to an account that exists and is still unverified. Verified accounts are skipped
1500
+ * deliberately: `verifyEmail` signs the code's bearer in, so resending to a verified
1501
+ * address would turn this into passwordless sign-in for anyone who can read that inbox.
1502
+ */
1503
+ async sendEmailVerification(input, reqHeaders) {
1504
+ const { ip } = extractClientMeta(reqHeaders);
1505
+ const email = input.email.toLowerCase();
1506
+ await assertRateLimit(this.limiter, `email-verify:${email}`, EMAIL_VERIFICATION_RATE_LIMIT);
1507
+ if (ip) {
1508
+ await assertRateLimit(this.limiter, `email-verify-ip:${ip}`, EMAIL_VERIFICATION_RATE_LIMIT);
1509
+ }
1510
+ const [row] = await this.drizzle.db
1511
+ .select({ emailVerified: user.emailVerified })
1512
+ .from(user)
1513
+ .where(eq(user.email, email))
1514
+ .limit(1);
1515
+ if (row && !row.emailVerified) {
1516
+ await this.api.sendVerificationOTP({
1517
+ body: { email, type: 'email-verification' },
1518
+ headers: nodeHeadersToHeaders(reqHeaders),
1519
+ asResponse: true,
1520
+ });
457
1521
  }
458
1522
  return SUCCESS;
459
1523
  }
460
- async verifyEmail(input, reqHeaders) {
1524
+ /**
1525
+ * Consumes the 6-digit code mailed by `register()` and signs the player in -
1526
+ * better-auth's `autoSignInAfterVerification` mints the session here rather than at
1527
+ * sign-up, which is what lets sign-up stay sessionless and therefore keep its
1528
+ * duplicate-email response indistinguishable. Same post-credential gates as `login`:
1529
+ * a code is proof of address ownership, not a bypass for an RG or backoffice block.
1530
+ */
1531
+ async verifyEmail(input, reqHeaders, resHeaders) {
1532
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
461
1533
  const headers = nodeHeadersToHeaders(reqHeaders);
462
- const userId = await this.currentUserId(headers);
463
- await assertRateLimit(this.limiter, `verify-email:${userId ?? 'anonymous'}`, VERIFY_EMAIL_RATE_LIMIT);
464
- const res = await this.api.verifyEmail({
465
- query: { token: input.token },
1534
+ const email = input.email.toLowerCase();
1535
+ // Keyed on the address under attack (six digits are guessable) and on the caller, so
1536
+ // one client can neither grind a single account nor sweep many.
1537
+ await assertRateLimit(this.limiter, `verify-email:${email}`, VERIFY_EMAIL_RATE_LIMIT);
1538
+ // Only when the caller's IP is actually known: an `unknown` bucket would be shared by
1539
+ // every anonymous caller, letting one client stall everyone else's sign-up.
1540
+ if (ip) {
1541
+ await assertRateLimit(this.limiter, `verify-email-ip:${ip}`, VERIFY_EMAIL_RATE_LIMIT);
1542
+ }
1543
+ const res = await this.api.verifyEmailOTP({
1544
+ body: { email, otp: input.otp },
466
1545
  headers,
467
1546
  asResponse: true,
468
1547
  });
469
- await ensureOk(res);
470
- if (userId) {
471
- this.events.emit('identity.email.verified', { userId });
1548
+ await ensureOk(res, { genericMessage: 'Invalid or expired verification code' });
1549
+ const body = (await res.json());
1550
+ // better-auth has already committed `emailVerified` by now, so the audit record is
1551
+ // emitted before any gate below can throw - a state change that leaves no trail is a
1552
+ // compliance gap, see docs/standards/audit.md.
1553
+ const playerId = await this.identityReader.getPlayerIdByUserIdSafe(body.user.id);
1554
+ this.events.emit('identity.email.verified', { userId: body.user.id, playerId, ip, userAgent });
1555
+ const [account] = await this.drizzle.db
1556
+ .select({
1557
+ id: user.id,
1558
+ rgBlocked: user.rgBlocked,
1559
+ rgBlockedUntil: user.rgBlockedUntil,
1560
+ twoFactorEnabled: user.twoFactorEnabled,
1561
+ })
1562
+ .from(user)
1563
+ .where(eq(user.id, body.user.id))
1564
+ .limit(1);
1565
+ if (account) {
1566
+ await this.assertAccountNotBlocked(account, { ip, userAgent });
472
1567
  }
473
- return SUCCESS;
1568
+ // Before the 2FA branch below: that path ends the session it just minted, but the zone
1569
+ // the browser reported is good either way.
1570
+ await captureTimezone(this.playerProvisioning, body.user.id, input.timezone);
1571
+ // better-auth mints this session with `createSession`, which its twoFactor plugin only
1572
+ // hooks on the sign-in routes - so an enrolled account would get a full session from
1573
+ // the emailed code alone, bypassing its second factor. Verification still stands; the
1574
+ // session does not, and the player signs in through `login` to face the challenge.
1575
+ if (account?.twoFactorEnabled) {
1576
+ // Scoped to the token this call just minted: the player's other devices did nothing
1577
+ // wrong, and an unrelated sign-out here would be indistinguishable from a session
1578
+ // hijack. The RG/backoffice branch above is the one that revokes everything.
1579
+ if (body.token) {
1580
+ await this.drizzle.db
1581
+ .update(session)
1582
+ .set({ expiresAt: new Date() })
1583
+ .where(eq(session.token, body.token));
1584
+ }
1585
+ return { twoFactorRedirect: true };
1586
+ }
1587
+ if (!body.token) {
1588
+ throw new ORPCError('INTERNAL_SERVER_ERROR', { message: 'Verification did not sign you in' });
1589
+ }
1590
+ this.forwardCookies(res, resHeaders);
1591
+ await this.drizzle.db
1592
+ .update(session)
1593
+ .set({ ipAddress: ip, userAgent })
1594
+ .where(eq(session.token, body.token));
1595
+ this.events.emit('identity.user.login', { userId: body.user.id, playerId, ip, userAgent });
1596
+ this.events.emit('identity.authentication.succeeded', {
1597
+ userId: body.user.id,
1598
+ playerId,
1599
+ method: 'email_verification',
1600
+ ip,
1601
+ userAgent,
1602
+ });
1603
+ const sessionDurationSeconds = this.auth.options.session?.expiresIn ?? SESSION_DURATION_IN_SECONDS;
1604
+ return {
1605
+ user: toUser(body.user),
1606
+ session: {
1607
+ token: body.token,
1608
+ expiresAt: new Date(Date.now() + sessionDurationSeconds * 1000).toISOString(),
1609
+ },
1610
+ };
474
1611
  }
475
1612
  async changeEmail(input, reqHeaders, resHeaders) {
476
1613
  const headers = nodeHeadersToHeaders(reqHeaders);
1614
+ const userId = await this.currentUserId(headers);
1615
+ const newEmail = input.newEmail.toLowerCase();
477
1616
  const res = await this.api.changeEmail({
478
1617
  body: { newEmail: input.newEmail },
479
1618
  headers,
480
1619
  asResponse: true,
481
1620
  });
482
1621
  await ensureOk(res);
483
- forwardCookies(res, resHeaders);
1622
+ this.forwardCookies(res, resHeaders);
1623
+ if (userId) {
1624
+ // better-auth's `/change-email` returns the same `{ status: true }` shape for the
1625
+ // anti-enumeration no-op (target already owned by someone else) and for a deferred
1626
+ // confirmation-email flow, where the address only actually changes once the
1627
+ // confirmation link is clicked - neither of which touched this row yet. Requiring
1628
+ // `user.email` to already equal the requested address scopes the disable to the
1629
+ // one branch (`updateEmailWithoutVerification`) that updates it synchronously.
1630
+ const [disabled] = await this.drizzle.db
1631
+ .update(user)
1632
+ .set({ loginWithdrawalAlertsEnabled: false })
1633
+ .where(and(eq(user.id, userId), eq(user.loginWithdrawalAlertsEnabled, true), eq(user.email, newEmail)))
1634
+ .returning({ id: user.id });
1635
+ if (disabled) {
1636
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
1637
+ this.events.emit('identity.security.login_withdrawal_alerts.updated', {
1638
+ userId,
1639
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(userId),
1640
+ previousEnabled: true,
1641
+ enabled: false,
1642
+ ip,
1643
+ userAgent,
1644
+ });
1645
+ }
1646
+ }
484
1647
  return SUCCESS;
485
1648
  }
486
1649
  async updateProfile(input, reqHeaders, resHeaders) {
487
1650
  if (input.language !== undefined) {
488
1651
  assertSupportedLanguage(input.language, this.platformConfig);
489
1652
  }
1653
+ const { ip, userAgent } = extractClientMeta(reqHeaders);
490
1654
  const headers = nodeHeadersToHeaders(reqHeaders);
491
1655
  // better-auth's field parser and drizzle's mapUpdateSet both drop `undefined`
492
1656
  // values before the SQL SET clause, so omitted fields are safely no-ops here.
@@ -497,12 +1661,17 @@ export class IdentityService {
497
1661
  asResponse: true,
498
1662
  });
499
1663
  await ensureOk(res);
500
- forwardCookies(res, resHeaders);
1664
+ this.forwardCookies(res, resHeaders);
501
1665
  // updateUser returns { status } only - re-read from session to get the full user.
502
1666
  const session = await this.auth.api.getSession({ headers });
503
1667
  const current = session?.user;
504
1668
  if (current) {
505
- this.events.emit('identity.profile.updated', { userId: current.id });
1669
+ this.events.emit('identity.profile.updated', {
1670
+ userId: current.id,
1671
+ playerId: await this.identityReader.getPlayerIdByUserIdSafe(current.id),
1672
+ ip,
1673
+ userAgent,
1674
+ });
506
1675
  }
507
1676
  if (!current) {
508
1677
  throw new Error('Profile update succeeded but session could not be re-read');