@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.
- package/README.md +10 -10
- package/bin/migrate.mjs +55 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/admin-console/__tests__/backoffice.router.test.js +82 -51
- package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
- package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts +2 -0
- package/dist/admin-console/__tests__/backoffice.service.int.test.d.ts.map +1 -0
- package/dist/admin-console/__tests__/backoffice.service.int.test.js +334 -0
- package/dist/admin-console/__tests__/backoffice.service.int.test.js.map +1 -0
- package/dist/admin-console/contract/index.d.ts +302 -28
- package/dist/admin-console/contract/index.d.ts.map +1 -1
- package/dist/admin-console/contract/index.js +74 -6
- package/dist/admin-console/contract/index.js.map +1 -1
- package/dist/admin-console/plugin.d.ts +182 -1
- package/dist/admin-console/plugin.d.ts.map +1 -1
- package/dist/admin-console/plugin.js +6 -6
- package/dist/admin-console/plugin.js.map +1 -1
- package/dist/admin-console/router/index.d.ts +135 -18
- package/dist/admin-console/router/index.d.ts.map +1 -1
- package/dist/admin-console/router/index.js +18 -2
- package/dist/admin-console/router/index.js.map +1 -1
- package/dist/admin-console/service/backoffice.service.d.ts +70 -10
- package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.js +67 -11
- package/dist/admin-console/service/backoffice.service.js.map +1 -1
- package/dist/analytics/__tests__/analytics.contract.test.d.ts +2 -0
- package/dist/analytics/__tests__/analytics.contract.test.d.ts.map +1 -0
- package/dist/analytics/__tests__/analytics.contract.test.js +36 -0
- package/dist/analytics/__tests__/analytics.contract.test.js.map +1 -0
- package/dist/analytics/__tests__/analytics.router.test.d.ts +2 -0
- package/dist/analytics/__tests__/analytics.router.test.d.ts.map +1 -0
- package/dist/analytics/__tests__/analytics.router.test.js +56 -0
- package/dist/analytics/__tests__/analytics.router.test.js.map +1 -0
- package/dist/analytics/__tests__/financial-analytics.service.test.d.ts +2 -0
- package/dist/analytics/__tests__/financial-analytics.service.test.d.ts.map +1 -0
- package/dist/analytics/__tests__/financial-analytics.service.test.js +87 -0
- package/dist/analytics/__tests__/financial-analytics.service.test.js.map +1 -0
- package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts +2 -0
- package/dist/analytics/__tests__/funnel-analytics.service.test.d.ts.map +1 -0
- package/dist/analytics/__tests__/funnel-analytics.service.test.js +42 -0
- package/dist/analytics/__tests__/funnel-analytics.service.test.js.map +1 -0
- package/dist/analytics/contract/financial.d.ts +121 -0
- package/dist/analytics/contract/financial.d.ts.map +1 -0
- package/dist/analytics/contract/financial.js +45 -0
- package/dist/analytics/contract/financial.js.map +1 -0
- package/dist/analytics/contract/funnel.d.ts +52 -0
- package/dist/analytics/contract/funnel.d.ts.map +1 -0
- package/dist/analytics/contract/funnel.js +24 -0
- package/dist/analytics/contract/funnel.js.map +1 -0
- package/dist/analytics/contract/index.d.ts +68 -0
- package/dist/analytics/contract/index.d.ts.map +1 -0
- package/dist/analytics/contract/index.js +9 -0
- package/dist/analytics/contract/index.js.map +1 -0
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/plugin.d.ts +184 -0
- package/dist/analytics/plugin.d.ts.map +1 -0
- package/dist/analytics/plugin.js +13 -0
- package/dist/analytics/plugin.js.map +1 -0
- package/dist/analytics/router/index.d.ts +69 -0
- package/dist/analytics/router/index.d.ts.map +1 -0
- package/dist/analytics/router/index.js +24 -0
- package/dist/analytics/router/index.js.map +1 -0
- package/dist/analytics/server.d.ts +5 -0
- package/dist/analytics/server.d.ts.map +1 -0
- package/dist/analytics/server.js +5 -0
- package/dist/analytics/server.js.map +1 -0
- package/dist/analytics/service/financial-analytics.service.d.ts +14 -0
- package/dist/analytics/service/financial-analytics.service.d.ts.map +1 -0
- package/dist/analytics/service/financial-analytics.service.js +146 -0
- package/dist/analytics/service/financial-analytics.service.js.map +1 -0
- package/dist/analytics/service/funnel-analytics.service.d.ts +11 -0
- package/dist/analytics/service/funnel-analytics.service.d.ts.map +1 -0
- package/dist/analytics/service/funnel-analytics.service.js +83 -0
- package/dist/analytics/service/funnel-analytics.service.js.map +1 -0
- package/dist/audit/__tests__/audit.service.int.test.d.ts +2 -0
- package/dist/audit/__tests__/audit.service.int.test.d.ts.map +1 -0
- package/dist/audit/__tests__/audit.service.int.test.js +906 -0
- package/dist/audit/__tests__/audit.service.int.test.js.map +1 -0
- package/dist/audit/__tests__/map-event.test.d.ts +2 -0
- package/dist/audit/__tests__/map-event.test.d.ts.map +1 -0
- package/dist/audit/__tests__/map-event.test.js +196 -0
- package/dist/audit/__tests__/map-event.test.js.map +1 -0
- package/dist/audit/contract/index.d.ts +154 -10
- package/dist/audit/contract/index.d.ts.map +1 -1
- package/dist/audit/contract/index.js +45 -5
- package/dist/audit/contract/index.js.map +1 -1
- package/dist/audit/migrate.d.ts.map +1 -1
- package/dist/audit/migrate.js +12 -0
- package/dist/audit/migrate.js.map +1 -1
- package/dist/audit/plugin.d.ts +183 -1
- package/dist/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +587 -50
- package/dist/audit/plugin.js.map +1 -1
- package/dist/audit/router/index.d.ts +73 -5
- package/dist/audit/router/index.d.ts.map +1 -1
- package/dist/audit/router/index.js +2 -5
- package/dist/audit/router/index.js.map +1 -1
- package/dist/audit/service/audit.service.d.ts +40 -14
- package/dist/audit/service/audit.service.d.ts.map +1 -1
- package/dist/audit/service/audit.service.js +86 -11
- package/dist/audit/service/audit.service.js.map +1 -1
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.js +126 -0
- package/dist/casino/gaming/__tests__/admin-reporting.int.test.js.map +1 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.js +429 -0
- package/dist/casino/gaming/__tests__/gaming.service.int.test.js.map +1 -0
- package/dist/casino/gaming/adapters/mock/mock-game-adapter.d.ts.map +1 -1
- package/dist/casino/gaming/adapters/mock/mock-game-adapter.js +3 -1
- package/dist/casino/gaming/adapters/mock/mock-game-adapter.js.map +1 -1
- package/dist/casino/gaming/admin-reporting.d.ts +9 -0
- package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
- package/dist/casino/gaming/admin-reporting.js +79 -0
- package/dist/casino/gaming/admin-reporting.js.map +1 -0
- package/dist/casino/gaming/contract/index.d.ts +21 -2
- package/dist/casino/gaming/contract/index.d.ts.map +1 -1
- package/dist/casino/gaming/contract/index.js +10 -2
- package/dist/casino/gaming/contract/index.js.map +1 -1
- package/dist/casino/gaming/drizzle/migrations/0002_yummy_lifeguard.sql +4 -0
- package/dist/casino/gaming/drizzle/migrations/0003_wealthy_greymalkin.sql +2 -0
- package/dist/casino/gaming/drizzle/migrations/0004_serious_storm.sql +4 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0002_snapshot.json +237 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0003_snapshot.json +259 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0004_snapshot.json +259 -0
- package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +21 -0
- package/dist/casino/gaming/plugin.d.ts +183 -1
- package/dist/casino/gaming/plugin.d.ts.map +1 -1
- package/dist/casino/gaming/plugin.js +15 -5
- package/dist/casino/gaming/plugin.js.map +1 -1
- package/dist/casino/gaming/router/index.d.ts +12 -1
- package/dist/casino/gaming/router/index.d.ts.map +1 -1
- package/dist/casino/gaming/router/index.js +7 -2
- package/dist/casino/gaming/router/index.js.map +1 -1
- package/dist/casino/gaming/schema/index.d.ts +35 -0
- package/dist/casino/gaming/schema/index.d.ts.map +1 -1
- package/dist/casino/gaming/schema/index.js +19 -4
- package/dist/casino/gaming/schema/index.js.map +1 -1
- package/dist/casino/gaming/service/gaming.service.d.ts +48 -7
- package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
- package/dist/casino/gaming/service/gaming.service.js +147 -21
- package/dist/casino/gaming/service/gaming.service.js.map +1 -1
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts +2 -0
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.d.ts.map +1 -0
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.js +56 -0
- package/dist/casino/lobby/__tests__/lobby.cache.int.test.js.map +1 -0
- package/dist/casino/lobby/plugin.d.ts +181 -1
- package/dist/casino/lobby/plugin.d.ts.map +1 -1
- package/dist/casino/lobby/plugin.js +3 -3
- package/dist/casino/lobby/plugin.js.map +1 -1
- package/dist/casino/lobby/service/lobby.service.d.ts +3 -1
- package/dist/casino/lobby/service/lobby.service.d.ts.map +1 -1
- package/dist/casino/server.d.ts +1 -0
- package/dist/casino/server.d.ts.map +1 -1
- package/dist/casino/server.js +1 -0
- package/dist/casino/server.js.map +1 -1
- package/dist/cms/__tests__/cms.reads.int.test.d.ts +2 -0
- package/dist/cms/__tests__/cms.reads.int.test.d.ts.map +1 -0
- package/dist/cms/__tests__/cms.reads.int.test.js +66 -0
- package/dist/cms/__tests__/cms.reads.int.test.js.map +1 -0
- package/dist/cms/__tests__/cms.router.int.test.d.ts +2 -0
- package/dist/cms/__tests__/cms.router.int.test.d.ts.map +1 -0
- package/dist/cms/__tests__/cms.router.int.test.js +356 -0
- package/dist/cms/__tests__/cms.router.int.test.js.map +1 -0
- package/dist/cms/__tests__/cms.service.int.test.d.ts +2 -0
- package/dist/cms/__tests__/cms.service.int.test.d.ts.map +1 -0
- package/dist/cms/__tests__/cms.service.int.test.js +908 -0
- package/dist/cms/__tests__/cms.service.int.test.js.map +1 -0
- package/dist/cms/contract/index.d.ts +413 -42
- package/dist/cms/contract/index.d.ts.map +1 -1
- package/dist/cms/contract/index.js +161 -35
- package/dist/cms/contract/index.js.map +1 -1
- package/dist/cms/drizzle/migrations/0001_steep_starjammers.sql +29 -0
- package/dist/cms/drizzle/migrations/0002_naive_kingpin.sql +14 -0
- package/dist/cms/drizzle/migrations/0003_worthless_titanium_man.sql +2 -0
- package/dist/cms/drizzle/migrations/meta/0001_snapshot.json +303 -0
- package/dist/cms/drizzle/migrations/meta/0002_snapshot.json +412 -0
- package/dist/cms/drizzle/migrations/meta/0003_snapshot.json +442 -0
- package/dist/cms/drizzle/migrations/meta/_journal.json +21 -0
- package/dist/cms/moderation/validate-banner-image-url.d.ts +8 -0
- package/dist/cms/moderation/validate-banner-image-url.d.ts.map +1 -0
- package/dist/cms/moderation/validate-banner-image-url.js +20 -0
- package/dist/cms/moderation/validate-banner-image-url.js.map +1 -0
- package/dist/cms/plugin.d.ts +181 -1
- package/dist/cms/plugin.d.ts.map +1 -1
- package/dist/cms/plugin.js +5 -5
- package/dist/cms/plugin.js.map +1 -1
- package/dist/cms/router/index.d.ts +219 -37
- package/dist/cms/router/index.d.ts.map +1 -1
- package/dist/cms/router/index.js +83 -21
- package/dist/cms/router/index.js.map +1 -1
- package/dist/cms/schema/index.d.ts +283 -28
- package/dist/cms/schema/index.d.ts.map +1 -1
- package/dist/cms/schema/index.js +57 -7
- package/dist/cms/schema/index.js.map +1 -1
- package/dist/cms/server.d.ts +1 -1
- package/dist/cms/server.d.ts.map +1 -1
- package/dist/cms/server.js +1 -1
- package/dist/cms/server.js.map +1 -1
- package/dist/cms/service/cms.service.d.ts +229 -45
- package/dist/cms/service/cms.service.d.ts.map +1 -1
- package/dist/cms/service/cms.service.js +702 -67
- package/dist/cms/service/cms.service.js.map +1 -1
- package/dist/common/errors/__tests__/errors.mapper.test.d.ts +2 -0
- package/dist/common/errors/__tests__/errors.mapper.test.d.ts.map +1 -0
- package/dist/common/errors/__tests__/errors.mapper.test.js +59 -0
- package/dist/common/errors/__tests__/errors.mapper.test.js.map +1 -0
- package/dist/common/errors/errors.classes.js +3 -3
- package/dist/common/errors/errors.classes.js.map +1 -1
- package/dist/common/errors/errors.mapper.js +1 -1
- package/dist/common/errors/errors.mapper.js.map +1 -1
- package/dist/compliance/__tests__/assert.test.d.ts +2 -0
- package/dist/compliance/__tests__/assert.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/assert.test.js +34 -0
- package/dist/compliance/__tests__/assert.test.js.map +1 -0
- package/dist/compliance/__tests__/compliance.service.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/compliance.service.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/compliance.service.int.test.js +81 -0
- package/dist/compliance/__tests__/compliance.service.int.test.js.map +1 -0
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js +82 -0
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.int.test.js.map +1 -0
- package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/kyc-admin.router.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/kyc-admin.router.int.test.js +198 -0
- package/dist/compliance/__tests__/kyc-admin.router.int.test.js.map +1 -0
- package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/kyc-webhook.router.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/kyc-webhook.router.int.test.js +177 -0
- package/dist/compliance/__tests__/kyc-webhook.router.int.test.js.map +1 -0
- package/dist/compliance/__tests__/kyc.service.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/kyc.service.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/kyc.service.int.test.js +397 -0
- package/dist/compliance/__tests__/kyc.service.int.test.js.map +1 -0
- package/dist/compliance/__tests__/limits.contract.test.d.ts +2 -0
- package/dist/compliance/__tests__/limits.contract.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/limits.contract.test.js +83 -0
- package/dist/compliance/__tests__/limits.contract.test.js.map +1 -0
- package/dist/compliance/__tests__/rg-eval.test.js +28 -1
- package/dist/compliance/__tests__/rg-eval.test.js.map +1 -1
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.js +512 -0
- package/dist/compliance/__tests__/rg-monitoring.service.int.test.js.map +1 -0
- package/dist/compliance/__tests__/rg-self-service.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/rg-self-service.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/rg-self-service.int.test.js +539 -0
- package/dist/compliance/__tests__/rg-self-service.int.test.js.map +1 -0
- package/dist/compliance/__tests__/rg.contract.test.js +60 -20
- package/dist/compliance/__tests__/rg.contract.test.js.map +1 -1
- package/dist/compliance/__tests__/rg.router.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/rg.router.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/rg.router.int.test.js +325 -0
- package/dist/compliance/__tests__/rg.router.int.test.js.map +1 -0
- package/dist/compliance/__tests__/rg.service.int.test.d.ts +2 -0
- package/dist/compliance/__tests__/rg.service.int.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/rg.service.int.test.js +747 -0
- package/dist/compliance/__tests__/rg.service.int.test.js.map +1 -0
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts +16 -3
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts.map +1 -1
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js +47 -5
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js.map +1 -1
- package/dist/compliance/adapters/rg-limit-gate.d.ts +17 -0
- package/dist/compliance/adapters/rg-limit-gate.d.ts.map +1 -0
- package/dist/compliance/adapters/rg-limit-gate.js +107 -0
- package/dist/compliance/adapters/rg-limit-gate.js.map +1 -0
- package/dist/compliance/contract/index.d.ts +1316 -121
- package/dist/compliance/contract/index.d.ts.map +1 -1
- package/dist/compliance/contract/index.js +102 -8
- package/dist/compliance/contract/index.js.map +1 -1
- package/dist/compliance/contract/limits.d.ts +52 -0
- package/dist/compliance/contract/limits.d.ts.map +1 -1
- package/dist/compliance/contract/limits.js +27 -7
- package/dist/compliance/contract/limits.js.map +1 -1
- package/dist/compliance/contract/rg.d.ts +337 -7
- package/dist/compliance/contract/rg.d.ts.map +1 -1
- package/dist/compliance/contract/rg.js +61 -15
- package/dist/compliance/contract/rg.js.map +1 -1
- package/dist/compliance/drizzle/migrations/0002_condemned_monster_badoon.sql +3 -0
- package/dist/compliance/drizzle/migrations/0003_public_spirit.sql +1 -0
- package/dist/compliance/drizzle/migrations/0004_military_silk_fever.sql +2 -0
- package/dist/compliance/drizzle/migrations/0005_reflective_magma.sql +13 -0
- package/dist/compliance/drizzle/migrations/0006_backfill_session_limit_currency.sql +15 -0
- package/dist/compliance/drizzle/migrations/0007_romantic_toxin.sql +6 -0
- package/dist/compliance/drizzle/migrations/meta/0002_snapshot.json +673 -0
- package/dist/compliance/drizzle/migrations/meta/0003_snapshot.json +679 -0
- package/dist/compliance/drizzle/migrations/meta/0004_snapshot.json +679 -0
- package/dist/compliance/drizzle/migrations/meta/0005_snapshot.json +754 -0
- package/dist/compliance/drizzle/migrations/meta/0006_snapshot.json +754 -0
- package/dist/compliance/drizzle/migrations/meta/0007_snapshot.json +785 -0
- package/dist/compliance/drizzle/migrations/meta/_journal.json +42 -0
- package/dist/compliance/plugin.d.ts +184 -1
- package/dist/compliance/plugin.d.ts.map +1 -1
- package/dist/compliance/plugin.js +85 -14
- package/dist/compliance/plugin.js.map +1 -1
- package/dist/compliance/router/index.d.ts +851 -65
- package/dist/compliance/router/index.d.ts.map +1 -1
- package/dist/compliance/router/index.js +106 -23
- package/dist/compliance/router/index.js.map +1 -1
- package/dist/compliance/schema/index.d.ts +224 -4
- package/dist/compliance/schema/index.d.ts.map +1 -1
- package/dist/compliance/schema/index.js +38 -5
- package/dist/compliance/schema/index.js.map +1 -1
- package/dist/compliance/service/compliance.service.d.ts +23 -33
- package/dist/compliance/service/compliance.service.d.ts.map +1 -1
- package/dist/compliance/service/compliance.service.js +20 -37
- package/dist/compliance/service/compliance.service.js.map +1 -1
- package/dist/compliance/service/kyc.service.d.ts +228 -10
- package/dist/compliance/service/kyc.service.d.ts.map +1 -1
- package/dist/compliance/service/kyc.service.js +566 -62
- package/dist/compliance/service/kyc.service.js.map +1 -1
- package/dist/compliance/service/rg-eval.d.ts +7 -2
- package/dist/compliance/service/rg-eval.d.ts.map +1 -1
- package/dist/compliance/service/rg-eval.js +10 -2
- package/dist/compliance/service/rg-eval.js.map +1 -1
- package/dist/compliance/service/rg-monitoring.service.d.ts +24 -6
- package/dist/compliance/service/rg-monitoring.service.d.ts.map +1 -1
- package/dist/compliance/service/rg-monitoring.service.js +109 -20
- package/dist/compliance/service/rg-monitoring.service.js.map +1 -1
- package/dist/compliance/service/rg-self-service.service.d.ts +84 -0
- package/dist/compliance/service/rg-self-service.service.d.ts.map +1 -0
- package/dist/compliance/service/rg-self-service.service.js +449 -0
- package/dist/compliance/service/rg-self-service.service.js.map +1 -0
- package/dist/compliance/service/rg.service.d.ts +103 -15
- package/dist/compliance/service/rg.service.d.ts.map +1 -1
- package/dist/compliance/service/rg.service.js +325 -61
- package/dist/compliance/service/rg.service.js.map +1 -1
- package/dist/contracts/__tests__/compose-contract.test.d.ts +2 -0
- package/dist/contracts/__tests__/compose-contract.test.d.ts.map +1 -0
- package/dist/contracts/__tests__/compose-contract.test.js +27 -0
- package/dist/contracts/__tests__/compose-contract.test.js.map +1 -0
- package/dist/contracts/__tests__/identity.test.d.ts +2 -0
- package/dist/contracts/__tests__/identity.test.d.ts.map +1 -0
- package/dist/contracts/__tests__/identity.test.js +50 -0
- package/dist/contracts/__tests__/identity.test.js.map +1 -0
- package/dist/contracts/__tests__/player.test.d.ts +2 -0
- package/dist/contracts/__tests__/player.test.d.ts.map +1 -0
- package/dist/contracts/__tests__/player.test.js +51 -0
- package/dist/contracts/__tests__/player.test.js.map +1 -0
- package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts +2 -0
- package/dist/contracts/adapters/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/contracts/adapters/__tests__/rate-limit.test.js +13 -0
- package/dist/contracts/adapters/__tests__/rate-limit.test.js.map +1 -0
- package/dist/contracts/adapters/__tests__/token.test.d.ts +2 -0
- package/dist/contracts/adapters/__tests__/token.test.d.ts.map +1 -0
- package/dist/contracts/adapters/__tests__/token.test.js +14 -0
- package/dist/contracts/adapters/__tests__/token.test.js.map +1 -0
- package/dist/contracts/adapters/admin-game-reporting.d.ts +43 -0
- package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-game-reporting.js +17 -0
- package/dist/contracts/adapters/admin-game-reporting.js.map +1 -0
- package/dist/contracts/adapters/admin-permission.d.ts +11 -0
- package/dist/contracts/adapters/admin-permission.d.ts.map +1 -1
- package/dist/contracts/adapters/admin-permission.js +6 -4
- package/dist/contracts/adapters/admin-permission.js.map +1 -1
- package/dist/contracts/adapters/admin-player-activity.d.ts +51 -0
- package/dist/contracts/adapters/admin-player-activity.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-player-activity.js +3 -0
- package/dist/contracts/adapters/admin-player-activity.js.map +1 -0
- package/dist/contracts/adapters/admin-role-assignment-directory.d.ts +12 -0
- package/dist/contracts/adapters/admin-role-assignment-directory.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-role-assignment-directory.js +3 -0
- package/dist/contracts/adapters/admin-role-assignment-directory.js.map +1 -0
- package/dist/contracts/adapters/admin-security.d.ts +27 -0
- package/dist/contracts/adapters/admin-security.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-security.js +9 -0
- package/dist/contracts/adapters/admin-security.js.map +1 -0
- package/dist/contracts/adapters/admin-user-directory.d.ts +52 -4
- package/dist/contracts/adapters/admin-user-directory.d.ts.map +1 -1
- package/dist/contracts/adapters/admin-user-directory.js +8 -0
- package/dist/contracts/adapters/admin-user-directory.js.map +1 -1
- package/dist/contracts/adapters/admin-wallet-reporting.d.ts +11 -0
- package/dist/contracts/adapters/admin-wallet-reporting.d.ts.map +1 -1
- package/dist/contracts/adapters/admin-wallet-reporting.js +9 -0
- package/dist/contracts/adapters/admin-wallet-reporting.js.map +1 -1
- package/dist/contracts/adapters/aggregator.d.ts +12 -0
- package/dist/contracts/adapters/aggregator.d.ts.map +1 -1
- package/dist/contracts/adapters/aggregator.js +5 -3
- package/dist/contracts/adapters/aggregator.js.map +1 -1
- package/dist/contracts/adapters/audit.d.ts +30 -4
- package/dist/contracts/adapters/audit.d.ts.map +1 -1
- package/dist/contracts/adapters/audit.js.map +1 -1
- package/dist/contracts/adapters/broker.d.ts +23 -0
- package/dist/contracts/adapters/broker.d.ts.map +1 -1
- package/dist/contracts/adapters/broker.js +8 -6
- package/dist/contracts/adapters/broker.js.map +1 -1
- package/dist/contracts/adapters/cache.d.ts +11 -0
- package/dist/contracts/adapters/cache.d.ts.map +1 -1
- package/dist/contracts/adapters/cache.js +8 -6
- package/dist/contracts/adapters/cache.js.map +1 -1
- package/dist/contracts/adapters/chat-block-writer.d.ts +18 -0
- package/dist/contracts/adapters/chat-block-writer.d.ts.map +1 -0
- package/dist/contracts/adapters/chat-block-writer.js +7 -0
- package/dist/contracts/adapters/chat-block-writer.js.map +1 -0
- package/dist/contracts/adapters/chat-moderation.d.ts +75 -0
- package/dist/contracts/adapters/chat-moderation.d.ts.map +1 -0
- package/dist/contracts/adapters/chat-moderation.js +3 -0
- package/dist/contracts/adapters/chat-moderation.js.map +1 -0
- package/dist/contracts/adapters/chat-room-access.d.ts +6 -0
- package/dist/contracts/adapters/chat-room-access.d.ts.map +1 -0
- package/dist/contracts/adapters/chat-room-access.js +3 -0
- package/dist/contracts/adapters/chat-room-access.js.map +1 -0
- package/dist/contracts/adapters/chat-system-writer.d.ts +19 -0
- package/dist/contracts/adapters/chat-system-writer.d.ts.map +1 -0
- package/dist/contracts/adapters/chat-system-writer.js +3 -0
- package/dist/contracts/adapters/chat-system-writer.js.map +1 -0
- package/dist/contracts/adapters/email-template.d.ts +12 -0
- package/dist/contracts/adapters/email-template.d.ts.map +1 -0
- package/dist/contracts/adapters/email-template.js +3 -0
- package/dist/contracts/adapters/email-template.js.map +1 -0
- package/dist/contracts/adapters/error-tracking.d.ts +12 -0
- package/dist/contracts/adapters/error-tracking.d.ts.map +1 -0
- package/dist/contracts/adapters/error-tracking.js +3 -0
- package/dist/contracts/adapters/error-tracking.js.map +1 -0
- package/dist/contracts/adapters/exchange-rate-provider.d.ts +14 -0
- package/dist/contracts/adapters/exchange-rate-provider.d.ts.map +1 -0
- package/dist/contracts/adapters/exchange-rate-provider.js +5 -0
- package/dist/contracts/adapters/exchange-rate-provider.js.map +1 -0
- package/dist/contracts/adapters/exchange-rate-reader.d.ts +16 -0
- package/dist/contracts/adapters/exchange-rate-reader.d.ts.map +1 -0
- package/dist/contracts/adapters/exchange-rate-reader.js +3 -0
- package/dist/contracts/adapters/exchange-rate-reader.js.map +1 -0
- package/dist/contracts/adapters/game.d.ts +13 -1
- package/dist/contracts/adapters/game.d.ts.map +1 -1
- package/dist/contracts/adapters/game.js +4 -2
- package/dist/contracts/adapters/game.js.map +1 -1
- package/dist/contracts/adapters/gaming-commands.d.ts +25 -0
- package/dist/contracts/adapters/gaming-commands.d.ts.map +1 -0
- package/dist/contracts/adapters/gaming-commands.js +8 -0
- package/dist/contracts/adapters/gaming-commands.js.map +1 -0
- package/dist/contracts/adapters/geo-check-commands.d.ts +8 -0
- package/dist/contracts/adapters/geo-check-commands.d.ts.map +1 -0
- package/dist/contracts/adapters/geo-check-commands.js +3 -0
- package/dist/contracts/adapters/geo-check-commands.js.map +1 -0
- package/dist/contracts/adapters/geo-ip.d.ts +4 -0
- package/dist/contracts/adapters/geo-ip.d.ts.map +1 -1
- package/dist/contracts/adapters/geo-ip.js +4 -2
- package/dist/contracts/adapters/geo-ip.js.map +1 -1
- package/dist/contracts/adapters/identity-reader.d.ts +20 -4
- package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
- package/dist/contracts/adapters/identity-reader.js.map +1 -1
- package/dist/contracts/adapters/identity.d.ts +15 -0
- package/dist/contracts/adapters/identity.d.ts.map +1 -1
- package/dist/contracts/adapters/identity.js +5 -2
- package/dist/contracts/adapters/identity.js.map +1 -1
- package/dist/contracts/adapters/index.d.ts +72 -21
- package/dist/contracts/adapters/index.d.ts.map +1 -1
- package/dist/contracts/adapters/index.js +37 -13
- package/dist/contracts/adapters/index.js.map +1 -1
- package/dist/contracts/adapters/job-queue.d.ts +55 -0
- package/dist/contracts/adapters/job-queue.d.ts.map +1 -1
- package/dist/contracts/adapters/job-queue.js +11 -9
- package/dist/contracts/adapters/job-queue.js.map +1 -1
- package/dist/contracts/adapters/kyc.d.ts +110 -11
- package/dist/contracts/adapters/kyc.d.ts.map +1 -1
- package/dist/contracts/adapters/kyc.js +23 -0
- package/dist/contracts/adapters/kyc.js.map +1 -1
- package/dist/contracts/adapters/login-enforcement.d.ts +8 -0
- package/dist/contracts/adapters/login-enforcement.d.ts.map +1 -1
- package/dist/contracts/adapters/login-enforcement.js +8 -6
- package/dist/contracts/adapters/login-enforcement.js.map +1 -1
- package/dist/contracts/adapters/mail.d.ts +30 -0
- package/dist/contracts/adapters/mail.d.ts.map +1 -0
- package/dist/contracts/adapters/mail.js +4 -0
- package/dist/contracts/adapters/mail.js.map +1 -0
- package/dist/contracts/adapters/outbox.d.ts +14 -0
- package/dist/contracts/adapters/outbox.d.ts.map +1 -1
- package/dist/contracts/adapters/outbox.js +14 -12
- package/dist/contracts/adapters/outbox.js.map +1 -1
- package/dist/contracts/adapters/payment.d.ts +141 -3
- package/dist/contracts/adapters/payment.d.ts.map +1 -1
- package/dist/contracts/adapters/payment.js +11 -3
- package/dist/contracts/adapters/payment.js.map +1 -1
- package/dist/contracts/adapters/play-eligibility.d.ts +15 -0
- package/dist/contracts/adapters/play-eligibility.d.ts.map +1 -0
- package/dist/contracts/adapters/play-eligibility.js +3 -0
- package/dist/contracts/adapters/play-eligibility.js.map +1 -0
- package/dist/contracts/adapters/player-activity.d.ts +6 -0
- package/dist/contracts/adapters/player-activity.d.ts.map +1 -0
- package/dist/contracts/adapters/player-activity.js +3 -0
- package/dist/contracts/adapters/player-activity.js.map +1 -0
- package/dist/contracts/adapters/player-provisioning.d.ts +29 -0
- package/dist/contracts/adapters/player-provisioning.d.ts.map +1 -0
- package/dist/contracts/adapters/player-provisioning.js +3 -0
- package/dist/contracts/adapters/player-provisioning.js.map +1 -0
- package/dist/contracts/adapters/player-tags.d.ts +4 -0
- package/dist/contracts/adapters/player-tags.d.ts.map +1 -1
- package/dist/contracts/adapters/player-tags.js.map +1 -1
- package/dist/contracts/adapters/rate-limit.d.ts +42 -3
- package/dist/contracts/adapters/rate-limit.d.ts.map +1 -1
- package/dist/contracts/adapters/rate-limit.js +30 -6
- package/dist/contracts/adapters/rate-limit.js.map +1 -1
- package/dist/contracts/adapters/realtime.d.ts +156 -7
- package/dist/contracts/adapters/realtime.d.ts.map +1 -1
- package/dist/contracts/adapters/realtime.js +33 -10
- package/dist/contracts/adapters/realtime.js.map +1 -1
- package/dist/contracts/adapters/rg-limits.d.ts +47 -0
- package/dist/contracts/adapters/rg-limits.d.ts.map +1 -0
- package/dist/contracts/adapters/rg-limits.js +18 -0
- package/dist/contracts/adapters/rg-limits.js.map +1 -0
- package/dist/contracts/adapters/rng.d.ts +11 -0
- package/dist/contracts/adapters/rng.d.ts.map +1 -1
- package/dist/contracts/adapters/rng.js +11 -9
- package/dist/contracts/adapters/rng.js.map +1 -1
- package/dist/contracts/adapters/sms.d.ts +15 -0
- package/dist/contracts/adapters/sms.d.ts.map +1 -0
- package/dist/contracts/adapters/sms.js +9 -0
- package/dist/contracts/adapters/sms.js.map +1 -0
- package/dist/contracts/adapters/social-commands.d.ts +12 -0
- package/dist/contracts/adapters/social-commands.d.ts.map +1 -0
- package/dist/contracts/adapters/social-commands.js +7 -0
- package/dist/contracts/adapters/social-commands.js.map +1 -0
- package/dist/contracts/adapters/swap.d.ts +80 -0
- package/dist/contracts/adapters/swap.d.ts.map +1 -0
- package/dist/contracts/adapters/swap.js +5 -0
- package/dist/contracts/adapters/swap.js.map +1 -0
- package/dist/contracts/adapters/tag-evaluation-commands.d.ts +20 -0
- package/dist/contracts/adapters/tag-evaluation-commands.d.ts.map +1 -0
- package/dist/contracts/adapters/tag-evaluation-commands.js +13 -0
- package/dist/contracts/adapters/tag-evaluation-commands.js.map +1 -0
- package/dist/contracts/adapters/token.d.ts +28 -5
- package/dist/contracts/adapters/token.d.ts.map +1 -1
- package/dist/contracts/adapters/token.js +10 -8
- package/dist/contracts/adapters/token.js.map +1 -1
- package/dist/contracts/adapters/wallet-asset-catalog.d.ts +34 -0
- package/dist/contracts/adapters/wallet-asset-catalog.d.ts.map +1 -0
- package/dist/contracts/adapters/wallet-asset-catalog.js +3 -0
- package/dist/contracts/adapters/wallet-asset-catalog.js.map +1 -0
- package/dist/contracts/adapters/wallet-commands.d.ts +25 -0
- package/dist/contracts/adapters/wallet-commands.d.ts.map +1 -1
- package/dist/contracts/adapters/wallet-commands.js.map +1 -1
- package/dist/contracts/adapters/wallet-reader.d.ts +43 -1
- package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
- package/dist/contracts/adapters/wallet-reader.js.map +1 -1
- package/dist/contracts/kit.d.ts +15 -0
- package/dist/contracts/kit.d.ts.map +1 -1
- package/dist/contracts/kit.js +1 -0
- package/dist/contracts/kit.js.map +1 -1
- package/dist/contracts/schemas/__tests__/common-schemas.test.js +33 -4
- package/dist/contracts/schemas/__tests__/common-schemas.test.js.map +1 -1
- package/dist/contracts/schemas/__tests__/events.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/events.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/events.test.js +192 -0
- package/dist/contracts/schemas/__tests__/events.test.js.map +1 -0
- package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/igaming-config.test.js +38 -0
- package/dist/contracts/schemas/__tests__/igaming-config.test.js.map +1 -0
- package/dist/contracts/schemas/__tests__/platform-config.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/platform-config.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/platform-config.test.js +16 -0
- package/dist/contracts/schemas/__tests__/platform-config.test.js.map +1 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
- package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/tag-schemas.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/tag-schemas.test.js +42 -0
- package/dist/contracts/schemas/__tests__/tag-schemas.test.js.map +1 -0
- package/dist/contracts/schemas/chat-attachment.d.ts +20 -0
- package/dist/contracts/schemas/chat-attachment.d.ts.map +1 -0
- package/dist/contracts/schemas/chat-attachment.js +14 -0
- package/dist/contracts/schemas/chat-attachment.js.map +1 -0
- package/dist/contracts/schemas/chat-command-metadata.d.ts +73 -0
- package/dist/contracts/schemas/chat-command-metadata.d.ts.map +1 -0
- package/dist/contracts/schemas/chat-command-metadata.js +67 -0
- package/dist/contracts/schemas/chat-command-metadata.js.map +1 -0
- package/dist/contracts/schemas/chat-command.d.ts +224 -0
- package/dist/contracts/schemas/chat-command.d.ts.map +1 -0
- package/dist/contracts/schemas/chat-command.js +55 -0
- package/dist/contracts/schemas/chat-command.js.map +1 -0
- package/dist/contracts/schemas/common.d.ts +36 -0
- package/dist/contracts/schemas/common.d.ts.map +1 -1
- package/dist/contracts/schemas/common.js +67 -2
- package/dist/contracts/schemas/common.js.map +1 -1
- package/dist/contracts/schemas/compliance.d.ts +23 -1
- package/dist/contracts/schemas/compliance.d.ts.map +1 -1
- package/dist/contracts/schemas/compliance.js +12 -0
- package/dist/contracts/schemas/compliance.js.map +1 -1
- package/dist/contracts/schemas/display-currency.d.ts +14 -0
- package/dist/contracts/schemas/display-currency.d.ts.map +1 -0
- package/dist/contracts/schemas/display-currency.js +45 -0
- package/dist/contracts/schemas/display-currency.js.map +1 -0
- package/dist/contracts/schemas/events.d.ts +934 -7
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +594 -69
- package/dist/contracts/schemas/events.js.map +1 -1
- package/dist/contracts/schemas/game.d.ts +9 -0
- package/dist/contracts/schemas/game.d.ts.map +1 -0
- package/dist/contracts/schemas/game.js +4 -0
- package/dist/contracts/schemas/game.js.map +1 -0
- package/dist/contracts/schemas/iam.d.ts +31 -0
- package/dist/contracts/schemas/iam.d.ts.map +1 -1
- package/dist/contracts/schemas/iam.js +34 -0
- package/dist/contracts/schemas/iam.js.map +1 -1
- package/dist/contracts/schemas/identity.d.ts +196 -4
- package/dist/contracts/schemas/identity.d.ts.map +1 -1
- package/dist/contracts/schemas/identity.js +186 -8
- package/dist/contracts/schemas/identity.js.map +1 -1
- package/dist/contracts/schemas/igaming-config.d.ts +31 -1
- package/dist/contracts/schemas/igaming-config.d.ts.map +1 -1
- package/dist/contracts/schemas/igaming-config.js +9 -1
- package/dist/contracts/schemas/igaming-config.js.map +1 -1
- package/dist/contracts/schemas/index.d.ts +7 -0
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +7 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/contracts/schemas/mail.d.ts +188 -0
- package/dist/contracts/schemas/mail.d.ts.map +1 -0
- package/dist/contracts/schemas/mail.js +80 -0
- package/dist/contracts/schemas/mail.js.map +1 -0
- package/dist/contracts/schemas/platform-config.d.ts +211 -32
- package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
- package/dist/contracts/schemas/platform-config.js +239 -7
- package/dist/contracts/schemas/platform-config.js.map +1 -1
- package/dist/contracts/schemas/player.d.ts +96 -4
- package/dist/contracts/schemas/player.d.ts.map +1 -1
- package/dist/contracts/schemas/player.js +83 -9
- package/dist/contracts/schemas/player.js.map +1 -1
- package/dist/contracts/schemas/reporting.d.ts +20 -0
- package/dist/contracts/schemas/reporting.d.ts.map +1 -0
- package/dist/contracts/schemas/reporting.js +13 -0
- package/dist/contracts/schemas/reporting.js.map +1 -0
- package/dist/contracts/schemas/tag.d.ts +86 -2
- package/dist/contracts/schemas/tag.d.ts.map +1 -1
- package/dist/contracts/schemas/tag.js +13 -1
- package/dist/contracts/schemas/tag.js.map +1 -1
- package/dist/contracts/schemas/wallet-tx.d.ts +50 -3
- package/dist/contracts/schemas/wallet-tx.d.ts.map +1 -1
- package/dist/contracts/schemas/wallet-tx.js +50 -3
- package/dist/contracts/schemas/wallet-tx.js.map +1 -1
- package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js +155 -0
- package/dist/engagement/chat/__tests__/chat-moderation-expiry.int.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js +81 -0
- package/dist/engagement/chat/__tests__/chat-mute-listing.int.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/chat.router.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/chat.router.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/chat.router.test.js +44 -0
- package/dist/engagement/chat/__tests__/chat.router.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/chat.service.int.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/chat.service.int.test.js +2349 -0
- package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/contract.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/contract.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/contract.test.js +44 -0
- package/dist/engagement/chat/__tests__/contract.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/global-chat-room.int.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/global-chat-room.int.test.js +100 -0
- package/dist/engagement/chat/__tests__/global-chat-room.int.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/moderation.test.js +2 -0
- package/dist/engagement/chat/__tests__/moderation.test.js.map +1 -1
- package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js +736 -0
- package/dist/engagement/chat/__tests__/room-ownership-handover.int.test.js.map +1 -0
- package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts +2 -0
- package/dist/engagement/chat/__tests__/validate-attachment.test.d.ts.map +1 -0
- package/dist/engagement/chat/__tests__/validate-attachment.test.js +38 -0
- package/dist/engagement/chat/__tests__/validate-attachment.test.js.map +1 -0
- package/dist/engagement/chat/contract/constants.d.ts +15 -0
- package/dist/engagement/chat/contract/constants.d.ts.map +1 -0
- package/dist/engagement/chat/contract/constants.js +20 -0
- package/dist/engagement/chat/contract/constants.js.map +1 -0
- package/dist/engagement/chat/contract/index.d.ts +2190 -16
- package/dist/engagement/chat/contract/index.d.ts.map +1 -1
- package/dist/engagement/chat/contract/index.js +457 -12
- package/dist/engagement/chat/contract/index.js.map +1 -1
- package/dist/engagement/chat/drizzle/migrations/0001_cloudy_groot.sql +32 -0
- package/dist/engagement/chat/drizzle/migrations/0002_steep_zodiak.sql +3 -0
- package/dist/engagement/chat/drizzle/migrations/0003_stormy_king_bedlam.sql +9 -0
- package/dist/engagement/chat/drizzle/migrations/0004_panoramic_robin_chapel.sql +6 -0
- package/dist/engagement/chat/drizzle/migrations/0005_tranquil_gwen_stacy.sql +100 -0
- package/dist/engagement/chat/drizzle/migrations/0006_tiny_ultron.sql +3 -0
- package/dist/engagement/chat/drizzle/migrations/0007_seed_global_chat_room.sql +8 -0
- package/dist/engagement/chat/drizzle/migrations/0008_robust_korvac.sql +1 -0
- package/dist/engagement/chat/drizzle/migrations/0009_massive_bill_hollister.sql +1 -0
- package/dist/engagement/chat/drizzle/migrations/0010_backfill_role_assigned_at.sql +9 -0
- package/dist/engagement/chat/drizzle/migrations/0011_light_changeling.sql +1 -0
- package/dist/engagement/chat/drizzle/migrations/0012_strange_mephisto.sql +3 -0
- package/dist/engagement/chat/drizzle/migrations/0013_chilly_sprite.sql +6 -0
- package/dist/engagement/chat/drizzle/migrations/0014_chat_moderation_expiry_recorded.sql +19 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0001_snapshot.json +557 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0002_snapshot.json +576 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0003_snapshot.json +652 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0004_snapshot.json +666 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0005_snapshot.json +1422 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0006_snapshot.json +1456 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0007_snapshot.json +1456 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0008_snapshot.json +1462 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0009_snapshot.json +1468 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0010_snapshot.json +1468 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0011_snapshot.json +1489 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0012_snapshot.json +1517 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0013_snapshot.json +1517 -0
- package/dist/engagement/chat/drizzle/migrations/meta/0014_snapshot.json +1544 -0
- package/dist/engagement/chat/drizzle/migrations/meta/_journal.json +98 -0
- package/dist/engagement/chat/index.d.ts +1 -2
- package/dist/engagement/chat/index.d.ts.map +1 -1
- package/dist/engagement/chat/index.js +1 -2
- package/dist/engagement/chat/index.js.map +1 -1
- package/dist/engagement/chat/moderation/index.d.ts +1 -0
- package/dist/engagement/chat/moderation/index.d.ts.map +1 -1
- package/dist/engagement/chat/moderation/index.js +1 -0
- package/dist/engagement/chat/moderation/index.js.map +1 -1
- package/dist/engagement/chat/moderation/profanity.d.ts.map +1 -1
- package/dist/engagement/chat/moderation/profanity.js +2 -0
- package/dist/engagement/chat/moderation/profanity.js.map +1 -1
- package/dist/engagement/chat/moderation/validate-attachment.d.ts +9 -0
- package/dist/engagement/chat/moderation/validate-attachment.d.ts.map +1 -0
- package/dist/engagement/chat/moderation/validate-attachment.js +27 -0
- package/dist/engagement/chat/moderation/validate-attachment.js.map +1 -0
- package/dist/engagement/chat/plugin.d.ts +183 -1
- package/dist/engagement/chat/plugin.d.ts.map +1 -1
- package/dist/engagement/chat/plugin.js +211 -5
- package/dist/engagement/chat/plugin.js.map +1 -1
- package/dist/engagement/chat/router/index.d.ts +1662 -16
- package/dist/engagement/chat/router/index.d.ts.map +1 -1
- package/dist/engagement/chat/router/index.js +302 -27
- package/dist/engagement/chat/router/index.js.map +1 -1
- package/dist/engagement/chat/schema/index.d.ts +1621 -0
- package/dist/engagement/chat/schema/index.d.ts.map +1 -1
- package/dist/engagement/chat/schema/index.js +192 -4
- package/dist/engagement/chat/schema/index.js.map +1 -1
- package/dist/engagement/chat/service/chat-ban.service.d.ts +26 -0
- package/dist/engagement/chat/service/chat-ban.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-ban.service.js +144 -0
- package/dist/engagement/chat/service/chat-ban.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-message-moderation.service.d.ts +14 -0
- package/dist/engagement/chat/service/chat-message-moderation.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-message-moderation.service.js +48 -0
- package/dist/engagement/chat/service/chat-message-moderation.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts +22 -0
- package/dist/engagement/chat/service/chat-moderation-expiry.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-moderation-expiry.service.js +80 -0
- package/dist/engagement/chat/service/chat-moderation-expiry.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-moderation.service.d.ts +30 -0
- package/dist/engagement/chat/service/chat-moderation.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-moderation.service.js +40 -0
- package/dist/engagement/chat/service/chat-moderation.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-mute.service.d.ts +26 -0
- package/dist/engagement/chat/service/chat-mute.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-mute.service.js +159 -0
- package/dist/engagement/chat/service/chat-mute.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-room-ban.service.d.ts +29 -0
- package/dist/engagement/chat/service/chat-room-ban.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-room-ban.service.js +107 -0
- package/dist/engagement/chat/service/chat-room-ban.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-room-membership.service.d.ts +107 -0
- package/dist/engagement/chat/service/chat-room-membership.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-room-membership.service.js +536 -0
- package/dist/engagement/chat/service/chat-room-membership.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-room-mute.service.d.ts +25 -0
- package/dist/engagement/chat/service/chat-room-mute.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-room-mute.service.js +89 -0
- package/dist/engagement/chat/service/chat-room-mute.service.js.map +1 -0
- package/dist/engagement/chat/service/chat-room-purge.service.d.ts +13 -0
- package/dist/engagement/chat/service/chat-room-purge.service.d.ts.map +1 -0
- package/dist/engagement/chat/service/chat-room-purge.service.js +75 -0
- package/dist/engagement/chat/service/chat-room-purge.service.js.map +1 -0
- package/dist/engagement/chat/service/chat.service.d.ts +1144 -35
- package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
- package/dist/engagement/chat/service/chat.service.js +1243 -70
- package/dist/engagement/chat/service/chat.service.js.map +1 -1
- package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts +42 -0
- package/dist/engagement/chat/service/errors/chat-moderation.errors.d.ts.map +1 -0
- package/dist/engagement/chat/service/errors/chat-moderation.errors.js +32 -0
- package/dist/engagement/chat/service/errors/chat-moderation.errors.js.map +1 -0
- package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts +2 -0
- package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.d.ts.map +1 -0
- package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js +98 -0
- package/dist/engagement/chat-commands/__tests__/migration-upgrade.int.test.js.map +1 -0
- package/dist/engagement/chat-commands/contract/index.d.ts +201 -0
- package/dist/engagement/chat-commands/contract/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/contract/index.js +70 -0
- package/dist/engagement/chat-commands/contract/index.js.map +1 -0
- package/dist/engagement/chat-commands/drizzle/migrations/0000_daffy_lady_bullseye.sql +24 -0
- package/dist/engagement/chat-commands/drizzle/migrations/0001_sturdy_barracuda.sql +1 -0
- package/dist/engagement/chat-commands/drizzle/migrations/0002_single_currency_command_limits.sql +45 -0
- package/dist/engagement/chat-commands/drizzle/migrations/meta/0000_snapshot.json +164 -0
- package/dist/engagement/chat-commands/drizzle/migrations/meta/0001_snapshot.json +83 -0
- package/dist/engagement/chat-commands/drizzle/migrations/meta/0002_snapshot.json +83 -0
- package/dist/engagement/chat-commands/drizzle/migrations/meta/_journal.json +27 -0
- package/dist/engagement/chat-commands/drizzle.config.d.ts +4 -0
- package/dist/engagement/chat-commands/drizzle.config.d.ts.map +1 -0
- package/dist/engagement/chat-commands/drizzle.config.js +21 -0
- package/dist/engagement/chat-commands/drizzle.config.js.map +1 -0
- package/dist/engagement/chat-commands/migrate.d.ts +2 -0
- package/dist/engagement/chat-commands/migrate.d.ts.map +1 -0
- package/dist/engagement/chat-commands/migrate.js +20 -0
- package/dist/engagement/chat-commands/migrate.js.map +1 -0
- package/dist/engagement/chat-commands/plugin.d.ts +184 -0
- package/dist/engagement/chat-commands/plugin.d.ts.map +1 -0
- package/dist/engagement/chat-commands/plugin.js +15 -0
- package/dist/engagement/chat-commands/plugin.js.map +1 -0
- package/dist/engagement/chat-commands/router/index.d.ts +137 -0
- package/dist/engagement/chat-commands/router/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/router/index.js +24 -0
- package/dist/engagement/chat-commands/router/index.js.map +1 -0
- package/dist/engagement/chat-commands/schema/index.d.ts +140 -0
- package/dist/engagement/chat-commands/schema/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/schema/index.js +13 -0
- package/dist/engagement/chat-commands/schema/index.js.map +1 -0
- package/dist/engagement/chat-commands/seed/index.d.ts +3 -0
- package/dist/engagement/chat-commands/seed/index.d.ts.map +1 -0
- package/dist/engagement/chat-commands/seed/index.js +66 -0
- package/dist/engagement/chat-commands/seed/index.js.map +1 -0
- package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts +2 -0
- package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.d.ts.map +1 -0
- package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js +157 -0
- package/dist/engagement/chat-commands/service/__tests__/chat-commands.service.test.js.map +1 -0
- package/dist/engagement/chat-commands/service/chat-commands.service.d.ts +60 -0
- package/dist/engagement/chat-commands/service/chat-commands.service.d.ts.map +1 -0
- package/dist/engagement/chat-commands/service/chat-commands.service.js +147 -0
- package/dist/engagement/chat-commands/service/chat-commands.service.js.map +1 -0
- package/dist/engagement/contracts.d.ts +2 -0
- package/dist/engagement/contracts.d.ts.map +1 -1
- package/dist/engagement/contracts.js +2 -0
- package/dist/engagement/contracts.js.map +1 -1
- package/dist/engagement/index.d.ts +2 -0
- package/dist/engagement/index.d.ts.map +1 -1
- package/dist/engagement/index.js +2 -0
- package/dist/engagement/index.js.map +1 -1
- package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts +2 -0
- package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.d.ts.map +1 -0
- package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js +184 -0
- package/dist/engagement/notifications/__tests__/chat-room-notifications.int.test.js.map +1 -0
- package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts +2 -0
- package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts.map +1 -0
- package/dist/engagement/notifications/__tests__/notification-event-map.test.js +319 -0
- package/dist/engagement/notifications/__tests__/notification-event-map.test.js.map +1 -0
- package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts +2 -0
- package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts.map +1 -0
- package/dist/engagement/notifications/__tests__/notifications.router.int.test.js +148 -0
- package/dist/engagement/notifications/__tests__/notifications.router.int.test.js.map +1 -0
- package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts +2 -0
- package/dist/engagement/notifications/__tests__/notifications.service.int.test.d.ts.map +1 -0
- package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +298 -0
- package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -0
- package/dist/engagement/notifications/contract/index.d.ts +126 -13
- package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
- package/dist/engagement/notifications/contract/index.js +46 -5
- package/dist/engagement/notifications/contract/index.js.map +1 -1
- package/dist/engagement/notifications/drizzle/migrations/0001_classy_pixie.sql +1 -0
- package/dist/engagement/notifications/drizzle/migrations/0002_open_madame_web.sql +2 -0
- package/dist/engagement/notifications/drizzle/migrations/meta/0001_snapshot.json +98 -0
- package/dist/engagement/notifications/drizzle/migrations/meta/0002_snapshot.json +119 -0
- package/dist/engagement/notifications/drizzle/migrations/meta/_journal.json +14 -0
- package/dist/engagement/notifications/plugin.d.ts +200 -1
- package/dist/engagement/notifications/plugin.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.js +431 -47
- package/dist/engagement/notifications/plugin.js.map +1 -1
- package/dist/engagement/notifications/react/notifications.d.ts +20 -0
- package/dist/engagement/notifications/react/notifications.d.ts.map +1 -0
- package/dist/engagement/notifications/react/notifications.js +39 -0
- package/dist/engagement/notifications/react/notifications.js.map +1 -0
- package/dist/engagement/notifications/router/index.d.ts +74 -13
- package/dist/engagement/notifications/router/index.d.ts.map +1 -1
- package/dist/engagement/notifications/router/index.js +37 -16
- package/dist/engagement/notifications/router/index.js.map +1 -1
- package/dist/engagement/notifications/schema/index.d.ts +36 -0
- package/dist/engagement/notifications/schema/index.d.ts.map +1 -1
- package/dist/engagement/notifications/schema/index.js +7 -2
- package/dist/engagement/notifications/schema/index.js.map +1 -1
- package/dist/engagement/notifications/service/notifications.service.d.ts +33 -21
- package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
- package/dist/engagement/notifications/service/notifications.service.js +41 -11
- package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
- package/dist/engagement/react.d.ts +1 -1
- package/dist/engagement/react.d.ts.map +1 -1
- package/dist/engagement/react.js +2 -2
- package/dist/engagement/react.js.map +1 -1
- package/dist/engagement/server.d.ts +2 -0
- package/dist/engagement/server.d.ts.map +1 -1
- package/dist/engagement/server.js +2 -0
- package/dist/engagement/server.js.map +1 -1
- package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts +2 -0
- package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts.map +1 -0
- package/dist/engagement/social/__tests__/social.plugin.int.test.js +100 -0
- package/dist/engagement/social/__tests__/social.plugin.int.test.js.map +1 -0
- package/dist/engagement/social/__tests__/social.router.int.test.d.ts +2 -0
- package/dist/engagement/social/__tests__/social.router.int.test.d.ts.map +1 -0
- package/dist/engagement/social/__tests__/social.router.int.test.js +215 -0
- package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -0
- package/dist/engagement/social/__tests__/social.service.int.test.d.ts +2 -0
- package/dist/engagement/social/__tests__/social.service.int.test.d.ts.map +1 -0
- package/dist/engagement/social/__tests__/social.service.int.test.js +810 -0
- package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -0
- package/dist/engagement/social/contract/index.d.ts +187 -0
- package/dist/engagement/social/contract/index.d.ts.map +1 -0
- package/dist/engagement/social/contract/index.js +107 -0
- package/dist/engagement/social/contract/index.js.map +1 -0
- package/dist/engagement/social/drizzle/migrations/0000_fine_jamie_braddock.sql +24 -0
- package/dist/engagement/social/drizzle/migrations/0001_lame_eddie_brock.sql +10 -0
- package/dist/engagement/social/drizzle/migrations/0002_foamy_saracen.sql +1 -0
- package/dist/engagement/social/drizzle/migrations/0003_fuzzy_shadow_king.sql +4 -0
- package/dist/engagement/social/drizzle/migrations/0004_friendship-cancel-constraint.sql +2 -0
- package/dist/engagement/social/drizzle/migrations/meta/0000_snapshot.json +232 -0
- package/dist/engagement/social/drizzle/migrations/meta/0001_snapshot.json +129 -0
- package/dist/engagement/social/drizzle/migrations/meta/0002_snapshot.json +134 -0
- package/dist/engagement/social/drizzle/migrations/meta/0003_snapshot.json +145 -0
- package/dist/engagement/social/drizzle/migrations/meta/0004_snapshot.json +145 -0
- package/dist/engagement/social/drizzle/migrations/meta/_journal.json +41 -0
- package/dist/engagement/social/drizzle.config.d.ts +4 -0
- package/dist/engagement/social/drizzle.config.d.ts.map +1 -0
- package/dist/engagement/social/drizzle.config.js +21 -0
- package/dist/engagement/social/drizzle.config.js.map +1 -0
- package/dist/engagement/social/index.d.ts +3 -0
- package/dist/engagement/social/index.d.ts.map +1 -0
- package/dist/engagement/social/index.js +6 -0
- package/dist/engagement/social/index.js.map +1 -0
- package/dist/engagement/social/migrate.d.ts +5 -0
- package/dist/engagement/social/migrate.d.ts.map +1 -0
- package/dist/engagement/social/migrate.js +17 -0
- package/dist/engagement/social/migrate.js.map +1 -0
- package/dist/engagement/social/plugin.d.ts +184 -0
- package/dist/engagement/social/plugin.d.ts.map +1 -0
- package/dist/engagement/social/plugin.js +17 -0
- package/dist/engagement/social/plugin.js.map +1 -0
- package/dist/engagement/social/router/index.d.ts +98 -0
- package/dist/engagement/social/router/index.d.ts.map +1 -0
- package/dist/engagement/social/router/index.js +68 -0
- package/dist/engagement/social/router/index.js.map +1 -0
- package/dist/engagement/social/schema/index.d.ts +145 -0
- package/dist/engagement/social/schema/index.d.ts.map +1 -0
- package/dist/engagement/social/schema/index.js +24 -0
- package/dist/engagement/social/schema/index.js.map +1 -0
- package/dist/engagement/social/service/social.service.d.ts +73 -0
- package/dist/engagement/social/service/social.service.d.ts.map +1 -0
- package/dist/engagement/social/service/social.service.js +479 -0
- package/dist/engagement/social/service/social.service.js.map +1 -0
- package/dist/fx/contracts.d.ts +2 -0
- package/dist/fx/contracts.d.ts.map +1 -0
- package/dist/fx/contracts.js +2 -0
- package/dist/fx/contracts.js.map +1 -0
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts +2 -0
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.d.ts.map +1 -0
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js +236 -0
- package/dist/fx/exchange-rate/__tests__/exchange-rate-reader.service.int.test.js.map +1 -0
- package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts +2 -0
- package/dist/fx/exchange-rate/__tests__/select-provider.test.d.ts.map +1 -0
- package/dist/fx/exchange-rate/__tests__/select-provider.test.js +26 -0
- package/dist/fx/exchange-rate/__tests__/select-provider.test.js.map +1 -0
- package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts +59 -0
- package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.d.ts.map +1 -0
- package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js +212 -0
- package/dist/fx/exchange-rate/adapters/exchange-rate-reader.service.js.map +1 -0
- package/dist/fx/exchange-rate/contract/index.d.ts +44 -0
- package/dist/fx/exchange-rate/contract/index.d.ts.map +1 -0
- package/dist/fx/exchange-rate/contract/index.js +30 -0
- package/dist/fx/exchange-rate/contract/index.js.map +1 -0
- package/dist/fx/exchange-rate/drizzle/migrations/0000_hot_trauma.sql +10 -0
- package/dist/fx/exchange-rate/drizzle/migrations/meta/0000_snapshot.json +92 -0
- package/dist/fx/exchange-rate/drizzle/migrations/meta/_journal.json +13 -0
- package/dist/fx/exchange-rate/drizzle.config.d.ts +4 -0
- package/dist/fx/exchange-rate/drizzle.config.d.ts.map +1 -0
- package/dist/fx/exchange-rate/drizzle.config.js +18 -0
- package/dist/fx/exchange-rate/drizzle.config.js.map +1 -0
- package/dist/fx/exchange-rate/index.d.ts +3 -0
- package/dist/fx/exchange-rate/index.d.ts.map +1 -0
- package/dist/fx/exchange-rate/index.js +3 -0
- package/dist/fx/exchange-rate/index.js.map +1 -0
- package/dist/fx/exchange-rate/migrate.d.ts +5 -0
- package/dist/fx/exchange-rate/migrate.d.ts.map +1 -0
- package/dist/fx/exchange-rate/migrate.js +14 -0
- package/dist/fx/exchange-rate/migrate.js.map +1 -0
- package/dist/fx/exchange-rate/plugin.d.ts +183 -0
- package/dist/fx/exchange-rate/plugin.d.ts.map +1 -0
- package/dist/fx/exchange-rate/plugin.js +42 -0
- package/dist/fx/exchange-rate/plugin.js.map +1 -0
- package/dist/fx/exchange-rate/react/exchange-rate.d.ts +12 -0
- package/dist/fx/exchange-rate/react/exchange-rate.d.ts.map +1 -0
- package/dist/fx/exchange-rate/react/exchange-rate.js +17 -0
- package/dist/fx/exchange-rate/react/exchange-rate.js.map +1 -0
- package/dist/fx/exchange-rate/router/index.d.ts +22 -0
- package/dist/fx/exchange-rate/router/index.d.ts.map +1 -0
- package/dist/fx/exchange-rate/router/index.js +18 -0
- package/dist/fx/exchange-rate/router/index.js.map +1 -0
- package/dist/fx/exchange-rate/schema/index.d.ts +116 -0
- package/dist/fx/exchange-rate/schema/index.d.ts.map +1 -0
- package/dist/fx/exchange-rate/schema/index.js +18 -0
- package/dist/fx/exchange-rate/schema/index.js.map +1 -0
- package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts +22 -0
- package/dist/fx/exchange-rate/service/exchange-rate.service.d.ts.map +1 -0
- package/dist/fx/exchange-rate/service/exchange-rate.service.js +38 -0
- package/dist/fx/exchange-rate/service/exchange-rate.service.js.map +1 -0
- package/dist/fx/index.d.ts +2 -0
- package/dist/fx/index.d.ts.map +1 -0
- package/dist/fx/index.js +2 -0
- package/dist/fx/index.js.map +1 -0
- package/dist/fx/react.d.ts +2 -0
- package/dist/fx/react.d.ts.map +1 -0
- package/dist/fx/react.js +2 -0
- package/dist/fx/react.js.map +1 -0
- package/dist/fx/server.d.ts +2 -0
- package/dist/fx/server.d.ts.map +1 -0
- package/dist/fx/server.js +2 -0
- package/dist/fx/server.js.map +1 -0
- package/dist/iam/__tests__/admin-player-activity.int.test.d.ts +2 -0
- package/dist/iam/__tests__/admin-player-activity.int.test.d.ts.map +1 -0
- package/dist/iam/__tests__/admin-player-activity.int.test.js +119 -0
- package/dist/iam/__tests__/admin-player-activity.int.test.js.map +1 -0
- package/dist/iam/__tests__/iam.service.int.test.d.ts +2 -0
- package/dist/iam/__tests__/iam.service.int.test.d.ts.map +1 -0
- package/dist/iam/__tests__/iam.service.int.test.js +580 -0
- package/dist/iam/__tests__/iam.service.int.test.js.map +1 -0
- package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
- package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
- package/dist/iam/adapters/admin-player-activity.js +106 -0
- package/dist/iam/adapters/admin-player-activity.js.map +1 -0
- package/dist/iam/adapters/admin-role-assignment-directory.d.ts +8 -0
- package/dist/iam/adapters/admin-role-assignment-directory.d.ts.map +1 -0
- package/dist/iam/adapters/admin-role-assignment-directory.js +23 -0
- package/dist/iam/adapters/admin-role-assignment-directory.js.map +1 -0
- package/dist/iam/contract/index.d.ts +58 -0
- package/dist/iam/contract/index.d.ts.map +1 -1
- package/dist/iam/contract/index.js +30 -4
- package/dist/iam/contract/index.js.map +1 -1
- package/dist/iam/plugin.d.ts +183 -1
- package/dist/iam/plugin.d.ts.map +1 -1
- package/dist/iam/plugin.js +10 -5
- package/dist/iam/plugin.js.map +1 -1
- package/dist/iam/router/index.d.ts +37 -0
- package/dist/iam/router/index.d.ts.map +1 -1
- package/dist/iam/router/index.js +7 -1
- package/dist/iam/router/index.js.map +1 -1
- package/dist/iam/seed/data/default-admin-roles.d.ts.map +1 -1
- package/dist/iam/seed/data/default-admin-roles.js +5 -0
- package/dist/iam/seed/data/default-admin-roles.js.map +1 -1
- package/dist/iam/service/iam.service.d.ts +55 -26
- package/dist/iam/service/iam.service.d.ts.map +1 -1
- package/dist/iam/service/iam.service.js +122 -17
- package/dist/iam/service/iam.service.js.map +1 -1
- package/dist/mail/__tests__/default-email-template-renderer.test.d.ts +2 -0
- package/dist/mail/__tests__/default-email-template-renderer.test.d.ts.map +1 -0
- package/dist/mail/__tests__/default-email-template-renderer.test.js +119 -0
- package/dist/mail/__tests__/default-email-template-renderer.test.js.map +1 -0
- package/dist/mail/__tests__/mail.service.test.d.ts +2 -0
- package/dist/mail/__tests__/mail.service.test.d.ts.map +1 -0
- package/dist/mail/__tests__/mail.service.test.js +215 -0
- package/dist/mail/__tests__/mail.service.test.js.map +1 -0
- package/dist/mail/adapters/default-email-template-renderer.d.ts +5 -0
- package/dist/mail/adapters/default-email-template-renderer.d.ts.map +1 -0
- package/dist/mail/adapters/default-email-template-renderer.js +118 -0
- package/dist/mail/adapters/default-email-template-renderer.js.map +1 -0
- package/dist/mail/adapters/stdout-email-sender.d.ts +5 -0
- package/dist/mail/adapters/stdout-email-sender.d.ts.map +1 -0
- package/dist/mail/adapters/stdout-email-sender.js +8 -0
- package/dist/mail/adapters/stdout-email-sender.js.map +1 -0
- package/dist/mail/contract/index.d.ts +133 -0
- package/dist/mail/contract/index.d.ts.map +1 -0
- package/dist/mail/contract/index.js +17 -0
- package/dist/mail/contract/index.js.map +1 -0
- package/dist/mail/index.d.ts +5 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +5 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/plugin.d.ts +183 -0
- package/dist/mail/plugin.d.ts.map +1 -0
- package/dist/mail/plugin.js +66 -0
- package/dist/mail/plugin.js.map +1 -0
- package/dist/mail/service/mail-payload.service.d.ts +8 -0
- package/dist/mail/service/mail-payload.service.d.ts.map +1 -0
- package/dist/mail/service/mail-payload.service.js +43 -0
- package/dist/mail/service/mail-payload.service.js.map +1 -0
- package/dist/mail/service/mail.service.d.ts +30 -0
- package/dist/mail/service/mail.service.d.ts.map +1 -0
- package/dist/mail/service/mail.service.js +152 -0
- package/dist/mail/service/mail.service.js.map +1 -0
- package/dist/pam/identity/__tests__/admin-security.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/admin-security.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/admin-security.int.test.js +137 -0
- package/dist/pam/identity/__tests__/admin-security.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/admin-user-directory.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/admin-user-directory.int.test.js +234 -0
- package/dist/pam/identity/__tests__/admin-user-directory.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/device-fingerprint.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/device-fingerprint.test.js +105 -0
- package/dist/pam/identity/__tests__/device-fingerprint.test.js.map +1 -0
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js +197 -0
- package/dist/pam/identity/__tests__/identity.rate-limit.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js +119 -0
- package/dist/pam/identity/__tests__/identity.registration-gates.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/identity.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/identity.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/identity.service.int.test.js +915 -0
- package/dist/pam/identity/__tests__/identity.service.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/login-enforcement.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js +99 -0
- package/dist/pam/identity/__tests__/login-enforcement.service.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/phone-login.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/phone-login.service.int.test.js +394 -0
- package/dist/pam/identity/__tests__/phone-login.service.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.js +273 -0
- package/dist/pam/identity/__tests__/phone-verification.service.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/play-eligibility.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/play-eligibility.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/play-eligibility.test.js +30 -0
- package/dist/pam/identity/__tests__/play-eligibility.test.js.map +1 -0
- package/dist/pam/identity/__tests__/rg-guard.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/rg-guard.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/rg-guard.test.js +21 -0
- package/dist/pam/identity/__tests__/rg-guard.test.js.map +1 -0
- package/dist/pam/identity/__tests__/session.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/session.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/session.service.int.test.js +88 -0
- package/dist/pam/identity/__tests__/session.service.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/two-factor-delivery.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/two-factor-delivery.test.js +23 -0
- package/dist/pam/identity/__tests__/two-factor-delivery.test.js.map +1 -0
- package/dist/pam/identity/__tests__/user-commands.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/user-commands.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/user-commands.int.test.js +33 -0
- package/dist/pam/identity/__tests__/user-commands.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/username-backfill.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/username-backfill.int.test.js +103 -0
- package/dist/pam/identity/__tests__/username-backfill.int.test.js.map +1 -0
- package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts +2 -0
- package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.d.ts.map +1 -0
- package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js +171 -0
- package/dist/pam/identity/__tests__/withdrawal-pin.service.int.test.js.map +1 -0
- package/dist/pam/identity/adapters/identity-reader.service.d.ts +9 -4
- package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
- package/dist/pam/identity/adapters/identity-reader.service.js +61 -2
- package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
- package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts +3 -3
- package/dist/pam/identity/adapters/mock/mock-kyc-adapter.d.ts.map +1 -1
- package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js +3 -3
- package/dist/pam/identity/adapters/mock/mock-kyc-adapter.js.map +1 -1
- package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts +8 -0
- package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts.map +1 -0
- package/dist/pam/identity/adapters/mock/mock-sms-adapter.js +7 -0
- package/dist/pam/identity/adapters/mock/mock-sms-adapter.js.map +1 -0
- package/dist/pam/identity/admin-user-directory.d.ts +40 -8
- package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
- package/dist/pam/identity/admin-user-directory.js +92 -35
- package/dist/pam/identity/admin-user-directory.js.map +1 -1
- package/dist/pam/identity/contract/index.d.ts +397 -16
- package/dist/pam/identity/contract/index.d.ts.map +1 -1
- package/dist/pam/identity/contract/index.js +187 -7
- package/dist/pam/identity/contract/index.js.map +1 -1
- package/dist/pam/identity/drizzle/migrations/0001_rainy_peter_quill.sql +18 -0
- package/dist/pam/identity/drizzle/migrations/0002_outstanding_patriot.sql +1 -0
- package/dist/pam/identity/drizzle/migrations/0003_open_shotgun.sql +1 -0
- package/dist/pam/identity/drizzle/migrations/0004_round_giant_girl.sql +1 -0
- package/dist/pam/identity/drizzle/migrations/0005_daily_black_tom.sql +1 -0
- package/dist/pam/identity/drizzle/migrations/0006_brave_sabra.sql +1 -0
- package/dist/pam/identity/drizzle/migrations/0007_fuzzy_barracuda.sql +44 -0
- package/dist/pam/identity/drizzle/migrations/0008_pink_bucky.sql +23 -0
- package/dist/pam/identity/drizzle/migrations/0009_hard_sauron.sql +2 -0
- package/dist/pam/identity/drizzle/migrations/0010_lying_young_avengers.sql +19 -0
- package/dist/pam/identity/drizzle/migrations/0011_useful_the_executioner.sql +2 -0
- package/dist/pam/identity/drizzle/migrations/0012_worried_nuke.sql +2 -0
- package/dist/pam/identity/drizzle/migrations/0013_backfill_two_factor_method.sql +6 -0
- package/dist/pam/identity/drizzle/migrations/meta/0001_snapshot.json +684 -0
- package/dist/pam/identity/drizzle/migrations/meta/0002_snapshot.json +690 -0
- package/dist/pam/identity/drizzle/migrations/meta/0003_snapshot.json +695 -0
- package/dist/pam/identity/drizzle/migrations/meta/0004_snapshot.json +680 -0
- package/dist/pam/identity/drizzle/migrations/meta/0005_snapshot.json +695 -0
- package/dist/pam/identity/drizzle/migrations/meta/0006_snapshot.json +701 -0
- package/dist/pam/identity/drizzle/migrations/meta/0007_snapshot.json +737 -0
- package/dist/pam/identity/drizzle/migrations/meta/0008_snapshot.json +913 -0
- package/dist/pam/identity/drizzle/migrations/meta/0009_snapshot.json +926 -0
- package/dist/pam/identity/drizzle/migrations/meta/0010_snapshot.json +1066 -0
- package/dist/pam/identity/drizzle/migrations/meta/0011_snapshot.json +1078 -0
- package/dist/pam/identity/drizzle/migrations/meta/0012_snapshot.json +1090 -0
- package/dist/pam/identity/drizzle/migrations/meta/0013_snapshot.json +1090 -0
- package/dist/pam/identity/drizzle/migrations/meta/_journal.json +91 -0
- package/dist/pam/identity/plugin.d.ts +182 -1
- package/dist/pam/identity/plugin.d.ts.map +1 -1
- package/dist/pam/identity/plugin.js +133 -18
- package/dist/pam/identity/plugin.js.map +1 -1
- package/dist/pam/identity/react/account.d.ts +78 -13
- package/dist/pam/identity/react/account.d.ts.map +1 -1
- package/dist/pam/identity/react/account.js +76 -6
- package/dist/pam/identity/react/account.js.map +1 -1
- package/dist/pam/identity/react/auth.d.ts +22 -13
- package/dist/pam/identity/react/auth.d.ts.map +1 -1
- package/dist/pam/identity/router/index.d.ts +348 -17
- package/dist/pam/identity/router/index.d.ts.map +1 -1
- package/dist/pam/identity/router/index.js +139 -14
- package/dist/pam/identity/router/index.js.map +1 -1
- package/dist/pam/identity/schema/index.d.ts +807 -0
- package/dist/pam/identity/schema/index.d.ts.map +1 -1
- package/dist/pam/identity/schema/index.js +107 -3
- package/dist/pam/identity/schema/index.js.map +1 -1
- package/dist/pam/identity/service/admin-security.service.d.ts +84 -0
- package/dist/pam/identity/service/admin-security.service.d.ts.map +1 -0
- package/dist/pam/identity/service/admin-security.service.js +280 -0
- package/dist/pam/identity/service/admin-security.service.js.map +1 -0
- package/dist/pam/identity/service/capture-timezone.service.d.ts +10 -0
- package/dist/pam/identity/service/capture-timezone.service.d.ts.map +1 -0
- package/dist/pam/identity/service/capture-timezone.service.js +21 -0
- package/dist/pam/identity/service/capture-timezone.service.js.map +1 -0
- package/dist/pam/identity/service/device-fingerprint.service.d.ts +32 -0
- package/dist/pam/identity/service/device-fingerprint.service.d.ts.map +1 -0
- package/dist/pam/identity/service/device-fingerprint.service.js +79 -0
- package/dist/pam/identity/service/device-fingerprint.service.js.map +1 -0
- package/dist/pam/identity/service/fresh-reauthentication.service.d.ts +21 -0
- package/dist/pam/identity/service/fresh-reauthentication.service.d.ts.map +1 -0
- package/dist/pam/identity/service/fresh-reauthentication.service.js +45 -0
- package/dist/pam/identity/service/fresh-reauthentication.service.js.map +1 -0
- package/dist/pam/identity/service/identity.service.d.ts +194 -40
- package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
- package/dist/pam/identity/service/identity.service.js +1311 -142
- package/dist/pam/identity/service/identity.service.js.map +1 -1
- package/dist/pam/identity/service/lockout-policy.service.d.ts +30 -0
- package/dist/pam/identity/service/lockout-policy.service.d.ts.map +1 -0
- package/dist/pam/identity/service/lockout-policy.service.js +40 -0
- package/dist/pam/identity/service/lockout-policy.service.js.map +1 -0
- package/dist/pam/identity/service/phone-login.service.d.ts +65 -0
- package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -0
- package/dist/pam/identity/service/phone-login.service.js +393 -0
- package/dist/pam/identity/service/phone-login.service.js.map +1 -0
- package/dist/pam/identity/service/phone-verification.service.d.ts +37 -0
- package/dist/pam/identity/service/phone-verification.service.d.ts.map +1 -0
- package/dist/pam/identity/service/phone-verification.service.js +221 -0
- package/dist/pam/identity/service/phone-verification.service.js.map +1 -0
- package/dist/pam/identity/service/play-eligibility.service.d.ts +8 -0
- package/dist/pam/identity/service/play-eligibility.service.d.ts.map +1 -0
- package/dist/pam/identity/service/play-eligibility.service.js +21 -0
- package/dist/pam/identity/service/play-eligibility.service.js.map +1 -0
- package/dist/pam/identity/service/rg-guard.service.d.ts +37 -0
- package/dist/pam/identity/service/rg-guard.service.d.ts.map +1 -0
- package/dist/pam/identity/service/rg-guard.service.js +60 -0
- package/dist/pam/identity/service/rg-guard.service.js.map +1 -0
- package/dist/pam/identity/service/security-controls.service.d.ts +4 -0
- package/dist/pam/identity/service/security-controls.service.d.ts.map +1 -0
- package/dist/pam/identity/service/security-controls.service.js +31 -0
- package/dist/pam/identity/service/security-controls.service.js.map +1 -0
- package/dist/pam/identity/service/session.service.d.ts +63 -6
- package/dist/pam/identity/service/session.service.d.ts.map +1 -1
- package/dist/pam/identity/service/session.service.js +113 -21
- package/dist/pam/identity/service/session.service.js.map +1 -1
- package/dist/pam/identity/service/trusted-device.service.d.ts +56 -0
- package/dist/pam/identity/service/trusted-device.service.d.ts.map +1 -0
- package/dist/pam/identity/service/trusted-device.service.js +157 -0
- package/dist/pam/identity/service/trusted-device.service.js.map +1 -0
- package/dist/pam/identity/service/two-factor-challenge.service.d.ts +36 -0
- package/dist/pam/identity/service/two-factor-challenge.service.d.ts.map +1 -0
- package/dist/pam/identity/service/two-factor-challenge.service.js +30 -0
- package/dist/pam/identity/service/two-factor-challenge.service.js.map +1 -0
- package/dist/pam/identity/service/two-factor-delivery.service.d.ts +67 -0
- package/dist/pam/identity/service/two-factor-delivery.service.d.ts.map +1 -0
- package/dist/pam/identity/service/two-factor-delivery.service.js +135 -0
- package/dist/pam/identity/service/two-factor-delivery.service.js.map +1 -0
- package/dist/pam/identity/service/two-factor-lockout.service.d.ts +25 -0
- package/dist/pam/identity/service/two-factor-lockout.service.d.ts.map +1 -0
- package/dist/pam/identity/service/two-factor-lockout.service.js +121 -0
- package/dist/pam/identity/service/two-factor-lockout.service.js.map +1 -0
- package/dist/pam/identity/service/user-commands.service.d.ts +11 -0
- package/dist/pam/identity/service/user-commands.service.d.ts.map +1 -0
- package/dist/pam/identity/service/user-commands.service.js +32 -0
- package/dist/pam/identity/service/user-commands.service.js.map +1 -0
- package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts +3 -0
- package/dist/pam/identity/service/withdrawal-pin-hash.service.d.ts.map +1 -0
- package/dist/pam/identity/service/withdrawal-pin-hash.service.js +10 -0
- package/dist/pam/identity/service/withdrawal-pin-hash.service.js.map +1 -0
- package/dist/pam/identity/service/withdrawal-pin.service.d.ts +34 -0
- package/dist/pam/identity/service/withdrawal-pin.service.d.ts.map +1 -0
- package/dist/pam/identity/service/withdrawal-pin.service.js +130 -0
- package/dist/pam/identity/service/withdrawal-pin.service.js.map +1 -0
- package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts +2 -0
- package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.d.ts.map +1 -0
- package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js +81 -0
- package/dist/pam/player-management/__tests__/kyc-status-writer.int.test.js.map +1 -0
- package/dist/pam/player-management/__tests__/player.router.int.test.d.ts +2 -0
- package/dist/pam/player-management/__tests__/player.router.int.test.d.ts.map +1 -0
- package/dist/pam/player-management/__tests__/player.router.int.test.js +107 -0
- package/dist/pam/player-management/__tests__/player.router.int.test.js.map +1 -0
- package/dist/pam/player-management/__tests__/player.service.int.test.d.ts +2 -0
- package/dist/pam/player-management/__tests__/player.service.int.test.d.ts.map +1 -0
- package/dist/pam/player-management/__tests__/player.service.int.test.js +479 -0
- package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -0
- package/dist/pam/player-management/contract/index.d.ts +125 -15
- package/dist/pam/player-management/contract/index.d.ts.map +1 -1
- package/dist/pam/player-management/contract/index.js +35 -5
- package/dist/pam/player-management/contract/index.js.map +1 -1
- package/dist/pam/player-management/plugin.d.ts +182 -1
- package/dist/pam/player-management/plugin.d.ts.map +1 -1
- package/dist/pam/player-management/plugin.js +11 -8
- package/dist/pam/player-management/plugin.js.map +1 -1
- package/dist/pam/player-management/router/index.d.ts +95 -15
- package/dist/pam/player-management/router/index.d.ts.map +1 -1
- package/dist/pam/player-management/router/index.js +54 -17
- package/dist/pam/player-management/router/index.js.map +1 -1
- package/dist/pam/player-management/service/kyc-status-writer.d.ts +5 -7
- package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
- package/dist/pam/player-management/service/kyc-status-writer.js +23 -19
- package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
- package/dist/pam/player-management/service/player.service.d.ts +65 -22
- package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
- package/dist/pam/player-management/service/player.service.js +148 -43
- package/dist/pam/player-management/service/player.service.js.map +1 -1
- package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts +2 -0
- package/dist/pam/player-note/__tests__/player-note.router.int.test.d.ts.map +1 -0
- package/dist/pam/player-note/__tests__/player-note.router.int.test.js +52 -0
- package/dist/pam/player-note/__tests__/player-note.router.int.test.js.map +1 -0
- package/dist/pam/player-note/contract/index.d.ts +14 -0
- package/dist/pam/player-note/contract/index.d.ts.map +1 -1
- package/dist/pam/player-note/contract/index.js +8 -2
- package/dist/pam/player-note/contract/index.js.map +1 -1
- package/dist/pam/player-note/plugin.d.ts +182 -1
- package/dist/pam/player-note/plugin.d.ts.map +1 -1
- package/dist/pam/player-note/plugin.js +6 -4
- package/dist/pam/player-note/plugin.js.map +1 -1
- package/dist/pam/player-note/router/index.d.ts +10 -1
- package/dist/pam/player-note/router/index.d.ts.map +1 -1
- package/dist/pam/player-note/router/index.js +20 -3
- package/dist/pam/player-note/router/index.js.map +1 -1
- package/dist/pam/player-note/service/player-note.service.d.ts +5 -3
- package/dist/pam/player-note/service/player-note.service.d.ts.map +1 -1
- package/dist/pam/player-note/service/player-note.service.js +5 -3
- package/dist/pam/player-note/service/player-note.service.js.map +1 -1
- package/dist/pam/profile/__tests__/profile.service.int.test.d.ts +2 -0
- package/dist/pam/profile/__tests__/profile.service.int.test.d.ts.map +1 -0
- package/dist/pam/profile/__tests__/profile.service.int.test.js +296 -0
- package/dist/pam/profile/__tests__/profile.service.int.test.js.map +1 -0
- package/dist/pam/profile/contract/index.d.ts +74 -36
- package/dist/pam/profile/contract/index.d.ts.map +1 -1
- package/dist/pam/profile/contract/index.js +16 -1
- package/dist/pam/profile/contract/index.js.map +1 -1
- package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
- package/dist/pam/profile/drizzle/migrations/0002_sour_alex_wilder.sql +7 -0
- package/dist/pam/profile/drizzle/migrations/0003_absurd_morbius.sql +4 -0
- package/dist/pam/profile/drizzle/migrations/0004_fuzzy_korvac.sql +1 -0
- package/dist/pam/profile/drizzle/migrations/0005_moaning_rachel_grey.sql +2 -0
- package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
- package/dist/pam/profile/drizzle/migrations/meta/0002_snapshot.json +200 -0
- package/dist/pam/profile/drizzle/migrations/meta/0003_snapshot.json +224 -0
- package/dist/pam/profile/drizzle/migrations/meta/0004_snapshot.json +230 -0
- package/dist/pam/profile/drizzle/migrations/meta/0005_snapshot.json +242 -0
- package/dist/pam/profile/drizzle/migrations/meta/_journal.json +35 -0
- package/dist/pam/profile/migrate.d.ts.map +1 -1
- package/dist/pam/profile/migrate.js +3 -1
- package/dist/pam/profile/migrate.js.map +1 -1
- package/dist/pam/profile/plugin.d.ts +182 -1
- package/dist/pam/profile/plugin.d.ts.map +1 -1
- package/dist/pam/profile/plugin.js +8 -4
- package/dist/pam/profile/plugin.js.map +1 -1
- package/dist/pam/profile/react/profile.d.ts +34 -6
- package/dist/pam/profile/react/profile.d.ts.map +1 -1
- package/dist/pam/profile/react/profile.js +12 -0
- package/dist/pam/profile/react/profile.js.map +1 -1
- package/dist/pam/profile/router/index.d.ts +32 -4
- package/dist/pam/profile/router/index.d.ts.map +1 -1
- package/dist/pam/profile/router/index.js +4 -1
- package/dist/pam/profile/router/index.js.map +1 -1
- package/dist/pam/profile/schema/index.d.ts +193 -6
- package/dist/pam/profile/schema/index.d.ts.map +1 -1
- package/dist/pam/profile/schema/index.js +22 -10
- package/dist/pam/profile/schema/index.js.map +1 -1
- package/dist/pam/profile/service/profile.service.d.ts +55 -8
- package/dist/pam/profile/service/profile.service.d.ts.map +1 -1
- package/dist/pam/profile/service/profile.service.js +128 -23
- package/dist/pam/profile/service/profile.service.js.map +1 -1
- package/dist/pam/react.d.ts +2 -2
- package/dist/pam/react.d.ts.map +1 -1
- package/dist/pam/react.js +2 -2
- package/dist/pam/react.js.map +1 -1
- package/dist/pam/shared/__tests__/shared-mappers.test.d.ts +2 -0
- package/dist/pam/shared/__tests__/shared-mappers.test.d.ts.map +1 -0
- package/dist/pam/shared/__tests__/shared-mappers.test.js +61 -0
- package/dist/pam/shared/__tests__/shared-mappers.test.js.map +1 -0
- package/dist/pam/shared/language.d.ts +3 -1
- package/dist/pam/shared/language.d.ts.map +1 -1
- package/dist/pam/shared/language.js +6 -0
- package/dist/pam/shared/language.js.map +1 -1
- package/dist/pam/shared/otp.d.ts +3 -0
- package/dist/pam/shared/otp.d.ts.map +1 -0
- package/dist/pam/shared/otp.js +11 -0
- package/dist/pam/shared/otp.js.map +1 -0
- package/dist/pam/shared/player-mapper.d.ts +14 -4
- package/dist/pam/shared/player-mapper.d.ts.map +1 -1
- package/dist/pam/shared/player-mapper.js +14 -5
- package/dist/pam/shared/player-mapper.js.map +1 -1
- package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js +77 -0
- package/dist/pam/tag/__tests__/get-active-tag-keys.int.test.js.map +1 -0
- package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js +1024 -0
- package/dist/pam/tag/__tests__/tag-evaluation.service.int.test.js.map +1 -0
- package/dist/pam/tag/__tests__/tag-mappers.test.js +25 -0
- package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
- package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/tag-rule.service.int.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/tag-rule.service.int.test.js +145 -0
- package/dist/pam/tag/__tests__/tag-rule.service.int.test.js.map +1 -0
- package/dist/pam/tag/__tests__/tag.router.int.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/tag.router.int.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/tag.router.int.test.js +222 -0
- package/dist/pam/tag/__tests__/tag.router.int.test.js.map +1 -0
- package/dist/pam/tag/__tests__/tag.service.int.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/tag.service.int.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/tag.service.int.test.js +571 -0
- package/dist/pam/tag/__tests__/tag.service.int.test.js.map +1 -0
- package/dist/pam/tag/contract/index.d.ts +139 -1
- package/dist/pam/tag/contract/index.d.ts.map +1 -1
- package/dist/pam/tag/contract/index.js +12 -2
- package/dist/pam/tag/contract/index.js.map +1 -1
- package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts +37 -0
- package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts.map +1 -0
- package/dist/pam/tag/contract/player-tag-assign-metadata.js +20 -0
- package/dist/pam/tag/contract/player-tag-assign-metadata.js.map +1 -0
- package/dist/pam/tag/drizzle/migrations/0002_silent_skaar.sql +4 -0
- package/dist/pam/tag/drizzle/migrations/0003_overconfident_guardian.sql +3 -0
- package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
- package/dist/pam/tag/drizzle/migrations/meta/0002_snapshot.json +335 -0
- package/dist/pam/tag/drizzle/migrations/meta/0003_snapshot.json +343 -0
- package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
- package/dist/pam/tag/drizzle/migrations/meta/_journal.json +21 -0
- package/dist/pam/tag/migrate.d.ts.map +1 -1
- package/dist/pam/tag/migrate.js +34 -0
- package/dist/pam/tag/migrate.js.map +1 -1
- package/dist/pam/tag/plugin.d.ts +182 -1
- package/dist/pam/tag/plugin.d.ts.map +1 -1
- package/dist/pam/tag/plugin.js +46 -19
- package/dist/pam/tag/plugin.js.map +1 -1
- package/dist/pam/tag/router/index.d.ts +114 -1
- package/dist/pam/tag/router/index.d.ts.map +1 -1
- package/dist/pam/tag/router/index.js +38 -9
- package/dist/pam/tag/router/index.js.map +1 -1
- package/dist/pam/tag/schema/index.d.ts +32 -3
- package/dist/pam/tag/schema/index.d.ts.map +1 -1
- package/dist/pam/tag/schema/index.js +15 -2
- package/dist/pam/tag/schema/index.js.map +1 -1
- package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
- package/dist/pam/tag/seed/data/default-tag-rules.js +42 -0
- package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
- package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
- package/dist/pam/tag/seed/data/default-tags.js +6 -0
- package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.d.ts +147 -17
- package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.js +491 -48
- package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
- package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
- package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-mappers.js +1 -0
- package/dist/pam/tag/service/tag-mappers.js.map +1 -1
- package/dist/pam/tag/service/tag-rule.service.d.ts +8 -6
- package/dist/pam/tag/service/tag-rule.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-rule.service.js +8 -2
- package/dist/pam/tag/service/tag-rule.service.js.map +1 -1
- package/dist/pam/tag/service/tag.service.d.ts +162 -16
- package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag.service.js +297 -30
- package/dist/pam/tag/service/tag.service.js.map +1 -1
- package/dist/react/context/__tests__/realtime-client.test.d.ts +2 -0
- package/dist/react/context/__tests__/realtime-client.test.d.ts.map +1 -0
- package/dist/react/context/__tests__/realtime-client.test.js +75 -0
- package/dist/react/context/__tests__/realtime-client.test.js.map +1 -0
- package/dist/react/context/realtime-client.d.ts +15 -0
- package/dist/react/context/realtime-client.d.ts.map +1 -1
- package/dist/react/context/realtime-client.js.map +1 -1
- package/dist/react/hooks/__tests__/use-event-stream.test.d.ts +2 -0
- package/dist/react/hooks/__tests__/use-event-stream.test.d.ts.map +1 -0
- package/dist/react/hooks/__tests__/use-event-stream.test.js +153 -0
- package/dist/react/hooks/__tests__/use-event-stream.test.js.map +1 -0
- package/dist/react/hooks/use-event-stream.d.ts +3 -3
- package/dist/react/hooks/use-event-stream.d.ts.map +1 -1
- package/dist/react/hooks/use-event-stream.js +60 -28
- package/dist/react/hooks/use-event-stream.js.map +1 -1
- package/dist/server/auth/__tests__/admin-guard.int.test.d.ts +2 -0
- package/dist/server/auth/__tests__/admin-guard.int.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/admin-guard.int.test.js +199 -0
- package/dist/server/auth/__tests__/admin-guard.int.test.js.map +1 -0
- package/dist/server/auth/__tests__/auth.test.d.ts +2 -0
- package/dist/server/auth/__tests__/auth.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/auth.test.js +150 -0
- package/dist/server/auth/__tests__/auth.test.js.map +1 -0
- package/dist/server/auth/__tests__/permission-levels.test.d.ts +2 -0
- package/dist/server/auth/__tests__/permission-levels.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/permission-levels.test.js +89 -0
- package/dist/server/auth/__tests__/permission-levels.test.js.map +1 -0
- package/dist/server/auth/__tests__/permissions.test.d.ts +2 -0
- package/dist/server/auth/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/permissions.test.js +15 -0
- package/dist/server/auth/__tests__/permissions.test.js.map +1 -0
- package/dist/server/auth/__tests__/session-resolver.int.test.d.ts +2 -0
- package/dist/server/auth/__tests__/session-resolver.int.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/session-resolver.int.test.js +59 -0
- package/dist/server/auth/__tests__/session-resolver.int.test.js.map +1 -0
- package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts +2 -0
- package/dist/server/auth/__tests__/sign-session-cookie.test.d.ts.map +1 -0
- package/dist/server/auth/__tests__/sign-session-cookie.test.js +59 -0
- package/dist/server/auth/__tests__/sign-session-cookie.test.js.map +1 -0
- package/dist/server/auth/admin-guard.d.ts +13 -10
- package/dist/server/auth/admin-guard.d.ts.map +1 -1
- package/dist/server/auth/admin-guard.js +106 -44
- package/dist/server/auth/admin-guard.js.map +1 -1
- package/dist/server/auth/auth.d.ts +48 -5
- package/dist/server/auth/auth.d.ts.map +1 -1
- package/dist/server/auth/auth.js +78 -19
- package/dist/server/auth/auth.js.map +1 -1
- package/dist/server/auth/index.d.ts +3 -1
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1 -0
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/permissions.d.ts +133 -14
- package/dist/server/auth/permissions.d.ts.map +1 -1
- package/dist/server/auth/permissions.js +15 -20
- package/dist/server/auth/permissions.js.map +1 -1
- package/dist/server/auth/session-resolver.d.ts +4 -0
- package/dist/server/auth/session-resolver.d.ts.map +1 -1
- package/dist/server/auth/session-resolver.js +9 -2
- package/dist/server/auth/session-resolver.js.map +1 -1
- package/dist/server/auth/sign-session-cookie.d.ts +18 -0
- package/dist/server/auth/sign-session-cookie.d.ts.map +1 -0
- package/dist/server/auth/sign-session-cookie.js +15 -0
- package/dist/server/auth/sign-session-cookie.js.map +1 -0
- package/dist/server/db/__tests__/migrate.test.d.ts +2 -0
- package/dist/server/db/__tests__/migrate.test.d.ts.map +1 -0
- package/dist/server/db/__tests__/migrate.test.js +158 -0
- package/dist/server/db/__tests__/migrate.test.js.map +1 -0
- package/dist/server/db/__tests__/query-helpers.test.js +186 -1
- package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
- package/dist/server/db/__tests__/zod-jsonb.test.d.ts +2 -0
- package/dist/server/db/__tests__/zod-jsonb.test.d.ts.map +1 -0
- package/dist/server/db/__tests__/zod-jsonb.test.js +56 -0
- package/dist/server/db/__tests__/zod-jsonb.test.js.map +1 -0
- package/dist/server/db/drizzle.service.d.ts.map +1 -1
- package/dist/server/db/drizzle.service.js +8 -0
- package/dist/server/db/drizzle.service.js.map +1 -1
- package/dist/server/db/index.d.ts +2 -1
- package/dist/server/db/index.d.ts.map +1 -1
- package/dist/server/db/index.js +2 -1
- package/dist/server/db/index.js.map +1 -1
- package/dist/server/db/migrate.d.ts +38 -0
- package/dist/server/db/migrate.d.ts.map +1 -1
- package/dist/server/db/migrate.js +81 -12
- package/dist/server/db/migrate.js.map +1 -1
- package/dist/server/db/outbox/__tests__/relay.int.test.d.ts +2 -0
- package/dist/server/db/outbox/__tests__/relay.int.test.d.ts.map +1 -0
- package/dist/server/db/outbox/__tests__/relay.int.test.js +183 -0
- package/dist/server/db/outbox/__tests__/relay.int.test.js.map +1 -0
- package/dist/server/db/query-helpers.d.ts +9 -0
- package/dist/server/db/query-helpers.d.ts.map +1 -1
- package/dist/server/db/query-helpers.js +74 -0
- package/dist/server/db/query-helpers.js.map +1 -1
- package/dist/server/db/zod-jsonb.d.ts +52 -0
- package/dist/server/db/zod-jsonb.d.ts.map +1 -0
- package/dist/server/db/zod-jsonb.js +52 -0
- package/dist/server/db/zod-jsonb.js.map +1 -0
- package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js +240 -0
- package/dist/server/kernel/__tests__/bullmq-job-queue.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/cache.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/cache.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/cache.int.test.js +52 -0
- package/dist/server/kernel/__tests__/cache.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/domain-error.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/domain-error.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/domain-error.test.js +35 -0
- package/dist/server/kernel/__tests__/domain-error.test.js.map +1 -0
- package/dist/server/kernel/__tests__/error-reporter.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/error-reporter.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/error-reporter.test.js +52 -0
- package/dist/server/kernel/__tests__/error-reporter.test.js.map +1 -0
- package/dist/server/kernel/__tests__/event-bus.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/event-bus.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/event-bus.int.test.js +201 -0
- package/dist/server/kernel/__tests__/event-bus.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/helpers.test.js +26 -0
- package/dist/server/kernel/__tests__/helpers.test.js.map +1 -1
- package/dist/server/kernel/__tests__/logger.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/logger.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/logger.test.js +44 -0
- package/dist/server/kernel/__tests__/logger.test.js.map +1 -0
- package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/orpc-error-map.test.js +54 -0
- package/dist/server/kernel/__tests__/orpc-error-map.test.js.map +1 -0
- package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/platform-config-loader.test.js +112 -0
- package/dist/server/kernel/__tests__/platform-config-loader.test.js.map +1 -0
- package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/rate-limiter.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/rate-limiter.int.test.js +44 -0
- package/dist/server/kernel/__tests__/rate-limiter.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/redis-cache.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/redis-cache.int.test.js +49 -0
- package/dist/server/kernel/__tests__/redis-cache.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js +251 -0
- package/dist/server/kernel/__tests__/redis-pubsub-realtime-transport.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js +61 -0
- package/dist/server/kernel/__tests__/redis-rate-limiter.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.int.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js +190 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.int.test.js.map +1 -0
- package/dist/server/kernel/__tests__/request-context.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/request-context.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/request-context.test.js +64 -0
- package/dist/server/kernel/__tests__/request-context.test.js.map +1 -0
- package/dist/server/kernel/__tests__/router-utils.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/router-utils.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/router-utils.test.js +87 -0
- package/dist/server/kernel/__tests__/router-utils.test.js.map +1 -0
- package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
- package/dist/server/kernel/bullmq-job-queue.js +27 -4
- package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
- package/dist/server/kernel/cache.d.ts +0 -12
- package/dist/server/kernel/cache.d.ts.map +1 -1
- package/dist/server/kernel/cache.js +0 -55
- package/dist/server/kernel/cache.js.map +1 -1
- package/dist/server/kernel/container.d.ts +7 -6
- package/dist/server/kernel/container.d.ts.map +1 -1
- package/dist/server/kernel/container.js +3 -0
- package/dist/server/kernel/container.js.map +1 -1
- package/dist/server/kernel/domain-error.d.ts +15 -5
- package/dist/server/kernel/domain-error.d.ts.map +1 -1
- package/dist/server/kernel/domain-error.js +4 -2
- package/dist/server/kernel/domain-error.js.map +1 -1
- package/dist/server/kernel/error-reporter.d.ts +5 -0
- package/dist/server/kernel/error-reporter.d.ts.map +1 -0
- package/dist/server/kernel/error-reporter.js +20 -0
- package/dist/server/kernel/error-reporter.js.map +1 -0
- package/dist/server/kernel/event-bus.d.ts +2 -18
- package/dist/server/kernel/event-bus.d.ts.map +1 -1
- package/dist/server/kernel/event-bus.js +28 -44
- package/dist/server/kernel/event-bus.js.map +1 -1
- package/dist/server/kernel/event-stream.d.ts.map +1 -1
- package/dist/server/kernel/event-stream.js +19 -4
- package/dist/server/kernel/event-stream.js.map +1 -1
- package/dist/server/kernel/index.d.ts +10 -8
- package/dist/server/kernel/index.d.ts.map +1 -1
- package/dist/server/kernel/index.js +8 -7
- package/dist/server/kernel/index.js.map +1 -1
- package/dist/server/kernel/logger.d.ts.map +1 -1
- package/dist/server/kernel/logger.js +51 -2
- package/dist/server/kernel/logger.js.map +1 -1
- package/dist/server/kernel/orpc-error-map.d.ts.map +1 -1
- package/dist/server/kernel/orpc-error-map.js +4 -1
- package/dist/server/kernel/orpc-error-map.js.map +1 -1
- package/dist/server/kernel/rate-limiter.d.ts +2 -10
- package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/rate-limiter.js +0 -34
- package/dist/server/kernel/rate-limiter.js.map +1 -1
- package/dist/server/kernel/realtime-authorizer.d.ts +2 -4
- package/dist/server/kernel/realtime-authorizer.d.ts.map +1 -1
- package/dist/server/kernel/realtime-authorizer.js +3 -2
- package/dist/server/kernel/realtime-authorizer.js.map +1 -1
- package/dist/server/kernel/redis-cache.d.ts +3 -0
- package/dist/server/kernel/redis-cache.d.ts.map +1 -1
- package/dist/server/kernel/redis-cache.js +10 -0
- package/dist/server/kernel/redis-cache.js.map +1 -1
- package/dist/server/kernel/redis-client.d.ts.map +1 -1
- package/dist/server/kernel/redis-client.js +5 -1
- package/dist/server/kernel/redis-client.js.map +1 -1
- package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts +51 -0
- package/dist/server/kernel/redis-pubsub-realtime-transport.d.ts.map +1 -0
- package/dist/server/kernel/redis-pubsub-realtime-transport.js +0 -0
- package/dist/server/kernel/redis-pubsub-realtime-transport.js.map +1 -0
- package/dist/server/kernel/redis-rate-limiter.d.ts +1 -0
- package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/redis-rate-limiter.js +11 -0
- package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
- package/dist/server/kernel/redis-streams-broker.d.ts +65 -0
- package/dist/server/kernel/redis-streams-broker.d.ts.map +1 -0
- package/dist/server/kernel/redis-streams-broker.js +203 -0
- package/dist/server/kernel/redis-streams-broker.js.map +1 -0
- package/dist/server/kernel/request-context.d.ts +4 -0
- package/dist/server/kernel/request-context.d.ts.map +1 -1
- package/dist/server/kernel/request-context.js +4 -0
- package/dist/server/kernel/request-context.js.map +1 -1
- package/dist/server/kernel/router-utils.d.ts +7 -0
- package/dist/server/kernel/router-utils.d.ts.map +1 -1
- package/dist/server/kernel/router-utils.js +31 -2
- package/dist/server/kernel/router-utils.js.map +1 -1
- package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts +2 -0
- package/dist/server/plugin-host/__tests__/core-plugins.test.d.ts.map +1 -0
- package/dist/server/plugin-host/__tests__/core-plugins.test.js +27 -0
- package/dist/server/plugin-host/__tests__/core-plugins.test.js.map +1 -0
- package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts +2 -0
- package/dist/server/plugin-host/__tests__/load-plugins.test.d.ts.map +1 -0
- package/dist/server/plugin-host/__tests__/load-plugins.test.js +31 -0
- package/dist/server/plugin-host/__tests__/load-plugins.test.js.map +1 -0
- package/dist/server/plugin-host/__tests__/module-registry.test.js.map +1 -1
- package/dist/server/plugin-host/__tests__/required-ports.test.js +1 -0
- package/dist/server/plugin-host/__tests__/required-ports.test.js.map +1 -1
- package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts +2 -0
- package/dist/server/plugin-host/__tests__/typed-plugin.test.d.ts.map +1 -0
- package/dist/server/plugin-host/__tests__/typed-plugin.test.js +82 -0
- package/dist/server/plugin-host/__tests__/typed-plugin.test.js.map +1 -0
- package/dist/server/plugin-host/core-plugins.d.ts +16 -0
- package/dist/server/plugin-host/core-plugins.d.ts.map +1 -0
- package/dist/server/plugin-host/core-plugins.js +42 -0
- package/dist/server/plugin-host/core-plugins.js.map +1 -0
- package/dist/server/plugin-host/define-plugin.d.ts +24 -24
- package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
- package/dist/server/plugin-host/define-plugin.js +1 -3
- package/dist/server/plugin-host/define-plugin.js.map +1 -1
- package/dist/server/plugin-host/index.d.ts +3 -3
- package/dist/server/plugin-host/index.d.ts.map +1 -1
- package/dist/server/plugin-host/index.js +2 -2
- package/dist/server/plugin-host/index.js.map +1 -1
- package/dist/server/plugin-host/load-extensions.d.ts +2 -2
- package/dist/server/plugin-host/load-extensions.js +2 -2
- package/dist/server/plugin-host/load-plugins.d.ts +7 -3
- package/dist/server/plugin-host/load-plugins.d.ts.map +1 -1
- package/dist/server/plugin-host/load-plugins.js +10 -2
- package/dist/server/plugin-host/load-plugins.js.map +1 -1
- package/dist/server/plugin-host/module-registry.d.ts +9 -14
- package/dist/server/plugin-host/module-registry.d.ts.map +1 -1
- package/dist/server/plugin-host/module-registry.js +2 -9
- package/dist/server/plugin-host/module-registry.js.map +1 -1
- package/dist/server/runtime/__tests__/create-app.test.d.ts +2 -0
- package/dist/server/runtime/__tests__/create-app.test.d.ts.map +1 -0
- package/dist/server/runtime/__tests__/create-app.test.js +155 -0
- package/dist/server/runtime/__tests__/create-app.test.js.map +1 -0
- package/dist/server/runtime/assert-durable-seams.d.ts +19 -0
- package/dist/server/runtime/assert-durable-seams.d.ts.map +1 -0
- package/dist/server/runtime/assert-durable-seams.js +37 -0
- package/dist/server/runtime/assert-durable-seams.js.map +1 -0
- package/dist/server/runtime/core-token-catalog.d.ts +181 -0
- package/dist/server/runtime/core-token-catalog.d.ts.map +1 -0
- package/dist/server/runtime/core-token-catalog.js +70 -0
- package/dist/server/runtime/core-token-catalog.js.map +1 -0
- package/dist/server/runtime/create-app.d.ts +20 -23
- package/dist/server/runtime/create-app.d.ts.map +1 -1
- package/dist/server/runtime/create-app.js +142 -84
- package/dist/server/runtime/create-app.js.map +1 -1
- package/dist/server/runtime/index.d.ts +3 -4
- package/dist/server/runtime/index.d.ts.map +1 -1
- package/dist/server/runtime/index.js +1 -3
- package/dist/server/runtime/index.js.map +1 -1
- package/dist/testing/global-setup.d.ts +15 -0
- package/dist/testing/global-setup.d.ts.map +1 -0
- package/dist/testing/global-setup.js +33 -0
- package/dist/testing/global-setup.js.map +1 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock.d.ts +58 -15
- package/dist/testing/mock.d.ts.map +1 -1
- package/dist/testing/mock.js +163 -39
- package/dist/testing/mock.js.map +1 -1
- package/dist/testing/real-infra.d.ts +68 -0
- package/dist/testing/real-infra.d.ts.map +1 -0
- package/dist/testing/real-infra.js +151 -0
- package/dist/testing/real-infra.js.map +1 -0
- package/dist/testing/realtime-transport-conformance.d.ts +35 -0
- package/dist/testing/realtime-transport-conformance.d.ts.map +1 -0
- package/dist/testing/realtime-transport-conformance.js +94 -0
- package/dist/testing/realtime-transport-conformance.js.map +1 -0
- package/dist/testing/seed-player.d.ts +113 -0
- package/dist/testing/seed-player.d.ts.map +1 -0
- package/dist/testing/seed-player.js +43 -0
- package/dist/testing/seed-player.js.map +1 -0
- package/dist/testing/seed-wallet.d.ts +9 -0
- package/dist/testing/seed-wallet.d.ts.map +1 -0
- package/dist/testing/seed-wallet.js +27 -0
- package/dist/testing/seed-wallet.js.map +1 -0
- package/dist/wallet/__tests__/admin-reporting.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/admin-reporting.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/admin-reporting.int.test.js +236 -0
- package/dist/wallet/__tests__/admin-reporting.int.test.js.map +1 -0
- package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js +163 -0
- package/dist/wallet/__tests__/bonus-rollover-concurrency.int.test.js.map +1 -0
- package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/bonus-rollover.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/bonus-rollover.int.test.js +444 -0
- package/dist/wallet/__tests__/bonus-rollover.int.test.js.map +1 -0
- package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts +2 -0
- package/dist/wallet/__tests__/custody-sweep-gate.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/custody-sweep-gate.test.js +70 -0
- package/dist/wallet/__tests__/custody-sweep-gate.test.js.map +1 -0
- package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/custody-sweep.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/custody-sweep.service.int.test.js +274 -0
- package/dist/wallet/__tests__/custody-sweep.service.int.test.js.map +1 -0
- package/dist/wallet/__tests__/deposit-gate.test.d.ts +2 -0
- package/dist/wallet/__tests__/deposit-gate.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/deposit-gate.test.js +46 -0
- package/dist/wallet/__tests__/deposit-gate.test.js.map +1 -0
- package/dist/wallet/__tests__/rail-for.test.d.ts +2 -0
- package/dist/wallet/__tests__/rail-for.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/rail-for.test.js +29 -0
- package/dist/wallet/__tests__/rail-for.test.js.map +1 -0
- package/dist/wallet/__tests__/reconciliation-diff.test.d.ts +2 -0
- package/dist/wallet/__tests__/reconciliation-diff.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/reconciliation-diff.test.js +49 -0
- package/dist/wallet/__tests__/reconciliation-diff.test.js.map +1 -0
- package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/reconciliation.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/reconciliation.service.int.test.js +618 -0
- package/dist/wallet/__tests__/reconciliation.service.int.test.js.map +1 -0
- package/dist/wallet/__tests__/settlement-network.test.d.ts +2 -0
- package/dist/wallet/__tests__/settlement-network.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/settlement-network.test.js +54 -0
- package/dist/wallet/__tests__/settlement-network.test.js.map +1 -0
- package/dist/wallet/__tests__/swap.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/swap.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/swap.service.int.test.js +398 -0
- package/dist/wallet/__tests__/swap.service.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-address-format.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-address-format.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-address-format.test.js +102 -0
- package/dist/wallet/__tests__/wallet-address-format.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-asset.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-asset.router.int.test.js +263 -0
- package/dist/wallet/__tests__/wallet-asset.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js +137 -0
- package/dist/wallet/__tests__/wallet-auto-rule.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js +205 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal-config.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js +900 -0
- package/dist/wallet/__tests__/wallet-auto-withdrawal.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js +38 -0
- package/dist/wallet/__tests__/wallet-balance-stream.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js +114 -0
- package/dist/wallet/__tests__/wallet-bonus-rollover-config.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-commands.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-commands.service.int.test.js +419 -0
- package/dist/wallet/__tests__/wallet-commands.service.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-currency-code.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-currency-code.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-currency-code.test.js +48 -0
- package/dist/wallet/__tests__/wallet-currency-code.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-custody-routes.router.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-custody-routes.router.test.js +129 -0
- package/dist/wallet/__tests__/wallet-custody-routes.router.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-kyc-gate.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js +104 -0
- package/dist/wallet/__tests__/wallet-kyc-gate.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-reader.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-reader.service.int.test.js +111 -0
- package/dist/wallet/__tests__/wallet-reader.service.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js +93 -0
- package/dist/wallet/__tests__/wallet-rg-limit-gate.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js +37 -0
- package/dist/wallet/__tests__/wallet-transaction-direction-backfill.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-webhook.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-webhook.router.int.test.js +311 -0
- package/dist/wallet/__tests__/wallet-webhook.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js +64 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address-cap.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js +179 -0
- package/dist/wallet/__tests__/wallet-withdrawal-address.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet.rate-limit.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet.rate-limit.int.test.js +117 -0
- package/dist/wallet/__tests__/wallet.rate-limit.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet.router.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet.router.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet.router.int.test.js +104 -0
- package/dist/wallet/__tests__/wallet.router.int.test.js.map +1 -0
- package/dist/wallet/__tests__/wallet.service.int.test.d.ts +2 -0
- package/dist/wallet/__tests__/wallet.service.int.test.d.ts.map +1 -0
- package/dist/wallet/__tests__/wallet.service.int.test.js +1674 -0
- package/dist/wallet/__tests__/wallet.service.int.test.js.map +1 -0
- package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts +14 -0
- package/dist/wallet/adapters/wallet-asset-catalog.service.d.ts.map +1 -0
- package/dist/wallet/adapters/wallet-asset-catalog.service.js +37 -0
- package/dist/wallet/adapters/wallet-asset-catalog.service.js.map +1 -0
- package/dist/wallet/adapters/wallet-reader.service.d.ts +8 -1
- package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
- package/dist/wallet/adapters/wallet-reader.service.js +52 -1
- package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
- package/dist/wallet/admin-reporting.d.ts +3 -3
- package/dist/wallet/admin-reporting.d.ts.map +1 -1
- package/dist/wallet/admin-reporting.js +11 -3
- package/dist/wallet/admin-reporting.js.map +1 -1
- package/dist/wallet/contract/index.d.ts +1018 -19
- package/dist/wallet/contract/index.d.ts.map +1 -1
- package/dist/wallet/contract/index.js +513 -15
- package/dist/wallet/contract/index.js.map +1 -1
- package/dist/wallet/drizzle/migrations/0003_certain_ogun.sql +2 -0
- package/dist/wallet/drizzle/migrations/0004_reflective_shriek.sql +2 -0
- package/dist/wallet/drizzle/migrations/0005_gigantic_dust.sql +10 -0
- package/dist/wallet/drizzle/migrations/0006_lush_morg.sql +1 -0
- package/dist/wallet/drizzle/migrations/0007_bouncy_swordsman.sql +17 -0
- package/dist/wallet/drizzle/migrations/0008_gorgeous_colonel_america.sql +1 -0
- package/dist/wallet/drizzle/migrations/0009_smooth_sue_storm.sql +17 -0
- package/dist/wallet/drizzle/migrations/0010_worthless_quasimodo.sql +84 -0
- package/dist/wallet/drizzle/migrations/0011_premium_natasha_romanoff.sql +30 -0
- package/dist/wallet/drizzle/migrations/0012_long_wong.sql +15 -0
- package/dist/wallet/drizzle/migrations/0013_polite_peter_parker.sql +1 -0
- package/dist/wallet/drizzle/migrations/0014_abandoned_madripoor.sql +20 -0
- package/dist/wallet/drizzle/migrations/0015_right_oracle.sql +3 -0
- package/dist/wallet/drizzle/migrations/0016_curly_ben_urich.sql +2 -0
- package/dist/wallet/drizzle/migrations/0017_workable_wolf_cub.sql +2 -0
- package/dist/wallet/drizzle/migrations/0018_marvelous_demogoblin.sql +3 -0
- package/dist/wallet/drizzle/migrations/0019_awesome_drax.sql +2 -0
- package/dist/wallet/drizzle/migrations/0020_salty_infant_terrible.sql +1 -0
- package/dist/wallet/drizzle/migrations/0021_mean_chameleon.sql +3 -0
- package/dist/wallet/drizzle/migrations/0022_natural_exodus.sql +1 -0
- package/dist/wallet/drizzle/migrations/meta/0003_snapshot.json +567 -0
- package/dist/wallet/drizzle/migrations/meta/0004_snapshot.json +631 -0
- package/dist/wallet/drizzle/migrations/meta/0006_snapshot.json +638 -0
- package/dist/wallet/drizzle/migrations/meta/0007_snapshot.json +723 -0
- package/dist/wallet/drizzle/migrations/meta/0008_snapshot.json +716 -0
- package/dist/wallet/drizzle/migrations/meta/0009_snapshot.json +895 -0
- package/dist/wallet/drizzle/migrations/meta/0010_snapshot.json +1565 -0
- package/dist/wallet/drizzle/migrations/meta/0011_snapshot.json +1777 -0
- package/dist/wallet/drizzle/migrations/meta/0012_snapshot.json +1907 -0
- package/dist/wallet/drizzle/migrations/meta/0013_snapshot.json +1913 -0
- package/dist/wallet/drizzle/migrations/meta/0014_snapshot.json +1925 -0
- package/dist/wallet/drizzle/migrations/meta/0015_snapshot.json +1937 -0
- package/dist/wallet/drizzle/migrations/meta/0016_snapshot.json +1943 -0
- package/dist/wallet/drizzle/migrations/meta/0017_snapshot.json +1945 -0
- package/dist/wallet/drizzle/migrations/meta/0018_snapshot.json +1967 -0
- package/dist/wallet/drizzle/migrations/meta/0019_snapshot.json +1973 -0
- package/dist/wallet/drizzle/migrations/meta/0020_snapshot.json +1979 -0
- package/dist/wallet/drizzle/migrations/meta/0021_snapshot.json +1986 -0
- package/dist/wallet/drizzle/migrations/meta/0022_snapshot.json +1987 -0
- package/dist/wallet/drizzle/migrations/meta/_journal.json +140 -0
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +0 -2
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/migrate.d.ts +0 -1
- package/dist/wallet/migrate.d.ts.map +1 -1
- package/dist/wallet/migrate.js +0 -4
- package/dist/wallet/migrate.js.map +1 -1
- package/dist/wallet/plugin.d.ts +183 -1
- package/dist/wallet/plugin.d.ts.map +1 -1
- package/dist/wallet/plugin.js +223 -19
- package/dist/wallet/plugin.js.map +1 -1
- package/dist/wallet/router/index.d.ts +557 -12
- package/dist/wallet/router/index.d.ts.map +1 -1
- package/dist/wallet/router/index.js +270 -36
- package/dist/wallet/router/index.js.map +1 -1
- package/dist/wallet/schema/index.d.ts +1990 -9
- package/dist/wallet/schema/index.d.ts.map +1 -1
- package/dist/wallet/schema/index.js +290 -7
- package/dist/wallet/schema/index.js.map +1 -1
- package/dist/wallet/seed/index.d.ts +3 -0
- package/dist/wallet/seed/index.d.ts.map +1 -0
- package/dist/wallet/seed/index.js +3 -0
- package/dist/wallet/seed/index.js.map +1 -0
- package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts +11 -0
- package/dist/wallet/seed/seed-auto-withdrawal-config.d.ts.map +1 -0
- package/dist/wallet/seed/seed-auto-withdrawal-config.js +16 -0
- package/dist/wallet/seed/seed-auto-withdrawal-config.js.map +1 -0
- package/dist/wallet/seed/seed-bonus-rollover-config.d.ts +3 -0
- package/dist/wallet/seed/seed-bonus-rollover-config.d.ts.map +1 -0
- package/dist/wallet/seed/seed-bonus-rollover-config.js +8 -0
- package/dist/wallet/seed/seed-bonus-rollover-config.js.map +1 -0
- package/dist/wallet/service/custody-sweep.service.d.ts +77 -0
- package/dist/wallet/service/custody-sweep.service.d.ts.map +1 -0
- package/dist/wallet/service/custody-sweep.service.js +388 -0
- package/dist/wallet/service/custody-sweep.service.js.map +1 -0
- package/dist/wallet/service/reconciliation-finding.service.d.ts +68 -0
- package/dist/wallet/service/reconciliation-finding.service.d.ts.map +1 -0
- package/dist/wallet/service/reconciliation-finding.service.js +82 -0
- package/dist/wallet/service/reconciliation-finding.service.js.map +1 -0
- package/dist/wallet/service/reconciliation.service.d.ts +143 -0
- package/dist/wallet/service/reconciliation.service.d.ts.map +1 -0
- package/dist/wallet/service/reconciliation.service.js +685 -0
- package/dist/wallet/service/reconciliation.service.js.map +1 -0
- package/dist/wallet/service/swap.service.d.ts +78 -0
- package/dist/wallet/service/swap.service.d.ts.map +1 -0
- package/dist/wallet/service/swap.service.js +336 -0
- package/dist/wallet/service/swap.service.js.map +1 -0
- package/dist/wallet/service/wallet-commands.service.d.ts +19 -4
- package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet-commands.service.js +238 -31
- package/dist/wallet/service/wallet-commands.service.js.map +1 -1
- package/dist/wallet/service/wallet.service.d.ts +679 -30
- package/dist/wallet/service/wallet.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.js +1351 -155
- package/dist/wallet/service/wallet.service.js.map +1 -1
- package/generators/src/config.ts +547 -0
- package/generators/src/templates/adapter.hbs +19 -0
- package/generators/src/templates/contract.hbs +19 -0
- package/generators/src/templates/job-worker.hbs +34 -0
- package/generators/src/templates/module/drizzle.config.hbs +22 -0
- package/generators/src/templates/module/index.hbs +5 -0
- package/generators/src/templates/module/migrate.hbs +17 -0
- package/generators/src/templates/module/plugin.hbs +19 -0
- package/generators/src/templates/module/router.hbs +19 -0
- package/generators/src/templates/module/schema.hbs +14 -0
- package/generators/src/templates/module/service.hbs +26 -0
- package/generators/src/templates/plugin.hbs +20 -0
- package/package.json +168 -11
- package/dist/admin-console/__tests__/backoffice.service.test.d.ts +0 -2
- package/dist/admin-console/__tests__/backoffice.service.test.d.ts.map +0 -1
- package/dist/admin-console/__tests__/backoffice.service.test.js +0 -156
- package/dist/admin-console/__tests__/backoffice.service.test.js.map +0 -1
- package/dist/audit/__tests__/audit.service.test.d.ts +0 -2
- package/dist/audit/__tests__/audit.service.test.d.ts.map +0 -1
- package/dist/audit/__tests__/audit.service.test.js +0 -442
- package/dist/audit/__tests__/audit.service.test.js.map +0 -1
- package/dist/casino/gaming/__tests__/gaming.service.test.d.ts +0 -2
- package/dist/casino/gaming/__tests__/gaming.service.test.d.ts.map +0 -1
- package/dist/casino/gaming/__tests__/gaming.service.test.js +0 -55
- package/dist/casino/gaming/__tests__/gaming.service.test.js.map +0 -1
- package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts +0 -2
- package/dist/casino/lobby/__tests__/lobby.cache.test.d.ts.map +0 -1
- package/dist/casino/lobby/__tests__/lobby.cache.test.js +0 -47
- package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +0 -1
- package/dist/casino/lobby/__tests__/lobby.service.test.d.ts +0 -2
- package/dist/casino/lobby/__tests__/lobby.service.test.d.ts.map +0 -1
- package/dist/casino/lobby/__tests__/lobby.service.test.js +0 -11
- package/dist/casino/lobby/__tests__/lobby.service.test.js.map +0 -1
- package/dist/cms/__tests__/cms.cache.test.d.ts +0 -2
- package/dist/cms/__tests__/cms.cache.test.d.ts.map +0 -1
- package/dist/cms/__tests__/cms.cache.test.js +0 -87
- package/dist/cms/__tests__/cms.cache.test.js.map +0 -1
- package/dist/cms/__tests__/cms.router.test.d.ts +0 -2
- package/dist/cms/__tests__/cms.router.test.d.ts.map +0 -1
- package/dist/cms/__tests__/cms.router.test.js +0 -51
- package/dist/cms/__tests__/cms.router.test.js.map +0 -1
- package/dist/cms/__tests__/cms.service.test.d.ts +0 -2
- package/dist/cms/__tests__/cms.service.test.d.ts.map +0 -1
- package/dist/cms/__tests__/cms.service.test.js +0 -17
- package/dist/cms/__tests__/cms.service.test.js.map +0 -1
- package/dist/compliance/__tests__/compliance.service.test.d.ts +0 -2
- package/dist/compliance/__tests__/compliance.service.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/compliance.service.test.js +0 -96
- package/dist/compliance/__tests__/compliance.service.test.js.map +0 -1
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts +0 -2
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +0 -25
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +0 -1
- package/dist/compliance/__tests__/kyc.service.test.d.ts +0 -2
- package/dist/compliance/__tests__/kyc.service.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/kyc.service.test.js +0 -177
- package/dist/compliance/__tests__/kyc.service.test.js.map +0 -1
- package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts +0 -2
- package/dist/compliance/__tests__/rg-monitoring.service.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/rg-monitoring.service.test.js +0 -110
- package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +0 -1
- package/dist/compliance/__tests__/rg.router.test.d.ts +0 -2
- package/dist/compliance/__tests__/rg.router.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/rg.router.test.js +0 -66
- package/dist/compliance/__tests__/rg.router.test.js.map +0 -1
- package/dist/compliance/__tests__/rg.service.test.d.ts +0 -2
- package/dist/compliance/__tests__/rg.service.test.d.ts.map +0 -1
- package/dist/compliance/__tests__/rg.service.test.js +0 -212
- package/dist/compliance/__tests__/rg.service.test.js.map +0 -1
- package/dist/contracts/adapters/email.d.ts +0 -10
- package/dist/contracts/adapters/email.d.ts.map +0 -1
- package/dist/contracts/adapters/email.js +0 -8
- package/dist/contracts/adapters/email.js.map +0 -1
- package/dist/contracts/adapters/notification.d.ts +0 -6
- package/dist/contracts/adapters/notification.d.ts.map +0 -1
- package/dist/contracts/adapters/notification.js +0 -8
- package/dist/contracts/adapters/notification.js.map +0 -1
- package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts +0 -2
- package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts.map +0 -1
- package/dist/contracts/schemas/__tests__/identity-schemas.test.js +0 -38
- package/dist/contracts/schemas/__tests__/identity-schemas.test.js.map +0 -1
- package/dist/engagement/chat/__tests__/chat.service.test.d.ts +0 -2
- package/dist/engagement/chat/__tests__/chat.service.test.d.ts.map +0 -1
- package/dist/engagement/chat/__tests__/chat.service.test.js +0 -170
- package/dist/engagement/chat/__tests__/chat.service.test.js.map +0 -1
- package/dist/engagement/chat/react/use-chat-stream.d.ts +0 -26
- package/dist/engagement/chat/react/use-chat-stream.d.ts.map +0 -1
- package/dist/engagement/chat/react/use-chat-stream.js +0 -54
- package/dist/engagement/chat/react/use-chat-stream.js.map +0 -1
- package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts +0 -2
- package/dist/engagement/notifications/__tests__/notifications.service.test.d.ts.map +0 -1
- package/dist/engagement/notifications/__tests__/notifications.service.test.js +0 -84
- package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +0 -1
- package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts +0 -5
- package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.d.ts.map +0 -1
- package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js +0 -6
- package/dist/engagement/notifications/adapters/mock/mock-notification-adapter.js.map +0 -1
- package/dist/iam/__tests__/iam.service.test.d.ts +0 -2
- package/dist/iam/__tests__/iam.service.test.d.ts.map +0 -1
- package/dist/iam/__tests__/iam.service.test.js +0 -744
- package/dist/iam/__tests__/iam.service.test.js.map +0 -1
- package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts +0 -2
- package/dist/pam/identity/__tests__/admin-user-directory.test.d.ts.map +0 -1
- package/dist/pam/identity/__tests__/admin-user-directory.test.js +0 -93
- package/dist/pam/identity/__tests__/admin-user-directory.test.js.map +0 -1
- package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts +0 -2
- package/dist/pam/identity/__tests__/identity.rate-limit.test.d.ts.map +0 -1
- package/dist/pam/identity/__tests__/identity.rate-limit.test.js +0 -127
- package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +0 -1
- package/dist/pam/identity/__tests__/identity.service.test.d.ts +0 -2
- package/dist/pam/identity/__tests__/identity.service.test.d.ts.map +0 -1
- package/dist/pam/identity/__tests__/identity.service.test.js +0 -292
- package/dist/pam/identity/__tests__/identity.service.test.js.map +0 -1
- package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts +0 -2
- package/dist/pam/identity/__tests__/login-enforcement.service.test.d.ts.map +0 -1
- package/dist/pam/identity/__tests__/login-enforcement.service.test.js +0 -41
- package/dist/pam/identity/__tests__/login-enforcement.service.test.js.map +0 -1
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts +0 -2
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.d.ts.map +0 -1
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +0 -38
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +0 -1
- package/dist/pam/player-management/__tests__/player.router.test.d.ts +0 -2
- package/dist/pam/player-management/__tests__/player.router.test.d.ts.map +0 -1
- package/dist/pam/player-management/__tests__/player.router.test.js +0 -57
- package/dist/pam/player-management/__tests__/player.router.test.js.map +0 -1
- package/dist/pam/player-management/__tests__/player.service.test.d.ts +0 -2
- package/dist/pam/player-management/__tests__/player.service.test.d.ts.map +0 -1
- package/dist/pam/player-management/__tests__/player.service.test.js +0 -144
- package/dist/pam/player-management/__tests__/player.service.test.js.map +0 -1
- package/dist/pam/profile/__tests__/profile.service.test.d.ts +0 -2
- package/dist/pam/profile/__tests__/profile.service.test.d.ts.map +0 -1
- package/dist/pam/profile/__tests__/profile.service.test.js +0 -48
- package/dist/pam/profile/__tests__/profile.service.test.js.map +0 -1
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts +0 -2
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.d.ts.map +0 -1
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +0 -38
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +0 -1
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts +0 -2
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.d.ts.map +0 -1
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +0 -269
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +0 -1
- package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts +0 -2
- package/dist/pam/tag/__tests__/tag-rule.service.test.d.ts.map +0 -1
- package/dist/pam/tag/__tests__/tag-rule.service.test.js +0 -149
- package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +0 -1
- package/dist/pam/tag/__tests__/tag.router.test.d.ts +0 -2
- package/dist/pam/tag/__tests__/tag.router.test.d.ts.map +0 -1
- package/dist/pam/tag/__tests__/tag.router.test.js +0 -38
- package/dist/pam/tag/__tests__/tag.router.test.js.map +0 -1
- package/dist/pam/tag/__tests__/tag.service.test.d.ts +0 -2
- package/dist/pam/tag/__tests__/tag.service.test.d.ts.map +0 -1
- package/dist/pam/tag/__tests__/tag.service.test.js +0 -262
- package/dist/pam/tag/__tests__/tag.service.test.js.map +0 -1
- package/dist/server/auth/__tests__/admin-guard.test.d.ts +0 -2
- package/dist/server/auth/__tests__/admin-guard.test.d.ts.map +0 -1
- package/dist/server/auth/__tests__/admin-guard.test.js +0 -133
- package/dist/server/auth/__tests__/admin-guard.test.js.map +0 -1
- package/dist/server/auth/__tests__/session-resolver.test.d.ts +0 -2
- package/dist/server/auth/__tests__/session-resolver.test.d.ts.map +0 -1
- package/dist/server/auth/__tests__/session-resolver.test.js +0 -27
- package/dist/server/auth/__tests__/session-resolver.test.js.map +0 -1
- package/dist/server/db/outbox/__tests__/relay.test.d.ts +0 -2
- package/dist/server/db/outbox/__tests__/relay.test.d.ts.map +0 -1
- package/dist/server/db/outbox/__tests__/relay.test.js +0 -124
- package/dist/server/db/outbox/__tests__/relay.test.js.map +0 -1
- package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/bullmq-job-queue.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/bullmq-job-queue.test.js +0 -190
- package/dist/server/kernel/__tests__/bullmq-job-queue.test.js.map +0 -1
- package/dist/server/kernel/__tests__/cache.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/cache.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/cache.test.js +0 -84
- package/dist/server/kernel/__tests__/cache.test.js.map +0 -1
- package/dist/server/kernel/__tests__/event-bus.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/event-bus.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/event-bus.test.js +0 -116
- package/dist/server/kernel/__tests__/event-bus.test.js.map +0 -1
- package/dist/server/kernel/__tests__/job-queue.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/job-queue.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/job-queue.test.js +0 -135
- package/dist/server/kernel/__tests__/job-queue.test.js.map +0 -1
- package/dist/server/kernel/__tests__/rate-limiter.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/rate-limiter.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/rate-limiter.test.js +0 -74
- package/dist/server/kernel/__tests__/rate-limiter.test.js.map +0 -1
- package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/realtime-authorizer.test.js +0 -19
- package/dist/server/kernel/__tests__/realtime-authorizer.test.js.map +0 -1
- package/dist/server/kernel/__tests__/realtime-transport.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/realtime-transport.test.js +0 -50
- package/dist/server/kernel/__tests__/realtime-transport.test.js.map +0 -1
- package/dist/server/kernel/__tests__/redis-cache.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/redis-cache.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/redis-cache.test.js +0 -49
- package/dist/server/kernel/__tests__/redis-cache.test.js.map +0 -1
- package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts +0 -2
- package/dist/server/kernel/__tests__/redis-rate-limiter.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/redis-rate-limiter.test.js +0 -56
- package/dist/server/kernel/__tests__/redis-rate-limiter.test.js.map +0 -1
- package/dist/server/kernel/job-queue.d.ts +0 -40
- package/dist/server/kernel/job-queue.d.ts.map +0 -1
- package/dist/server/kernel/job-queue.js +0 -200
- package/dist/server/kernel/job-queue.js.map +0 -1
- package/dist/server/kernel/realtime-transport.d.ts +0 -8
- package/dist/server/kernel/realtime-transport.d.ts.map +0 -1
- package/dist/server/kernel/realtime-transport.js +0 -57
- package/dist/server/kernel/realtime-transport.js.map +0 -1
- package/dist/server/runtime/openapi.d.ts +0 -15
- package/dist/server/runtime/openapi.d.ts.map +0 -1
- package/dist/server/runtime/openapi.js +0 -26
- package/dist/server/runtime/openapi.js.map +0 -1
- package/dist/wallet/__tests__/admin-reporting.test.d.ts +0 -2
- package/dist/wallet/__tests__/admin-reporting.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/admin-reporting.test.js +0 -124
- package/dist/wallet/__tests__/admin-reporting.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +0 -100
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +0 -517
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet-commands.service.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet-commands.service.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet-commands.service.test.js +0 -176
- package/dist/wallet/__tests__/wallet-commands.service.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet-kyc-gate.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet-kyc-gate.test.js +0 -61
- package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet-webhook.router.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet-webhook.router.test.js +0 -78
- package/dist/wallet/__tests__/wallet-webhook.router.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet.rate-limit.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet.rate-limit.test.js +0 -34
- package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet.router.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet.router.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet.router.test.js +0 -45
- package/dist/wallet/__tests__/wallet.router.test.js.map +0 -1
- package/dist/wallet/__tests__/wallet.service.test.d.ts +0 -2
- package/dist/wallet/__tests__/wallet.service.test.d.ts.map +0 -1
- package/dist/wallet/__tests__/wallet.service.test.js +0 -971
- package/dist/wallet/__tests__/wallet.service.test.js.map +0 -1
- package/turbo-generators/src/config.ts +0 -478
- package/turbo-generators/src/templates/adapter.hbs +0 -19
- package/turbo-generators/src/templates/contract.hbs +0 -18
- package/turbo-generators/src/templates/job-worker.hbs +0 -34
- package/turbo-generators/src/templates/module/agents.hbs +0 -67
- package/turbo-generators/src/templates/module/drizzle.config.hbs +0 -22
- package/turbo-generators/src/templates/module/index.hbs +0 -5
- package/turbo-generators/src/templates/module/migrate.hbs +0 -15
- package/turbo-generators/src/templates/module/package.json.hbs +0 -62
- package/turbo-generators/src/templates/module/plugin.hbs +0 -20
- package/turbo-generators/src/templates/module/router.hbs +0 -19
- package/turbo-generators/src/templates/module/schema.hbs +0 -21
- package/turbo-generators/src/templates/module/service.hbs +0 -26
- package/turbo-generators/src/templates/module/tsconfig.json.hbs +0 -8
- package/turbo-generators/src/templates/plugin.hbs +0 -20
- /package/{turbo-generators → generators}/src/templates/adr.hbs +0 -0
- /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
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
107
|
-
|
|
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
|
-
//
|
|
111
|
-
//
|
|
112
|
-
|
|
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
|
-
|
|
231
|
+
identityReader;
|
|
232
|
+
mailDispatch;
|
|
136
233
|
options;
|
|
137
234
|
limiter;
|
|
138
235
|
platformConfig;
|
|
139
|
-
|
|
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.
|
|
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
|
-
...(
|
|
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
|
|
162
|
-
await
|
|
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.
|
|
165
|
-
body: {
|
|
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
|
-
|
|
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
|
-
|
|
172
|
-
|
|
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,
|
|
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
|
|
230
|
-
// distinguish a restricted account from a wrong password.
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
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.
|
|
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() +
|
|
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
|
-
|
|
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
|
|
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
|
|
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({
|
|
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
|
-
|
|
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
|
|
287
|
-
|
|
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
|
-
|
|
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', {
|
|
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
|
-
|
|
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', {
|
|
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
|
-
|
|
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
|
|
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
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
-
|
|
380
|
-
|
|
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.
|
|
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
|
-
|
|
398
|
-
|
|
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
|
-
|
|
404
|
-
|
|
405
|
-
//
|
|
406
|
-
//
|
|
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.
|
|
409
|
-
body: { email
|
|
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
|
-
|
|
421
|
-
|
|
422
|
-
await
|
|
423
|
-
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
|
451
|
-
const
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
|
|
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
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
471
|
-
|
|
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
|
-
|
|
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', {
|
|
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');
|