@eva_solutions/auth-sdk 0.0.0-stage → 3.0.0-dev-20261107051125

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 (205) hide show
  1. package/CHANGELOG.md +290 -0
  2. package/LICENSE +21 -0
  3. package/README.md +481 -2
  4. package/dist/admin/index.cjs +4 -0
  5. package/dist/admin/index.d.cts +2 -0
  6. package/dist/admin/index.d.ts +2 -0
  7. package/dist/admin/index.js +1 -0
  8. package/dist/admin-DjvuvuI8.js +408 -0
  9. package/dist/admin-DjvuvuI8.js.map +1 -0
  10. package/dist/admin-Q6lbWqLM.cjs +419 -0
  11. package/dist/admin-Q6lbWqLM.cjs.map +1 -0
  12. package/dist/api-path-2Ulruz7R.cjs +34 -0
  13. package/dist/api-path-2Ulruz7R.cjs.map +1 -0
  14. package/dist/api-path-B-vSkL2H.js +29 -0
  15. package/dist/api-path-B-vSkL2H.js.map +1 -0
  16. package/dist/auth-19r-Q6X2.js +84 -0
  17. package/dist/auth-19r-Q6X2.js.map +1 -0
  18. package/dist/auth-DX1N5JA4.cjs +131 -0
  19. package/dist/auth-DX1N5JA4.cjs.map +1 -0
  20. package/dist/auth-handlers-B3iJaPln.js +343 -0
  21. package/dist/auth-handlers-B3iJaPln.js.map +1 -0
  22. package/dist/auth-handlers-BTbXKJms.d.ts +15 -0
  23. package/dist/auth-handlers-BTbXKJms.d.ts.map +1 -0
  24. package/dist/auth-handlers-CDzGFDTu.cjs +404 -0
  25. package/dist/auth-handlers-CDzGFDTu.cjs.map +1 -0
  26. package/dist/auth-handlers-DRUUTEtW.d.cts +15 -0
  27. package/dist/auth-handlers-DRUUTEtW.d.cts.map +1 -0
  28. package/dist/catalog-CHPqldcj.cjs +172 -0
  29. package/dist/catalog-CHPqldcj.cjs.map +1 -0
  30. package/dist/catalog-CIqpzgsM.d.cts +75 -0
  31. package/dist/catalog-CIqpzgsM.d.cts.map +1 -0
  32. package/dist/catalog-CIqpzgsM.d.ts +75 -0
  33. package/dist/catalog-CIqpzgsM.d.ts.map +1 -0
  34. package/dist/catalog-DqPhtCKZ.js +95 -0
  35. package/dist/catalog-DqPhtCKZ.js.map +1 -0
  36. package/dist/config-D6Tr7ev6.d.cts +95 -0
  37. package/dist/config-D6Tr7ev6.d.cts.map +1 -0
  38. package/dist/config-rl4_-VAq.d.ts +95 -0
  39. package/dist/config-rl4_-VAq.d.ts.map +1 -0
  40. package/dist/constants-BE1_9Tod.cjs +52 -0
  41. package/dist/constants-BE1_9Tod.cjs.map +1 -0
  42. package/dist/constants-BY7QZokc.js +29 -0
  43. package/dist/constants-BY7QZokc.js.map +1 -0
  44. package/dist/constants-CcbhOaAP.cjs +153 -0
  45. package/dist/constants-CcbhOaAP.cjs.map +1 -0
  46. package/dist/constants-rNuD5qJn.js +94 -0
  47. package/dist/constants-rNuD5qJn.js.map +1 -0
  48. package/dist/contracts/index.cjs +1006 -0
  49. package/dist/contracts/index.cjs.map +1 -0
  50. package/dist/contracts/index.d.cts +488 -0
  51. package/dist/contracts/index.d.cts.map +1 -0
  52. package/dist/contracts/index.d.ts +488 -0
  53. package/dist/contracts/index.d.ts.map +1 -0
  54. package/dist/contracts/index.js +817 -0
  55. package/dist/contracts/index.js.map +1 -0
  56. package/dist/cookies-DCIcr7uy.cjs +94 -0
  57. package/dist/cookies-DCIcr7uy.cjs.map +1 -0
  58. package/dist/cookies-DKEC7AWv.js +71 -0
  59. package/dist/cookies-DKEC7AWv.js.map +1 -0
  60. package/dist/delegated-token-CVNbMNfy.js +426 -0
  61. package/dist/delegated-token-CVNbMNfy.js.map +1 -0
  62. package/dist/delegated-token-DHSK4rHI.cjs +461 -0
  63. package/dist/delegated-token-DHSK4rHI.cjs.map +1 -0
  64. package/dist/error-helpers-BenWu-_u.d.ts +105 -0
  65. package/dist/error-helpers-BenWu-_u.d.ts.map +1 -0
  66. package/dist/error-helpers-KBHUbkOM.d.cts +105 -0
  67. package/dist/error-helpers-KBHUbkOM.d.cts.map +1 -0
  68. package/dist/error-helpers-XCh4ZJ-g.cjs +282 -0
  69. package/dist/error-helpers-XCh4ZJ-g.cjs.map +1 -0
  70. package/dist/error-helpers-lnwgNOw9.js +145 -0
  71. package/dist/error-helpers-lnwgNOw9.js.map +1 -0
  72. package/dist/error-messages-CGpW1fsg.d.cts +48 -0
  73. package/dist/error-messages-CGpW1fsg.d.cts.map +1 -0
  74. package/dist/error-messages-CGpW1fsg.d.ts +48 -0
  75. package/dist/error-messages-CGpW1fsg.d.ts.map +1 -0
  76. package/dist/event-codes-BBJHon-I.cjs +48 -0
  77. package/dist/event-codes-BBJHon-I.cjs.map +1 -0
  78. package/dist/event-codes-BgcJWsov.d.cts +42 -0
  79. package/dist/event-codes-BgcJWsov.d.cts.map +1 -0
  80. package/dist/event-codes-BgcJWsov.d.ts +42 -0
  81. package/dist/event-codes-BgcJWsov.d.ts.map +1 -0
  82. package/dist/event-codes-DR5_VlaR.js +43 -0
  83. package/dist/event-codes-DR5_VlaR.js.map +1 -0
  84. package/dist/generic/index.cjs +91 -0
  85. package/dist/generic/index.cjs.map +1 -0
  86. package/dist/generic/index.d.cts +27 -0
  87. package/dist/generic/index.d.cts.map +1 -0
  88. package/dist/generic/index.d.ts +27 -0
  89. package/dist/generic/index.d.ts.map +1 -0
  90. package/dist/generic/index.js +80 -0
  91. package/dist/generic/index.js.map +1 -0
  92. package/dist/hono/index.cjs +309 -0
  93. package/dist/hono/index.cjs.map +1 -0
  94. package/dist/hono/index.d.cts +272 -0
  95. package/dist/hono/index.d.cts.map +1 -0
  96. package/dist/hono/index.d.ts +272 -0
  97. package/dist/hono/index.d.ts.map +1 -0
  98. package/dist/hono/index.js +290 -0
  99. package/dist/hono/index.js.map +1 -0
  100. package/dist/hono-openapi/index.cjs +326 -0
  101. package/dist/hono-openapi/index.cjs.map +1 -0
  102. package/dist/hono-openapi/index.d.cts +14 -0
  103. package/dist/hono-openapi/index.d.cts.map +1 -0
  104. package/dist/hono-openapi/index.d.ts +14 -0
  105. package/dist/hono-openapi/index.d.ts.map +1 -0
  106. package/dist/hono-openapi/index.js +307 -0
  107. package/dist/hono-openapi/index.js.map +1 -0
  108. package/dist/http-client-BVF3iktR.cjs +211 -0
  109. package/dist/http-client-BVF3iktR.cjs.map +1 -0
  110. package/dist/http-client-Da0-OMfc.js +206 -0
  111. package/dist/http-client-Da0-OMfc.js.map +1 -0
  112. package/dist/index-BYzDaMR9.d.ts +312 -0
  113. package/dist/index-BYzDaMR9.d.ts.map +1 -0
  114. package/dist/index-CNNMCrdl.d.ts +66 -0
  115. package/dist/index-CNNMCrdl.d.ts.map +1 -0
  116. package/dist/index-DBZoLU4E.d.ts +240 -0
  117. package/dist/index-DBZoLU4E.d.ts.map +1 -0
  118. package/dist/index-DcvQWByo.d.cts +66 -0
  119. package/dist/index-DcvQWByo.d.cts.map +1 -0
  120. package/dist/index-Dold-Ycb.d.cts +1711 -0
  121. package/dist/index-Dold-Ycb.d.cts.map +1 -0
  122. package/dist/index-Dold-Ycb.d.ts +1711 -0
  123. package/dist/index-Dold-Ycb.d.ts.map +1 -0
  124. package/dist/index-jAO62-OD.d.cts +240 -0
  125. package/dist/index-jAO62-OD.d.cts.map +1 -0
  126. package/dist/index-o7nXcl7z.d.cts +312 -0
  127. package/dist/index-o7nXcl7z.d.cts.map +1 -0
  128. package/dist/index.cjs +89 -0
  129. package/dist/index.cjs.map +1 -0
  130. package/dist/index.d.cts +114 -0
  131. package/dist/index.d.cts.map +1 -0
  132. package/dist/index.d.ts +114 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +28 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/jwt-BBNqk0TV.cjs +155 -0
  137. package/dist/jwt-BBNqk0TV.cjs.map +1 -0
  138. package/dist/jwt-DhqgH94B.js +150 -0
  139. package/dist/jwt-DhqgH94B.js.map +1 -0
  140. package/dist/key-resolver-CESqj4-P.cjs +45 -0
  141. package/dist/key-resolver-CESqj4-P.cjs.map +1 -0
  142. package/dist/key-resolver-D56I2Zpz.js +34 -0
  143. package/dist/key-resolver-D56I2Zpz.js.map +1 -0
  144. package/dist/parse-error-response-6qOQS5y9.cjs +316 -0
  145. package/dist/parse-error-response-6qOQS5y9.cjs.map +1 -0
  146. package/dist/parse-error-response-BM9-kjs0.js +239 -0
  147. package/dist/parse-error-response-BM9-kjs0.js.map +1 -0
  148. package/dist/path-segment-C25i6aaH.cjs +29 -0
  149. package/dist/path-segment-C25i6aaH.cjs.map +1 -0
  150. package/dist/path-segment-CyqnaFrP.js +24 -0
  151. package/dist/path-segment-CyqnaFrP.js.map +1 -0
  152. package/dist/react/index.cjs +336 -0
  153. package/dist/react/index.cjs.map +1 -0
  154. package/dist/react/index.d.cts +151 -0
  155. package/dist/react/index.d.cts.map +1 -0
  156. package/dist/react/index.d.ts +151 -0
  157. package/dist/react/index.d.ts.map +1 -0
  158. package/dist/react/index.js +300 -0
  159. package/dist/react/index.js.map +1 -0
  160. package/dist/refresh-dedup-CKaHHe7m.js +14 -0
  161. package/dist/refresh-dedup-CKaHHe7m.js.map +1 -0
  162. package/dist/refresh-dedup-CLdACQXR.cjs +19 -0
  163. package/dist/refresh-dedup-CLdACQXR.cjs.map +1 -0
  164. package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
  165. package/dist/routes-DpAzgY1V.cjs +424 -0
  166. package/dist/routes-DpAzgY1V.cjs.map +1 -0
  167. package/dist/routes-F1g5aVqP.js +347 -0
  168. package/dist/routes-F1g5aVqP.js.map +1 -0
  169. package/dist/s2s/index.cjs +24 -0
  170. package/dist/s2s/index.d.cts +5 -0
  171. package/dist/s2s/index.d.ts +5 -0
  172. package/dist/s2s/index.js +5 -0
  173. package/dist/s2s-6wbotr78.cjs +926 -0
  174. package/dist/s2s-6wbotr78.cjs.map +1 -0
  175. package/dist/s2s-B_0SIQzn.js +897 -0
  176. package/dist/s2s-B_0SIQzn.js.map +1 -0
  177. package/dist/sign-C7y6xdvT.cjs +324 -0
  178. package/dist/sign-C7y6xdvT.cjs.map +1 -0
  179. package/dist/sign-HFtcYwa-.js +259 -0
  180. package/dist/sign-HFtcYwa-.js.map +1 -0
  181. package/dist/tokens-C1nzkn21.cjs +232 -0
  182. package/dist/tokens-C1nzkn21.cjs.map +1 -0
  183. package/dist/tokens-C3Z40qd7.js +107 -0
  184. package/dist/tokens-C3Z40qd7.js.map +1 -0
  185. package/dist/types-B5sf7kKE.d.cts +52 -0
  186. package/dist/types-B5sf7kKE.d.cts.map +1 -0
  187. package/dist/types-CLOIHzRu.d.ts +96 -0
  188. package/dist/types-CLOIHzRu.d.ts.map +1 -0
  189. package/dist/types-CQTZdZIF.d.ts +52 -0
  190. package/dist/types-CQTZdZIF.d.ts.map +1 -0
  191. package/dist/types-DGeQ8j4k.d.cts +538 -0
  192. package/dist/types-DGeQ8j4k.d.cts.map +1 -0
  193. package/dist/types-DIUWza9-.d.ts +538 -0
  194. package/dist/types-DIUWza9-.d.ts.map +1 -0
  195. package/dist/types-qh6ANBCV.d.cts +96 -0
  196. package/dist/types-qh6ANBCV.d.cts.map +1 -0
  197. package/dist/webhooks/index.cjs +8 -0
  198. package/dist/webhooks/index.d.cts +5 -0
  199. package/dist/webhooks/index.d.ts +5 -0
  200. package/dist/webhooks/index.js +4 -0
  201. package/dist/webhooks-B5sAWC9W.js +74 -0
  202. package/dist/webhooks-B5sAWC9W.js.map +1 -0
  203. package/dist/webhooks-Cx11psg1.cjs +79 -0
  204. package/dist/webhooks-Cx11psg1.cjs.map +1 -0
  205. package/package.json +192 -3
