@adonis-agora/authkit-server 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/build/assets/grafana/authkit-dashboard.json +118 -0
  4. package/build/commands/clients_create.d.ts +27 -0
  5. package/build/commands/clients_create.js +121 -0
  6. package/build/commands/commands.json +292 -0
  7. package/build/commands/configure.d.ts +2 -0
  8. package/build/commands/configure.js +45 -0
  9. package/build/commands/doctor.d.ts +10 -0
  10. package/build/commands/doctor.js +113 -0
  11. package/build/commands/eject.d.ts +11 -0
  12. package/build/commands/eject.js +96 -0
  13. package/build/commands/expire_scan.d.ts +28 -0
  14. package/build/commands/expire_scan.js +92 -0
  15. package/build/commands/import_users.d.ts +17 -0
  16. package/build/commands/import_users.js +80 -0
  17. package/build/commands/keys_rotate.d.ts +21 -0
  18. package/build/commands/keys_rotate.js +126 -0
  19. package/build/commands/main.d.ts +12 -0
  20. package/build/commands/main.js +38 -0
  21. package/build/commands/settings_get.d.ts +18 -0
  22. package/build/commands/settings_get.js +43 -0
  23. package/build/commands/settings_list.d.ts +17 -0
  24. package/build/commands/settings_list.js +39 -0
  25. package/build/commands/settings_set.d.ts +20 -0
  26. package/build/commands/settings_set.js +55 -0
  27. package/build/commands/settings_unset.d.ts +18 -0
  28. package/build/commands/settings_unset.js +46 -0
  29. package/build/commands/ui_preset.d.ts +4 -0
  30. package/build/commands/ui_preset.js +32 -0
  31. package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
  32. package/build/database/migrations/make_authkit_oidc_table.js +19 -0
  33. package/build/host/ui/admin.html +29 -0
  34. package/build/host/views/account/apps.edge +59 -0
  35. package/build/host/views/account/confirm.edge +70 -0
  36. package/build/host/views/account/email-confirmed.edge +16 -0
  37. package/build/host/views/account/login.edge +33 -0
  38. package/build/host/views/account/mfa.edge +152 -0
  39. package/build/host/views/account/orgs.edge +58 -0
  40. package/build/host/views/account/security.edge +215 -0
  41. package/build/host/views/account/tokens.edge +75 -0
  42. package/build/host/views/consent.edge +20 -0
  43. package/build/host/views/forgot.edge +43 -0
  44. package/build/host/views/login.edge +251 -0
  45. package/build/host/views/maintenance.edge +32 -0
  46. package/build/host/views/mfa-challenge.edge +107 -0
  47. package/build/host/views/otp-unlock.edge +40 -0
  48. package/build/host/views/partials/styles.edge +2 -0
  49. package/build/host/views/reset.edge +30 -0
  50. package/build/host/views/signup.edge +62 -0
  51. package/build/host/views/verify-email.edge +17 -0
  52. package/build/index.d.ts +115 -0
  53. package/build/index.js +76 -0
  54. package/build/password/common_passwords.txt +10000 -0
  55. package/build/providers/authkit_server_provider.d.ts +27 -0
  56. package/build/providers/authkit_server_provider.js +242 -0
  57. package/build/src/accounts/account_store.d.ts +578 -0
  58. package/build/src/accounts/account_store.js +60 -0
  59. package/build/src/accounts/lucid_account_store.d.ts +156 -0
  60. package/build/src/accounts/lucid_account_store.js +294 -0
  61. package/build/src/accounts/lucid_store/core.d.ts +9 -0
  62. package/build/src/accounts/lucid_store/core.js +306 -0
  63. package/build/src/accounts/lucid_store/mfa.d.ts +15 -0
  64. package/build/src/accounts/lucid_store/mfa.js +108 -0
  65. package/build/src/accounts/lucid_store/organizations.d.ts +13 -0
  66. package/build/src/accounts/lucid_store/organizations.js +294 -0
  67. package/build/src/accounts/lucid_store/password_hygiene.d.ts +20 -0
  68. package/build/src/accounts/lucid_store/password_hygiene.js +130 -0
  69. package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
  70. package/build/src/accounts/lucid_store/provider_identity.js +59 -0
  71. package/build/src/accounts/lucid_store/shared.d.ts +113 -0
  72. package/build/src/accounts/lucid_store/shared.js +130 -0
  73. package/build/src/accounts/lucid_store/status_profile.d.ts +34 -0
  74. package/build/src/accounts/lucid_store/status_profile.js +100 -0
  75. package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
  76. package/build/src/accounts/lucid_store/webauthn.js +140 -0
  77. package/build/src/accounts/lucid_stores.d.ts +45 -0
  78. package/build/src/accounts/lucid_stores.js +30 -0
  79. package/build/src/adapters/adapter_contract.d.ts +37 -0
  80. package/build/src/adapters/adapter_contract.js +1 -0
  81. package/build/src/adapters/database_adapter.d.ts +21 -0
  82. package/build/src/adapters/database_adapter.js +79 -0
  83. package/build/src/adapters/factory.d.ts +30 -0
  84. package/build/src/adapters/factory.js +43 -0
  85. package/build/src/adapters/redis_adapter.d.ts +24 -0
  86. package/build/src/adapters/redis_adapter.js +122 -0
  87. package/build/src/audit/audit_sink.d.ts +63 -0
  88. package/build/src/audit/audit_sink.js +1 -0
  89. package/build/src/audit/lucid_audit_sink.d.ts +10 -0
  90. package/build/src/audit/lucid_audit_sink.js +99 -0
  91. package/build/src/commands/expire_scan_command.d.ts +60 -0
  92. package/build/src/commands/expire_scan_command.js +229 -0
  93. package/build/src/commands/import_clients.d.ts +40 -0
  94. package/build/src/commands/import_clients.js +79 -0
  95. package/build/src/commands/import_users.d.ts +51 -0
  96. package/build/src/commands/import_users.js +94 -0
  97. package/build/src/commands/resolve_config.d.ts +13 -0
  98. package/build/src/commands/resolve_config.js +18 -0
  99. package/build/src/commands/settings_commands.d.ts +47 -0
  100. package/build/src/commands/settings_commands.js +270 -0
  101. package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
  102. package/build/src/controllers/oidc_callback_controller.js +33 -0
  103. package/build/src/define_config.d.ts +772 -0
  104. package/build/src/define_config.js +351 -0
  105. package/build/src/doctor/checks.d.ts +197 -0
  106. package/build/src/doctor/checks.js +858 -0
  107. package/build/src/events/dispatcher.d.ts +45 -0
  108. package/build/src/events/dispatcher.js +117 -0
  109. package/build/src/host/account_api/account_api_controller.d.ts +245 -0
  110. package/build/src/host/account_api/account_api_controller.js +827 -0
  111. package/build/src/host/account_deletion_ops.d.ts +80 -0
  112. package/build/src/host/account_deletion_ops.js +118 -0
  113. package/build/src/host/account_deletion_service.d.ts +63 -0
  114. package/build/src/host/account_deletion_service.js +133 -0
  115. package/build/src/host/account_export_service.d.ts +76 -0
  116. package/build/src/host/account_export_service.js +140 -0
  117. package/build/src/host/account_home.d.ts +11 -0
  118. package/build/src/host/account_home.js +11 -0
  119. package/build/src/host/account_lockout.d.ts +86 -0
  120. package/build/src/host/account_lockout.js +185 -0
  121. package/build/src/host/active_org_cookie.d.ts +28 -0
  122. package/build/src/host/active_org_cookie.js +47 -0
  123. package/build/src/host/admin_api/admin_api_guard.d.ts +16 -0
  124. package/build/src/host/admin_api/admin_api_guard.js +59 -0
  125. package/build/src/host/admin_api/admin_orgs_service.d.ts +125 -0
  126. package/build/src/host/admin_api/admin_orgs_service.js +324 -0
  127. package/build/src/host/admin_api/admin_users_service.d.ts +163 -0
  128. package/build/src/host/admin_api/admin_users_service.js +308 -0
  129. package/build/src/host/admin_api/api_clients_controller.d.ts +54 -0
  130. package/build/src/host/admin_api/api_clients_controller.js +89 -0
  131. package/build/src/host/admin_api/api_keys_controller.d.ts +19 -0
  132. package/build/src/host/admin_api/api_keys_controller.js +36 -0
  133. package/build/src/host/admin_api/api_misc_controller.d.ts +19 -0
  134. package/build/src/host/admin_api/api_misc_controller.js +44 -0
  135. package/build/src/host/admin_api/api_orgs_controller.d.ts +108 -0
  136. package/build/src/host/admin_api/api_orgs_controller.js +189 -0
  137. package/build/src/host/admin_api/api_settings_controller.d.ts +55 -0
  138. package/build/src/host/admin_api/api_settings_controller.js +134 -0
  139. package/build/src/host/admin_api/api_users_controller.d.ts +108 -0
  140. package/build/src/host/admin_api/api_users_controller.js +187 -0
  141. package/build/src/host/admin_api/dto.d.ts +131 -0
  142. package/build/src/host/admin_api/dto.js +122 -0
  143. package/build/src/host/admin_api/token_verify_service.d.ts +34 -0
  144. package/build/src/host/admin_api/token_verify_service.js +74 -0
  145. package/build/src/host/admin_clients_service.d.ts +88 -0
  146. package/build/src/host/admin_clients_service.js +181 -0
  147. package/build/src/host/admin_console/admin_shell_controller.d.ts +27 -0
  148. package/build/src/host/admin_console/admin_shell_controller.js +167 -0
  149. package/build/src/host/admin_console/console_audit_controller.d.ts +17 -0
  150. package/build/src/host/admin_console/console_audit_controller.js +25 -0
  151. package/build/src/host/admin_console/console_clients_controller.d.ts +53 -0
  152. package/build/src/host/admin_console/console_clients_controller.js +102 -0
  153. package/build/src/host/admin_console/console_impersonation_controller.d.ts +23 -0
  154. package/build/src/host/admin_console/console_impersonation_controller.js +45 -0
  155. package/build/src/host/admin_console/console_keys_controller.d.ts +24 -0
  156. package/build/src/host/admin_console/console_keys_controller.js +41 -0
  157. package/build/src/host/admin_console/console_orgs_controller.d.ts +96 -0
  158. package/build/src/host/admin_console/console_orgs_controller.js +238 -0
  159. package/build/src/host/admin_console/console_overview_controller.d.ts +27 -0
  160. package/build/src/host/admin_console/console_overview_controller.js +44 -0
  161. package/build/src/host/admin_console/console_roles_controller.d.ts +31 -0
  162. package/build/src/host/admin_console/console_roles_controller.js +108 -0
  163. package/build/src/host/admin_console/console_sessions_controller.d.ts +91 -0
  164. package/build/src/host/admin_console/console_sessions_controller.js +125 -0
  165. package/build/src/host/admin_console/console_settings_controller.d.ts +47 -0
  166. package/build/src/host/admin_console/console_settings_controller.js +115 -0
  167. package/build/src/host/admin_console/console_users_controller.d.ts +110 -0
  168. package/build/src/host/admin_console/console_users_controller.js +212 -0
  169. package/build/src/host/admin_prefix.d.ts +50 -0
  170. package/build/src/host/admin_prefix.js +77 -0
  171. package/build/src/host/admin_sessions_service.d.ts +119 -0
  172. package/build/src/host/admin_sessions_service.js +284 -0
  173. package/build/src/host/admin_stats_service.d.ts +44 -0
  174. package/build/src/host/admin_stats_service.js +130 -0
  175. package/build/src/host/admin_validators.d.ts +247 -0
  176. package/build/src/host/admin_validators.js +197 -0
  177. package/build/src/host/augmentations.d.ts +12 -0
  178. package/build/src/host/augmentations.js +1 -0
  179. package/build/src/host/auth_host_config.d.ts +22 -0
  180. package/build/src/host/auth_host_config.js +13 -0
  181. package/build/src/host/avatar_storage.d.ts +68 -0
  182. package/build/src/host/avatar_storage.js +166 -0
  183. package/build/src/host/bot_protection.d.ts +187 -0
  184. package/build/src/host/bot_protection.js +132 -0
  185. package/build/src/host/branding.d.ts +19 -0
  186. package/build/src/host/branding.js +8 -0
  187. package/build/src/host/config_locks.d.ts +38 -0
  188. package/build/src/host/config_locks.js +70 -0
  189. package/build/src/host/console_session.d.ts +27 -0
  190. package/build/src/host/console_session.js +36 -0
  191. package/build/src/host/controllers/account_apps_controller.d.ts +15 -0
  192. package/build/src/host/controllers/account_apps_controller.js +61 -0
  193. package/build/src/host/controllers/account_confirm_controller.d.ts +24 -0
  194. package/build/src/host/controllers/account_confirm_controller.js +144 -0
  195. package/build/src/host/controllers/account_mfa_controller.d.ts +28 -0
  196. package/build/src/host/controllers/account_mfa_controller.js +208 -0
  197. package/build/src/host/controllers/account_orgs_controller.d.ts +80 -0
  198. package/build/src/host/controllers/account_orgs_controller.js +401 -0
  199. package/build/src/host/controllers/account_security_controller.d.ts +43 -0
  200. package/build/src/host/controllers/account_security_controller.js +546 -0
  201. package/build/src/host/controllers/account_session_controller.d.ts +21 -0
  202. package/build/src/host/controllers/account_session_controller.js +113 -0
  203. package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
  204. package/build/src/host/controllers/account_tokens_controller.js +67 -0
  205. package/build/src/host/controllers/interaction_controller.d.ts +125 -0
  206. package/build/src/host/controllers/interaction_controller.js +981 -0
  207. package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
  208. package/build/src/host/controllers/pat_introspection_controller.js +46 -0
  209. package/build/src/host/controllers/registration_controller.d.ts +18 -0
  210. package/build/src/host/controllers/registration_controller.js +382 -0
  211. package/build/src/host/controllers/social_controller.d.ts +8 -0
  212. package/build/src/host/controllers/social_controller.js +89 -0
  213. package/build/src/host/csrf.d.ts +29 -0
  214. package/build/src/host/csrf.js +14 -0
  215. package/build/src/host/default_mailer.d.ts +112 -0
  216. package/build/src/host/default_mailer.js +417 -0
  217. package/build/src/host/durable/account_deletion_workflow.d.ts +48 -0
  218. package/build/src/host/durable/account_deletion_workflow.js +86 -0
  219. package/build/src/host/durable/account_export_workflow.d.ts +68 -0
  220. package/build/src/host/durable/account_export_workflow.js +93 -0
  221. package/build/src/host/durable/index.d.ts +68 -0
  222. package/build/src/host/durable/index.js +77 -0
  223. package/build/src/host/email_templates.d.ts +39 -0
  224. package/build/src/host/email_templates.js +69 -0
  225. package/build/src/host/geo.d.ts +22 -0
  226. package/build/src/host/geo.js +39 -0
  227. package/build/src/host/i18n.d.ts +1416 -0
  228. package/build/src/host/i18n.js +1583 -0
  229. package/build/src/host/impersonation.d.ts +25 -0
  230. package/build/src/host/impersonation.js +31 -0
  231. package/build/src/host/key_rotation.d.ts +14 -0
  232. package/build/src/host/key_rotation.js +27 -0
  233. package/build/src/host/key_rotation_actions.d.ts +42 -0
  234. package/build/src/host/key_rotation_actions.js +27 -0
  235. package/build/src/host/login_attempt.d.ts +98 -0
  236. package/build/src/host/login_attempt.js +211 -0
  237. package/build/src/host/login_notify.d.ts +27 -0
  238. package/build/src/host/login_notify.js +142 -0
  239. package/build/src/host/middleware/account_auth.d.ts +7 -0
  240. package/build/src/host/middleware/account_auth.js +11 -0
  241. package/build/src/host/otp_lockout.d.ts +103 -0
  242. package/build/src/host/otp_lockout.js +221 -0
  243. package/build/src/host/rate_limit.d.ts +39 -0
  244. package/build/src/host/rate_limit.js +94 -0
  245. package/build/src/host/register_auth_host.d.ts +97 -0
  246. package/build/src/host/register_auth_host.js +466 -0
  247. package/build/src/host/renderers/edge_renderer.d.ts +12 -0
  248. package/build/src/host/renderers/edge_renderer.js +38 -0
  249. package/build/src/host/renderers/inertia_renderer.d.ts +70 -0
  250. package/build/src/host/renderers/inertia_renderer.js +54 -0
  251. package/build/src/host/runtime_settings.d.ts +181 -0
  252. package/build/src/host/runtime_settings.js +307 -0
  253. package/build/src/host/runtime_toggles.d.ts +807 -0
  254. package/build/src/host/runtime_toggles.js +784 -0
  255. package/build/src/host/security_notice_service.d.ts +36 -0
  256. package/build/src/host/security_notice_service.js +87 -0
  257. package/build/src/host/session_context.d.ts +23 -0
  258. package/build/src/host/session_context.js +89 -0
  259. package/build/src/host/sudo_mode.d.ts +56 -0
  260. package/build/src/host/sudo_mode.js +99 -0
  261. package/build/src/host/svg_chart.d.ts +15 -0
  262. package/build/src/host/svg_chart.js +45 -0
  263. package/build/src/host/trusted_device.d.ts +61 -0
  264. package/build/src/host/trusted_device.js +65 -0
  265. package/build/src/host/ui-dist/assets/index-CRWcmsex.js +137 -0
  266. package/build/src/host/ui-dist/assets/index-DTSmD4RU.css +1 -0
  267. package/build/src/host/ui-dist/index.html +17 -0
  268. package/build/src/host/user_agent.d.ts +18 -0
  269. package/build/src/host/user_agent.js +50 -0
  270. package/build/src/host/validators.d.ts +127 -0
  271. package/build/src/host/validators.js +53 -0
  272. package/build/src/keys/jwks_manager.d.ts +6 -0
  273. package/build/src/keys/jwks_manager.js +11 -0
  274. package/build/src/keys/keystore.d.ts +52 -0
  275. package/build/src/keys/keystore.js +68 -0
  276. package/build/src/keys/keystore_codec.d.ts +20 -0
  277. package/build/src/keys/keystore_codec.js +42 -0
  278. package/build/src/keys/keystore_crypto.d.ts +9 -0
  279. package/build/src/keys/keystore_crypto.js +27 -0
  280. package/build/src/keys/keystore_manager.d.ts +43 -0
  281. package/build/src/keys/keystore_manager.js +104 -0
  282. package/build/src/keys/keystore_vault.d.ts +113 -0
  283. package/build/src/keys/keystore_vault.js +265 -0
  284. package/build/src/mixins/json_column.d.ts +33 -0
  285. package/build/src/mixins/json_column.js +38 -0
  286. package/build/src/mixins/with_audit_log.d.ts +19 -0
  287. package/build/src/mixins/with_audit_log.js +39 -0
  288. package/build/src/mixins/with_auth_user.d.ts +24 -0
  289. package/build/src/mixins/with_auth_user.js +46 -0
  290. package/build/src/mixins/with_credentials.d.ts +20 -0
  291. package/build/src/mixins/with_credentials.js +29 -0
  292. package/build/src/mixins/with_mfa.d.ts +35 -0
  293. package/build/src/mixins/with_mfa.js +21 -0
  294. package/build/src/mixins/with_personal_access_token.d.ts +19 -0
  295. package/build/src/mixins/with_personal_access_token.js +42 -0
  296. package/build/src/mixins/with_provider_identity.d.ts +20 -0
  297. package/build/src/mixins/with_provider_identity.js +32 -0
  298. package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
  299. package/build/src/mixins/with_webauthn_credential.js +46 -0
  300. package/build/src/observability/diagnostics_bridge.d.ts +6 -0
  301. package/build/src/observability/diagnostics_bridge.js +27 -0
  302. package/build/src/observability/metrics_controller.d.ts +5 -0
  303. package/build/src/observability/metrics_controller.js +24 -0
  304. package/build/src/observability/metrics_service.d.ts +2 -0
  305. package/build/src/observability/metrics_service.js +7 -0
  306. package/build/src/observability/otel_recorder.d.ts +10 -0
  307. package/build/src/observability/otel_recorder.js +59 -0
  308. package/build/src/observability/telescope/data_providers.d.ts +24 -0
  309. package/build/src/observability/telescope/data_providers.js +235 -0
  310. package/build/src/observability/telescope/extension.d.ts +29 -0
  311. package/build/src/observability/telescope/extension.js +167 -0
  312. package/build/src/observability/telescope/index.d.ts +8 -0
  313. package/build/src/observability/telescope/index.js +8 -0
  314. package/build/src/observability/wire_provider_events.d.ts +12 -0
  315. package/build/src/observability/wire_provider_events.js +30 -0
  316. package/build/src/password/common_passwords.d.ts +31 -0
  317. package/build/src/password/common_passwords.js +73 -0
  318. package/build/src/password/password_manager.d.ts +163 -0
  319. package/build/src/password/password_manager.js +191 -0
  320. package/build/src/password/policy.d.ts +71 -0
  321. package/build/src/password/policy.js +55 -0
  322. package/build/src/password/pwned.d.ts +36 -0
  323. package/build/src/password/pwned.js +52 -0
  324. package/build/src/pat/lucid_pat_store.d.ts +6 -0
  325. package/build/src/pat/lucid_pat_store.js +62 -0
  326. package/build/src/pat/pat_store.d.ts +31 -0
  327. package/build/src/pat/pat_store.js +1 -0
  328. package/build/src/pat/pat_tokens.d.ts +4 -0
  329. package/build/src/pat/pat_tokens.js +9 -0
  330. package/build/src/provider/build_provider.d.ts +45 -0
  331. package/build/src/provider/build_provider.js +219 -0
  332. package/build/src/provider/device_sources.d.ts +6 -0
  333. package/build/src/provider/device_sources.js +65 -0
  334. package/build/src/provider/interaction_actions.d.ts +36 -0
  335. package/build/src/provider/interaction_actions.js +55 -0
  336. package/build/src/provider/key_rotation_scheduler.d.ts +28 -0
  337. package/build/src/provider/key_rotation_scheduler.js +40 -0
  338. package/build/src/provider/keystore_reload.d.ts +21 -0
  339. package/build/src/provider/keystore_reload.js +39 -0
  340. package/build/src/provider/logout_sources.d.ts +13 -0
  341. package/build/src/provider/logout_sources.js +64 -0
  342. package/build/src/provider/oidc_service.d.ts +81 -0
  343. package/build/src/provider/oidc_service.js +254 -0
  344. package/build/src/provider/single_flight_lock.d.ts +18 -0
  345. package/build/src/provider/single_flight_lock.js +31 -0
  346. package/build/src/provider/token_exchange.d.ts +21 -0
  347. package/build/src/provider/token_exchange.js +124 -0
  348. package/build/src/register_routes.d.ts +16 -0
  349. package/build/src/register_routes.js +21 -0
  350. package/build/src/schema/ensure.d.ts +41 -0
  351. package/build/src/schema/ensure.js +262 -0
  352. package/build/stubs/config/authkit.stub +20 -0
  353. package/build/stubs/config/authkit_react.stub +52 -0
  354. package/build/stubs/main.d.ts +1 -0
  355. package/build/stubs/main.js +2 -0
  356. package/build/stubs/models/auth_user.stub +22 -0
  357. package/build/stubs/ui/edge/views/consent.edge +13 -0
  358. package/build/stubs/ui/edge/views/login.edge +19 -0
  359. package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
  360. package/build/stubs/ui/react/pages/account/login.tsx +56 -0
  361. package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
  362. package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
  363. package/build/stubs/ui/react/pages/consent.tsx +39 -0
  364. package/build/stubs/ui/react/pages/forgot.tsx +44 -0
  365. package/build/stubs/ui/react/pages/login.tsx +171 -0
  366. package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  367. package/build/stubs/ui/react/pages/reset.tsx +58 -0
  368. package/build/stubs/ui/react/pages/signup.tsx +78 -0
  369. package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
  370. package/build/types.d.ts +7 -0
  371. package/build/types.js +1 -0
  372. package/package.json +147 -0
  373. package/stubs/config/authkit.stub +20 -0
  374. package/stubs/config/authkit_react.stub +52 -0
  375. package/stubs/main.ts +2 -0
  376. package/stubs/models/auth_user.stub +22 -0
  377. package/stubs/ui/edge/views/consent.edge +13 -0
  378. package/stubs/ui/edge/views/login.edge +19 -0
  379. package/stubs/ui/react/components/auth_shell.tsx +67 -0
  380. package/stubs/ui/react/pages/account/login.tsx +56 -0
  381. package/stubs/ui/react/pages/account/mfa.tsx +132 -0
  382. package/stubs/ui/react/pages/account/tokens.tsx +88 -0
  383. package/stubs/ui/react/pages/consent.tsx +39 -0
  384. package/stubs/ui/react/pages/forgot.tsx +44 -0
  385. package/stubs/ui/react/pages/login.tsx +171 -0
  386. package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  387. package/stubs/ui/react/pages/reset.tsx +58 -0
  388. package/stubs/ui/react/pages/signup.tsx +78 -0
  389. package/stubs/ui/react/pages/verify-email.tsx +24 -0
