@aurabase/aurabase-js 0.3.0 → 0.4.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 (343) hide show
  1. package/README.md +26 -795
  2. package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.ts → dist/AuraClient-BcFE8u1v.d.cts} +1 -1
  3. package/{packages/aurabase/dist/AuraClient-DAtDbfPB.d.cts → dist/AuraClient-BcFE8u1v.d.ts} +1 -1
  4. package/{packages/aurabase/dist → dist}/index.d.cts +1 -1
  5. package/{packages/aurabase/dist → dist}/index.d.ts +1 -1
  6. package/{packages/aurabase/dist → dist}/ssr.d.cts +1 -1
  7. package/{packages/aurabase/dist → dist}/ssr.d.ts +1 -1
  8. package/package.json +72 -82
  9. package/.changeset/config.json +0 -11
  10. package/CHANGELOG.md +0 -30
  11. package/packages/ai/LICENSE +0 -21
  12. package/packages/ai/README.md +0 -106
  13. package/packages/ai/dist/index.cjs +0 -229
  14. package/packages/ai/dist/index.d.cts +0 -139
  15. package/packages/ai/dist/index.d.ts +0 -139
  16. package/packages/ai/dist/index.js +0 -226
  17. package/packages/ai/node_modules/.bin/esbuild +0 -19
  18. package/packages/ai/node_modules/.bin/tsc +0 -22
  19. package/packages/ai/node_modules/.bin/tsserver +0 -22
  20. package/packages/ai/node_modules/.bin/tsup +0 -22
  21. package/packages/ai/node_modules/.bin/tsup-node +0 -22
  22. package/packages/ai/node_modules/.bin/vite +0 -22
  23. package/packages/ai/node_modules/.bin/vitest +0 -22
  24. package/packages/ai/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  25. package/packages/ai/package.json +0 -61
  26. package/packages/ai/src/AiService.ts +0 -226
  27. package/packages/ai/src/index.ts +0 -18
  28. package/packages/ai/src/sse.ts +0 -141
  29. package/packages/ai/src/types.ts +0 -30
  30. package/packages/ai/tests/chat-stream.test.ts +0 -151
  31. package/packages/ai/tests/rag-namespaces.test.ts +0 -54
  32. package/packages/ai/tests/sse.test.ts +0 -69
  33. package/packages/ai/tsconfig.json +0 -5
  34. package/packages/ai/tsup.config.ts +0 -11
  35. package/packages/aurabase/LICENSE +0 -21
  36. package/packages/aurabase/README.md +0 -64
  37. package/packages/aurabase/node_modules/.bin/esbuild +0 -19
  38. package/packages/aurabase/node_modules/.bin/tsc +0 -22
  39. package/packages/aurabase/node_modules/.bin/tsserver +0 -22
  40. package/packages/aurabase/node_modules/.bin/tsup +0 -22
  41. package/packages/aurabase/node_modules/.bin/tsup-node +0 -22
  42. package/packages/aurabase/node_modules/.bin/vite +0 -22
  43. package/packages/aurabase/node_modules/.bin/vitest +0 -22
  44. package/packages/aurabase/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  45. package/packages/aurabase/package.json +0 -80
  46. package/packages/aurabase/src/AuraClient.ts +0 -237
  47. package/packages/aurabase/src/index.ts +0 -152
  48. package/packages/aurabase/src/ssr.ts +0 -156
  49. package/packages/aurabase/tests/ai-streaming-rag-e2e.test.ts +0 -82
  50. package/packages/aurabase/tests/ai.test.ts +0 -111
  51. package/packages/aurabase/tests/auth-admin.test.ts +0 -515
  52. package/packages/aurabase/tests/auth-e2e.test.ts +0 -135
  53. package/packages/aurabase/tests/auth-hardening.test.ts +0 -206
  54. package/packages/aurabase/tests/auth.test.ts +0 -947
  55. package/packages/aurabase/tests/database.test.ts +0 -230
  56. package/packages/aurabase/tests/db-types-e2e.test.ts +0 -217
  57. package/packages/aurabase/tests/dispose.test.ts +0 -23
  58. package/packages/aurabase/tests/foreign-token.e2e.test.ts +0 -129
  59. package/packages/aurabase/tests/functions.test.ts +0 -107
  60. package/packages/aurabase/tests/integration.test.ts +0 -413
  61. package/packages/aurabase/tests/live-production-validation.js +0 -241
  62. package/packages/aurabase/tests/live-sdk-production-validation.js +0 -293
  63. package/packages/aurabase/tests/mocks.ts +0 -139
  64. package/packages/aurabase/tests/notifications.test.ts +0 -314
  65. package/packages/aurabase/tests/observability-backup.test.ts +0 -186
  66. package/packages/aurabase/tests/observability-hook.test.ts +0 -130
  67. package/packages/aurabase/tests/production-robustness.test.ts +0 -268
  68. package/packages/aurabase/tests/public-api-surface.test.ts +0 -53
  69. package/packages/aurabase/tests/query-builder.test.ts +0 -329
  70. package/packages/aurabase/tests/readme-smoke-e2e.test.ts +0 -231
  71. package/packages/aurabase/tests/realtime-filter-e2e.test.ts +0 -344
  72. package/packages/aurabase/tests/refresh-locks.test.ts +0 -210
  73. package/packages/aurabase/tests/retry-option.test.ts +0 -17
  74. package/packages/aurabase/tests/rpc-e2e.test.ts +0 -254
  75. package/packages/aurabase/tests/rs256-local-e2e.test.ts +0 -114
  76. package/packages/aurabase/tests/rt-alias-public-e2e.test.ts +0 -235
  77. package/packages/aurabase/tests/rt-http-broadcast-e2e.test.ts +0 -124
  78. package/packages/aurabase/tests/service-role-guard.test.ts +0 -99
  79. package/packages/aurabase/tests/ssr.test.ts +0 -91
  80. package/packages/aurabase/tests/storage-backend-e2e.test.ts +0 -481
  81. package/packages/aurabase/tests/storage-sdk-parity-e2e.test.ts +0 -104
  82. package/packages/aurabase/tests/storage-transform-e2e.test.ts +0 -684
  83. package/packages/aurabase/tests/storage.test.ts +0 -55
  84. package/packages/aurabase/tests/types/client-generic.test-d.ts +0 -79
  85. package/packages/aurabase/tests/types/docs-snippets.test-d.ts +0 -571
  86. package/packages/aurabase/tests/types/error-code.test-d.ts +0 -53
  87. package/packages/aurabase/tsconfig.json +0 -5
  88. package/packages/aurabase/tsconfig.test-d.json +0 -5
  89. package/packages/aurabase/tsup.config.ts +0 -11
  90. package/packages/aurabase/vitest.config.ts +0 -16
  91. package/packages/aurabase/vitest.e2e.config.ts +0 -9
  92. package/packages/auth/LICENSE +0 -21
  93. package/packages/auth/README.md +0 -215
  94. package/packages/auth/dist/index.cjs +0 -1175
  95. package/packages/auth/dist/index.d.cts +0 -397
  96. package/packages/auth/dist/index.d.ts +0 -397
  97. package/packages/auth/dist/index.js +0 -1170
  98. package/packages/auth/node_modules/.bin/esbuild +0 -19
  99. package/packages/auth/node_modules/.bin/tsc +0 -22
  100. package/packages/auth/node_modules/.bin/tsserver +0 -22
  101. package/packages/auth/node_modules/.bin/tsup +0 -22
  102. package/packages/auth/node_modules/.bin/tsup-node +0 -22
  103. package/packages/auth/node_modules/.bin/vite +0 -22
  104. package/packages/auth/node_modules/.bin/vitest +0 -22
  105. package/packages/auth/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  106. package/packages/auth/package.json +0 -61
  107. package/packages/auth/src/AuthAdminService.ts +0 -149
  108. package/packages/auth/src/AuthService.ts +0 -1166
  109. package/packages/auth/src/SessionManager.ts +0 -92
  110. package/packages/auth/src/index.ts +0 -17
  111. package/packages/auth/src/jwks.ts +0 -337
  112. package/packages/auth/src/pkce.ts +0 -27
  113. package/packages/auth/src/types.ts +0 -89
  114. package/packages/auth/tests/auth-lifecycle.test.ts +0 -149
  115. package/packages/auth/tests/detect-session.test.ts +0 -361
  116. package/packages/auth/tests/getclaims.test.ts +0 -780
  117. package/packages/auth/tests/is-mfa-challenge.test.ts +0 -27
  118. package/packages/auth/tests/password-recovery.test.ts +0 -124
  119. package/packages/auth/tests/pkce.test.ts +0 -192
  120. package/packages/auth/tests/session-manager.test.ts +0 -103
  121. package/packages/auth/tests/set-session.test.ts +0 -139
  122. package/packages/auth/tests/verify-otp.test.ts +0 -153
  123. package/packages/auth/tsconfig.json +0 -5
  124. package/packages/auth/tsup.config.ts +0 -11
  125. package/packages/core/LICENSE +0 -21
  126. package/packages/core/README.md +0 -132
  127. package/packages/core/dist/index.cjs +0 -695
  128. package/packages/core/dist/index.d.cts +0 -1137
  129. package/packages/core/dist/index.d.ts +0 -1137
  130. package/packages/core/dist/index.js +0 -673
  131. package/packages/core/node_modules/.bin/esbuild +0 -22
  132. package/packages/core/node_modules/.bin/tsc +0 -22
  133. package/packages/core/node_modules/.bin/tsserver +0 -22
  134. package/packages/core/node_modules/.bin/tsup +0 -22
  135. package/packages/core/node_modules/.bin/tsup-node +0 -22
  136. package/packages/core/node_modules/.bin/vite +0 -22
  137. package/packages/core/node_modules/.bin/vitest +0 -22
  138. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  139. package/packages/core/package.json +0 -57
  140. package/packages/core/src/AuraError.ts +0 -89
  141. package/packages/core/src/BaseService.ts +0 -44
  142. package/packages/core/src/client.ts +0 -34
  143. package/packages/core/src/cookie-utils.ts +0 -42
  144. package/packages/core/src/fetch.ts +0 -435
  145. package/packages/core/src/index.ts +0 -22
  146. package/packages/core/src/retry.ts +0 -63
  147. package/packages/core/src/serialize.ts +0 -6
  148. package/packages/core/src/stores/BaseAuthStore.ts +0 -164
  149. package/packages/core/src/stores/LocalAuthStore.ts +0 -199
  150. package/packages/core/src/types.ts +0 -1042
  151. package/packages/core/tests/auth-store.test.ts +0 -300
  152. package/packages/core/tests/error-code.test.ts +0 -61
  153. package/packages/core/tests/error.test.ts +0 -24
  154. package/packages/core/tests/fetch.test.ts +0 -286
  155. package/packages/core/tests/mocks.ts +0 -139
  156. package/packages/core/tests/observability.test.ts +0 -86
  157. package/packages/core/tests/refresh-hardening.test.ts +0 -164
  158. package/packages/core/tests/refresh-observability.test.ts +0 -111
  159. package/packages/core/tests/retry.test.ts +0 -106
  160. package/packages/core/tests/serialize.test.ts +0 -12
  161. package/packages/core/tests/timeout.test.ts +0 -79
  162. package/packages/core/tsconfig.json +0 -5
  163. package/packages/core/tsup.config.ts +0 -11
  164. package/packages/db/LICENSE +0 -21
  165. package/packages/db/README.md +0 -152
  166. package/packages/db/VENDORED.md +0 -93
  167. package/packages/db/dist/index.cjs +0 -544
  168. package/packages/db/dist/index.d.cts +0 -1111
  169. package/packages/db/dist/index.d.ts +0 -1111
  170. package/packages/db/dist/index.js +0 -541
  171. package/packages/db/node_modules/.bin/esbuild +0 -19
  172. package/packages/db/node_modules/.bin/tsc +0 -22
  173. package/packages/db/node_modules/.bin/tsserver +0 -22
  174. package/packages/db/node_modules/.bin/tsup +0 -22
  175. package/packages/db/node_modules/.bin/tsup-node +0 -22
  176. package/packages/db/node_modules/.bin/vite +0 -22
  177. package/packages/db/node_modules/.bin/vitest +0 -22
  178. package/packages/db/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  179. package/packages/db/package.json +0 -62
  180. package/packages/db/src/DatabaseService.ts +0 -170
  181. package/packages/db/src/QueryBuilder.ts +0 -830
  182. package/packages/db/src/index.ts +0 -2
  183. package/packages/db/src/pgrst-types/common/common.ts +0 -86
  184. package/packages/db/src/pgrst-types/common/rpc.ts +0 -151
  185. package/packages/db/src/pgrst-types/feature-flags.ts +0 -20
  186. package/packages/db/src/pgrst-types/types.ts +0 -134
  187. package/packages/db/src/select-query-parser/parser.ts +0 -479
  188. package/packages/db/src/select-query-parser/result.ts +0 -553
  189. package/packages/db/src/select-query-parser/types.ts +0 -132
  190. package/packages/db/src/select-query-parser/utils.ts +0 -707
  191. package/packages/db/tests/filters.test.ts +0 -81
  192. package/packages/db/tests/mutations-filtered.e2e.test.ts +0 -132
  193. package/packages/db/tests/mutations-filtered.test.ts +0 -188
  194. package/packages/db/tests/order.test.ts +0 -45
  195. package/packages/db/tests/rpc.test.ts +0 -41
  196. package/packages/db/tests/scale/build-large-schema.ts +0 -94
  197. package/packages/db/tests/scale/scale-compile.test.ts +0 -167
  198. package/packages/db/tests/schema.test.ts +0 -77
  199. package/packages/db/tests/single-accept.e2e.test.ts +0 -123
  200. package/packages/db/tests/single.test.ts +0 -211
  201. package/packages/db/tests/types/filters.test-d.ts +0 -52
  202. package/packages/db/tests/types/fixtures.ts +0 -40
  203. package/packages/db/tests/types/from-views.test-d.ts +0 -18
  204. package/packages/db/tests/types/mutations.test-d.ts +0 -23
  205. package/packages/db/tests/types/rpc.test-d.ts +0 -60
  206. package/packages/db/tests/types/schema-shape.test-d.ts +0 -8
  207. package/packages/db/tests/types/select-inference.test-d.ts +0 -38
  208. package/packages/db/tests/vendored/fixtures.ts +0 -83
  209. package/packages/db/tests/vendored/get-result.test-d.ts +0 -75
  210. package/packages/db/tsconfig.json +0 -5
  211. package/packages/db/tsconfig.test-d.json +0 -5
  212. package/packages/db/tsup.config.ts +0 -11
  213. package/packages/db/vitest.config.ts +0 -8
  214. package/packages/functions/LICENSE +0 -21
  215. package/packages/functions/README.md +0 -96
  216. package/packages/functions/dist/index.cjs +0 -173
  217. package/packages/functions/dist/index.d.cts +0 -81
  218. package/packages/functions/dist/index.d.ts +0 -81
  219. package/packages/functions/dist/index.js +0 -168
  220. package/packages/functions/node_modules/.bin/esbuild +0 -19
  221. package/packages/functions/node_modules/.bin/tsc +0 -22
  222. package/packages/functions/node_modules/.bin/tsserver +0 -22
  223. package/packages/functions/node_modules/.bin/tsup +0 -22
  224. package/packages/functions/node_modules/.bin/tsup-node +0 -22
  225. package/packages/functions/node_modules/.bin/vite +0 -22
  226. package/packages/functions/node_modules/.bin/vitest +0 -22
  227. package/packages/functions/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  228. package/packages/functions/package.json +0 -60
  229. package/packages/functions/src/FunctionsService.ts +0 -188
  230. package/packages/functions/src/errors.ts +0 -70
  231. package/packages/functions/src/index.ts +0 -6
  232. package/packages/functions/tests/invoke.test.ts +0 -97
  233. package/packages/functions/tests/response-type-errors.test.ts +0 -135
  234. package/packages/functions/tsconfig.json +0 -5
  235. package/packages/functions/tsup.config.ts +0 -11
  236. package/packages/gen/LICENSE +0 -21
  237. package/packages/gen/README.md +0 -84
  238. package/packages/gen/dist/cli.cjs +0 -334
  239. package/packages/gen/dist/cli.d.cts +0 -1
  240. package/packages/gen/dist/cli.d.ts +0 -1
  241. package/packages/gen/dist/cli.js +0 -332
  242. package/packages/gen/dist/index.cjs +0 -257
  243. package/packages/gen/dist/index.d.cts +0 -12
  244. package/packages/gen/dist/index.d.ts +0 -12
  245. package/packages/gen/dist/index.js +0 -255
  246. package/packages/gen/node_modules/.bin/esbuild +0 -19
  247. package/packages/gen/node_modules/.bin/tsc +0 -22
  248. package/packages/gen/node_modules/.bin/tsserver +0 -22
  249. package/packages/gen/node_modules/.bin/tsup +0 -22
  250. package/packages/gen/node_modules/.bin/tsup-node +0 -22
  251. package/packages/gen/node_modules/.bin/vite +0 -22
  252. package/packages/gen/node_modules/.bin/vitest +0 -22
  253. package/packages/gen/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  254. package/packages/gen/package.json +0 -66
  255. package/packages/gen/src/cli.ts +0 -67
  256. package/packages/gen/src/generate.ts +0 -0
  257. package/packages/gen/src/index.ts +0 -2
  258. package/packages/gen/tests/compile.test.ts +0 -213
  259. package/packages/gen/tests/e2e.test.ts +0 -130
  260. package/packages/gen/tests/generate.test.ts +0 -396
  261. package/packages/gen/tsconfig.json +0 -5
  262. package/packages/gen/tsup.config.ts +0 -11
  263. package/packages/notifications/LICENSE +0 -21
  264. package/packages/notifications/README.md +0 -134
  265. package/packages/notifications/dist/index.cjs +0 -128
  266. package/packages/notifications/dist/index.d.cts +0 -81
  267. package/packages/notifications/dist/index.d.ts +0 -81
  268. package/packages/notifications/dist/index.js +0 -125
  269. package/packages/notifications/node_modules/.bin/esbuild +0 -19
  270. package/packages/notifications/node_modules/.bin/tsc +0 -22
  271. package/packages/notifications/node_modules/.bin/tsserver +0 -22
  272. package/packages/notifications/node_modules/.bin/tsup +0 -22
  273. package/packages/notifications/node_modules/.bin/tsup-node +0 -22
  274. package/packages/notifications/node_modules/.bin/vite +0 -22
  275. package/packages/notifications/node_modules/.bin/vitest +0 -22
  276. package/packages/notifications/package.json +0 -60
  277. package/packages/notifications/src/NotificationsService.ts +0 -230
  278. package/packages/notifications/src/index.ts +0 -19
  279. package/packages/notifications/tsconfig.json +0 -5
  280. package/packages/notifications/tsup.config.ts +0 -11
  281. package/packages/realtime/LICENSE +0 -21
  282. package/packages/realtime/README.md +0 -183
  283. package/packages/realtime/dist/index.cjs +0 -977
  284. package/packages/realtime/dist/index.d.cts +0 -259
  285. package/packages/realtime/dist/index.d.ts +0 -259
  286. package/packages/realtime/dist/index.js +0 -973
  287. package/packages/realtime/node_modules/.bin/esbuild +0 -19
  288. package/packages/realtime/node_modules/.bin/tsc +0 -22
  289. package/packages/realtime/node_modules/.bin/tsserver +0 -22
  290. package/packages/realtime/node_modules/.bin/tsup +0 -22
  291. package/packages/realtime/node_modules/.bin/tsup-node +0 -22
  292. package/packages/realtime/node_modules/.bin/vite +0 -22
  293. package/packages/realtime/node_modules/.bin/vitest +0 -22
  294. package/packages/realtime/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  295. package/packages/realtime/package.json +0 -60
  296. package/packages/realtime/src/AuraChannel.ts +0 -485
  297. package/packages/realtime/src/HeartbeatManager.ts +0 -73
  298. package/packages/realtime/src/RealtimeService.ts +0 -505
  299. package/packages/realtime/src/columnFilter.ts +0 -301
  300. package/packages/realtime/src/index.ts +0 -4
  301. package/packages/realtime/tests/ack-routing.test.ts +0 -81
  302. package/packages/realtime/tests/column-filter.test.ts +0 -144
  303. package/packages/realtime/tests/dispatch.test.ts +0 -191
  304. package/packages/realtime/tests/heartbeat.test.ts +0 -67
  305. package/packages/realtime/tests/http-broadcast.test.ts +0 -68
  306. package/packages/realtime/tests/realtime-token.test.ts +0 -43
  307. package/packages/realtime/tests/reconnect-race.test.ts +0 -149
  308. package/packages/realtime/tests/ref-id.test.ts +0 -34
  309. package/packages/realtime/tests/set-auth.test.ts +0 -70
  310. package/packages/realtime/tsconfig.json +0 -5
  311. package/packages/realtime/tsup.config.ts +0 -11
  312. package/packages/storage/LICENSE +0 -21
  313. package/packages/storage/README.md +0 -141
  314. package/packages/storage/dist/index.cjs +0 -333
  315. package/packages/storage/dist/index.d.cts +0 -185
  316. package/packages/storage/dist/index.d.ts +0 -185
  317. package/packages/storage/dist/index.js +0 -329
  318. package/packages/storage/node_modules/.bin/esbuild +0 -19
  319. package/packages/storage/node_modules/.bin/tsc +0 -22
  320. package/packages/storage/node_modules/.bin/tsserver +0 -22
  321. package/packages/storage/node_modules/.bin/tsup +0 -22
  322. package/packages/storage/node_modules/.bin/tsup-node +0 -22
  323. package/packages/storage/node_modules/.bin/vite +0 -22
  324. package/packages/storage/node_modules/.bin/vitest +0 -22
  325. package/packages/storage/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  326. package/packages/storage/package.json +0 -60
  327. package/packages/storage/src/DownloadBuilder.ts +0 -60
  328. package/packages/storage/src/StorageService.ts +0 -323
  329. package/packages/storage/src/index.ts +0 -2
  330. package/packages/storage/src/path.ts +0 -35
  331. package/packages/storage/src/transform.ts +0 -15
  332. package/packages/storage/tests/download.test.ts +0 -64
  333. package/packages/storage/tests/parity.test.ts +0 -154
  334. package/packages/storage/tests/path.test.ts +0 -87
  335. package/packages/storage/tests/transform.test.ts +0 -79
  336. package/packages/storage/tsconfig.json +0 -5
  337. package/packages/storage/tsup.config.ts +0 -11
  338. package/pnpm-workspace.yaml +0 -24
  339. package/tsconfig.base.json +0 -15
  340. /package/{packages/aurabase/dist → dist}/index.cjs +0 -0
  341. /package/{packages/aurabase/dist → dist}/index.js +0 -0
  342. /package/{packages/aurabase/dist → dist}/ssr.cjs +0 -0
  343. /package/{packages/aurabase/dist → dist}/ssr.js +0 -0