@@ -0,0 +1,300 @@
1
+ import { a as HEADERS, i as ERROR_CODES } from "../constants-rNuD5qJn.js";
2
+ import { C as SDK_ERROR_REASONS, S as matchSdkReason, _ as isUnauthorized, a as isConflict, b as isVerifyFailed, c as isInternalError, d as isNotFound, f as isRateLimited, g as isTokenInvalid, h as isServiceUnavailable, i as isBadRequest, l as isMalformed, m as isSdkError, n as isApiError, o as isForbidden, p as isRefreshNoTokens, r as isAuthRequired, s as isGone, t as isAccountStateLocked, u as isNetworkError, v as isUnprocessableEntity, x as matchError, y as isValidationError } from "../error-helpers-lnwgNOw9.js";
3
+ import { d as DEFAULT_ERROR_MESSAGES, n as configureEvaAuth, t as parseErrorResponse } from "../parse-error-response-BM9-kjs0.js";
4
+ import { n as readTokensFromCookies } from "../cookies-DKEC7AWv.js";
5
+ import { i as getCookieNames, t as COOKIE_MAX_AGE } from "../constants-BY7QZokc.js";
6
+ import { z } from "zod";
7
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ // src/react/auth-fetch.ts
10
+ const ApiResponseSchema = z.object({ data: z.unknown().optional() });
11
+ const FETCH_TIMEOUT = 3e4;
12
+ const sdkError = (reason, message, status) => ({
13
+ kind: "sdk",
14
+ reason,
15
+ message,
16
+ status
17
+ });
18
+ const authFetch = async (url, options) => {
19
+ try {
20
+ const timeoutSignal = AbortSignal.timeout(FETCH_TIMEOUT);
21
+ const signal = options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
22
+ const res = await fetch(url, {
23
+ ...options,
24
+ headers: {
25
+ "Content-Type": "application/json",
26
+ ...options?.headers
27
+ },
28
+ credentials: "include",
29
+ signal
30
+ });
31
+ if (!res.ok) {
32
+ const body = await res.json().catch(() => null);
33
+ return {
34
+ ok: false,
35
+ error: parseErrorResponse(res.status, body)
36
+ };
37
+ }
38
+ const json = await res.json();
39
+ const parsed = ApiResponseSchema.safeParse(json);
40
+ if (!parsed.success) return {
41
+ ok: false,
42
+ error: sdkError(SDK_ERROR_REASONS.malformed, "Estructura de respuesta inválida", 502)
43
+ };
44
+ return {
45
+ ok: true,
46
+ data: parsed.data.data
47
+ };
48
+ } catch (err) {
49
+ if (err instanceof DOMException && err.name === "TimeoutError") return {
50
+ ok: false,
51
+ error: sdkError(SDK_ERROR_REASONS.network, "Tiempo de espera agotado", 0)
52
+ };
53
+ if (err instanceof DOMException && err.name === "AbortError") return {
54
+ ok: false,
55
+ error: sdkError(SDK_ERROR_REASONS.network, "Solicitud cancelada", 0)
56
+ };
57
+ return {
58
+ ok: false,
59
+ error: sdkError(SDK_ERROR_REASONS.network, "Error de red", 0)
60
+ };
61
+ }
62
+ };
63
+ // src/react/eva-auth-provider.tsx
64
+ const AuthContext = createContext(null);
65
+ const useAuthContext = () => {
66
+ const ctx = useContext(AuthContext);
67
+ if (!ctx) throw new Error("Hook must be used within EvaAuthProvider");
68
+ return ctx;
69
+ };
70
+ const RETRY_DELAYS = [
71
+ 1e3,
72
+ 2e3,
73
+ 4e3
74
+ ];
75
+ const EvaAuthProvider = ({ children, basePath = "/auth", apiUrl, onAuthChange }) => {
76
+ const urlBase = useMemo(() => {
77
+ if (!apiUrl) return basePath;
78
+ return `${apiUrl.replace(/\/$/, "")}${basePath}`;
79
+ }, [apiUrl, basePath]);
80
+ const [state, setState] = useState({
81
+ isAuthenticated: false,
82
+ isLoading: true,
83
+ error: null
84
+ });
85
+ const prevAuthRef = useRef(state.isAuthenticated);
86
+ const onAuthChangeRef = useRef(onAuthChange);
87
+ onAuthChangeRef.current = onAuthChange;
88
+ useEffect(() => {
89
+ if (prevAuthRef.current !== state.isAuthenticated) {
90
+ prevAuthRef.current = state.isAuthenticated;
91
+ onAuthChangeRef.current?.(state.isAuthenticated);
92
+ }
93
+ }, [state.isAuthenticated]);
94
+ useEffect(() => {
95
+ const controller = new AbortController();
96
+ const checkSession = async () => {
97
+ let lastError = {
98
+ kind: "sdk",
99
+ reason: "network",
100
+ message: "Error de red",
101
+ status: 0
102
+ };
103
+ for (let attempt = 0; attempt <= RETRY_DELAYS.length; attempt++) {
104
+ const result = await authFetch(`${urlBase}/refresh`, {
105
+ method: "POST",
106
+ signal: controller.signal
107
+ });
108
+ if (controller.signal.aborted) return;
109
+ if (result.ok) {
110
+ setState({
111
+ isAuthenticated: true,
112
+ isLoading: false,
113
+ error: null
114
+ });
115
+ return;
116
+ }
117
+ if (result.error.status === 401) {
118
+ setState({
119
+ isAuthenticated: false,
120
+ isLoading: false,
121
+ error: null
122
+ });
123
+ return;
124
+ }
125
+ if (result.error.status >= 400 && result.error.status < 500) {
126
+ setState({
127
+ isAuthenticated: false,
128
+ isLoading: false,
129
+ error: result.error
130
+ });
131
+ return;
132
+ }
133
+ lastError = result.error;
134
+ if (attempt < RETRY_DELAYS.length) {
135
+ await new Promise((r) => setTimeout(r, RETRY_DELAYS[attempt]));
136
+ if (controller.signal.aborted) return;
137
+ }
138
+ }
139
+ setState({
140
+ isAuthenticated: false,
141
+ isLoading: false,
142
+ error: lastError
143
+ });
144
+ };
145
+ checkSession();
146
+ return () => controller.abort();
147
+ }, [urlBase]);
148
+ const setAuthenticated = useCallback((value) => {
149
+ setState((prev) => ({
150
+ ...prev,
151
+ isAuthenticated: value,
152
+ error: null
153
+ }));
154
+ }, []);
155
+ const login = useMemo(() => ({
156
+ getCode: (params) => authFetch(`${urlBase}/get-code`, {
157
+ method: "POST",
158
+ body: JSON.stringify(params)
159
+ }),
160
+ verify: async (params) => {
161
+ const result = await authFetch(`${urlBase}/login`, {
162
+ method: "POST",
163
+ body: JSON.stringify(params)
164
+ });
165
+ if (result.ok) setState({
166
+ isAuthenticated: true,
167
+ isLoading: false,
168
+ error: null
169
+ });
170
+ return result;
171
+ }
172
+ }), [urlBase]);
173
+ const logout = useCallback(async () => {
174
+ const result = await authFetch(`${urlBase}/logout`, { method: "POST" });
175
+ if (result.ok) setState({
176
+ isAuthenticated: false,
177
+ isLoading: false,
178
+ error: null
179
+ });
180
+ return result;
181
+ }, [urlBase]);
182
+ const value = useMemo(() => ({
183
+ ...state,
184
+ login,
185
+ logout,
186
+ setAuthenticated,
187
+ basePath: urlBase
188
+ }), [
189
+ state,
190
+ login,
191
+ logout,
192
+ setAuthenticated,
193
+ urlBase
194
+ ]);
195
+ return /* @__PURE__ */ jsx(AuthContext.Provider, {
196
+ value,
197
+ children
198
+ });
199
+ };
200
+ // src/react/use-auth.ts
201
+ const useAuth = () => {
202
+ const { isAuthenticated, isLoading, error, login, logout } = useAuthContext();
203
+ return {
204
+ isAuthenticated,
205
+ isLoading,
206
+ error,
207
+ login,
208
+ logout
209
+ };
210
+ };
211
+ // src/react/use-auth-data.ts
212
+ const useAuthData = (path) => {
213
+ const { basePath, isAuthenticated } = useAuthContext();
214
+ const [data, setData] = useState(null);
215
+ const [isLoading, setIsLoading] = useState(false);
216
+ const [error, setError] = useState(null);
217
+ const controllerRef = useRef(null);
218
+ const fetchData = useCallback(async (signal) => {
219
+ setIsLoading(true);
220
+ setError(null);
221
+ try {
222
+ const result = await authFetch(`${basePath}${path}`, { signal });
223
+ if (signal?.aborted) return;
224
+ if (result.ok) {
225
+ setData(result.data);
226
+ setError(null);
227
+ } else {
228
+ setData(null);
229
+ setError(result.error);
230
+ }
231
+ } finally {
232
+ if (!signal?.aborted) setIsLoading(false);
233
+ }
234
+ }, [basePath, path]);
235
+ useEffect(() => {
236
+ if (!isAuthenticated) {
237
+ setData(null);
238
+ setIsLoading(false);
239
+ setError(null);
240
+ return;
241
+ }
242
+ controllerRef.current?.abort();
243
+ const controller = new AbortController();
244
+ controllerRef.current = controller;
245
+ fetchData(controller.signal);
246
+ return () => controller.abort();
247
+ }, [isAuthenticated, fetchData]);
248
+ return {
249
+ data,
250
+ isLoading,
251
+ error,
252
+ refetch: useCallback(() => {
253
+ controllerRef.current?.abort();
254
+ const controller = new AbortController();
255
+ controllerRef.current = controller;
256
+ fetchData(controller.signal);
257
+ }, [fetchData])
258
+ };
259
+ };
260
+ // src/react/use-user.ts
261
+ const useUser = () => {
262
+ const { data: user, ...rest } = useAuthData("/me");
263
+ return {
264
+ user,
265
+ ...rest
266
+ };
267
+ };
268
+ // src/react/use-sessions.ts
269
+ const useSessions = () => {
270
+ const { basePath } = useAuthContext();
271
+ const { data: sessions, refetch, ...rest } = useAuthData("/sessions");
272
+ const closeSession = useCallback(async (sessionId) => {
273
+ const result = await authFetch(`${basePath}/sessions/${sessionId}`, { method: "DELETE" });
274
+ if (result.ok) refetch();
275
+ return result;
276
+ }, [basePath, refetch]);
277
+ const closeAllOther = useCallback(async () => {
278
+ const result = await authFetch(`${basePath}/sessions`, { method: "DELETE" });
279
+ if (result.ok) refetch();
280
+ return result;
281
+ }, [basePath, refetch]);
282
+ return {
283
+ sessions,
284
+ ...rest,
285
+ refetch,
286
+ closeSession,
287
+ closeAllOther
288
+ };
289
+ };
290
+ // src/react/use-empresas.ts
291
+ const useEmpresas = () => {
292
+ const { data: empresas, ...rest } = useAuthData("/empresas");
293
+ return {
294
+ empresas,
295
+ ...rest
296
+ };
297
+ };
298
+ export { COOKIE_MAX_AGE, DEFAULT_ERROR_MESSAGES, ERROR_CODES, EvaAuthProvider, HEADERS, SDK_ERROR_REASONS, authFetch, configureEvaAuth, getCookieNames, isAccountStateLocked, isApiError, isAuthRequired, isBadRequest, isConflict, isForbidden, isGone, isInternalError, isMalformed, isNetworkError, isNotFound, isRateLimited, isRefreshNoTokens, isSdkError, isServiceUnavailable, isTokenInvalid, isUnauthorized, isUnprocessableEntity, isValidationError, isVerifyFailed, matchError, matchSdkReason, readTokensFromCookies, useAuth, useEmpresas, useSessions, useUser };
299
+
300
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/react/auth-fetch.ts","../../src/react/eva-auth-provider.tsx","../../src/react/use-auth.ts","../../src/react/use-auth-data.ts","../../src/react/use-user.ts","../../src/react/use-sessions.ts","../../src/react/use-empresas.ts"],"sourcesContent":["import { z } from 'zod'\nimport type { Result } from '../types'\nimport type { EvaSdkError } from '../types'\nimport { SDK_ERROR_REASONS } from '../error-codes'\nimport { parseErrorResponse } from '../parse-error-response'\n\nconst ApiResponseSchema = z.object({\n data: z.unknown().optional(),\n})\n\nconst FETCH_TIMEOUT = 30_000\n\nconst sdkError = (\n reason: EvaSdkError['reason'],\n message: string,\n status: number,\n): EvaSdkError => ({\n kind: 'sdk',\n reason,\n message,\n status,\n})\n\nexport const authFetch = async <T>(\n url: string,\n options?: RequestInit,\n): Promise<Result<T>> => {\n try {\n const timeoutSignal = AbortSignal.timeout(FETCH_TIMEOUT)\n const signal = options?.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const res = await fetch(url, {\n ...options,\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n credentials: 'include',\n signal,\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => null)\n const error = parseErrorResponse(res.status, body)\n return { ok: false, error }\n }\n\n const json: unknown = await res.json()\n const parsed = ApiResponseSchema.safeParse(json)\n if (!parsed.success) {\n return {\n ok: false,\n error: sdkError(\n SDK_ERROR_REASONS.malformed,\n 'Estructura de respuesta inválida',\n 502,\n ),\n }\n }\n return { ok: true, data: parsed.data.data as T }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'TimeoutError') {\n return {\n ok: false,\n error: sdkError(\n SDK_ERROR_REASONS.network,\n 'Tiempo de espera agotado',\n 0,\n ),\n }\n }\n if (err instanceof DOMException && err.name === 'AbortError') {\n return {\n ok: false,\n error: sdkError(SDK_ERROR_REASONS.network, 'Solicitud cancelada', 0),\n }\n }\n return {\n ok: false,\n error: sdkError(SDK_ERROR_REASONS.network, 'Error de red', 0),\n }\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n type ReactNode,\n} from 'react'\nimport type { Result, EvaError } from '../types'\nimport { authFetch } from './auth-fetch'\n\n// ── Types ──────────────────────────────────────────────\n\nexport type AuthState = {\n isAuthenticated: boolean\n isLoading: boolean\n error: EvaError | null\n}\n\nexport type AuthContextValue = AuthState & {\n login: {\n /**\n * Solicita el código. El `challengeId` devuelto es opaco: consérvalo en\n * memoria (el provider no lo guarda) y pásalo a `verify`. Cada `getCode`\n * nuevo invalida el `challengeId` anterior.\n */\n getCode: (params: {\n phone: string\n }) => Promise<Result<{ message: string; challengeId: string }>>\n /** Verifica el código con el `challengeId` que devolvió `getCode`. */\n verify: (params: {\n phone: string\n code: string\n challengeId: string\n }) => Promise<Result<{ user: { id: string } }>>\n }\n logout: () => Promise<Result<{ message: string }>>\n setAuthenticated: (value: boolean) => void\n basePath: string\n}\n\nexport type EvaAuthProviderProps = {\n children: ReactNode\n basePath?: string\n apiUrl?: string\n onAuthChange?: (authenticated: boolean) => void\n}\n\n// ── Context ────────────────────────────────────────────\n\nconst AuthContext = createContext<AuthContextValue | null>(null)\n\nexport const useAuthContext = () => {\n const ctx = useContext(AuthContext)\n if (!ctx) throw new Error('Hook must be used within EvaAuthProvider')\n return ctx\n}\n\n// ── Provider ───────────────────────────────────────────\n\nconst RETRY_DELAYS = [1000, 2000, 4000]\n\nexport const EvaAuthProvider = ({\n children,\n basePath = '/auth',\n apiUrl,\n onAuthChange,\n}: EvaAuthProviderProps) => {\n const urlBase = useMemo(() => {\n if (!apiUrl) return basePath\n return `${apiUrl.replace(/\\/$/, '')}${basePath}`\n }, [apiUrl, basePath])\n\n const [state, setState] = useState<AuthState>({\n isAuthenticated: false,\n isLoading: true,\n error: null,\n })\n\n const prevAuthRef = useRef(state.isAuthenticated)\n const onAuthChangeRef = useRef(onAuthChange)\n onAuthChangeRef.current = onAuthChange\n\n // Notify on auth transitions\n useEffect(() => {\n if (prevAuthRef.current !== state.isAuthenticated) {\n prevAuthRef.current = state.isAuthenticated\n onAuthChangeRef.current?.(state.isAuthenticated)\n }\n }, [state.isAuthenticated])\n\n // Silent refresh on mount\n useEffect(() => {\n const controller = new AbortController()\n\n const checkSession = async () => {\n let lastError: EvaError = {\n kind: 'sdk',\n reason: 'network',\n message: 'Error de red',\n status: 0,\n }\n for (let attempt = 0; attempt <= RETRY_DELAYS.length; attempt++) {\n const result = await authFetch<unknown>(`${urlBase}/refresh`, {\n method: 'POST',\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) return\n\n if (result.ok) {\n setState({ isAuthenticated: true, isLoading: false, error: null })\n return\n }\n\n if (result.error.status === 401) {\n setState({ isAuthenticated: false, isLoading: false, error: null })\n return\n }\n\n // Errores de cliente (4xx) no son recuperables con retry\n if (result.error.status >= 400 && result.error.status < 500) {\n setState({\n isAuthenticated: false,\n isLoading: false,\n error: result.error,\n })\n return\n }\n\n lastError = result.error\n\n if (attempt < RETRY_DELAYS.length) {\n await new Promise<void>((r) => setTimeout(r, RETRY_DELAYS[attempt]))\n if (controller.signal.aborted) return\n }\n }\n\n setState({\n isAuthenticated: false,\n isLoading: false,\n error: lastError,\n })\n }\n\n checkSession()\n return () => controller.abort()\n }, [urlBase])\n\n const setAuthenticated = useCallback((value: boolean) => {\n setState((prev) => ({ ...prev, isAuthenticated: value, error: null }))\n }, [])\n\n const login = useMemo(\n () => ({\n getCode: (params: { phone: string }) =>\n authFetch<{ message: string; challengeId: string }>(\n `${urlBase}/get-code`,\n {\n method: 'POST',\n body: JSON.stringify(params),\n },\n ),\n verify: async (params: {\n phone: string\n code: string\n challengeId: string\n }) => {\n const result = await authFetch<{ user: { id: string } }>(\n `${urlBase}/login`,\n {\n method: 'POST',\n body: JSON.stringify(params),\n },\n )\n if (result.ok)\n setState({ isAuthenticated: true, isLoading: false, error: null })\n return result\n },\n }),\n [urlBase],\n )\n\n const logout = useCallback(async () => {\n const result = await authFetch<{ message: string }>(`${urlBase}/logout`, {\n method: 'POST',\n })\n if (result.ok)\n setState({ isAuthenticated: false, isLoading: false, error: null })\n return result\n }, [urlBase])\n\n const value = useMemo<AuthContextValue>(\n () => ({\n ...state,\n login,\n logout,\n setAuthenticated,\n basePath: urlBase,\n }),\n [state, login, logout, setAuthenticated, urlBase],\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n","import { useAuthContext } from './eva-auth-provider'\n\nexport const useAuth = () => {\n const { isAuthenticated, isLoading, error, login, logout } = useAuthContext()\n return { isAuthenticated, isLoading, error, login, logout }\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { useAuthContext } from './eva-auth-provider'\nimport type { EvaError } from '../types'\nimport { authFetch } from './auth-fetch'\n\ntype AuthDataResult<T> = {\n data: T | null\n isLoading: boolean\n error: EvaError | null\n refetch: () => void\n}\n\nexport const useAuthData = <T>(path: string): AuthDataResult<T> => {\n const { basePath, isAuthenticated } = useAuthContext()\n\n const [data, setData] = useState<T | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<EvaError | null>(null)\n const controllerRef = useRef<AbortController | null>(null)\n\n const fetchData = useCallback(\n async (signal?: AbortSignal) => {\n setIsLoading(true)\n setError(null)\n\n try {\n const result = await authFetch<T>(`${basePath}${path}`, { signal })\n if (signal?.aborted) return\n\n if (result.ok) {\n setData(result.data)\n setError(null)\n } else {\n setData(null)\n setError(result.error)\n }\n } finally {\n if (!signal?.aborted) setIsLoading(false)\n }\n },\n [basePath, path],\n )\n\n useEffect(() => {\n if (!isAuthenticated) {\n setData(null)\n setIsLoading(false)\n setError(null)\n return\n }\n\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n fetchData(controller.signal)\n return () => controller.abort()\n }, [isAuthenticated, fetchData])\n\n const refetch = useCallback(() => {\n controllerRef.current?.abort()\n const controller = new AbortController()\n controllerRef.current = controller\n fetchData(controller.signal)\n }, [fetchData])\n\n return { data, isLoading, error, refetch }\n}\n","import type { EvaUser } from '../types'\nimport { useAuthData } from './use-auth-data'\n\nexport const useUser = () => {\n const { data: user, ...rest } = useAuthData<EvaUser>('/me')\n return { user, ...rest }\n}\n","import { useCallback } from 'react'\nimport type { EvaSession, Result } from '../types'\nimport { useAuthContext } from './eva-auth-provider'\nimport { useAuthData } from './use-auth-data'\nimport { authFetch } from './auth-fetch'\n\nexport const useSessions = () => {\n const { basePath } = useAuthContext()\n const {\n data: sessions,\n refetch,\n ...rest\n } = useAuthData<EvaSession[]>('/sessions')\n\n const closeSession = useCallback(\n async (sessionId: string): Promise<Result<{ message: string }>> => {\n const result = await authFetch<{ message: string }>(\n `${basePath}/sessions/${sessionId}`,\n {\n method: 'DELETE',\n },\n )\n if (result.ok) refetch()\n return result\n },\n [basePath, refetch],\n )\n\n const closeAllOther = useCallback(async (): Promise<\n Result<{ message: string }>\n > => {\n const result = await authFetch<{ message: string }>(\n `${basePath}/sessions`,\n {\n method: 'DELETE',\n },\n )\n if (result.ok) refetch()\n return result\n }, [basePath, refetch])\n\n return { sessions, ...rest, refetch, closeSession, closeAllOther }\n}\n","import type { EvaEmpresa } from '../types'\nimport { useAuthData } from './use-auth-data'\n\nexport const useEmpresas = () => {\n const { data: empresas, ...rest } = useAuthData<EvaEmpresa[]>('/empresas')\n return { empresas, ...rest }\n}\n"],"mappings":";;;;;;;;;AAMA,MAAM,oBAAoB,EAAE,OAAO,EACjC,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC7B,CAAC;AAED,MAAM,gBAAgB;AAEtB,MAAM,YACJ,QACA,SACA,YACiB;CACjB,MAAM;CACN;CACA;CACA;AACF;AAEA,MAAa,YAAY,OACvB,KACA,YACuB;CACvB,IAAI;EACF,MAAM,gBAAgB,YAAY,QAAQ,aAAa;EACvD,MAAM,SAAS,SAAS,SACpB,YAAY,IAAI,CAAC,QAAQ,QAAQ,aAAa,CAAC,IAC/C;EAEJ,MAAM,MAAM,MAAM,MAAM,KAAK;GAC3B,GAAG;GACH,SAAS;IAAE,gBAAgB;IAAoB,GAAG,SAAS;GAAQ;GACnE,aAAa;GACb;EACF,CAAC;EAED,IAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,YAAY,IAAI;GAE9C,OAAO;IAAE,IAAI;IAAO,OADN,mBAAmB,IAAI,QAAQ,IACrB;GAAE;EAC5B;EAEA,MAAM,OAAgB,MAAM,IAAI,KAAK;EACrC,MAAM,SAAS,kBAAkB,UAAU,IAAI;EAC/C,IAAI,CAAC,OAAO,SACV,OAAO;GACL,IAAI;GACJ,OAAO,SACL,kBAAkB,WAClB,oCACA,GACF;EACF;EAEF,OAAO;GAAE,IAAI;GAAM,MAAM,OAAO,KAAK;EAAU;CACjD,SAAS,KAAK;EACZ,IAAI,eAAe,gBAAgB,IAAI,SAAS,gBAC9C,OAAO;GACL,IAAI;GACJ,OAAO,SACL,kBAAkB,SAClB,4BACA,CACF;EACF;EAEF,IAAI,eAAe,gBAAgB,IAAI,SAAS,cAC9C,OAAO;GACL,IAAI;GACJ,OAAO,SAAS,kBAAkB,SAAS,uBAAuB,CAAC;EACrE;EAEF,OAAO;GACL,IAAI;GACJ,OAAO,SAAS,kBAAkB,SAAS,gBAAgB,CAAC;EAC9D;CACF;AACF;;AC7BA,MAAM,cAAc,cAAuC,IAAI;AAE/D,MAAa,uBAAuB;CAClC,MAAM,MAAM,WAAW,WAAW;CAClC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,0CAA0C;CACpE,OAAO;AACT;AAIA,MAAM,eAAe;CAAC;CAAM;CAAM;AAAI;AAEtC,MAAa,mBAAmB,EAC9B,UACA,WAAW,SACX,QACA,mBAC0B;CAC1B,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,QAAQ,OAAO;EACpB,OAAO,GAAG,OAAO,QAAQ,OAAO,EAAE,IAAI;CACxC,GAAG,CAAC,QAAQ,QAAQ,CAAC;CAErB,MAAM,CAAC,OAAO,YAAY,SAAoB;EAC5C,iBAAiB;EACjB,WAAW;EACX,OAAO;CACT,CAAC;CAED,MAAM,cAAc,OAAO,MAAM,eAAe;CAChD,MAAM,kBAAkB,OAAO,YAAY;CAC3C,gBAAgB,UAAU;CAG1B,gBAAgB;EACd,IAAI,YAAY,YAAY,MAAM,iBAAiB;GACjD,YAAY,UAAU,MAAM;GAC5B,gBAAgB,UAAU,MAAM,eAAe;EACjD;CACF,GAAG,CAAC,MAAM,eAAe,CAAC;CAG1B,gBAAgB;EACd,MAAM,aAAa,IAAI,gBAAgB;EAEvC,MAAM,eAAe,YAAY;GAC/B,IAAI,YAAsB;IACxB,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;GACV;GACA,KAAK,IAAI,UAAU,GAAG,WAAW,aAAa,QAAQ,WAAW;IAC/D,MAAM,SAAS,MAAM,UAAmB,GAAG,QAAQ,WAAW;KAC5D,QAAQ;KACR,QAAQ,WAAW;IACrB,CAAC;IAED,IAAI,WAAW,OAAO,SAAS;IAE/B,IAAI,OAAO,IAAI;KACb,SAAS;MAAE,iBAAiB;MAAM,WAAW;MAAO,OAAO;KAAK,CAAC;KACjE;IACF;IAEA,IAAI,OAAO,MAAM,WAAW,KAAK;KAC/B,SAAS;MAAE,iBAAiB;MAAO,WAAW;MAAO,OAAO;KAAK,CAAC;KAClE;IACF;IAGA,IAAI,OAAO,MAAM,UAAU,OAAO,OAAO,MAAM,SAAS,KAAK;KAC3D,SAAS;MACP,iBAAiB;MACjB,WAAW;MACX,OAAO,OAAO;KAChB,CAAC;KACD;IACF;IAEA,YAAY,OAAO;IAEnB,IAAI,UAAU,aAAa,QAAQ;KACjC,MAAM,IAAI,SAAe,MAAM,WAAW,GAAG,aAAa,QAAQ,CAAC;KACnE,IAAI,WAAW,OAAO,SAAS;IACjC;GACF;GAEA,SAAS;IACP,iBAAiB;IACjB,WAAW;IACX,OAAO;GACT,CAAC;EACH;EAEA,aAAa;EACb,aAAa,WAAW,MAAM;CAChC,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,mBAAmB,aAAa,UAAmB;EACvD,UAAU,UAAU;GAAE,GAAG;GAAM,iBAAiB;GAAO,OAAO;EAAK,EAAE;CACvE,GAAG,CAAC,CAAC;CAEL,MAAM,QAAQ,eACL;EACL,UAAU,WACR,UACE,GAAG,QAAQ,YACX;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,MAAM;EAC7B,CACF;EACF,QAAQ,OAAO,WAIT;GACJ,MAAM,SAAS,MAAM,UACnB,GAAG,QAAQ,SACX;IACE,QAAQ;IACR,MAAM,KAAK,UAAU,MAAM;GAC7B,CACF;GACA,IAAI,OAAO,IACT,SAAS;IAAE,iBAAiB;IAAM,WAAW;IAAO,OAAO;GAAK,CAAC;GACnE,OAAO;EACT;CACF,IACA,CAAC,OAAO,CACV;CAEA,MAAM,SAAS,YAAY,YAAY;EACrC,MAAM,SAAS,MAAM,UAA+B,GAAG,QAAQ,UAAU,EACvE,QAAQ,OACV,CAAC;EACD,IAAI,OAAO,IACT,SAAS;GAAE,iBAAiB;GAAO,WAAW;GAAO,OAAO;EAAK,CAAC;EACpE,OAAO;CACT,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,QAAQ,eACL;EACL,GAAG;EACH;EACA;EACA;EACA,UAAU;CACZ,IACA;EAAC;EAAO;EAAO;EAAQ;EAAkB;CAAO,CAClD;CAEA,OAAO,oBAAC,YAAY,UAAb;EAA6B;EAAQ;CAA+B,CAAA;AAC7E;;AC5MA,MAAa,gBAAgB;CAC3B,MAAM,EAAE,iBAAiB,WAAW,OAAO,OAAO,WAAW,eAAe;CAC5E,OAAO;EAAE;EAAiB;EAAW;EAAO;EAAO;CAAO;AAC5D;;ACOA,MAAa,eAAkB,SAAoC;CACjE,MAAM,EAAE,UAAU,oBAAoB,eAAe;CAErD,MAAM,CAAC,MAAM,WAAW,SAAmB,IAAI;CAC/C,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,CAAC,OAAO,YAAY,SAA0B,IAAI;CACxD,MAAM,gBAAgB,OAA+B,IAAI;CAEzD,MAAM,YAAY,YAChB,OAAO,WAAyB;EAC9B,aAAa,IAAI;EACjB,SAAS,IAAI;EAEb,IAAI;GACF,MAAM,SAAS,MAAM,UAAa,GAAG,WAAW,QAAQ,EAAE,OAAO,CAAC;GAClE,IAAI,QAAQ,SAAS;GAErB,IAAI,OAAO,IAAI;IACb,QAAQ,OAAO,IAAI;IACnB,SAAS,IAAI;GACf,OAAO;IACL,QAAQ,IAAI;IACZ,SAAS,OAAO,KAAK;GACvB;EACF,UAAU;GACR,IAAI,CAAC,QAAQ,SAAS,aAAa,KAAK;EAC1C;CACF,GACA,CAAC,UAAU,IAAI,CACjB;CAEA,gBAAgB;EACd,IAAI,CAAC,iBAAiB;GACpB,QAAQ,IAAI;GACZ,aAAa,KAAK;GAClB,SAAS,IAAI;GACb;EACF;EAEA,cAAc,SAAS,MAAM;EAC7B,MAAM,aAAa,IAAI,gBAAgB;EACvC,cAAc,UAAU;EACxB,UAAU,WAAW,MAAM;EAC3B,aAAa,WAAW,MAAM;CAChC,GAAG,CAAC,iBAAiB,SAAS,CAAC;CAS/B,OAAO;EAAE;EAAM;EAAW;EAAO,SAPjB,kBAAkB;GAChC,cAAc,SAAS,MAAM;GAC7B,MAAM,aAAa,IAAI,gBAAgB;GACvC,cAAc,UAAU;GACxB,UAAU,WAAW,MAAM;EAC7B,GAAG,CAAC,SAAS,CAE0B;CAAE;AAC3C;;AC/DA,MAAa,gBAAgB;CAC3B,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,YAAqB,KAAK;CAC1D,OAAO;EAAE;EAAM,GAAG;CAAK;AACzB;;ACAA,MAAa,oBAAoB;CAC/B,MAAM,EAAE,aAAa,eAAe;CACpC,MAAM,EACJ,MAAM,UACN,SACA,GAAG,SACD,YAA0B,WAAW;CAEzC,MAAM,eAAe,YACnB,OAAO,cAA4D;EACjE,MAAM,SAAS,MAAM,UACnB,GAAG,SAAS,YAAY,aACxB,EACE,QAAQ,SACV,CACF;EACA,IAAI,OAAO,IAAI,QAAQ;EACvB,OAAO;CACT,GACA,CAAC,UAAU,OAAO,CACpB;CAEA,MAAM,gBAAgB,YAAY,YAE7B;EACH,MAAM,SAAS,MAAM,UACnB,GAAG,SAAS,YACZ,EACE,QAAQ,SACV,CACF;EACA,IAAI,OAAO,IAAI,QAAQ;EACvB,OAAO;CACT,GAAG,CAAC,UAAU,OAAO,CAAC;CAEtB,OAAO;EAAE;EAAU,GAAG;EAAM;EAAS;EAAc;CAAc;AACnE;;ACvCA,MAAa,oBAAoB;CAC/B,MAAM,EAAE,MAAM,UAAU,GAAG,SAAS,YAA0B,WAAW;CACzE,OAAO;EAAE;EAAU,GAAG;CAAK;AAC7B"}
@@ -0,0 +1,14 @@
1
+ // src/refresh-dedup.ts
2
+ const pendingRefreshes = /* @__PURE__ */ new Map();
3
+ function deduplicateRefresh(refreshToken, refreshFn) {
4
+ const existing = pendingRefreshes.get(refreshToken);
5
+ if (existing) return existing;
6
+ const promise = refreshFn().finally(() => {
7
+ pendingRefreshes.delete(refreshToken);
8
+ });
9
+ pendingRefreshes.set(refreshToken, promise);
10
+ return promise;
11
+ }
12
+ export { deduplicateRefresh as t };
13
+
14
+ //# sourceMappingURL=refresh-dedup-CKaHHe7m.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-dedup-CKaHHe7m.js","names":[],"sources":["../src/refresh-dedup.ts"],"sourcesContent":["import type { Result, TokenPair } from './types'\n\ntype RefreshResult = Result<{ user: { id: string }; tokens?: TokenPair }>\n\nconst pendingRefreshes = new Map<string, Promise<RefreshResult>>()\n\nexport function deduplicateRefresh(\n refreshToken: string,\n refreshFn: () => Promise<RefreshResult>,\n): Promise<RefreshResult> {\n const existing = pendingRefreshes.get(refreshToken)\n if (existing) return existing\n\n const promise = refreshFn().finally(() => {\n pendingRefreshes.delete(refreshToken)\n })\n pendingRefreshes.set(refreshToken, promise)\n return promise\n}\n"],"mappings":";AAIA,MAAM,mCAAmB,IAAI,IAAoC;AAEjE,SAAgB,mBACd,cACA,WACwB;CACxB,MAAM,WAAW,iBAAiB,IAAI,YAAY;CAClD,IAAI,UAAU,OAAO;CAErB,MAAM,UAAU,UAAU,CAAC,CAAC,cAAc;EACxC,iBAAiB,OAAO,YAAY;CACtC,CAAC;CACD,iBAAiB,IAAI,cAAc,OAAO;CAC1C,OAAO;AACT"}
@@ -0,0 +1,19 @@
1
+ // src/refresh-dedup.ts
2
+ const pendingRefreshes = /* @__PURE__ */ new Map();
3
+ function deduplicateRefresh(refreshToken, refreshFn) {
4
+ const existing = pendingRefreshes.get(refreshToken);
5
+ if (existing) return existing;
6
+ const promise = refreshFn().finally(() => {
7
+ pendingRefreshes.delete(refreshToken);
8
+ });
9
+ pendingRefreshes.set(refreshToken, promise);
10
+ return promise;
11
+ }
12
+ Object.defineProperty(exports, "deduplicateRefresh", {
13
+ enumerable: true,
14
+ get: function() {
15
+ return deduplicateRefresh;
16
+ }
17
+ });
18
+
19
+ //# sourceMappingURL=refresh-dedup-CLdACQXR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-dedup-CLdACQXR.cjs","names":[],"sources":["../src/refresh-dedup.ts"],"sourcesContent":["import type { Result, TokenPair } from './types'\n\ntype RefreshResult = Result<{ user: { id: string }; tokens?: TokenPair }>\n\nconst pendingRefreshes = new Map<string, Promise<RefreshResult>>()\n\nexport function deduplicateRefresh(\n refreshToken: string,\n refreshFn: () => Promise<RefreshResult>,\n): Promise<RefreshResult> {\n const existing = pendingRefreshes.get(refreshToken)\n if (existing) return existing\n\n const promise = refreshFn().finally(() => {\n pendingRefreshes.delete(refreshToken)\n })\n pendingRefreshes.set(refreshToken, promise)\n return promise\n}\n"],"mappings":";AAIA,MAAM,mCAAmB,IAAI,IAAoC;AAEjE,SAAgB,mBACd,cACA,WACwB;CACxB,MAAM,WAAW,iBAAiB,IAAI,YAAY;CAClD,IAAI,UAAU,OAAO;CAErB,MAAM,UAAU,UAAU,CAAC,CAAC,cAAc;EACxC,iBAAiB,OAAO,YAAY;CACtC,CAAC;CACD,iBAAiB,IAAI,cAAc,OAAO;CAC1C,OAAO;AACT"}
@@ -0,0 +1,27 @@
1
+ // \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ Object.defineProperty(exports, "__toESM", {
23
+ enumerable: true,
24
+ get: function() {
25
+ return __toESM;
26
+ }
27
+ });