@@ -0,0 +1,68 @@
1
+ import type { OidcService } from "../../provider/oidc_service.js";
2
+ import type { DurableStepCtx } from "./account_deletion_workflow.js";
3
+ /** Nome canônico do workflow durável de export de dados de conta. */
4
+ export declare const ACCOUNT_EXPORT_WORKFLOW = "authkit.account.export";
5
+ /** Input do workflow `authkit.account.export`. */
6
+ export interface AccountExportWorkflowInput {
7
+ accountId: string;
8
+ /** IP da request, p/ auditoria (opcional). */
9
+ ip?: string | null;
10
+ }
11
+ /** Resultado do workflow de export (referência ao artefato persistido). */
12
+ export interface AccountExportWorkflowResult {
13
+ ok: boolean;
14
+ /** Key/URL do artefato persistido no drive (quando persistido). */
15
+ artifactKey: string | null;
16
+ /** Bytes do payload serializado (diagnóstico). */
17
+ bytes: number;
18
+ }
19
+ /**
20
+ * Persiste o artefato (JSON serializado) e devolve a sua key/URL. O default usa o
21
+ * disk do drive do app (`@adonisjs/drive`), gravando em
22
+ * `<uploads.exports.directory>/authkit-data-export-<accountId>-<runId>.json`. O
23
+ * app pode injetar a sua própria implementação (ex.: S3 com URL assinada).
24
+ */
25
+ export type PersistArtifact = (artifact: {
26
+ accountId: string;
27
+ runId: string;
28
+ json: string;
29
+ oidc: OidcService;
30
+ }) => Promise<string | null>;
31
+ /**
32
+ * Entrega o artefato ao titular: via signal durável (token `export:<runId>`)
33
+ * e/ou um link por e-mail. O default emite o signal (best-effort) — o app pluga
34
+ * o e-mail. Read-only quanto ao cascade (apenas notifica).
35
+ */
36
+ export type DeliverArtifact = (delivery: {
37
+ accountId: string;
38
+ runId: string;
39
+ artifactKey: string | null;
40
+ oidc: OidcService;
41
+ }) => Promise<void>;
42
+ /** Deps que o app injeta ao definir o workflow de export. */
43
+ export interface AccountExportWorkflowDeps {
44
+ oidc: () => OidcService | Promise<OidcService>;
45
+ /** Persistência do artefato (default: drive do app). */
46
+ persist?: PersistArtifact;
47
+ /** Entrega ao titular (default: no-op — o app pluga e-mail/signal). */
48
+ deliver?: DeliverArtifact;
49
+ }
50
+ /**
51
+ * Define a REGISTRAÇÃO do workflow durável `authkit.account.export`.
52
+ *
53
+ * Etapas (todas efeitos colaterais dentro de `ctx.step`, corpo determinístico):
54
+ * 1. `collect` — reúne o payload (reusa {@link AccountExportService.collect});
55
+ * 2. `audit` — registra `account.exported`;
56
+ * 3. `persist` — serializa + grava o artefato no drive;
57
+ * 4. `deliver` — notifica o titular (signal + link por e-mail, pluggable).
58
+ *
59
+ * Read-only + artefato → SEM compensação. Sub-fetches flaky podem ter retry
60
+ * por-etapa (a coleta é best-effort por dentro).
61
+ */
62
+ export declare function defineAccountExportWorkflow(deps: AccountExportWorkflowDeps): {
63
+ name: string;
64
+ version: string;
65
+ body: (ctx: DurableStepCtx & {
66
+ runId?: string;
67
+ }, input: AccountExportWorkflowInput) => Promise<unknown>;
68
+ };
@@ -0,0 +1,93 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { AccountExportService, } from "../account_export_service.js";
10
+ /** Nome canônico do workflow durável de export de dados de conta. */
11
+ export const ACCOUNT_EXPORT_WORKFLOW = "authkit.account.export";
12
+ /** Persistência default: grava o JSON no disk do drive do app (best-effort). */
13
+ const defaultPersist = async ({ accountId, runId, json, oidc, }) => {
14
+ // Indireção via variável: `@adonisjs/drive` é peer/opcional — pode não estar
15
+ // instalado, então o specifier não é resolvido em build-time.
16
+ const specifier = "@adonisjs/drive/services/main";
17
+ let drive = null;
18
+ try {
19
+ const mod = await import(__rewriteRelativeImportExtension(specifier));
20
+ drive = mod.default ?? null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ if (!drive)
26
+ return null;
27
+ const cfg = oidc.config;
28
+ const exportsCfg = cfg.uploads.exports;
29
+ const directory = (exportsCfg?.directory ?? "authkit/exports").replace(/\/+$/, "");
30
+ const diskName = exportsCfg?.disk ?? cfg.uploads.avatars?.disk;
31
+ const key = `${directory}/authkit-data-export-${accountId}-${runId}.json`;
32
+ try {
33
+ const disk = diskName ? drive.use(diskName) : drive.use();
34
+ await disk.put(key, json, {
35
+ contentType: "application/json; charset=utf-8",
36
+ });
37
+ return key;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ };
43
+ /** Entrega default: emite o signal `export:<runId>` (best-effort, fail-safe). */
44
+ const noopDeliver = async () => { };
45
+ /**
46
+ * Define a REGISTRAÇÃO do workflow durável `authkit.account.export`.
47
+ *
48
+ * Etapas (todas efeitos colaterais dentro de `ctx.step`, corpo determinístico):
49
+ * 1. `collect` — reúne o payload (reusa {@link AccountExportService.collect});
50
+ * 2. `audit` — registra `account.exported`;
51
+ * 3. `persist` — serializa + grava o artefato no drive;
52
+ * 4. `deliver` — notifica o titular (signal + link por e-mail, pluggable).
53
+ *
54
+ * Read-only + artefato → SEM compensação. Sub-fetches flaky podem ter retry
55
+ * por-etapa (a coleta é best-effort por dentro).
56
+ */
57
+ export function defineAccountExportWorkflow(deps) {
58
+ const persist = deps.persist ?? defaultPersist;
59
+ const deliver = deps.deliver ?? noopDeliver;
60
+ const body = async (ctx, input) => {
61
+ const { accountId } = input;
62
+ const runId = ctx.runId ?? accountId;
63
+ // 1) Coleta o payload (reusa a coleta inline do AccountExportService).
64
+ const payload = await ctx.step("collect", async () => {
65
+ const oidc = await deps.oidc();
66
+ return new AccountExportService(oidc).collect(accountId);
67
+ });
68
+ if (!payload)
69
+ return { ok: false, artifactKey: null, bytes: 0 };
70
+ // 2) Audita o export (account.exported).
71
+ await ctx.step("audit", async () => {
72
+ const cfg = (await deps.oidc()).config;
73
+ await cfg.audit?.record({
74
+ type: "account.exported",
75
+ accountId,
76
+ ip: input.ip ?? null,
77
+ });
78
+ });
79
+ // 3) Serializa + persiste o artefato.
80
+ const json = JSON.stringify(payload, null, 2);
81
+ const artifactKey = await ctx.step("persist", async () => {
82
+ const oidc = await deps.oidc();
83
+ return persist({ accountId, runId, json, oidc });
84
+ });
85
+ // 4) Entrega ao titular (signal + e-mail, pluggable).
86
+ await ctx.step("deliver", async () => {
87
+ const oidc = await deps.oidc();
88
+ await deliver({ accountId, runId, artifactKey, oidc });
89
+ });
90
+ return { ok: true, artifactKey, bytes: json.length };
91
+ };
92
+ return { name: ACCOUNT_EXPORT_WORKFLOW, version: "1", body };
93
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Subpath OPT-IN: workflows duráveis para os fluxos LGPD/GDPR de deleção e export
3
+ * de conta. ISOLADO do barrel principal (`@adonis-agora/authkit-server`) — só é
4
+ * carregado quando o app importa `@adonis-agora/authkit-server/durable` e tem o
5
+ * peer OPCIONAL `@adonis-agora/durable` instalado.
6
+ *
7
+ * Quando o modo durável NÃO está ligado (config `accountLifecycle.durable`
8
+ * ausente/false), NADA aqui é importado e o comportamento síncrono de sempre
9
+ * permanece byte-idêntico.
10
+ *
11
+ * Wiring no app:
12
+ *
13
+ * ```ts
14
+ * import { WorkflowEngine } from '@adonis-agora/durable'
15
+ * import {
16
+ * defineAccountDeletionWorkflow,
17
+ * defineAccountExportWorkflow,
18
+ * } from '@adonis-agora/authkit-server/durable'
19
+ *
20
+ * const engine = await app.container.make(WorkflowEngine)
21
+ * const oidc = () => app.container.make('authkit.server')
22
+ * const del = defineAccountDeletionWorkflow({ oidc })
23
+ * const exp = defineAccountExportWorkflow({ oidc })
24
+ * engine.register(del.name, del.version, del.body)
25
+ * engine.register(exp.name, exp.version, exp.body)
26
+ * // ...e rode um worker (engine.runPending / runOne) p/ o grupo do authkit.
27
+ * ```
28
+ */
29
+ import type { DeletionActor } from "../account_deletion_service.js";
30
+ import { type AccountDeleteWorkflowInput } from "./account_deletion_workflow.js";
31
+ import { type AccountExportWorkflowInput } from "./account_export_workflow.js";
32
+ export { defineAccountDeletionWorkflow, ACCOUNT_DELETE_WORKFLOW, type AccountDeleteWorkflowInput, type AccountDeletionWorkflowDeps, type DurableStepCtx, type WorkflowBody, } from "./account_deletion_workflow.js";
33
+ export { defineAccountExportWorkflow, ACCOUNT_EXPORT_WORKFLOW, type AccountExportWorkflowInput, type AccountExportWorkflowResult, type AccountExportWorkflowDeps, type PersistArtifact, type DeliverArtifact, } from "./account_export_workflow.js";
34
+ /**
35
+ * Superfície mínima do `WorkflowEngine` que o enqueue usa (`start` idempotente por
36
+ * run-id). Tipada estruturalmente p/ NÃO acoplar o build ao peer opcional.
37
+ */
38
+ export interface EnqueueEngine {
39
+ start(workflow: string, input: unknown, runId: string, opts?: unknown): Promise<unknown>;
40
+ }
41
+ /** Um resolver de container (`ctx.containerResolver` ou `app.container`). */
42
+ export interface ContainerResolverLike {
43
+ make(binding: unknown): Promise<unknown>;
44
+ }
45
+ /**
46
+ * Resolve o `WorkflowEngine` do container — SÓ no caminho durável. Importa
47
+ * `@adonis-agora/durable` dinamicamente (peer opcional), então o barrel principal
48
+ * nunca o carrega. Lança uma mensagem clara se o peer não estiver instalado.
49
+ */
50
+ export declare function resolveWorkflowEngine(resolver: ContainerResolverLike): Promise<EnqueueEngine>;
51
+ /**
52
+ * Enfileira o workflow durável de deleção, idempotente por `accountId` (run-id =
53
+ * `authkit.account.delete:<accountId>` → requests duplicadas dedupam no mesmo run).
54
+ * Retorna o run-id usado.
55
+ */
56
+ export declare function enqueueAccountDeletion(engine: EnqueueEngine, input: AccountDeleteWorkflowInput): Promise<string>;
57
+ /**
58
+ * Enfileira o workflow durável de export. Idempotente por `accountId` no run-id —
59
+ * uma exportação em voo dedupa pedidos repetidos do mesmo titular.
60
+ */
61
+ export declare function enqueueAccountExport(engine: EnqueueEngine, input: AccountExportWorkflowInput): Promise<string>;
62
+ /**
63
+ * Constrói um callback `EnqueueDeletion` (para `AdminUsersService.delete`) a partir
64
+ * de um resolver de container — resolve o `WorkflowEngine` e enfileira o cascade.
65
+ */
66
+ export declare function enqueueDeletionVia(resolver: ContainerResolverLike): (input: AccountDeleteWorkflowInput) => Promise<string>;
67
+ /** Re-export por conveniência: o tipo do ator de deleção. */
68
+ export type { DeletionActor };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Subpath OPT-IN: workflows duráveis para os fluxos LGPD/GDPR de deleção e export
3
+ * de conta. ISOLADO do barrel principal (`@adonis-agora/authkit-server`) — só é
4
+ * carregado quando o app importa `@adonis-agora/authkit-server/durable` e tem o
5
+ * peer OPCIONAL `@adonis-agora/durable` instalado.
6
+ *
7
+ * Quando o modo durável NÃO está ligado (config `accountLifecycle.durable`
8
+ * ausente/false), NADA aqui é importado e o comportamento síncrono de sempre
9
+ * permanece byte-idêntico.
10
+ *
11
+ * Wiring no app:
12
+ *
13
+ * ```ts
14
+ * import { WorkflowEngine } from '@adonis-agora/durable'
15
+ * import {
16
+ * defineAccountDeletionWorkflow,
17
+ * defineAccountExportWorkflow,
18
+ * } from '@adonis-agora/authkit-server/durable'
19
+ *
20
+ * const engine = await app.container.make(WorkflowEngine)
21
+ * const oidc = () => app.container.make('authkit.server')
22
+ * const del = defineAccountDeletionWorkflow({ oidc })
23
+ * const exp = defineAccountExportWorkflow({ oidc })
24
+ * engine.register(del.name, del.version, del.body)
25
+ * engine.register(exp.name, exp.version, exp.body)
26
+ * // ...e rode um worker (engine.runPending / runOne) p/ o grupo do authkit.
27
+ * ```
28
+ */
29
+ import { ACCOUNT_DELETE_WORKFLOW, } from "./account_deletion_workflow.js";
30
+ import { ACCOUNT_EXPORT_WORKFLOW, } from "./account_export_workflow.js";
31
+ export { defineAccountDeletionWorkflow, ACCOUNT_DELETE_WORKFLOW, } from "./account_deletion_workflow.js";
32
+ export { defineAccountExportWorkflow, ACCOUNT_EXPORT_WORKFLOW, } from "./account_export_workflow.js";
33
+ /**
34
+ * Resolve o `WorkflowEngine` do container — SÓ no caminho durável. Importa
35
+ * `@adonis-agora/durable` dinamicamente (peer opcional), então o barrel principal
36
+ * nunca o carrega. Lança uma mensagem clara se o peer não estiver instalado.
37
+ */
38
+ export async function resolveWorkflowEngine(resolver) {
39
+ let mod;
40
+ try {
41
+ mod = (await import("@adonis-agora/durable"));
42
+ }
43
+ catch {
44
+ throw new Error('[authkit] durable account-lifecycle is enabled but "@adonis-agora/durable" is not installed. ' +
45
+ "Add it as a dependency and register the workflows on your WorkflowEngine.");
46
+ }
47
+ return resolver.make(mod.WorkflowEngine);
48
+ }
49
+ /**
50
+ * Enfileira o workflow durável de deleção, idempotente por `accountId` (run-id =
51
+ * `authkit.account.delete:<accountId>` → requests duplicadas dedupam no mesmo run).
52
+ * Retorna o run-id usado.
53
+ */
54
+ export async function enqueueAccountDeletion(engine, input) {
55
+ const runId = `${ACCOUNT_DELETE_WORKFLOW}:${input.accountId}`;
56
+ await engine.start(ACCOUNT_DELETE_WORKFLOW, input, runId);
57
+ return runId;
58
+ }
59
+ /**
60
+ * Enfileira o workflow durável de export. Idempotente por `accountId` no run-id —
61
+ * uma exportação em voo dedupa pedidos repetidos do mesmo titular.
62
+ */
63
+ export async function enqueueAccountExport(engine, input) {
64
+ const runId = `${ACCOUNT_EXPORT_WORKFLOW}:${input.accountId}`;
65
+ await engine.start(ACCOUNT_EXPORT_WORKFLOW, input, runId);
66
+ return runId;
67
+ }
68
+ /**
69
+ * Constrói um callback `EnqueueDeletion` (para `AdminUsersService.delete`) a partir
70
+ * de um resolver de container — resolve o `WorkflowEngine` e enfileira o cascade.
71
+ */
72
+ export function enqueueDeletionVia(resolver) {
73
+ return async (input) => {
74
+ const engine = await resolveWorkflowEngine(resolver);
75
+ return enqueueAccountDeletion(engine, input);
76
+ };
77
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Renderização de e-mails transacionais do host-kit (reset de senha / verificação).
3
+ *
4
+ * Sem dependências (template literals) e com HTML email-safe: estilos inline,
5
+ * layout em tabela centralizada, botão de CTA com a cor de acento da marca, e
6
+ * sempre um corpo `text` de fallback. Branding vem do `config/authkit.ts`
7
+ * (`branding.default` ou a marca do client). Tudo escapado para evitar injeção.
8
+ */
9
+ export interface EmailContent {
10
+ subject: string;
11
+ html: string;
12
+ text: string;
13
+ }
14
+ interface EmailTemplateInput {
15
+ /** Marca usada no cabeçalho/botão/rodapé (accent/company opcionais). */
16
+ brand: {
17
+ appName: string;
18
+ accent?: string;
19
+ company?: string;
20
+ };
21
+ /** Assunto do e-mail. */
22
+ subject: string;
23
+ /** Saudação/título dentro do card. */
24
+ heading: string;
25
+ /** Parágrafo de introdução (texto puro, será escapado). */
26
+ intro: string;
27
+ /** Rótulo do botão de CTA. */
28
+ ctaLabel: string;
29
+ /** URL do CTA. */
30
+ ctaUrl: string;
31
+ /** Linha auxiliar abaixo do botão (ex.: validade do link). */
32
+ footnote?: string;
33
+ /** Texto que precede o link de fallback (i18n). Default em inglês. */
34
+ linkFallback?: string;
35
+ /** Locale do documento HTML (atributo `lang`). Default: 'en'. */
36
+ locale?: string;
37
+ }
38
+ export declare function renderTransactionalEmail(input: EmailTemplateInput): EmailContent;
39
+ export {};
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Renderização de e-mails transacionais do host-kit (reset de senha / verificação).
3
+ *
4
+ * Sem dependências (template literals) e com HTML email-safe: estilos inline,
5
+ * layout em tabela centralizada, botão de CTA com a cor de acento da marca, e
6
+ * sempre um corpo `text` de fallback. Branding vem do `config/authkit.ts`
7
+ * (`branding.default` ou a marca do client). Tudo escapado para evitar injeção.
8
+ */
9
+ /** Escapa texto para interpolação segura em HTML. */
10
+ function esc(value) {
11
+ return value
12
+ .replace(/&/g, '&amp;')
13
+ .replace(/</g, '&lt;')
14
+ .replace(/>/g, '&gt;')
15
+ .replace(/"/g, '&quot;')
16
+ .replace(/'/g, '&#39;');
17
+ }
18
+ const FALLBACK_ACCENT = '#4f46e5';
19
+ export function renderTransactionalEmail(input) {
20
+ const appName = input.brand.appName || input.brand.company || 'AuthKit';
21
+ const accent = input.brand.accent || FALLBACK_ACCENT;
22
+ const company = input.brand.company || appName;
23
+ const year = '©'; // ano resolvido fora (sem Date.* aqui); rodapé usa só o nome.
24
+ const lang = input.locale || 'en';
25
+ const linkFallback = input.linkFallback ||
26
+ 'If the button does not work, copy and paste this link into your browser:';
27
+ const html = `<!doctype html>
28
+ <html lang="${esc(lang)}">
29
+ <head>
30
+ <meta charset="utf-8">
31
+ <meta name="viewport" content="width=device-width, initial-scale=1">
32
+ <title>${esc(input.subject)}</title>
33
+ </head>
34
+ <body style="margin:0;padding:0;background:#f3f4f6;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;">
35
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f3f4f6;padding:32px 12px;">
36
+ <tr><td align="center">
37
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="max-width:480px;background:#ffffff;border-radius:14px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.08);">
38
+ <tr><td style="background:${esc(accent)};padding:20px 28px;">
39
+ <span style="color:#ffffff;font-size:18px;font-weight:700;letter-spacing:.2px;">${esc(appName)}</span>
40
+ </td></tr>
41
+ <tr><td style="padding:32px 28px 8px;">
42
+ <h1 style="margin:0 0 12px;font-size:20px;line-height:1.3;color:#111827;">${esc(input.heading)}</h1>
43
+ <p style="margin:0 0 24px;font-size:15px;line-height:1.6;color:#374151;">${esc(input.intro)}</p>
44
+ <table role="presentation" cellpadding="0" cellspacing="0"><tr><td style="border-radius:8px;background:${esc(accent)};">
45
+ <a href="${esc(input.ctaUrl)}" style="display:inline-block;padding:12px 24px;font-size:15px;font-weight:600;color:#ffffff;text-decoration:none;border-radius:8px;">${esc(input.ctaLabel)}</a>
46
+ </td></tr></table>
47
+ ${input.footnote ? `<p style="margin:24px 0 0;font-size:13px;line-height:1.5;color:#6b7280;">${esc(input.footnote)}</p>` : ''}
48
+ <p style="margin:24px 0 0;font-size:13px;line-height:1.5;color:#6b7280;">${esc(linkFallback)}<br><a href="${esc(input.ctaUrl)}" style="color:${esc(accent)};word-break:break-all;">${esc(input.ctaUrl)}</a></p>
49
+ </td></tr>
50
+ <tr><td style="padding:24px 28px 28px;border-top:1px solid #f3f4f6;">
51
+ <p style="margin:0;font-size:12px;line-height:1.5;color:#9ca3af;">${esc(company)} ${year}</p>
52
+ </td></tr>
53
+ </table>
54
+ </td></tr>
55
+ </table>
56
+ </body>
57
+ </html>`;
58
+ const text = [
59
+ input.heading,
60
+ '',
61
+ input.intro,
62
+ '',
63
+ `${input.ctaLabel}: ${input.ctaUrl}`,
64
+ ...(input.footnote ? ['', input.footnote] : []),
65
+ '',
66
+ `— ${company}`,
67
+ ].join('\n');
68
+ return { subject: input.subject, html, text };
69
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resolução de geolocalização PLUGÁVEL e FAIL-SAFE para o IP de uma sessão.
3
+ *
4
+ * A lib NÃO embute nenhum banco de geo (MaxMind/ipapi/etc.) — o host pluga o
5
+ * `resolveGeo` na config (ex.: lookup MaxMind local ou um fetch a um serviço). O
6
+ * default (hook ausente) é NÃO mostrar geo (só o IP). A resolução é best-effort
7
+ * com timeout curto: erro/timeout → `null` (a UI só omite a localização).
8
+ */
9
+ /**
10
+ * Hook do host que mapeia um IP para um rótulo de localização legível
11
+ * (ex.: "São Paulo, BR"). Recebe o IP e devolve a string OU `null` quando não
12
+ * resolve. Pode ser síncrono ou assíncrono.
13
+ */
14
+ export type ResolveGeo = (ip: string) => Promise<string | null> | (string | null);
15
+ /** Timeout default (ms) da resolução de geo — curto para não atrasar listagens. */
16
+ export declare const GEO_RESOLVE_TIMEOUT_MS = 1500;
17
+ /**
18
+ * Aplica o `resolveGeo` do host a um IP de forma defensiva: sem hook, sem IP, ou
19
+ * erro/timeout → `null`. NUNCA lança. O timeout evita que um lookup lento
20
+ * (ex.: rede) trave a renderização da lista de sessões.
21
+ */
22
+ export declare function resolveGeoSafe(resolveGeo: ResolveGeo | undefined, ip: string | null | undefined, timeoutMs?: number): Promise<string | null>;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Resolução de geolocalização PLUGÁVEL e FAIL-SAFE para o IP de uma sessão.
3
+ *
4
+ * A lib NÃO embute nenhum banco de geo (MaxMind/ipapi/etc.) — o host pluga o
5
+ * `resolveGeo` na config (ex.: lookup MaxMind local ou um fetch a um serviço). O
6
+ * default (hook ausente) é NÃO mostrar geo (só o IP). A resolução é best-effort
7
+ * com timeout curto: erro/timeout → `null` (a UI só omite a localização).
8
+ */
9
+ /** Timeout default (ms) da resolução de geo — curto para não atrasar listagens. */
10
+ export const GEO_RESOLVE_TIMEOUT_MS = 1500;
11
+ /**
12
+ * Aplica o `resolveGeo` do host a um IP de forma defensiva: sem hook, sem IP, ou
13
+ * erro/timeout → `null`. NUNCA lança. O timeout evita que um lookup lento
14
+ * (ex.: rede) trave a renderização da lista de sessões.
15
+ */
16
+ export async function resolveGeoSafe(resolveGeo, ip, timeoutMs = GEO_RESOLVE_TIMEOUT_MS) {
17
+ if (!resolveGeo || !ip)
18
+ return null;
19
+ try {
20
+ const result = await withTimeout(Promise.resolve(resolveGeo(ip)), timeoutMs);
21
+ return typeof result === 'string' && result.length > 0 ? result : null;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /** Rejeita após `ms` se a promise não resolver antes (limpa o timer ao fim). */
28
+ function withTimeout(promise, ms) {
29
+ return new Promise((resolve, reject) => {
30
+ const timer = setTimeout(() => reject(new Error('geo resolve timeout')), ms);
31
+ promise.then((value) => {
32
+ clearTimeout(timer);
33
+ resolve(value);
34
+ }, (error) => {
35
+ clearTimeout(timer);
36
+ reject(error);
37
+ });
38
+ });
39
+ }