@@ -1,1175 +0,0 @@
1
- 'use strict';
2
-
3
- var core = require('@aurabase/core');
4
-
5
- // src/AuthService.ts
6
-
7
- // src/SessionManager.ts
8
- var SessionManager = class {
9
- opts;
10
- _interval = null;
11
- _channel = null;
12
- _active = false;
13
- _visHandler = null;
14
- constructor(opts) {
15
- this.opts = { tickMs: 3e4, ...opts };
16
- }
17
- get isActive() {
18
- return this._active;
19
- }
20
- start() {
21
- if (!this.opts.enabled) return;
22
- if (typeof BroadcastChannel !== "undefined" && !this._channel) {
23
- this._channel = new BroadcastChannel(this.opts.channelName);
24
- this._channel.onmessage = (e) => this.opts.onRemoteMessage(e.data);
25
- }
26
- if (typeof document !== "undefined" && !this._visHandler) {
27
- this._visHandler = () => {
28
- if (document.hidden) {
29
- this._stopInterval();
30
- } else if (this._active) {
31
- this._startInterval();
32
- if (this.opts.isRefreshDue()) this.opts.onTick();
33
- }
34
- };
35
- document.addEventListener("visibilitychange", this._visHandler);
36
- }
37
- }
38
- setActive(active) {
39
- this._active = active;
40
- if (!this.opts.enabled) return;
41
- const hidden = typeof document !== "undefined" && document.hidden;
42
- if (active && !hidden) this._startInterval();
43
- else this._stopInterval();
44
- }
45
- broadcast(data) {
46
- this._channel?.postMessage(data);
47
- }
48
- stop() {
49
- this._stopInterval();
50
- this._active = false;
51
- if (this._channel) {
52
- try {
53
- this._channel.close();
54
- } catch {
55
- }
56
- this._channel = null;
57
- }
58
- if (this._visHandler && typeof document !== "undefined") {
59
- document.removeEventListener("visibilitychange", this._visHandler);
60
- this._visHandler = null;
61
- }
62
- }
63
- _startInterval() {
64
- if (this._interval) return;
65
- this._interval = setInterval(() => {
66
- if (this.opts.isRefreshDue()) this.opts.onTick();
67
- }, this.opts.tickMs);
68
- this._interval.unref?.();
69
- }
70
- _stopInterval() {
71
- if (this._interval) {
72
- clearInterval(this._interval);
73
- this._interval = null;
74
- }
75
- }
76
- };
77
-
78
- // src/jwks.ts
79
- var MAX_AGE_CAP_MS = 864e5;
80
- var FORCED_REFETCH_COOLDOWN_MS = 3e4;
81
- var NEGATIVE_CACHE_TTL_MS = 1e4;
82
- var DEFAULT_MAX_AGE_MS = 6e5;
83
- var clientStates = /* @__PURE__ */ new WeakMap();
84
- function stateFor(scope) {
85
- let s = clientStates.get(scope);
86
- if (!s) {
87
- s = {
88
- cache: /* @__PURE__ */ new Map(),
89
- inflight: /* @__PURE__ */ new Map(),
90
- lastFailedAt: /* @__PURE__ */ new Map(),
91
- lastForcedFetchAt: /* @__PURE__ */ new Map()
92
- };
93
- clientStates.set(scope, s);
94
- }
95
- return s;
96
- }
97
- function b64urlToBytes(s) {
98
- const b64 = s.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - s.length % 4) % 4);
99
- const bin = atob(b64);
100
- const out = new Uint8Array(bin.length);
101
- for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
102
- return out;
103
- }
104
- function decodeJwt(jwt) {
105
- const [h, p, s] = jwt.split(".");
106
- if (!h || !p || !s) throw new Error("malformed jwt");
107
- const dec = new TextDecoder();
108
- return {
109
- header: JSON.parse(dec.decode(b64urlToBytes(h))),
110
- payload: JSON.parse(dec.decode(b64urlToBytes(p))),
111
- signingInput: `${h}.${p}`,
112
- signature: b64urlToBytes(s)
113
- };
114
- }
115
- function parseMaxAge(cc) {
116
- const m = cc?.match(/max-age=(\d+)/);
117
- return m ? Number(m[1]) * 1e3 : null;
118
- }
119
- function fetchJwksDeduped(state, fetchFn, baseUrl) {
120
- const existing = state.inflight.get(baseUrl);
121
- if (existing) return existing;
122
- const p = (async () => {
123
- try {
124
- const res = await fetchFn(`${baseUrl}/.well-known/jwks.json`);
125
- if (!res.ok) throw new Error("jwks_fetch_failed");
126
- const body = await res.json();
127
- const parsed = parseMaxAge(res.headers.get("Cache-Control")) ?? DEFAULT_MAX_AGE_MS;
128
- const maxAge = Math.min(parsed, MAX_AGE_CAP_MS);
129
- const keys = body.keys ?? [];
130
- state.cache.set(baseUrl, { keys, fetchedAt: Date.now(), maxAgeMs: maxAge });
131
- state.lastFailedAt.delete(baseUrl);
132
- return keys;
133
- } catch {
134
- state.lastFailedAt.set(baseUrl, Date.now());
135
- throw new Error("jwks_fetch_failed");
136
- }
137
- })().finally(() => state.inflight.delete(baseUrl));
138
- state.inflight.set(baseUrl, p);
139
- return p;
140
- }
141
- async function loadJwks(state, fetchFn, baseUrl) {
142
- const now = Date.now();
143
- const c = state.cache.get(baseUrl);
144
- if (c && now - c.fetchedAt < c.maxAgeMs) return c.keys;
145
- const failedAt = state.lastFailedAt.get(baseUrl);
146
- if (failedAt !== void 0 && now - failedAt < NEGATIVE_CACHE_TTL_MS) {
147
- throw new Error("jwks_fetch_failed");
148
- }
149
- return fetchJwksDeduped(state, fetchFn, baseUrl);
150
- }
151
- async function forcedRefetchJwks(state, fetchFn, baseUrl) {
152
- const now = Date.now();
153
- const last = state.lastForcedFetchAt.get(baseUrl);
154
- if (last !== void 0 && now - last < FORCED_REFETCH_COOLDOWN_MS) return null;
155
- state.lastForcedFetchAt.set(baseUrl, now);
156
- const failedAt = state.lastFailedAt.get(baseUrl);
157
- if (failedAt !== void 0 && now - failedAt < NEGATIVE_CACHE_TTL_MS) {
158
- throw new Error("jwks_fetch_failed");
159
- }
160
- return fetchJwksDeduped(state, fetchFn, baseUrl);
161
- }
162
- function algParams(alg) {
163
- if (alg === "RS256") {
164
- return {
165
- importAlg: { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
166
- verifyAlg: { name: "RSASSA-PKCS1-v1_5" }
167
- };
168
- }
169
- if (alg === "ES256") {
170
- return {
171
- importAlg: { name: "ECDSA", namedCurve: "P-256" },
172
- verifyAlg: { name: "ECDSA", hash: "SHA-256" }
173
- };
174
- }
175
- return null;
176
- }
177
- async function verifyJwtLocal(scope, fetchFn, baseUrl, jwt, opts = {}) {
178
- let d;
179
- try {
180
- d = decodeJwt(jwt);
181
- } catch {
182
- return { ok: false, code: "invalid_jwt" };
183
- }
184
- const params = algParams(d.header.alg);
185
- if (!params) return { ok: false, code: "unsupported_alg" };
186
- const state = stateFor(scope);
187
- const matchesAlg = (k) => d.header.alg === "RS256" ? k.kty === "RSA" : k.kty === "EC";
188
- const candidateKeys = (keys2) => d.header.kid ? keys2.filter((k) => k.kid === d.header.kid && matchesAlg(k)) : keys2.filter((k) => matchesAlg(k));
189
- let keys;
190
- try {
191
- keys = await loadJwks(state, fetchFn, baseUrl);
192
- } catch {
193
- try {
194
- opts.onEvent?.(baseUrl);
195
- } catch {
196
- }
197
- return { ok: false, code: "jwks_fetch_failed" };
198
- }
199
- let candidates = candidateKeys(keys);
200
- if (candidates.length === 0 && d.header.kid) {
201
- let refetched;
202
- try {
203
- refetched = await forcedRefetchJwks(state, fetchFn, baseUrl);
204
- } catch {
205
- try {
206
- opts.onEvent?.(baseUrl);
207
- } catch {
208
- }
209
- return { ok: false, code: "jwks_fetch_failed" };
210
- }
211
- if (refetched) {
212
- keys = refetched;
213
- candidates = candidateKeys(keys);
214
- }
215
- }
216
- if (candidates.length === 0) return { ok: false, code: "no_matching_key" };
217
- const signingBytes = new TextEncoder().encode(d.signingInput);
218
- let valid = false;
219
- for (const jwk of candidates) {
220
- try {
221
- const key = await crypto.subtle.importKey("jwk", jwk, params.importAlg, false, ["verify"]);
222
- if (await crypto.subtle.verify(
223
- params.verifyAlg,
224
- key,
225
- d.signature,
226
- signingBytes
227
- )) {
228
- valid = true;
229
- break;
230
- }
231
- } catch {
232
- }
233
- }
234
- if (!valid) return { ok: false, code: "signature_invalid" };
235
- const now = Math.floor(Date.now() / 1e3);
236
- if (!opts.allowExpired && typeof d.payload.exp === "number" && d.payload.exp < now) {
237
- return { ok: false, code: "token_expired" };
238
- }
239
- if (typeof d.payload.nbf === "number" && d.payload.nbf > now + 60) {
240
- return { ok: false, code: "token_not_yet_valid" };
241
- }
242
- return {
243
- ok: true,
244
- claims: d.payload,
245
- header: {
246
- alg: d.header.alg,
247
- kid: d.header.kid,
248
- typ: d.header.typ
249
- }
250
- };
251
- }
252
-
253
- // src/pkce.ts
254
- function b64url(bytes) {
255
- let s = "";
256
- for (const b of bytes) s += String.fromCharCode(b);
257
- return btoa(s).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
258
- }
259
- function generateCodeVerifier() {
260
- const bytes = new Uint8Array(64);
261
- crypto.getRandomValues(bytes);
262
- return b64url(bytes);
263
- }
264
- async function codeChallengeS256(verifier) {
265
- const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
266
- return b64url(new Uint8Array(digest));
267
- }
268
-
269
- // src/AuthService.ts
270
- function isMfaChallenge(v) {
271
- return typeof v === "object" && v !== null && v.mfa_required === true;
272
- }
273
- var AuthService = class extends core.BaseService {
274
- _stateListeners = /* @__PURE__ */ new Set();
275
- _sessionManager;
276
- _applyingRemote = false;
277
- _unsubStore = null;
278
- _disposed = false;
279
- constructor(client, options) {
280
- super(client);
281
- const browser = typeof window !== "undefined";
282
- const enabled = !!options?.forceEnabled || (options?.autoRefresh ?? true) && browser && (options?.persistSession ?? true);
283
- this._sessionManager = new SessionManager({
284
- channelName: `aura-${client.projectId}-auth`,
285
- enabled,
286
- onTick: () => {
287
- void this.refreshSession();
288
- },
289
- isRefreshDue: () => {
290
- const t = this.client.authStore.token;
291
- return !!t && !!this.client.authStore.refreshToken && core.isTokenExpired(t, 60);
292
- },
293
- onRemoteMessage: (data) => this._applyRemoteState(data)
294
- });
295
- this._sessionManager.start();
296
- this._unsubStore = this.client.authStore.onChange((token) => {
297
- this._sessionManager.setActive(!!token);
298
- if (!this._applyingRemote) {
299
- const state = this._broadcastState();
300
- if (!token || state !== null) {
301
- this._sessionManager.broadcast(state);
302
- }
303
- }
304
- });
305
- if (this.client.authStore.token) this._sessionManager.setActive(true);
306
- const detect = options?.detectSessionInUrl ?? browser;
307
- if (detect && browser) {
308
- void this._detectSessionInUrl();
309
- }
310
- }
311
- /**
312
- * Détecte et consomme une session présente dans l'URL courante au boot (callback
313
- * OAuth), à l'image de `detectSessionInUrl` de supabase-js :
314
- * - fragment `#access_token=…&refresh_token=…` (flux implicit) → `setSession`.
315
- * - query `?token=…&type=recovery` (lien de récupération de mot de passe) → émet
316
- * `PASSWORD_RECOVERY` avec `recoveryToken` (AUCUNE session posée, PAS de `SIGNED_IN`).
317
- * - query `?code=…` (flux PKCE) → `exchangeCodeForSession` (relit le verifier).
318
- * Puis nettoie l'URL via `history.replaceState` (retire tokens/code de la barre
319
- * d'adresse et de l'historique). Idempotent, no-op si aucun token/code n'est
320
- * présent, no-op hors navigateur. NE THROW JAMAIS (best-effort au boot).
321
- */
322
- async _detectSessionInUrl() {
323
- if (typeof window === "undefined") return;
324
- try {
325
- const loc = window.location;
326
- if (!loc) return;
327
- const hash = typeof loc.hash === "string" ? loc.hash : "";
328
- const search = typeof loc.search === "string" ? loc.search : "";
329
- if (hash.includes("access_token")) {
330
- const initiatedKey = this._oauthInitiatedKey;
331
- const initiated = this.client.authStore.getItem(initiatedKey);
332
- if (!initiated) return;
333
- this.client.authStore.removeItem(initiatedKey);
334
- const frag = new URLSearchParams(hash.replace(/^#/, ""));
335
- const accessToken = frag.get("access_token");
336
- const refreshToken = frag.get("refresh_token");
337
- if (accessToken && refreshToken) {
338
- await this.setSession(accessToken, refreshToken);
339
- this._cleanAuthParamsFromUrl();
340
- }
341
- return;
342
- }
343
- {
344
- const qs = new URLSearchParams(search.replace(/^\?/, ""));
345
- const recoveryToken = qs.get("token");
346
- if (qs.get("type") === "recovery" && recoveryToken) {
347
- this._emitEvent("PASSWORD_RECOVERY", null, null, { recoveryToken });
348
- this._cleanAuthParamsFromUrl();
349
- return;
350
- }
351
- }
352
- if (/[?&]code=/.test(search)) {
353
- const qs = new URLSearchParams(search.replace(/^\?/, ""));
354
- const code = qs.get("code");
355
- if (code) {
356
- await this.exchangeCodeForSession(code);
357
- this._cleanAuthParamsFromUrl();
358
- }
359
- return;
360
- }
361
- } catch {
362
- }
363
- }
364
- /**
365
- * Retire de l'URL courante les paramètres d'auth du callback OAuth : le fragment
366
- * entier (flux implicit) et les query params `code`/`state` (flux PKCE), tout en
367
- * préservant les autres query params. Via `history.replaceState` (pas de nouvelle
368
- * entrée d'historique). Best-effort, ne throw jamais.
369
- */
370
- _cleanAuthParamsFromUrl() {
371
- try {
372
- if (typeof window === "undefined") return;
373
- const h = window.history;
374
- const loc = window.location;
375
- if (!h || typeof h.replaceState !== "function" || !loc) return;
376
- const qs = new URLSearchParams(
377
- typeof loc.search === "string" ? loc.search.replace(/^\?/, "") : ""
378
- );
379
- qs.delete("code");
380
- qs.delete("state");
381
- qs.delete("token");
382
- qs.delete("project_id");
383
- qs.delete("type");
384
- const remaining = qs.toString();
385
- const path = loc.pathname ?? "/";
386
- const clean = path + (remaining ? `?${remaining}` : "");
387
- h.replaceState(null, "", clean || "/");
388
- } catch {
389
- }
390
- }
391
- _broadcastState() {
392
- const s = this.client.authStore;
393
- if (!s.token || !s.refreshToken || !s.user || typeof s.user !== "object" || !("id" in s.user) || !s.user.id) {
394
- return null;
395
- }
396
- return { token: s.token, refreshToken: s.refreshToken, user: s.user };
397
- }
398
- _applyRemoteState(data) {
399
- if (data !== null) {
400
- const d = data;
401
- if (typeof d.token !== "string" || typeof d.refreshToken !== "string" || !d.user || typeof d.user !== "object") {
402
- return;
403
- }
404
- }
405
- this._applyingRemote = true;
406
- try {
407
- const store = this.client.authStore;
408
- const prevToken = store.token;
409
- if (!data) {
410
- store.clear();
411
- this._emitEvent("SIGNED_OUT", null, null);
412
- } else {
413
- const s = data;
414
- store.save(s.token, s.refreshToken, s.user);
415
- const event = !prevToken ? "SIGNED_IN" : s.token !== prevToken ? "TOKEN_REFRESHED" : "USER_UPDATED";
416
- this._emitEvent(event, s.user, s.token);
417
- }
418
- } finally {
419
- this._applyingRemote = false;
420
- }
421
- }
422
- /** Démonte le cycle de vie proactif : ticker, visibilité, BroadcastChannel, listeners. */
423
- dispose() {
424
- if (this._disposed) return;
425
- this._disposed = true;
426
- this._sessionManager.stop();
427
- this._unsubStore?.();
428
- this._unsubStore = null;
429
- this._stateListeners.clear();
430
- }
431
- get prefix() {
432
- return `/v1/auth/${this.client.projectId}`;
433
- }
434
- /** Clé project-scoped du `code_verifier` PKCE (anti-collision multi-projets). */
435
- get _pkceVerifierKey() {
436
- return `aura-${this.client.projectId}-pkce-code-verifier`;
437
- }
438
- /**
439
- * Clé project-scoped du MARQUEUR d'initiation du flux OAuth implicit (SEC-F3).
440
- * Posé par `signInWithOAuth` (flux implicit) avant le redirect ; vérifié + purgé
441
- * par `_detectSessionInUrl` au retour. Un fragment `#access_token` forgé/injecté
442
- * par un attaquant (login-CSRF / session fixation) n'aura PAS ce marqueur → il ne
443
- * sera jamais adopté.
444
- */
445
- get _oauthInitiatedKey() {
446
- return `aura-${this.client.projectId}-oauth-implicit-initiated`;
447
- }
448
- // -- Auth state change ------------------------------------------------------
449
- onAuthStateChange(callback) {
450
- if (this._disposed) return { unsubscribe: () => {
451
- } };
452
- this._stateListeners.add(callback);
453
- const store = this.client.authStore;
454
- queueMicrotask(() => {
455
- if (this._stateListeners.has(callback)) {
456
- callback({ event: "INITIAL_SESSION", user: store.user, accessToken: store.token });
457
- }
458
- });
459
- return {
460
- unsubscribe: () => {
461
- this._stateListeners.delete(callback);
462
- }
463
- };
464
- }
465
- _emitEvent(event, user, accessToken, extra) {
466
- for (const cb of this._stateListeners) {
467
- try {
468
- cb({ event, user, accessToken, ...extra });
469
- } catch {
470
- }
471
- }
472
- }
473
- // -- Sign up / sign in / sign out -------------------------------------------
474
- async signUp(req) {
475
- const res = await this.request("POST", `${this.prefix}/register`, req);
476
- if (res.data && !isMfaChallenge(res.data)) {
477
- const tp = res.data;
478
- this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
479
- this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
480
- }
481
- if (res.data && isMfaChallenge(res.data)) {
482
- const mfa = res.data;
483
- this._emitEvent("MFA_CHALLENGE", null, null, {
484
- mfaToken: mfa.mfa_token,
485
- mfaSetupRequired: mfa.mfa_setup_required
486
- });
487
- }
488
- return res;
489
- }
490
- async signInWithPassword(req) {
491
- const res = await this.request("POST", `${this.prefix}/login`, req);
492
- if (res.data && !isMfaChallenge(res.data)) {
493
- const tp = res.data;
494
- this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
495
- this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
496
- }
497
- if (res.data && isMfaChallenge(res.data)) {
498
- const mfa = res.data;
499
- this._emitEvent("MFA_CHALLENGE", null, null, {
500
- mfaToken: mfa.mfa_token,
501
- mfaSetupRequired: mfa.mfa_setup_required
502
- });
503
- }
504
- return res;
505
- }
506
- async signInWithOAuth(provider, options) {
507
- const params = new URLSearchParams();
508
- params.set("project_id", this.client.projectId);
509
- if (options?.redirectTo) params.set("redirect_uri", options.redirectTo);
510
- if (options?.scopes) params.set("scopes", options.scopes);
511
- if (options?.queryParams) {
512
- for (const [k, v] of Object.entries(options.queryParams)) {
513
- params.set(k, v);
514
- }
515
- }
516
- if (options?.flowType === "pkce") {
517
- if (typeof window !== "undefined" && !this.client.authStore.persistent) {
518
- console.warn(
519
- `[aurabase] PKCE (flowType:"pkce") requiert un store persistant (LocalAuthStore) pour que le code_verifier survive au redirect OAuth ; le store courant est en m\xE9moire \u2014 l'\xE9change \xE9chouera au retour.`
520
- );
521
- }
522
- try {
523
- const verifier = generateCodeVerifier();
524
- const challenge = await codeChallengeS256(verifier);
525
- this.client.authStore.setItem(this._pkceVerifierKey, verifier);
526
- params.set("code_challenge", challenge);
527
- params.set("code_challenge_method", "S256");
528
- } catch {
529
- return {
530
- data: null,
531
- error: new core.AuraError(0, {
532
- error: {
533
- code: "pkce_generation_failed",
534
- message: "PKCE: g\xE9n\xE9ration du code_verifier/challenge impossible (WebCrypto indisponible)"
535
- }
536
- })
537
- };
538
- }
539
- } else {
540
- if (typeof window !== "undefined" && !this.client.authStore.persistent) {
541
- console.warn(
542
- '[aurabase] S\xC9CURIT\xC9 : signInWithOAuth en flux implicit avec un store NON persistant (m\xE9moire) \u2014 le marqueur anti session-fixation ne survivra pas au redirect OAuth et la session ne sera pas adopt\xE9e au retour. Utilisez un LocalAuthStore, et pr\xE9f\xE9rez flowType:"pkce" (recommand\xE9, immunis\xE9 contre la session fixation).'
543
- );
544
- }
545
- try {
546
- this.client.authStore.setItem(this._oauthInitiatedKey, "1");
547
- } catch {
548
- }
549
- }
550
- const url = `${this.client.baseUrl}/v1/auth/oauth/${encodeURIComponent(provider)}/start?${params.toString()}`;
551
- if (typeof window !== "undefined") {
552
- window.location.href = url;
553
- }
554
- return { data: { url }, error: null };
555
- }
556
- async signInWithMagicLink(req) {
557
- return this.request("POST", `${this.prefix}/magic-link`, req);
558
- }
559
- async signInAnonymously() {
560
- const res = await this.request("POST", `${this.prefix}/anonymous`);
561
- if (res.data) {
562
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
563
- this._emitEvent("SIGNED_IN", res.data.user, res.data.access_token);
564
- }
565
- return res;
566
- }
567
- async signOut() {
568
- const refreshToken = this.client.authStore.refreshToken;
569
- if (!refreshToken) {
570
- this.client.authStore.clear();
571
- this._emitEvent("SIGNED_OUT", null, null);
572
- return { data: null, error: null };
573
- }
574
- const res = await this.request("POST", `${this.prefix}/logout`, {
575
- refresh_token: refreshToken
576
- }, { skipAuthRefresh: true });
577
- this.client.authStore.clear();
578
- this._emitEvent("SIGNED_OUT", null, null);
579
- return res;
580
- }
581
- // -- Session management -----------------------------------------------------
582
- async refreshSession() {
583
- const res = await core.refreshOnce(this.client);
584
- if (res.data) {
585
- this._emitEvent("TOKEN_REFRESHED", res.data.user, res.data.access_token);
586
- }
587
- return res;
588
- }
589
- /**
590
- * Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
591
- *
592
- * ÉCART DE FORME AVEC SUPABASE (LOT 3, 3.5, documenté — pas de breaking change) :
593
- * `supabase-js` renvoie `AuraResponse`-like `{data:{session: Session|null}, error}`
594
- * où `Session` regroupe `access_token`/`refresh_token`/`expires_at`/`user`. Ici,
595
- * `getSession()` renvoie directement `{accessToken, user}` (pas d'enveloppe
596
- * `{data, error}`, pas de `refreshToken`/`expiresAt`). Ce choix est délibéré :
597
- * cette méthode ne fait aucune requête réseau et ne peut donc jamais échouer
598
- * (`error` serait toujours `null`) — l'envelopper aurait été un contrat menteur.
599
- * Le `refreshToken` n'est pas exposé pour éviter qu'un consommateur le manipule
600
- * hors du store (contrairement à `accessToken`, souvent nécessaire pour des appels
601
- * `fetch` manuels côté app). Pour la session complète, lire `client.authStore`
602
- * directement (`.token`, `.refreshToken`, `.user`, `.isValid`).
603
- */
604
- async getSession() {
605
- return {
606
- accessToken: this.client.authStore.token,
607
- user: this.client.authStore.user
608
- };
609
- }
610
- async setSession(accessToken, refreshToken) {
611
- const store = this.client.authStore;
612
- const prev = { token: store.token, refreshToken: store.refreshToken, user: store.user };
613
- const hadValidPrev = !!(prev.token && prev.refreshToken && prev.user && prev.user.id);
614
- const restore = () => {
615
- if (hadValidPrev) {
616
- store.save(prev.token, prev.refreshToken, prev.user);
617
- } else {
618
- store.clear();
619
- }
620
- };
621
- if (core.isTokenExpired(accessToken, 0)) {
622
- store.save(accessToken, refreshToken, {});
623
- const refreshed = await core.refreshOnce(this.client);
624
- if (refreshed.data) {
625
- this._emitEvent("SIGNED_IN", refreshed.data.user, refreshed.data.access_token);
626
- return { data: refreshed.data.user, error: null };
627
- }
628
- restore();
629
- return { data: null, error: refreshed.error };
630
- }
631
- store.save(accessToken, refreshToken, {});
632
- const res = await this.request("GET", `${this.prefix}/user`);
633
- if (res.data) {
634
- store.save(accessToken, refreshToken, res.data);
635
- this._emitEvent("SIGNED_IN", res.data, accessToken);
636
- return res;
637
- }
638
- restore();
639
- return res;
640
- }
641
- async exchangeCodeForSession(authCode, codeVerifier) {
642
- return this._exchangeCode(authCode, codeVerifier, "SIGNED_IN");
643
- }
644
- /**
645
- * Cœur de l'échange PKCE. `successEvent` détermine l'événement émis en cas de
646
- * succès : `SIGNED_IN` (connexion normale) ou `PASSWORD_RECOVERY` (callback de
647
- * récupération de mot de passe, `?code=…&type=recovery` — voir `_detectSessionInUrl`).
648
- */
649
- async _exchangeCode(authCode, codeVerifier, successEvent) {
650
- const verifierKey = this._pkceVerifierKey;
651
- const verifier = codeVerifier ?? this.client.authStore.getItem(verifierKey);
652
- if (!verifier) {
653
- return {
654
- data: null,
655
- error: new core.AuraError(0, {
656
- error: { code: "no_code_verifier", message: "No PKCE code_verifier available (not provided and none stored)" }
657
- })
658
- };
659
- }
660
- try {
661
- const res = await this.request("POST", `${this.prefix}/oauth/pkce`, {
662
- auth_code: authCode,
663
- code_verifier: verifier
664
- });
665
- if (res.data) {
666
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
667
- this._emitEvent(successEvent, res.data.user, res.data.access_token);
668
- }
669
- return res;
670
- } finally {
671
- this.client.authStore.removeItem(verifierKey);
672
- }
673
- }
674
- async listSessions() {
675
- const store = this.client.authStore;
676
- if (store.token && store.refreshToken && !store.isValid) {
677
- const refreshed = await this.refreshSession();
678
- if (refreshed.error) {
679
- return { data: null, error: refreshed.error };
680
- }
681
- }
682
- const refreshToken = store.refreshToken;
683
- return this.request("GET", `${this.prefix}/sessions`, void 0, {
684
- headers: refreshToken ? { "x-refresh-token": refreshToken } : void 0
685
- });
686
- }
687
- async revokeSession(sessionId) {
688
- return this.request("DELETE", `${this.prefix}/sessions/${sessionId}`);
689
- }
690
- async revokeAllSessions() {
691
- const rt = this.client.authStore.refreshToken;
692
- if (!rt) {
693
- return {
694
- data: null,
695
- error: new core.AuraError(0, { error: { code: "no_session", message: "No refresh token available" } })
696
- };
697
- }
698
- const res = await this.request(
699
- "POST",
700
- `${this.prefix}/logout`,
701
- { refresh_token: rt, scope: "global" },
702
- { skipAuthRefresh: true }
703
- );
704
- if (!res.error) {
705
- this.client.authStore.clear();
706
- this._emitEvent("SIGNED_OUT", null, null);
707
- }
708
- return res;
709
- }
710
- // -- User management --------------------------------------------------------
711
- /**
712
- * Récupère l'utilisateur validé côté serveur.
713
- *
714
- * Sans argument : valide le token de la SESSION courante (`store.token`),
715
- * avec refresh proactif — comportement historique.
716
- *
717
- * Avec `jwt` (LOT D) : valide le token ARBITRAIRE passé, via l'override
718
- * `authToken` (`Authorization: Bearer <jwt>`), SANS toucher la session
719
- * (`skipAuthRefresh`, aucun refresh ni retry-401 sur le store). Le backend
720
- * applique l'isolation projet native : un token d'un AUTRE projet → 403.
721
- */
722
- async getUser(jwt) {
723
- if (jwt !== void 0) {
724
- return this.request("GET", `${this.prefix}/user`, void 0, {
725
- authToken: jwt,
726
- skipAuthRefresh: true
727
- });
728
- }
729
- return this.request("GET", `${this.prefix}/user`);
730
- }
731
- /**
732
- * Vérifie et décode les claims d'un JWT.
733
- *
734
- * Chemin nominal : vérification LOCALE via JWKS + WebCrypto, uniquement pour
735
- * `alg ∈ {RS256, ES256}` (anti-alg-confusion : jamais de vérif locale HS256).
736
- * Chemin fallback : `getUser()` (validation serveur) quand la vérif locale
737
- * n'est pas applicable — `alg` non supporté (HS256), JWKS vide, aucune clé
738
- * correspondante, ou fetch JWKS en échec. C'est le chemin nominal sur les
739
- * déploiements HS256 (JWKS `{"keys":[]}`).
740
- *
741
- * FOREIGN-TOKEN (LOT D) : le fallback getUser valide le token RÉELLEMENT visé.
742
- * Pour le token de session (no-arg, ou `jwt === authStore.token`), c'est
743
- * `getUser()` (validation du token du store). Pour un `jwt` ÉTRANGER, c'est
744
- * `getUser(jwt)` qui présente CE token en `Authorization` (override `authToken`,
745
- * jamais celui du store) : le backend le valide et renvoie SON identité. Aucune
746
- * misattribution possible — on présente exactement le token à vérifier — et
747
- * l'isolation projet est native côté gateway (token d'un autre projet → 403,
748
- * remonté en AuraError, jamais fabriqué).
749
- *
750
- * NOTE (fallback) : les claims renvoyées par le chemin fallback sont dérivées
751
- * de `getUser()` (identité validée serveur) et NE contiennent PAS `exp`/`iat`
752
- * (ni les autres champs temporels du JWT) — un consommateur ne doit pas se
753
- * fier à `claims.exp` / `claims.iat` après un fallback. Seul le chemin de
754
- * vérification locale RS256/ES256 renvoie les claims JWT complètes.
755
- */
756
- async getClaims(jwt, options) {
757
- const token = jwt ?? this.client.authStore.token;
758
- const usingStoreToken = jwt === void 0 || jwt === this.client.authStore.token;
759
- if (!token) {
760
- return {
761
- data: null,
762
- error: new core.AuraError(0, { error: { code: "no_session", message: "No JWT available" } })
763
- };
764
- }
765
- const r = await verifyJwtLocal(this.client, this.client.fetchFn, this.client.baseUrl, token, {
766
- allowExpired: options?.allowExpired,
767
- // LOT 3 (I8) : relie le callback générique de jwks.ts au hook d'observabilité
768
- // du client (onEvent/debug). jwks.ts reste sans dépendance vers @aurabase/core.
769
- onEvent: (baseUrl) => core.emitAuraEvent(this.client.onEvent, this.client.debug, { kind: "jwks-fetch-failed", baseUrl })
770
- });
771
- const checkIssAud = (c) => {
772
- if (options?.issuer !== void 0 && c.iss !== options.issuer) {
773
- return new core.AuraError(0, {
774
- error: { code: "invalid_issuer", message: `getClaims: issuer mismatch` }
775
- });
776
- }
777
- if (options?.audience !== void 0) {
778
- const aud = c.aud;
779
- const audList = Array.isArray(aud) ? aud : aud !== void 0 ? [aud] : [];
780
- if (!audList.includes(options.audience)) {
781
- return new core.AuraError(0, {
782
- error: { code: "invalid_audience", message: `getClaims: audience mismatch` }
783
- });
784
- }
785
- }
786
- return null;
787
- };
788
- if (r.ok) {
789
- const claims = r.claims;
790
- const issAudErr = checkIssAud(claims);
791
- if (issAudErr) return { data: null, error: issAudErr };
792
- const claimProject = claims.project_id;
793
- if (typeof claimProject === "string" && claimProject !== this.client.projectId) {
794
- return {
795
- data: null,
796
- error: new core.AuraError(0, {
797
- error: {
798
- code: "project_isolation_violation",
799
- message: `getClaims: token project mismatch (isolation)`
800
- }
801
- })
802
- };
803
- }
804
- return { data: { claims, header: r.header }, error: null };
805
- }
806
- if (r.code === "unsupported_alg" || r.code === "no_matching_key" || r.code === "jwks_fetch_failed") {
807
- let localPayload = {};
808
- try {
809
- localPayload = decodeJwt(token).payload;
810
- } catch {
811
- }
812
- const issAudErr = checkIssAud(localPayload);
813
- if (issAudErr) return { data: null, error: issAudErr };
814
- if (options?.allowExpired && typeof localPayload.exp === "number" && localPayload.exp < Math.floor(Date.now() / 1e3)) {
815
- return {
816
- data: null,
817
- error: new core.AuraError(0, {
818
- error: {
819
- code: "allow_expired_unsupported_on_fallback",
820
- message: "getClaims: allowExpired ne peut pas \xEAtre honor\xE9 sur le chemin de validation serveur (fallback HS256/JWKS)"
821
- }
822
- })
823
- };
824
- }
825
- const u = usingStoreToken ? await this.getUser() : await this.getUser(token);
826
- if (u.data) {
827
- let realAlg = "unknown";
828
- try {
829
- realAlg = decodeJwt(token).header.alg ?? "unknown";
830
- } catch {
831
- }
832
- return {
833
- data: {
834
- // Claims dérivées de getUser : PAS de `exp`/`iat` (voir JwtClaims/JSDoc).
835
- // `exp`/`iat` étant optionnels, plus de `as unknown as` masquant l'absence.
836
- claims: { ...u.data, sub: u.data.id },
837
- header: { alg: realAlg }
838
- },
839
- error: null
840
- };
841
- }
842
- return { data: null, error: u.error };
843
- }
844
- return {
845
- data: null,
846
- error: new core.AuraError(0, { error: { code: r.code, message: `getClaims: ${r.code}` } })
847
- };
848
- }
849
- async deleteUser(password) {
850
- const res = await this.request("DELETE", `${this.prefix}/user`, { password });
851
- if (!res.error) {
852
- this.client.authStore.clear();
853
- this._emitEvent("SIGNED_OUT", null, null);
854
- }
855
- return res;
856
- }
857
- async updateUser(req) {
858
- const res = await this.request("PUT", `${this.prefix}/user`, req);
859
- if (res.data) {
860
- const store = this.client.authStore;
861
- if (store.token && store.refreshToken) {
862
- store.save(store.token, store.refreshToken, res.data);
863
- }
864
- this._emitEvent("USER_UPDATED", res.data, this.client.authStore.token);
865
- }
866
- return res;
867
- }
868
- // -- Password recovery ------------------------------------------------------
869
- async resetPasswordForEmail(req) {
870
- return this.request("POST", `${this.prefix}/forgot-password`, req);
871
- }
872
- async updatePassword(newPassword, currentPassword) {
873
- const res = await this.request("PUT", `${this.prefix}/user`, {
874
- password: newPassword,
875
- current_password: currentPassword
876
- });
877
- if (!res.error) {
878
- this.client.authStore.clear();
879
- this._emitEvent("SIGNED_OUT", null, null);
880
- }
881
- return res;
882
- }
883
- // -- MFA --------------------------------------------------------------------
884
- async mfaEnroll() {
885
- return this.request("POST", `${this.prefix}/mfa/setup`);
886
- }
887
- async mfaVerifySetup(code) {
888
- return this.request("POST", `${this.prefix}/mfa/setup/verify`, { code });
889
- }
890
- async mfaVerify(req) {
891
- const res = await this.request("POST", `${this.prefix}/mfa/verify-login`, req);
892
- if (res.data) {
893
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
894
- this._emitEvent("SIGNED_IN", res.data.user, res.data.access_token);
895
- }
896
- return res;
897
- }
898
- async mfaUnenroll(password) {
899
- return this.request("POST", `${this.prefix}/mfa/disable`, { password });
900
- }
901
- async verifyOtp(params) {
902
- switch (params.type) {
903
- case "signup":
904
- return this._verifyToTokenPair(`${this.prefix}/verify-email`, { token: params.token });
905
- case "magiclink":
906
- return this._verifyToTokenPair(`${this.prefix}/magic-link/verify`, { token: params.token });
907
- case "email":
908
- return this._verifyToTokenPair(`${this.prefix}/email-otp/verify`, {
909
- email: params.email,
910
- code: params.token
911
- });
912
- case "sms":
913
- return this._verifyToTokenPair(`${this.prefix}/sms/verify`, {
914
- phone: params.phone,
915
- code: params.token
916
- });
917
- case "recovery": {
918
- if (!params.password) {
919
- return {
920
- data: null,
921
- error: new core.AuraError(0, {
922
- error: {
923
- code: "missing_password",
924
- message: "verifyOtp({ type: 'recovery' }) exige `password` : le backend fusionne consommation du token et changement de mot de passe."
925
- }
926
- })
927
- };
928
- }
929
- return this._verifyToTokenPair(`${this.prefix}/reset-password`, {
930
- token: params.token,
931
- password: params.password
932
- });
933
- }
934
- case "email_change": {
935
- const res = await this.request("POST", `${this.prefix}/user/confirm-email-change`, {
936
- token: params.token
937
- });
938
- if (res.data) {
939
- const store = this.client.authStore;
940
- if (store.token && store.refreshToken) {
941
- store.save(store.token, store.refreshToken, res.data);
942
- }
943
- this._emitEvent("USER_UPDATED", res.data, this.client.authStore.token);
944
- }
945
- return res;
946
- }
947
- case "invite":
948
- case "phone_change":
949
- return {
950
- data: null,
951
- error: new core.AuraError(0, {
952
- error: {
953
- code: "otp_type_unsupported",
954
- message: `verifyOtp: le type '${params.type}' n'est pas support\xE9 (aucun endpoint backend).`
955
- }
956
- })
957
- };
958
- default:
959
- return {
960
- data: null,
961
- error: new core.AuraError(0, {
962
- error: { code: "otp_type_unsupported", message: "verifyOtp: type OTP inconnu." }
963
- })
964
- };
965
- }
966
- }
967
- /**
968
- * Helper commun aux vérifications OTP renvoyant une `TokenPair` : appelle
969
- * l'endpoint, puis (succès) sauvegarde la session et émet `SIGNED_IN`.
970
- */
971
- async _verifyToTokenPair(path, body) {
972
- const res = await this.request("POST", path, body);
973
- if (res.data) {
974
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
975
- this._emitEvent("SIGNED_IN", res.data.user, res.data.access_token);
976
- }
977
- return res;
978
- }
979
- // -- Email verification -----------------------------------------------------
980
- /** Rétrocompat : délègue à `verifyOtp({ type: 'signup' })` (POST /verify-email). */
981
- async verifyEmail(token) {
982
- return this.verifyOtp({ type: "signup", token });
983
- }
984
- async resendVerificationEmail(email) {
985
- const e = email ?? this.client.authStore.user?.email;
986
- if (!e) {
987
- return {
988
- data: null,
989
- error: new core.AuraError(0, { error: { code: "missing_email", message: "Email is required" } })
990
- };
991
- }
992
- return this.request("POST", `${this.prefix}/resend-verification`, { email: e });
993
- }
994
- // -- Email OTP (Phase 2) --------------------------------------------------
995
- async signInWithEmailOtp(email) {
996
- return this.request("POST", `${this.prefix}/email-otp/send`, { email });
997
- }
998
- /** Rétrocompat : délègue à `verifyOtp({ type: 'email' })` (POST /email-otp/verify). */
999
- async verifyEmailOtp(email, code) {
1000
- return this.verifyOtp({ type: "email", email, token: code });
1001
- }
1002
- // -- SMS OTP (Phase 2) ----------------------------------------------------
1003
- async signInWithSmsOtp(phone) {
1004
- return this.request("POST", `${this.prefix}/sms/send`, { phone });
1005
- }
1006
- /** Rétrocompat : délègue à `verifyOtp({ type: 'sms' })` (POST /sms/verify). */
1007
- async verifySmsOtp(phone, code) {
1008
- return this.verifyOtp({ type: "sms", phone, token: code });
1009
- }
1010
- // -- Identity linking (Phase 2) -------------------------------------------
1011
- async listIdentities() {
1012
- return this.request("GET", `${this.prefix}/user/identities`);
1013
- }
1014
- async linkIdentity(provider) {
1015
- return this.request("POST", `${this.prefix}/user/identities/link/${provider}`);
1016
- }
1017
- async unlinkIdentity(identityId) {
1018
- return this.request("DELETE", `${this.prefix}/user/identities/${identityId}`);
1019
- }
1020
- // -- Email change (Phase 2) -----------------------------------------------
1021
- /**
1022
- * Rétrocompat : délègue à `verifyOtp({ type: 'email_change' })`.
1023
- * CHANGEMENT ASSUMÉ (parité) : émet désormais `USER_UPDATED` (auparavant aucun
1024
- * événement) — voir CHANGELOG.
1025
- */
1026
- async confirmEmailChange(token) {
1027
- return this.verifyOtp({ type: "email_change", token });
1028
- }
1029
- // -- MFA recovery codes (Phase 2) -----------------------------------------
1030
- async regenerateRecoveryCodes(code) {
1031
- return this.request("POST", `${this.prefix}/mfa/recovery-codes/regenerate`, { code });
1032
- }
1033
- // -- Native mobile OAuth (Phase 2) ----------------------------------------
1034
- async signInWithIdToken(provider, idToken, accessToken) {
1035
- const res = await this.request("POST", `${this.prefix}/token`, {
1036
- provider,
1037
- id_token: idToken,
1038
- access_token: accessToken
1039
- });
1040
- if (res.data) {
1041
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
1042
- this._emitEvent("SIGNED_IN", res.data.user, res.data.access_token);
1043
- }
1044
- return res;
1045
- }
1046
- // -- Project settings / public config --------------------------------------
1047
- /** GoTrue parity : GET /settings — config publique du projet (pas d'auth requise). */
1048
- async getSettings() {
1049
- return this.request("GET", `${this.prefix}/settings`);
1050
- }
1051
- /** Clé publiable (anon key) du projet — GET /anon-key (public, à l'image du modèle Supabase). */
1052
- async getAnonKey() {
1053
- return this.request("GET", `${this.prefix}/anon-key`);
1054
- }
1055
- // -- Password recovery (token consumption) ----------------------------------
1056
- /**
1057
- * Consomme le token de récupération de mot de passe et applique le nouveau mot de passe.
1058
- * Body confirmé au handler (`ResetPasswordRequest` — services/aura-auth/src/handlers/auth.rs) :
1059
- * `{ token, password }`. Révoque les anciennes sessions et renvoie une nouvelle TokenPair.
1060
- */
1061
- async resetPassword(token, newPassword) {
1062
- return this.verifyOtp({ type: "recovery", token, password: newPassword });
1063
- }
1064
- // -- Anonymous promotion -----------------------------------------------------
1065
- /**
1066
- * Convertit l'utilisateur anonyme courant (JWT requis) en compte régulier email+password.
1067
- * Body confirmé au handler (`PromoteAnonymousRequest`) : `{ email, password }`.
1068
- */
1069
- async promoteAnonymous(credentials) {
1070
- const res = await this.request("POST", `${this.prefix}/anonymous/promote`, credentials);
1071
- if (res.data) {
1072
- this.client.authStore.save(res.data.access_token, res.data.refresh_token, res.data.user);
1073
- this._emitEvent("USER_UPDATED", res.data.user, res.data.access_token);
1074
- }
1075
- return res;
1076
- }
1077
- // -- Magic link verification -------------------------------------------------
1078
- /**
1079
- * Consomme le token de magic link et renvoie une TokenPair.
1080
- * Body confirmé au handler (`VerifyMagicLinkRequest`) : `{ token }`.
1081
- */
1082
- async verifyMagicLink(token) {
1083
- return this.verifyOtp({ type: "magiclink", token });
1084
- }
1085
- };
1086
- var AuthAdminService = class extends core.BaseService {
1087
- get prefix() {
1088
- return `/v1/auth/${this.client.projectId}/admin`;
1089
- }
1090
- // -- Users ----------------------------------------------------------------
1091
- async listUsers(params) {
1092
- const query = new URLSearchParams();
1093
- if (params?.limit !== void 0) query.set("limit", String(params.limit));
1094
- if (params?.offset !== void 0) query.set("offset", String(params.offset));
1095
- if (params?.search) query.set("search", params.search);
1096
- const qs = query.toString();
1097
- return this.request("GET", `${this.prefix}/users${qs ? "?" + qs : ""}`);
1098
- }
1099
- async getUser(userId) {
1100
- return this.request("GET", `${this.prefix}/users/${userId}`);
1101
- }
1102
- async createUser(data) {
1103
- return this.request("POST", `${this.prefix}/users`, data);
1104
- }
1105
- async updateUser(userId, data) {
1106
- return this.request("PUT", `${this.prefix}/users/${userId}`, data);
1107
- }
1108
- async deleteUser(userId) {
1109
- return this.request("DELETE", `${this.prefix}/users/${userId}`);
1110
- }
1111
- async banUser(userId) {
1112
- return this.request("POST", `${this.prefix}/users/${userId}/ban`, {});
1113
- }
1114
- async unbanUser(userId) {
1115
- return this.request("POST", `${this.prefix}/users/${userId}/unban`, {});
1116
- }
1117
- async generateLink(userId, type) {
1118
- return this.request("POST", `${this.prefix}/users/${userId}/generate-link`, { type });
1119
- }
1120
- async getUserStats() {
1121
- return this.request("GET", `${this.prefix}/users/stats`);
1122
- }
1123
- async listUserIdentities(userId) {
1124
- return this.request("GET", `${this.prefix}/users/${userId}/identities`);
1125
- }
1126
- // -- Sessions ---------------------------------------------------------------
1127
- async listSessions(params) {
1128
- const query = new URLSearchParams();
1129
- if (params?.userId !== void 0) query.set("user_id", params.userId);
1130
- if (params?.limit !== void 0) query.set("limit", String(params.limit));
1131
- if (params?.offset !== void 0) query.set("offset", String(params.offset));
1132
- const qs = query.toString();
1133
- return this.request("GET", `${this.prefix}/sessions${qs ? "?" + qs : ""}`);
1134
- }
1135
- async revokeSession(sessionId) {
1136
- return this.request("DELETE", `${this.prefix}/sessions/${sessionId}`);
1137
- }
1138
- // -- Audit log ------------------------------------------------------------
1139
- async getAuditLog(params) {
1140
- const query = new URLSearchParams();
1141
- if (params?.userId !== void 0) query.set("user_id", params.userId);
1142
- if (params?.limit !== void 0) query.set("limit", String(params.limit));
1143
- if (params?.offset !== void 0) query.set("offset", String(params.offset));
1144
- const qs = query.toString();
1145
- return this.request("GET", `${this.prefix}/audit-log${qs ? "?" + qs : ""}`);
1146
- }
1147
- // -- Settings -------------------------------------------------------------
1148
- async getSettings() {
1149
- return this.request("GET", `${this.prefix}/settings`);
1150
- }
1151
- async updateSettings(data) {
1152
- return this.request("PUT", `${this.prefix}/settings`, data);
1153
- }
1154
- // -- Email templates ------------------------------------------------------
1155
- async listEmailTemplates() {
1156
- return this.request("GET", `${this.prefix}/email-templates`);
1157
- }
1158
- async getEmailTemplate(type) {
1159
- return this.request("GET", `${this.prefix}/email-templates/${type}`);
1160
- }
1161
- async updateEmailTemplate(type, data) {
1162
- return this.request("PUT", `${this.prefix}/email-templates/${type}`, data);
1163
- }
1164
- async deleteEmailTemplate(type) {
1165
- return this.request("DELETE", `${this.prefix}/email-templates/${type}`);
1166
- }
1167
- async testEmailTemplate(type, body) {
1168
- return this.request("POST", `${this.prefix}/email-templates/${type}/test`, body);
1169
- }
1170
- };
1171
-
1172
- exports.AuthAdminService = AuthAdminService;
1173
- exports.AuthService = AuthService;
1174
- exports.SessionManager = SessionManager;
1175
- exports.isMfaChallenge = isMfaChallenge;