@depup/better-auth__core 1.6.23-depup.2

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 (310) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +32 -0
  3. package/changes.json +14 -0
  4. package/dist/api/index.d.mts +281 -0
  5. package/dist/api/index.mjs +92 -0
  6. package/dist/async_hooks/index.d.mts +6 -0
  7. package/dist/async_hooks/index.mjs +20 -0
  8. package/dist/async_hooks/pure.index.d.mts +6 -0
  9. package/dist/async_hooks/pure.index.mjs +33 -0
  10. package/dist/context/endpoint-context.d.mts +18 -0
  11. package/dist/context/endpoint-context.mjs +29 -0
  12. package/dist/context/global.d.mts +6 -0
  13. package/dist/context/global.mjs +36 -0
  14. package/dist/context/index.d.mts +5 -0
  15. package/dist/context/index.mjs +5 -0
  16. package/dist/context/request-state.d.mts +27 -0
  17. package/dist/context/request-state.mjs +47 -0
  18. package/dist/context/transaction.d.mts +27 -0
  19. package/dist/context/transaction.mjs +96 -0
  20. package/dist/db/adapter/factory.d.mts +17 -0
  21. package/dist/db/adapter/factory.mjs +905 -0
  22. package/dist/db/adapter/get-default-field-name.d.mts +18 -0
  23. package/dist/db/adapter/get-default-field-name.mjs +36 -0
  24. package/dist/db/adapter/get-default-model-name.d.mts +12 -0
  25. package/dist/db/adapter/get-default-model-name.mjs +30 -0
  26. package/dist/db/adapter/get-field-attributes.d.mts +26 -0
  27. package/dist/db/adapter/get-field-attributes.mjs +37 -0
  28. package/dist/db/adapter/get-field-name.d.mts +18 -0
  29. package/dist/db/adapter/get-field-name.mjs +31 -0
  30. package/dist/db/adapter/get-id-field.d.mts +36 -0
  31. package/dist/db/adapter/get-id-field.mjs +64 -0
  32. package/dist/db/adapter/get-model-name.d.mts +12 -0
  33. package/dist/db/adapter/get-model-name.mjs +21 -0
  34. package/dist/db/adapter/index.d.mts +615 -0
  35. package/dist/db/adapter/index.mjs +24 -0
  36. package/dist/db/adapter/types.d.mts +105 -0
  37. package/dist/db/adapter/utils.d.mts +7 -0
  38. package/dist/db/adapter/utils.mjs +37 -0
  39. package/dist/db/get-tables.d.mts +6 -0
  40. package/dist/db/get-tables.mjs +266 -0
  41. package/dist/db/index.d.mts +10 -0
  42. package/dist/db/index.mjs +8 -0
  43. package/dist/db/plugin.d.mts +12 -0
  44. package/dist/db/schema/account.d.mts +28 -0
  45. package/dist/db/schema/account.mjs +17 -0
  46. package/dist/db/schema/rate-limit.d.mts +18 -0
  47. package/dist/db/schema/rate-limit.mjs +9 -0
  48. package/dist/db/schema/session.d.mts +23 -0
  49. package/dist/db/schema/session.mjs +12 -0
  50. package/dist/db/schema/shared.d.mts +10 -0
  51. package/dist/db/schema/shared.mjs +9 -0
  52. package/dist/db/schema/user.d.mts +22 -0
  53. package/dist/db/schema/user.mjs +11 -0
  54. package/dist/db/schema/verification.d.mts +21 -0
  55. package/dist/db/schema/verification.mjs +10 -0
  56. package/dist/db/type.d.mts +194 -0
  57. package/dist/env/color-depth.d.mts +4 -0
  58. package/dist/env/color-depth.mjs +86 -0
  59. package/dist/env/env-impl.d.mts +32 -0
  60. package/dist/env/env-impl.mjs +81 -0
  61. package/dist/env/index.d.mts +4 -0
  62. package/dist/env/index.mjs +4 -0
  63. package/dist/env/logger.d.mts +48 -0
  64. package/dist/env/logger.mjs +79 -0
  65. package/dist/error/codes.d.mts +69 -0
  66. package/dist/error/codes.mjs +55 -0
  67. package/dist/error/index.d.mts +26 -0
  68. package/dist/error/index.mjs +27 -0
  69. package/dist/index.d.mts +9 -0
  70. package/dist/index.mjs +1 -0
  71. package/dist/instrumentation/api.mjs +12 -0
  72. package/dist/instrumentation/attributes.d.mts +11 -0
  73. package/dist/instrumentation/attributes.mjs +10 -0
  74. package/dist/instrumentation/index.d.mts +3 -0
  75. package/dist/instrumentation/index.mjs +3 -0
  76. package/dist/instrumentation/noop.mjs +42 -0
  77. package/dist/instrumentation/pure.index.d.mts +7 -0
  78. package/dist/instrumentation/pure.index.mjs +7 -0
  79. package/dist/instrumentation/tracer.d.mts +13 -0
  80. package/dist/instrumentation/tracer.mjs +53 -0
  81. package/dist/oauth2/client-credentials-token.d.mts +56 -0
  82. package/dist/oauth2/client-credentials-token.mjs +64 -0
  83. package/dist/oauth2/create-authorization-url.d.mts +44 -0
  84. package/dist/oauth2/create-authorization-url.mjs +41 -0
  85. package/dist/oauth2/index.d.mts +8 -0
  86. package/dist/oauth2/index.mjs +7 -0
  87. package/dist/oauth2/oauth-provider.d.mts +192 -0
  88. package/dist/oauth2/refresh-access-token.d.mts +54 -0
  89. package/dist/oauth2/refresh-access-token.mjs +73 -0
  90. package/dist/oauth2/reject-redirects.mjs +60 -0
  91. package/dist/oauth2/utils.d.mts +24 -0
  92. package/dist/oauth2/utils.mjs +48 -0
  93. package/dist/oauth2/validate-authorization-code.d.mts +85 -0
  94. package/dist/oauth2/validate-authorization-code.mjs +86 -0
  95. package/dist/oauth2/verify.d.mts +65 -0
  96. package/dist/oauth2/verify.mjs +202 -0
  97. package/dist/social-providers/apple.d.mts +133 -0
  98. package/dist/social-providers/apple.mjs +117 -0
  99. package/dist/social-providers/atlassian.d.mts +70 -0
  100. package/dist/social-providers/atlassian.mjs +80 -0
  101. package/dist/social-providers/cognito.d.mts +85 -0
  102. package/dist/social-providers/cognito.mjs +162 -0
  103. package/dist/social-providers/discord.d.mts +124 -0
  104. package/dist/social-providers/discord.mjs +62 -0
  105. package/dist/social-providers/dropbox.d.mts +69 -0
  106. package/dist/social-providers/dropbox.mjs +72 -0
  107. package/dist/social-providers/facebook.d.mts +79 -0
  108. package/dist/social-providers/facebook.mjs +157 -0
  109. package/dist/social-providers/figma.d.mts +61 -0
  110. package/dist/social-providers/figma.mjs +83 -0
  111. package/dist/social-providers/github.d.mts +102 -0
  112. package/dist/social-providers/github.mjs +92 -0
  113. package/dist/social-providers/gitlab.d.mts +123 -0
  114. package/dist/social-providers/gitlab.mjs +79 -0
  115. package/dist/social-providers/google.d.mts +123 -0
  116. package/dist/social-providers/google.mjs +137 -0
  117. package/dist/social-providers/huggingface.d.mts +83 -0
  118. package/dist/social-providers/huggingface.mjs +73 -0
  119. package/dist/social-providers/index.d.mts +1834 -0
  120. package/dist/social-providers/index.mjs +78 -0
  121. package/dist/social-providers/kakao.d.mts +161 -0
  122. package/dist/social-providers/kakao.mjs +70 -0
  123. package/dist/social-providers/kick.d.mts +73 -0
  124. package/dist/social-providers/kick.mjs +68 -0
  125. package/dist/social-providers/line.d.mts +105 -0
  126. package/dist/social-providers/line.mjs +110 -0
  127. package/dist/social-providers/linear.d.mts +68 -0
  128. package/dist/social-providers/linear.mjs +85 -0
  129. package/dist/social-providers/linkedin.d.mts +67 -0
  130. package/dist/social-providers/linkedin.mjs +73 -0
  131. package/dist/social-providers/microsoft-entra-id.d.mts +174 -0
  132. package/dist/social-providers/microsoft-entra-id.mjs +152 -0
  133. package/dist/social-providers/naver.d.mts +92 -0
  134. package/dist/social-providers/naver.mjs +65 -0
  135. package/dist/social-providers/notion.d.mts +64 -0
  136. package/dist/social-providers/notion.mjs +72 -0
  137. package/dist/social-providers/paybin.d.mts +71 -0
  138. package/dist/social-providers/paybin.mjs +81 -0
  139. package/dist/social-providers/paypal.d.mts +131 -0
  140. package/dist/social-providers/paypal.mjs +188 -0
  141. package/dist/social-providers/polar.d.mts +74 -0
  142. package/dist/social-providers/polar.mjs +71 -0
  143. package/dist/social-providers/railway.d.mts +65 -0
  144. package/dist/social-providers/railway.mjs +74 -0
  145. package/dist/social-providers/reddit.d.mts +62 -0
  146. package/dist/social-providers/reddit.mjs +81 -0
  147. package/dist/social-providers/roblox.d.mts +70 -0
  148. package/dist/social-providers/roblox.mjs +57 -0
  149. package/dist/social-providers/salesforce.d.mts +79 -0
  150. package/dist/social-providers/salesforce.mjs +87 -0
  151. package/dist/social-providers/slack.d.mts +83 -0
  152. package/dist/social-providers/slack.mjs +66 -0
  153. package/dist/social-providers/spotify.d.mts +63 -0
  154. package/dist/social-providers/spotify.mjs +69 -0
  155. package/dist/social-providers/tiktok.d.mts +168 -0
  156. package/dist/social-providers/tiktok.mjs +60 -0
  157. package/dist/social-providers/twitch.d.mts +79 -0
  158. package/dist/social-providers/twitch.mjs +75 -0
  159. package/dist/social-providers/twitter.d.mts +126 -0
  160. package/dist/social-providers/twitter.mjs +85 -0
  161. package/dist/social-providers/vercel.d.mts +62 -0
  162. package/dist/social-providers/vercel.mjs +58 -0
  163. package/dist/social-providers/vk.d.mts +70 -0
  164. package/dist/social-providers/vk.mjs +81 -0
  165. package/dist/social-providers/wechat.d.mts +113 -0
  166. package/dist/social-providers/wechat.mjs +81 -0
  167. package/dist/social-providers/zoom.d.mts +163 -0
  168. package/dist/social-providers/zoom.mjs +69 -0
  169. package/dist/types/context.d.mts +319 -0
  170. package/dist/types/cookie.d.mts +15 -0
  171. package/dist/types/helper.d.mts +10 -0
  172. package/dist/types/index.d.mts +9 -0
  173. package/dist/types/init-options.d.mts +1430 -0
  174. package/dist/types/plugin-client.d.mts +123 -0
  175. package/dist/types/plugin.d.mts +124 -0
  176. package/dist/types/secret.d.mts +11 -0
  177. package/dist/utils/async.d.mts +22 -0
  178. package/dist/utils/async.mjs +32 -0
  179. package/dist/utils/db.d.mts +9 -0
  180. package/dist/utils/db.mjs +15 -0
  181. package/dist/utils/deprecate.d.mts +9 -0
  182. package/dist/utils/deprecate.mjs +16 -0
  183. package/dist/utils/error-codes.d.mts +13 -0
  184. package/dist/utils/error-codes.mjs +10 -0
  185. package/dist/utils/fetch-metadata.d.mts +4 -0
  186. package/dist/utils/fetch-metadata.mjs +6 -0
  187. package/dist/utils/host.d.mts +147 -0
  188. package/dist/utils/host.mjs +295 -0
  189. package/dist/utils/id.d.mts +4 -0
  190. package/dist/utils/id.mjs +7 -0
  191. package/dist/utils/ip.d.mts +77 -0
  192. package/dist/utils/ip.mjs +230 -0
  193. package/dist/utils/is-api-error.d.mts +6 -0
  194. package/dist/utils/is-api-error.mjs +8 -0
  195. package/dist/utils/json.d.mts +4 -0
  196. package/dist/utils/json.mjs +41 -0
  197. package/dist/utils/redirect-uri.d.mts +20 -0
  198. package/dist/utils/redirect-uri.mjs +48 -0
  199. package/dist/utils/string.d.mts +8 -0
  200. package/dist/utils/string.mjs +25 -0
  201. package/dist/utils/url.d.mts +37 -0
  202. package/dist/utils/url.mjs +61 -0
  203. package/package.json +216 -0
  204. package/src/api/index.ts +185 -0
  205. package/src/async_hooks/index.ts +40 -0
  206. package/src/async_hooks/pure.index.ts +46 -0
  207. package/src/context/endpoint-context.ts +50 -0
  208. package/src/context/global.ts +57 -0
  209. package/src/context/index.ts +23 -0
  210. package/src/context/request-state.ts +91 -0
  211. package/src/context/transaction.ts +169 -0
  212. package/src/db/adapter/factory.ts +1740 -0
  213. package/src/db/adapter/get-default-field-name.ts +59 -0
  214. package/src/db/adapter/get-default-model-name.ts +51 -0
  215. package/src/db/adapter/get-field-attributes.ts +62 -0
  216. package/src/db/adapter/get-field-name.ts +43 -0
  217. package/src/db/adapter/get-id-field.ts +150 -0
  218. package/src/db/adapter/get-model-name.ts +36 -0
  219. package/src/db/adapter/index.ts +656 -0
  220. package/src/db/adapter/types.ts +134 -0
  221. package/src/db/adapter/utils.ts +61 -0
  222. package/src/db/get-tables.ts +304 -0
  223. package/src/db/index.ts +43 -0
  224. package/src/db/plugin.ts +11 -0
  225. package/src/db/schema/account.ts +47 -0
  226. package/src/db/schema/rate-limit.ts +36 -0
  227. package/src/db/schema/session.ts +29 -0
  228. package/src/db/schema/shared.ts +7 -0
  229. package/src/db/schema/user.ts +31 -0
  230. package/src/db/schema/verification.ts +28 -0
  231. package/src/db/type.ts +360 -0
  232. package/src/env/color-depth.ts +172 -0
  233. package/src/env/env-impl.ts +123 -0
  234. package/src/env/index.ts +23 -0
  235. package/src/env/logger.ts +145 -0
  236. package/src/error/codes.ts +72 -0
  237. package/src/error/index.ts +44 -0
  238. package/src/index.ts +1 -0
  239. package/src/instrumentation/api.ts +17 -0
  240. package/src/instrumentation/attributes.ts +22 -0
  241. package/src/instrumentation/index.ts +2 -0
  242. package/src/instrumentation/noop.ts +74 -0
  243. package/src/instrumentation/pure.index.ts +31 -0
  244. package/src/instrumentation/tracer.ts +95 -0
  245. package/src/oauth2/client-credentials-token.ts +126 -0
  246. package/src/oauth2/create-authorization-url.ts +89 -0
  247. package/src/oauth2/index.ts +34 -0
  248. package/src/oauth2/oauth-provider.ts +222 -0
  249. package/src/oauth2/refresh-access-token.ts +157 -0
  250. package/src/oauth2/reject-redirects.ts +70 -0
  251. package/src/oauth2/utils.ts +70 -0
  252. package/src/oauth2/validate-authorization-code.ts +190 -0
  253. package/src/oauth2/verify.ts +408 -0
  254. package/src/social-providers/apple.ts +249 -0
  255. package/src/social-providers/atlassian.ts +133 -0
  256. package/src/social-providers/cognito.ts +281 -0
  257. package/src/social-providers/discord.ts +170 -0
  258. package/src/social-providers/dropbox.ts +112 -0
  259. package/src/social-providers/facebook.ts +288 -0
  260. package/src/social-providers/figma.ts +118 -0
  261. package/src/social-providers/github.ts +184 -0
  262. package/src/social-providers/gitlab.ts +155 -0
  263. package/src/social-providers/google.ts +263 -0
  264. package/src/social-providers/huggingface.ts +119 -0
  265. package/src/social-providers/index.ts +132 -0
  266. package/src/social-providers/kakao.ts +179 -0
  267. package/src/social-providers/kick.ts +109 -0
  268. package/src/social-providers/line.ts +169 -0
  269. package/src/social-providers/linear.ts +121 -0
  270. package/src/social-providers/linkedin.ts +110 -0
  271. package/src/social-providers/microsoft-entra-id.ts +391 -0
  272. package/src/social-providers/naver.ts +113 -0
  273. package/src/social-providers/notion.ts +108 -0
  274. package/src/social-providers/paybin.ts +118 -0
  275. package/src/social-providers/paypal.ts +371 -0
  276. package/src/social-providers/polar.ts +111 -0
  277. package/src/social-providers/railway.ts +100 -0
  278. package/src/social-providers/reddit.ts +126 -0
  279. package/src/social-providers/roblox.ts +112 -0
  280. package/src/social-providers/salesforce.ts +159 -0
  281. package/src/social-providers/slack.ts +112 -0
  282. package/src/social-providers/spotify.ts +94 -0
  283. package/src/social-providers/tiktok.ts +211 -0
  284. package/src/social-providers/twitch.ts +112 -0
  285. package/src/social-providers/twitter.ts +199 -0
  286. package/src/social-providers/vercel.ts +87 -0
  287. package/src/social-providers/vk.ts +125 -0
  288. package/src/social-providers/wechat.ts +220 -0
  289. package/src/social-providers/zoom.ts +230 -0
  290. package/src/types/context.ts +460 -0
  291. package/src/types/cookie.ts +10 -0
  292. package/src/types/helper.ts +27 -0
  293. package/src/types/index.ts +40 -0
  294. package/src/types/init-options.ts +1679 -0
  295. package/src/types/plugin-client.ts +143 -0
  296. package/src/types/plugin.ts +163 -0
  297. package/src/types/secret.ts +8 -0
  298. package/src/utils/async.ts +53 -0
  299. package/src/utils/db.ts +20 -0
  300. package/src/utils/deprecate.ts +21 -0
  301. package/src/utils/error-codes.ts +68 -0
  302. package/src/utils/fetch-metadata.ts +3 -0
  303. package/src/utils/host.ts +416 -0
  304. package/src/utils/id.ts +5 -0
  305. package/src/utils/ip.ts +395 -0
  306. package/src/utils/is-api-error.ts +10 -0
  307. package/src/utils/json.ts +56 -0
  308. package/src/utils/redirect-uri.ts +54 -0
  309. package/src/utils/string.ts +40 -0
  310. package/src/utils/url.ts +77 -0
@@ -0,0 +1,46 @@
1
+ import type { AsyncLocalStorage } from "node:async_hooks";
2
+
3
+ /**
4
+ * Due to the lack of AsyncLocalStorage in some environments (like Convex),
5
+ *
6
+ * We assume serverless functions are short-lived and single-threaded, so we can use a simple polyfill.
7
+ */
8
+ class AsyncLocalStoragePolyfill<T> {
9
+ #current: T | undefined = undefined;
10
+
11
+ run(store: T, fn: () => unknown): unknown {
12
+ const prev = this.#current;
13
+ this.#current = store;
14
+ const result = fn();
15
+ if (result instanceof Promise) {
16
+ return result.finally(() => {
17
+ this.#current = prev;
18
+ });
19
+ }
20
+ this.#current = prev;
21
+ return result;
22
+ }
23
+
24
+ getStore(): T | undefined {
25
+ return this.#current;
26
+ }
27
+ }
28
+
29
+ const AsyncLocalStoragePromise: Promise<typeof AsyncLocalStorage | null> =
30
+ Promise.resolve().then(() => {
31
+ if ("AsyncLocalStorage" in globalThis) {
32
+ return (globalThis as any).AsyncLocalStorage;
33
+ }
34
+ return AsyncLocalStoragePolyfill;
35
+ });
36
+
37
+ export async function getAsyncLocalStorage(): Promise<
38
+ typeof AsyncLocalStorage
39
+ > {
40
+ const mod = await AsyncLocalStoragePromise;
41
+ if (mod === null) {
42
+ throw new Error("getAsyncLocalStorage is only available in server code");
43
+ } else {
44
+ return mod;
45
+ }
46
+ }
@@ -0,0 +1,50 @@
1
+ import type { AsyncLocalStorage } from "@better-auth/core/async_hooks";
2
+ import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
3
+ import type { EndpointContext, InputContext } from "better-call";
4
+ import type { AuthContext } from "../types";
5
+ import { __getBetterAuthGlobal } from "./global";
6
+
7
+ export type AuthEndpointContext = Partial<
8
+ InputContext<string, any> & EndpointContext<string, any>
9
+ > & {
10
+ context: AuthContext;
11
+ };
12
+
13
+ const ensureAsyncStorage = async () => {
14
+ const betterAuthGlobal = __getBetterAuthGlobal();
15
+ if (!betterAuthGlobal.context.endpointContextAsyncStorage) {
16
+ const AsyncLocalStorage = await getAsyncLocalStorage();
17
+ betterAuthGlobal.context.endpointContextAsyncStorage =
18
+ new AsyncLocalStorage<AuthEndpointContext>();
19
+ }
20
+ return betterAuthGlobal.context
21
+ .endpointContextAsyncStorage as AsyncLocalStorage<AuthEndpointContext>;
22
+ };
23
+
24
+ /**
25
+ * This is for internal use only. Most users should use `getCurrentAuthContext` instead.
26
+ *
27
+ * It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.
28
+ */
29
+ export async function getCurrentAuthContextAsyncLocalStorage() {
30
+ return ensureAsyncStorage();
31
+ }
32
+
33
+ export async function getCurrentAuthContext(): Promise<AuthEndpointContext> {
34
+ const als = await ensureAsyncStorage();
35
+ const context = als.getStore();
36
+ if (!context) {
37
+ throw new Error(
38
+ "No auth context found. Please make sure you are calling this function within a `runWithEndpointContext` callback.",
39
+ );
40
+ }
41
+ return context;
42
+ }
43
+
44
+ export async function runWithEndpointContext<T>(
45
+ context: AuthEndpointContext,
46
+ fn: () => T,
47
+ ): Promise<T> {
48
+ const als = await ensureAsyncStorage();
49
+ return als.run(context, fn);
50
+ }
@@ -0,0 +1,57 @@
1
+ import type { AsyncLocalStorage } from "@better-auth/core/async_hooks";
2
+
3
+ interface BetterAuthGlobal {
4
+ /**
5
+ * The version of BetterAuth.
6
+ */
7
+ version: string;
8
+ /**
9
+ * Used to track the number of BetterAuth instances in the same process.
10
+ *
11
+ * Debugging purposes only.
12
+ */
13
+ epoch: number;
14
+ /**
15
+ * Stores the AsyncLocalStorage instances for each context.
16
+ */
17
+ context: Record<string, AsyncLocalStorage<unknown>>;
18
+ }
19
+
20
+ const symbol = Symbol.for("better-auth:global");
21
+ let bind: BetterAuthGlobal | null = null;
22
+
23
+ const __context: Record<string, AsyncLocalStorage<unknown>> = {};
24
+ const __betterAuthVersion: string = import.meta.env
25
+ .BETTER_AUTH_VERSION as string;
26
+
27
+ /**
28
+ * We store context instance in the globalThis.
29
+ *
30
+ * The reason we do this is that some bundlers, web framework, or package managers might
31
+ * create multiple copies of BetterAuth in the same process intentionally or unintentionally.
32
+ *
33
+ * For example, yarn v1, Next.js, SSR, Vite...
34
+ *
35
+ * @internal
36
+ */
37
+ export function __getBetterAuthGlobal(): BetterAuthGlobal {
38
+ if (!(globalThis as any)[symbol]) {
39
+ (globalThis as any)[symbol] = {
40
+ version: __betterAuthVersion,
41
+ epoch: 1,
42
+ context: __context,
43
+ };
44
+ bind = (globalThis as any)[symbol] as BetterAuthGlobal;
45
+ }
46
+ bind = (globalThis as any)[symbol] as BetterAuthGlobal;
47
+ if (bind.version !== __betterAuthVersion) {
48
+ bind.version = __betterAuthVersion;
49
+ // Different versions of BetterAuth are loaded in the same process.
50
+ bind.epoch++;
51
+ }
52
+ return (globalThis as any)[symbol] as BetterAuthGlobal;
53
+ }
54
+
55
+ export function getBetterAuthVersion(): string {
56
+ return __getBetterAuthGlobal().version;
57
+ }
@@ -0,0 +1,23 @@
1
+ export {
2
+ type AuthEndpointContext,
3
+ getCurrentAuthContext,
4
+ getCurrentAuthContextAsyncLocalStorage,
5
+ runWithEndpointContext,
6
+ } from "./endpoint-context";
7
+ export { getBetterAuthVersion } from "./global";
8
+ export {
9
+ defineRequestState,
10
+ getCurrentRequestState,
11
+ getRequestStateAsyncLocalStorage,
12
+ hasRequestState,
13
+ type RequestState,
14
+ type RequestStateWeakMap,
15
+ runWithRequestState,
16
+ } from "./request-state";
17
+ export {
18
+ getCurrentAdapter,
19
+ getCurrentDBAdapterAsyncLocalStorage,
20
+ queueAfterTransactionHook,
21
+ runWithAdapter,
22
+ runWithTransaction,
23
+ } from "./transaction";
@@ -0,0 +1,91 @@
1
+ import type { AsyncLocalStorage } from "@better-auth/core/async_hooks";
2
+ import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
3
+ import { __getBetterAuthGlobal } from "./global";
4
+
5
+ export type RequestStateWeakMap = WeakMap<object, any>;
6
+
7
+ const ensureAsyncStorage = async () => {
8
+ const betterAuthGlobal = __getBetterAuthGlobal();
9
+ if (!betterAuthGlobal.context.requestStateAsyncStorage) {
10
+ const AsyncLocalStorage = await getAsyncLocalStorage();
11
+ betterAuthGlobal.context.requestStateAsyncStorage =
12
+ new AsyncLocalStorage<RequestStateWeakMap>();
13
+ }
14
+ return betterAuthGlobal.context
15
+ .requestStateAsyncStorage as AsyncLocalStorage<RequestStateWeakMap>;
16
+ };
17
+
18
+ export async function getRequestStateAsyncLocalStorage() {
19
+ return ensureAsyncStorage();
20
+ }
21
+
22
+ export async function hasRequestState() {
23
+ const als = await ensureAsyncStorage();
24
+ return als.getStore() !== undefined;
25
+ }
26
+
27
+ export async function getCurrentRequestState(): Promise<RequestStateWeakMap> {
28
+ const als = await ensureAsyncStorage();
29
+ const store = als.getStore();
30
+ if (!store) {
31
+ throw new Error(
32
+ "No request state found. Please make sure you are calling this function within a `runWithRequestState` callback.",
33
+ );
34
+ }
35
+ return store;
36
+ }
37
+
38
+ export async function runWithRequestState<T>(
39
+ store: RequestStateWeakMap,
40
+ fn: () => T,
41
+ ): Promise<T> {
42
+ const als = await ensureAsyncStorage();
43
+ return als.run(store, fn);
44
+ }
45
+
46
+ export interface RequestState<T> {
47
+ get(): Promise<T>;
48
+ set(value: T): Promise<void>;
49
+
50
+ // A unique reference used as a key to identify this state within the request's WeakMap. Useful for debugging purposes.
51
+ readonly ref: Readonly<object>;
52
+ }
53
+
54
+ /**
55
+ * Defines a request-scoped state with lazy initialization.
56
+ *
57
+ * @param initFn - A function that initializes the state. It is called the first time `get()` is invoked within each request context, and only once per context.
58
+ * @returns A RequestState object with `get` and `set` methods, and a unique `ref` for debugging.
59
+ *
60
+ * @example
61
+ * const userState = defineRequestState(() => ({ id: '', name: '' }));
62
+ * // Later, within a request context:
63
+ * const user = await userState.get();
64
+ */
65
+ export function defineRequestState<T>(
66
+ initFn: () => T | Promise<T>,
67
+ ): RequestState<T>;
68
+ export function defineRequestState(
69
+ initFn: () => any | Promise<any>,
70
+ ): RequestState<any> {
71
+ const ref = Object.freeze({});
72
+ return {
73
+ get ref(): Readonly<object> {
74
+ return ref;
75
+ },
76
+ async get() {
77
+ const store = await getCurrentRequestState();
78
+ if (!store.has(ref)) {
79
+ const initialValue = await initFn();
80
+ store.set(ref, initialValue);
81
+ return initialValue;
82
+ }
83
+ return store.get(ref);
84
+ },
85
+
86
+ async set(value) {
87
+ const store = await getCurrentRequestState();
88
+ store.set(ref, value);
89
+ },
90
+ };
91
+ }
@@ -0,0 +1,169 @@
1
+ import type { AsyncLocalStorage } from "node:async_hooks";
2
+ import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
3
+ import type { DBAdapter, DBTransactionAdapter } from "../db/adapter";
4
+ import type { BetterAuthOptions } from "../types";
5
+ import { __getBetterAuthGlobal } from "./global";
6
+
7
+ type StoredAdapter = DBTransactionAdapter<BetterAuthOptions>;
8
+
9
+ type HookContext = {
10
+ adapter: StoredAdapter;
11
+ pendingHooks: Array<() => Promise<void>>;
12
+ isTransactionActive: boolean;
13
+ };
14
+
15
+ const ensureAsyncStorage = async () => {
16
+ const betterAuthGlobal = __getBetterAuthGlobal();
17
+ if (!betterAuthGlobal.context.adapterAsyncStorage) {
18
+ const AsyncLocalStorage = await getAsyncLocalStorage();
19
+ betterAuthGlobal.context.adapterAsyncStorage = new AsyncLocalStorage();
20
+ }
21
+ return betterAuthGlobal.context
22
+ .adapterAsyncStorage as AsyncLocalStorage<HookContext>;
23
+ };
24
+
25
+ /**
26
+ * This is for internal use only. Most users should use `getCurrentAdapter` instead.
27
+ *
28
+ * It is exposed for advanced use cases where you need direct access to the AsyncLocalStorage instance.
29
+ */
30
+ export const getCurrentDBAdapterAsyncLocalStorage = async () => {
31
+ return ensureAsyncStorage();
32
+ };
33
+
34
+ export const getCurrentAdapter = async <
35
+ Options extends BetterAuthOptions = BetterAuthOptions,
36
+ >(
37
+ fallback: DBTransactionAdapter<Options>,
38
+ ): Promise<DBTransactionAdapter<Options>> => {
39
+ return ensureAsyncStorage()
40
+ .then((als) => {
41
+ const store = als.getStore();
42
+ return (
43
+ (store?.adapter as DBTransactionAdapter<Options> | undefined) ||
44
+ fallback
45
+ );
46
+ })
47
+ .catch(() => {
48
+ return fallback;
49
+ });
50
+ };
51
+
52
+ export const runWithAdapter = async <
53
+ R,
54
+ Options extends BetterAuthOptions = BetterAuthOptions,
55
+ >(
56
+ adapter: DBAdapter<Options>,
57
+ fn: () => R,
58
+ ): Promise<R> => {
59
+ let called = false;
60
+ return ensureAsyncStorage()
61
+ .then(async (als) => {
62
+ called = true;
63
+ const pendingHooks: Array<() => Promise<void>> = [];
64
+ let result: Awaited<R>;
65
+ let error: unknown;
66
+ let hasError = false;
67
+ try {
68
+ result = await als.run(
69
+ {
70
+ adapter: adapter as unknown as StoredAdapter,
71
+ pendingHooks,
72
+ isTransactionActive: false,
73
+ },
74
+ fn,
75
+ );
76
+ } catch (err) {
77
+ error = err;
78
+ hasError = true;
79
+ }
80
+ // Execute pending hooks after the function completes (even if it threw)
81
+ for (const hook of pendingHooks) {
82
+ await hook();
83
+ }
84
+ if (hasError) {
85
+ throw error;
86
+ }
87
+ return result!;
88
+ })
89
+ .catch((err) => {
90
+ if (!called) {
91
+ return fn();
92
+ }
93
+ throw err;
94
+ });
95
+ };
96
+
97
+ export const runWithTransaction = async <
98
+ R,
99
+ Options extends BetterAuthOptions = BetterAuthOptions,
100
+ >(
101
+ adapter: DBAdapter<Options>,
102
+ fn: () => R,
103
+ ): Promise<R> => {
104
+ let called = false;
105
+ return ensureAsyncStorage()
106
+ .then(async (als) => {
107
+ called = true;
108
+ const store = als.getStore();
109
+ if (store?.isTransactionActive) {
110
+ return fn();
111
+ }
112
+ const pendingHooks: Array<() => Promise<void>> = [];
113
+ let result: Awaited<R>;
114
+ let error: unknown;
115
+ let hasError = false;
116
+ try {
117
+ result = await adapter.transaction(async (trx) => {
118
+ return als.run(
119
+ {
120
+ adapter: trx as unknown as StoredAdapter,
121
+ pendingHooks,
122
+ isTransactionActive: true,
123
+ },
124
+ fn,
125
+ );
126
+ });
127
+ } catch (e) {
128
+ hasError = true;
129
+ error = e;
130
+ }
131
+ for (const hook of pendingHooks) {
132
+ await hook();
133
+ }
134
+ if (hasError) {
135
+ throw error;
136
+ }
137
+ return result!;
138
+ })
139
+ .catch((err) => {
140
+ if (!called) {
141
+ return fn();
142
+ }
143
+ throw err;
144
+ });
145
+ };
146
+
147
+ /**
148
+ * Queue a hook to be executed after the current transaction commits.
149
+ * If not in a transaction, the hook will execute immediately.
150
+ */
151
+ export const queueAfterTransactionHook = async (
152
+ hook: () => Promise<void>,
153
+ ): Promise<void> => {
154
+ return ensureAsyncStorage()
155
+ .then((als) => {
156
+ const store = als.getStore();
157
+ if (store) {
158
+ // We're in a transaction context, queue the hook
159
+ store.pendingHooks.push(hook);
160
+ } else {
161
+ // Not in a transaction, execute immediately
162
+ return hook();
163
+ }
164
+ })
165
+ .catch(() => {
166
+ // No async storage available, execute immediately
167
+ return hook();
168
+ });
169
+ };