@insforge/sdk 1.4.0 → 1.4.1

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.
@@ -0,0 +1,67 @@
1
+ import { I as InsForgeConfig, d as InsForgeError } from './types-NjykhyRq.mjs';
2
+
3
+ declare const DEFAULT_ACCESS_TOKEN_COOKIE = "insforge_access_token";
4
+ declare const DEFAULT_REFRESH_TOKEN_COOKIE = "insforge_refresh_token";
5
+ interface AuthCookieNames {
6
+ accessToken?: string;
7
+ refreshToken?: string;
8
+ }
9
+ interface CookieOptions {
10
+ domain?: string;
11
+ path?: string;
12
+ expires?: Date;
13
+ maxAge?: number;
14
+ httpOnly?: boolean;
15
+ secure?: boolean;
16
+ sameSite?: 'lax' | 'strict' | 'none';
17
+ }
18
+ interface AuthCookieOptions {
19
+ accessToken?: CookieOptions;
20
+ refreshToken?: CookieOptions;
21
+ }
22
+ type CookieStoreValue = string | {
23
+ value?: string | null;
24
+ } | undefined | null;
25
+ interface CookieReader {
26
+ get(name: string): CookieStoreValue;
27
+ }
28
+ interface CookieWriter {
29
+ set?(name: string, value: string, options?: CookieOptions): unknown;
30
+ set?(options: {
31
+ name: string;
32
+ value: string;
33
+ } & CookieOptions): unknown;
34
+ delete?(name: string): unknown;
35
+ delete?(options: {
36
+ name: string;
37
+ } & CookieOptions): unknown;
38
+ }
39
+ interface CookieStore extends CookieReader, CookieWriter {
40
+ }
41
+ interface AuthCookieSettings {
42
+ names?: AuthCookieNames;
43
+ options?: AuthCookieOptions;
44
+ }
45
+ declare function getAccessTokenCookieName(names?: AuthCookieNames): string;
46
+ declare function getRefreshTokenCookieName(names?: AuthCookieNames): string;
47
+ declare function accessTokenCookieOptions(token: string, overrides?: CookieOptions): CookieOptions;
48
+ declare function refreshTokenCookieOptions(token: string, overrides?: CookieOptions): CookieOptions;
49
+ declare function setAuthCookies(cookies: CookieWriter | undefined, tokens: {
50
+ accessToken: string;
51
+ refreshToken?: string | null;
52
+ }, settings?: AuthCookieSettings): void;
53
+ declare function clearAuthCookies(cookies: CookieWriter | undefined, settings?: AuthCookieSettings): void;
54
+
55
+ interface UpdateSessionOptions extends Omit<InsForgeConfig, 'accessToken' | 'edgeFunctionToken' | 'isServerMode' | 'auth'>, AuthCookieSettings {
56
+ requestCookies: CookieStore;
57
+ responseCookies: CookieStore;
58
+ refreshLeewaySeconds?: number;
59
+ }
60
+ interface UpdateSessionResult {
61
+ refreshed: boolean;
62
+ accessToken: string | null;
63
+ error: InsForgeError | null;
64
+ }
65
+ declare function updateSession(options: UpdateSessionOptions): Promise<UpdateSessionResult>;
66
+
67
+ export { type AuthCookieSettings as A, type CookieStore as C, DEFAULT_ACCESS_TOKEN_COOKIE as D, type UpdateSessionOptions as U, type UpdateSessionResult as a, DEFAULT_REFRESH_TOKEN_COOKIE as b, accessTokenCookieOptions as c, clearAuthCookies as d, getRefreshTokenCookieName as e, type AuthCookieNames as f, getAccessTokenCookieName as g, type AuthCookieOptions as h, type CookieOptions as i, type CookieReader as j, type CookieWriter as k, refreshTokenCookieOptions as r, setAuthCookies as s, updateSession as u };
@@ -0,0 +1,67 @@
1
+ import { I as InsForgeConfig, d as InsForgeError } from './types-NjykhyRq.js';
2
+
3
+ declare const DEFAULT_ACCESS_TOKEN_COOKIE = "insforge_access_token";
4
+ declare const DEFAULT_REFRESH_TOKEN_COOKIE = "insforge_refresh_token";
5
+ interface AuthCookieNames {
6
+ accessToken?: string;
7
+ refreshToken?: string;
8
+ }
9
+ interface CookieOptions {
10
+ domain?: string;
11
+ path?: string;
12
+ expires?: Date;
13
+ maxAge?: number;
14
+ httpOnly?: boolean;
15
+ secure?: boolean;
16
+ sameSite?: 'lax' | 'strict' | 'none';
17
+ }
18
+ interface AuthCookieOptions {
19
+ accessToken?: CookieOptions;
20
+ refreshToken?: CookieOptions;
21
+ }
22
+ type CookieStoreValue = string | {
23
+ value?: string | null;
24
+ } | undefined | null;
25
+ interface CookieReader {
26
+ get(name: string): CookieStoreValue;
27
+ }
28
+ interface CookieWriter {
29
+ set?(name: string, value: string, options?: CookieOptions): unknown;
30
+ set?(options: {
31
+ name: string;
32
+ value: string;
33
+ } & CookieOptions): unknown;
34
+ delete?(name: string): unknown;
35
+ delete?(options: {
36
+ name: string;
37
+ } & CookieOptions): unknown;
38
+ }
39
+ interface CookieStore extends CookieReader, CookieWriter {
40
+ }
41
+ interface AuthCookieSettings {
42
+ names?: AuthCookieNames;
43
+ options?: AuthCookieOptions;
44
+ }
45
+ declare function getAccessTokenCookieName(names?: AuthCookieNames): string;
46
+ declare function getRefreshTokenCookieName(names?: AuthCookieNames): string;
47
+ declare function accessTokenCookieOptions(token: string, overrides?: CookieOptions): CookieOptions;
48
+ declare function refreshTokenCookieOptions(token: string, overrides?: CookieOptions): CookieOptions;
49
+ declare function setAuthCookies(cookies: CookieWriter | undefined, tokens: {
50
+ accessToken: string;
51
+ refreshToken?: string | null;
52
+ }, settings?: AuthCookieSettings): void;
53
+ declare function clearAuthCookies(cookies: CookieWriter | undefined, settings?: AuthCookieSettings): void;
54
+
55
+ interface UpdateSessionOptions extends Omit<InsForgeConfig, 'accessToken' | 'edgeFunctionToken' | 'isServerMode' | 'auth'>, AuthCookieSettings {
56
+ requestCookies: CookieStore;
57
+ responseCookies: CookieStore;
58
+ refreshLeewaySeconds?: number;
59
+ }
60
+ interface UpdateSessionResult {
61
+ refreshed: boolean;
62
+ accessToken: string | null;
63
+ error: InsForgeError | null;
64
+ }
65
+ declare function updateSession(options: UpdateSessionOptions): Promise<UpdateSessionResult>;
66
+
67
+ export { type AuthCookieSettings as A, type CookieStore as C, DEFAULT_ACCESS_TOKEN_COOKIE as D, type UpdateSessionOptions as U, type UpdateSessionResult as a, DEFAULT_REFRESH_TOKEN_COOKIE as b, accessTokenCookieOptions as c, clearAuthCookies as d, getRefreshTokenCookieName as e, type AuthCookieNames as f, getAccessTokenCookieName as g, type AuthCookieOptions as h, type CookieOptions as i, type CookieReader as j, type CookieWriter as k, refreshTokenCookieOptions as r, setAuthCookies as s, updateSession as u };
@@ -0,0 +1,3 @@
1
+ export { f as AuthCookieNames, h as AuthCookieOptions, A as AuthCookieSettings, i as CookieOptions, j as CookieReader, C as CookieStore, k as CookieWriter, D as DEFAULT_ACCESS_TOKEN_COOKIE, b as DEFAULT_REFRESH_TOKEN_COOKIE, U as UpdateSessionOptions, a as UpdateSessionResult, d as clearAuthCookies, g as getAccessTokenCookieName, e as getRefreshTokenCookieName, s as setAuthCookies, u as updateSession } from '../middleware-BxJ0PzUT.mjs';
2
+ import '../types-NjykhyRq.mjs';
3
+ import '@insforge/shared-schemas';
@@ -0,0 +1,3 @@
1
+ export { f as AuthCookieNames, h as AuthCookieOptions, A as AuthCookieSettings, i as CookieOptions, j as CookieReader, C as CookieStore, k as CookieWriter, D as DEFAULT_ACCESS_TOKEN_COOKIE, b as DEFAULT_REFRESH_TOKEN_COOKIE, U as UpdateSessionOptions, a as UpdateSessionResult, d as clearAuthCookies, g as getAccessTokenCookieName, e as getRefreshTokenCookieName, s as setAuthCookies, u as updateSession } from '../middleware-DLZiheYP.js';
2
+ import '../types-NjykhyRq.js';
3
+ import '@insforge/shared-schemas';
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ssr/middleware.ts
21
+ var middleware_exports = {};
22
+ __export(middleware_exports, {
23
+ DEFAULT_ACCESS_TOKEN_COOKIE: () => DEFAULT_ACCESS_TOKEN_COOKIE,
24
+ DEFAULT_REFRESH_TOKEN_COOKIE: () => DEFAULT_REFRESH_TOKEN_COOKIE,
25
+ clearAuthCookies: () => clearAuthCookies,
26
+ getAccessTokenCookieName: () => getAccessTokenCookieName,
27
+ getRefreshTokenCookieName: () => getRefreshTokenCookieName,
28
+ setAuthCookies: () => setAuthCookies,
29
+ updateSession: () => updateSession
30
+ });
31
+ module.exports = __toCommonJS(middleware_exports);
32
+
33
+ // src/lib/jwt.ts
34
+ function decodeBase64Url(input) {
35
+ const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
36
+ const padded = normalized.padEnd(
37
+ normalized.length + (4 - normalized.length % 4) % 4,
38
+ "="
39
+ );
40
+ const binary = atob(padded);
41
+ const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
42
+ return new TextDecoder().decode(bytes);
43
+ }
44
+ function getJwtExpiration(token) {
45
+ if (!token) return null;
46
+ const [, payload] = token.split(".");
47
+ if (!payload) return null;
48
+ try {
49
+ const parsed = JSON.parse(decodeBase64Url(payload));
50
+ if (typeof parsed.exp !== "number" || !Number.isFinite(parsed.exp)) {
51
+ return null;
52
+ }
53
+ return new Date(parsed.exp * 1e3);
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+ function isJwtExpiredOrExpiring(token, leewaySeconds = 60) {
59
+ if (!token) return false;
60
+ const expires = getJwtExpiration(token);
61
+ if (!expires) return true;
62
+ return expires.getTime() <= Date.now() + leewaySeconds * 1e3;
63
+ }
64
+
65
+ // src/ssr/cookies.ts
66
+ var DEFAULT_ACCESS_TOKEN_COOKIE = "insforge_access_token";
67
+ var DEFAULT_REFRESH_TOKEN_COOKIE = "insforge_refresh_token";
68
+ var EXPIRED_DATE = /* @__PURE__ */ new Date(0);
69
+ function getAccessTokenCookieName(names) {
70
+ return names?.accessToken ?? DEFAULT_ACCESS_TOKEN_COOKIE;
71
+ }
72
+ function getRefreshTokenCookieName(names) {
73
+ return names?.refreshToken ?? DEFAULT_REFRESH_TOKEN_COOKIE;
74
+ }
75
+ function getCookieValue(cookies, name) {
76
+ if (!cookies) return null;
77
+ const value = cookies.get(name);
78
+ if (typeof value === "string") return value || null;
79
+ if (value && typeof value.value === "string") return value.value || null;
80
+ return null;
81
+ }
82
+ function getCookieValueFromHeader(cookieHeader, name) {
83
+ if (!cookieHeader) return null;
84
+ const parts = cookieHeader.split(";");
85
+ for (const part of parts) {
86
+ const [rawName, ...rawValue] = part.trim().split("=");
87
+ if (rawName !== name) continue;
88
+ try {
89
+ return decodeURIComponent(rawValue.join("="));
90
+ } catch {
91
+ return rawValue.join("=");
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ function defaultCookieOptions() {
97
+ const secure = typeof process !== "undefined" ? process.env.NODE_ENV === "production" : typeof location !== "undefined" && location.protocol === "https:";
98
+ return {
99
+ path: "/",
100
+ sameSite: "lax",
101
+ secure
102
+ };
103
+ }
104
+ function accessTokenCookieOptions(token, overrides) {
105
+ return {
106
+ ...defaultCookieOptions(),
107
+ httpOnly: false,
108
+ expires: getJwtExpiration(token) ?? void 0,
109
+ ...overrides
110
+ };
111
+ }
112
+ function refreshTokenCookieOptions(token, overrides) {
113
+ return {
114
+ ...defaultCookieOptions(),
115
+ httpOnly: true,
116
+ expires: getJwtExpiration(token) ?? void 0,
117
+ ...overrides
118
+ };
119
+ }
120
+ function expiredCookieOptions(overrides) {
121
+ const { expires: _expires, maxAge: _maxAge, ...safeOverrides } = overrides ?? {};
122
+ return {
123
+ ...defaultCookieOptions(),
124
+ ...safeOverrides,
125
+ expires: EXPIRED_DATE,
126
+ maxAge: 0
127
+ };
128
+ }
129
+ function setCookie(cookies, name, value, options) {
130
+ if (!cookies?.set) return;
131
+ cookies.set(name, value, options);
132
+ }
133
+ function deleteCookie(cookies, name, options) {
134
+ if (!cookies) return;
135
+ if (cookies.set) {
136
+ cookies.set(name, "", expiredCookieOptions(options));
137
+ return;
138
+ }
139
+ cookies.delete?.(name);
140
+ }
141
+ function serializeCookie(name, value, options = {}) {
142
+ const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
143
+ if (options.maxAge !== void 0) parts.push(`Max-Age=${options.maxAge}`);
144
+ if (options.domain) parts.push(`Domain=${options.domain}`);
145
+ if (options.path) parts.push(`Path=${options.path}`);
146
+ if (options.expires) parts.push(`Expires=${options.expires.toUTCString()}`);
147
+ if (options.httpOnly) parts.push("HttpOnly");
148
+ if (options.secure) parts.push("Secure");
149
+ if (options.sameSite) {
150
+ const sameSite = options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1);
151
+ parts.push(`SameSite=${sameSite}`);
152
+ }
153
+ return parts.join("; ");
154
+ }
155
+ function appendSetCookie(headers, name, value, options) {
156
+ headers.append("Set-Cookie", serializeCookie(name, value, options));
157
+ }
158
+ function setAuthCookies(cookies, tokens, settings = {}) {
159
+ const accessName = getAccessTokenCookieName(settings.names);
160
+ const refreshName = getRefreshTokenCookieName(settings.names);
161
+ const accessOptions = accessTokenCookieOptions(
162
+ tokens.accessToken,
163
+ settings.options?.accessToken
164
+ );
165
+ setCookie(cookies, accessName, tokens.accessToken, accessOptions);
166
+ if (tokens.refreshToken) {
167
+ setCookie(
168
+ cookies,
169
+ refreshName,
170
+ tokens.refreshToken,
171
+ refreshTokenCookieOptions(
172
+ tokens.refreshToken,
173
+ settings.options?.refreshToken
174
+ )
175
+ );
176
+ }
177
+ }
178
+ function clearAuthCookies(cookies, settings = {}) {
179
+ const accessName = getAccessTokenCookieName(settings.names);
180
+ const refreshName = getRefreshTokenCookieName(settings.names);
181
+ const accessOptions = expiredCookieOptions(settings.options?.accessToken);
182
+ const refreshOptions = expiredCookieOptions(settings.options?.refreshToken);
183
+ deleteCookie(cookies, accessName, accessOptions);
184
+ deleteCookie(cookies, refreshName, refreshOptions);
185
+ }
186
+ function setAuthCookieHeaders(headers, tokens, settings = {}) {
187
+ const accessName = getAccessTokenCookieName(settings.names);
188
+ const refreshName = getRefreshTokenCookieName(settings.names);
189
+ appendSetCookie(
190
+ headers,
191
+ accessName,
192
+ tokens.accessToken,
193
+ accessTokenCookieOptions(tokens.accessToken, settings.options?.accessToken)
194
+ );
195
+ if (tokens.refreshToken) {
196
+ appendSetCookie(
197
+ headers,
198
+ refreshName,
199
+ tokens.refreshToken,
200
+ refreshTokenCookieOptions(
201
+ tokens.refreshToken,
202
+ settings.options?.refreshToken
203
+ )
204
+ );
205
+ }
206
+ }
207
+ function clearAuthCookieHeaders(headers, settings = {}) {
208
+ appendSetCookie(
209
+ headers,
210
+ getAccessTokenCookieName(settings.names),
211
+ "",
212
+ expiredCookieOptions(settings.options?.accessToken)
213
+ );
214
+ appendSetCookie(
215
+ headers,
216
+ getRefreshTokenCookieName(settings.names),
217
+ "",
218
+ expiredCookieOptions(settings.options?.refreshToken)
219
+ );
220
+ }
221
+
222
+ // src/types.ts
223
+ var InsForgeError = class _InsForgeError extends Error {
224
+ constructor(message, statusCode, error, nextActions) {
225
+ super(message);
226
+ this.name = "InsForgeError";
227
+ this.statusCode = statusCode;
228
+ this.error = error;
229
+ this.nextActions = nextActions;
230
+ }
231
+ static fromApiError(apiError) {
232
+ return new _InsForgeError(
233
+ apiError.message,
234
+ apiError.statusCode,
235
+ apiError.error,
236
+ apiError.nextActions
237
+ );
238
+ }
239
+ };
240
+
241
+ // src/ssr/refresh.ts
242
+ var import_shared_schemas = require("@insforge/shared-schemas");
243
+ function jsonResponse(body, init = {}, headers = new Headers(init.headers)) {
244
+ headers.set("Content-Type", "application/json");
245
+ return new Response(JSON.stringify(body), {
246
+ ...init,
247
+ headers
248
+ });
249
+ }
250
+ function normalizeError(error) {
251
+ if (error instanceof InsForgeError) return error;
252
+ if (error && typeof error === "object") {
253
+ const body = error;
254
+ return new InsForgeError(
255
+ typeof body.message === "string" ? body.message : "Failed to refresh auth session",
256
+ typeof body.statusCode === "number" ? body.statusCode : 500,
257
+ typeof body.error === "string" ? body.error : import_shared_schemas.ERROR_CODES.UNKNOWN_ERROR
258
+ );
259
+ }
260
+ return new InsForgeError(
261
+ error instanceof Error ? error.message : "Failed to refresh auth session",
262
+ 500,
263
+ import_shared_schemas.ERROR_CODES.UNKNOWN_ERROR
264
+ );
265
+ }
266
+ async function readJson(response) {
267
+ const contentType = response.headers.get("content-type");
268
+ if (!contentType?.includes("json")) return null;
269
+ return response.json();
270
+ }
271
+ function readRefreshToken(options) {
272
+ if (options.refreshToken) return options.refreshToken;
273
+ const refreshCookieName = getRefreshTokenCookieName(options.names);
274
+ const cookieValue = getCookieValue(options.cookies, refreshCookieName);
275
+ if (cookieValue) return cookieValue;
276
+ return getCookieValueFromHeader(
277
+ options.request?.headers.get("cookie"),
278
+ refreshCookieName
279
+ );
280
+ }
281
+ async function refreshAuth(options = {}) {
282
+ const headers = new Headers();
283
+ const refreshToken = readRefreshToken(options);
284
+ if (!refreshToken) {
285
+ clearAuthCookieHeaders(headers, options);
286
+ const error2 = new InsForgeError(
287
+ "Refresh token cookie is missing",
288
+ 401,
289
+ import_shared_schemas.ERROR_CODES.AUTH_UNAUTHORIZED
290
+ );
291
+ return {
292
+ response: jsonResponse(
293
+ {
294
+ error: error2.error,
295
+ message: error2.message,
296
+ statusCode: error2.statusCode
297
+ },
298
+ { status: error2.statusCode },
299
+ headers
300
+ ),
301
+ data: null,
302
+ accessToken: null,
303
+ refreshToken: null,
304
+ error: error2
305
+ };
306
+ }
307
+ let { baseUrl, anonKey } = options;
308
+ try {
309
+ baseUrl || (baseUrl = process.env.NEXT_PUBLIC_INSFORGE_URL);
310
+ anonKey || (anonKey = process.env.NEXT_PUBLIC_INSFORGE_ANON_KEY);
311
+ } catch {
312
+ }
313
+ if (!baseUrl || !anonKey) {
314
+ throw new Error(
315
+ "Missing InsForge baseUrl or anonKey. Pass baseUrl and anonKey to refreshAuth() or set NEXT_PUBLIC_INSFORGE_URL and NEXT_PUBLIC_INSFORGE_ANON_KEY."
316
+ );
317
+ }
318
+ const fetchImpl = options.fetch ?? (globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
319
+ if (!fetchImpl) {
320
+ throw new Error(
321
+ "Fetch is not available. Please provide a fetch implementation."
322
+ );
323
+ }
324
+ const requestHeaders = new Headers(options.headers);
325
+ requestHeaders.set("Authorization", `Bearer ${anonKey}`);
326
+ requestHeaders.set("Content-Type", "application/json");
327
+ requestHeaders.set("Accept", "application/json");
328
+ let data = null;
329
+ let error = null;
330
+ try {
331
+ const response = await fetchImpl(
332
+ new URL("/api/auth/refresh?client_type=mobile", baseUrl).toString(),
333
+ {
334
+ method: "POST",
335
+ headers: requestHeaders,
336
+ body: JSON.stringify({ refresh_token: refreshToken })
337
+ }
338
+ );
339
+ const body = await readJson(response);
340
+ if (!response.ok) {
341
+ error = normalizeError(
342
+ body ?? {
343
+ message: "Failed to refresh auth session",
344
+ statusCode: response.status,
345
+ error: import_shared_schemas.ERROR_CODES.UNKNOWN_ERROR
346
+ }
347
+ );
348
+ } else {
349
+ data = body;
350
+ }
351
+ } catch (caught) {
352
+ error = normalizeError(caught);
353
+ }
354
+ if (error || !data?.accessToken) {
355
+ clearAuthCookieHeaders(headers, options);
356
+ const normalized = normalizeError(error);
357
+ return {
358
+ response: jsonResponse(
359
+ {
360
+ error: normalized.error,
361
+ message: normalized.message,
362
+ statusCode: normalized.statusCode
363
+ },
364
+ { status: normalized.statusCode || 500 },
365
+ headers
366
+ ),
367
+ data: null,
368
+ accessToken: null,
369
+ refreshToken: null,
370
+ error: normalized
371
+ };
372
+ }
373
+ const nextRefreshToken = data.refreshToken ?? refreshToken;
374
+ setAuthCookieHeaders(
375
+ headers,
376
+ {
377
+ accessToken: data.accessToken,
378
+ refreshToken: nextRefreshToken
379
+ },
380
+ options
381
+ );
382
+ const responseBody = {
383
+ accessToken: data.accessToken,
384
+ user: data.user,
385
+ csrfToken: data.csrfToken
386
+ };
387
+ return {
388
+ response: jsonResponse(responseBody, { status: 200 }, headers),
389
+ data: responseBody,
390
+ accessToken: data.accessToken,
391
+ refreshToken: nextRefreshToken,
392
+ error: null
393
+ };
394
+ }
395
+
396
+ // src/ssr/update-session.ts
397
+ async function updateSession(options) {
398
+ const accessCookieName = getAccessTokenCookieName(options.names);
399
+ const refreshCookieName = getRefreshTokenCookieName(options.names);
400
+ const accessToken = getCookieValue(
401
+ options.requestCookies,
402
+ accessCookieName
403
+ );
404
+ if (accessToken && !isJwtExpiredOrExpiring(accessToken, options.refreshLeewaySeconds)) {
405
+ return {
406
+ refreshed: false,
407
+ accessToken,
408
+ error: null
409
+ };
410
+ }
411
+ const refreshToken = getCookieValue(
412
+ options.requestCookies,
413
+ refreshCookieName
414
+ );
415
+ if (!refreshToken) {
416
+ if (accessToken) {
417
+ clearAuthCookies(options.requestCookies, options);
418
+ clearAuthCookies(options.responseCookies, options);
419
+ }
420
+ return {
421
+ refreshed: false,
422
+ accessToken: null,
423
+ error: null
424
+ };
425
+ }
426
+ const result = await refreshAuth({
427
+ ...options,
428
+ refreshToken
429
+ });
430
+ if (result.error || !result.accessToken) {
431
+ clearAuthCookies(options.requestCookies, options);
432
+ clearAuthCookies(options.responseCookies, options);
433
+ return {
434
+ refreshed: false,
435
+ accessToken: null,
436
+ error: result.error
437
+ };
438
+ }
439
+ const tokens = {
440
+ accessToken: result.accessToken,
441
+ refreshToken: result.refreshToken ?? refreshToken
442
+ };
443
+ setAuthCookies(options.requestCookies, tokens, options);
444
+ setAuthCookies(options.responseCookies, tokens, options);
445
+ return {
446
+ refreshed: true,
447
+ accessToken: result.accessToken,
448
+ error: null
449
+ };
450
+ }
451
+ // Annotate the CommonJS export names for ESM import in node:
452
+ 0 && (module.exports = {
453
+ DEFAULT_ACCESS_TOKEN_COOKIE,
454
+ DEFAULT_REFRESH_TOKEN_COOKIE,
455
+ clearAuthCookies,
456
+ getAccessTokenCookieName,
457
+ getRefreshTokenCookieName,
458
+ setAuthCookies,
459
+ updateSession
460
+ });
461
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ssr/middleware.ts","../../src/lib/jwt.ts","../../src/ssr/cookies.ts","../../src/types.ts","../../src/ssr/refresh.ts","../../src/ssr/update-session.ts"],"sourcesContent":["export {\n updateSession,\n type UpdateSessionOptions,\n type UpdateSessionResult,\n} from './update-session';\nexport {\n DEFAULT_ACCESS_TOKEN_COOKIE,\n DEFAULT_REFRESH_TOKEN_COOKIE,\n clearAuthCookies,\n getAccessTokenCookieName,\n getRefreshTokenCookieName,\n setAuthCookies,\n type AuthCookieNames,\n type AuthCookieOptions,\n type AuthCookieSettings,\n type CookieOptions,\n type CookieReader,\n type CookieStore,\n type CookieWriter,\n} from './cookies';\n","function decodeBase64Url(input: string): string {\n const normalized = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n '=',\n );\n\n const binary = atob(padded);\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n}\n\nexport function getJwtExpiration(token: string | null | undefined): Date | null {\n if (!token) return null;\n\n const [, payload] = token.split('.');\n if (!payload) return null;\n\n try {\n const parsed = JSON.parse(decodeBase64Url(payload)) as { exp?: unknown };\n if (typeof parsed.exp !== 'number' || !Number.isFinite(parsed.exp)) {\n return null;\n }\n return new Date(parsed.exp * 1000);\n } catch {\n return null;\n }\n}\n\nexport function isJwtExpiredOrExpiring(\n token: string | null | undefined,\n leewaySeconds = 60,\n): boolean {\n if (!token) return false;\n const expires = getJwtExpiration(token);\n if (!expires) return true;\n\n return expires.getTime() <= Date.now() + leewaySeconds * 1000;\n}\n","import { getJwtExpiration } from '../lib/jwt';\n\nexport const DEFAULT_ACCESS_TOKEN_COOKIE = 'insforge_access_token';\nexport const DEFAULT_REFRESH_TOKEN_COOKIE = 'insforge_refresh_token';\n\nexport interface AuthCookieNames {\n accessToken?: string;\n refreshToken?: string;\n}\n\nexport interface CookieOptions {\n domain?: string;\n path?: string;\n expires?: Date;\n maxAge?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'lax' | 'strict' | 'none';\n}\n\nexport interface AuthCookieOptions {\n accessToken?: CookieOptions;\n refreshToken?: CookieOptions;\n}\n\nexport type CookieStoreValue =\n | string\n | { value?: string | null }\n | undefined\n | null;\n\nexport interface CookieReader {\n get(name: string): CookieStoreValue;\n}\n\nexport interface CookieWriter {\n set?(name: string, value: string, options?: CookieOptions): unknown;\n set?(options: { name: string; value: string } & CookieOptions): unknown;\n delete?(name: string): unknown;\n delete?(options: { name: string } & CookieOptions): unknown;\n}\n\nexport interface CookieStore extends CookieReader, CookieWriter {}\n\nexport interface AuthCookieSettings {\n names?: AuthCookieNames;\n options?: AuthCookieOptions;\n}\n\nconst EXPIRED_DATE = new Date(0);\n\nexport function getAccessTokenCookieName(names?: AuthCookieNames): string {\n return names?.accessToken ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n}\n\nexport function getRefreshTokenCookieName(names?: AuthCookieNames): string {\n return names?.refreshToken ?? DEFAULT_REFRESH_TOKEN_COOKIE;\n}\n\nexport function getCookieValue(\n cookies: CookieReader | undefined,\n name: string,\n): string | null {\n if (!cookies) return null;\n\n const value = cookies.get(name);\n if (typeof value === 'string') return value || null;\n if (value && typeof value.value === 'string') return value.value || null;\n return null;\n}\n\nexport function getCookieValueFromHeader(\n cookieHeader: string | null | undefined,\n name: string,\n): string | null {\n if (!cookieHeader) return null;\n\n const parts = cookieHeader.split(';');\n for (const part of parts) {\n const [rawName, ...rawValue] = part.trim().split('=');\n if (rawName !== name) continue;\n try {\n return decodeURIComponent(rawValue.join('='));\n } catch {\n return rawValue.join('=');\n }\n }\n return null;\n}\n\nexport function getBrowserCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n return getCookieValueFromHeader(document.cookie, name);\n}\n\nfunction defaultCookieOptions(): CookieOptions {\n const secure =\n typeof process !== 'undefined'\n ? process.env.NODE_ENV === 'production'\n : typeof location !== 'undefined' && location.protocol === 'https:';\n\n return {\n path: '/',\n sameSite: 'lax',\n secure,\n };\n}\n\nexport function accessTokenCookieOptions(\n token: string,\n overrides?: CookieOptions,\n): CookieOptions {\n return {\n ...defaultCookieOptions(),\n httpOnly: false,\n expires: getJwtExpiration(token) ?? undefined,\n ...overrides,\n };\n}\n\nexport function refreshTokenCookieOptions(\n token: string,\n overrides?: CookieOptions,\n): CookieOptions {\n return {\n ...defaultCookieOptions(),\n httpOnly: true,\n expires: getJwtExpiration(token) ?? undefined,\n ...overrides,\n };\n}\n\nexport function expiredCookieOptions(overrides?: CookieOptions): CookieOptions {\n const { expires: _expires, maxAge: _maxAge, ...safeOverrides } = overrides ?? {};\n return {\n ...defaultCookieOptions(),\n ...safeOverrides,\n expires: EXPIRED_DATE,\n maxAge: 0,\n };\n}\n\nexport function setCookie(\n cookies: CookieWriter | undefined,\n name: string,\n value: string,\n options?: CookieOptions,\n): void {\n if (!cookies?.set) return;\n cookies.set(name, value, options);\n}\n\nexport function deleteCookie(\n cookies: CookieWriter | undefined,\n name: string,\n options?: CookieOptions,\n): void {\n if (!cookies) return;\n if (cookies.set) {\n cookies.set(name, '', expiredCookieOptions(options));\n return;\n }\n cookies.delete?.(name);\n}\n\nexport function serializeCookie(\n name: string,\n value: string,\n options: CookieOptions = {},\n): string {\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n\n if (options.maxAge !== undefined) parts.push(`Max-Age=${options.maxAge}`);\n if (options.domain) parts.push(`Domain=${options.domain}`);\n if (options.path) parts.push(`Path=${options.path}`);\n if (options.expires) parts.push(`Expires=${options.expires.toUTCString()}`);\n if (options.httpOnly) parts.push('HttpOnly');\n if (options.secure) parts.push('Secure');\n if (options.sameSite) {\n const sameSite =\n options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1);\n parts.push(`SameSite=${sameSite}`);\n }\n\n return parts.join('; ');\n}\n\nexport function appendSetCookie(\n headers: Headers,\n name: string,\n value: string,\n options?: CookieOptions,\n): void {\n headers.append('Set-Cookie', serializeCookie(name, value, options));\n}\n\nexport function setAuthCookies(\n cookies: CookieWriter | undefined,\n tokens: {\n accessToken: string;\n refreshToken?: string | null;\n },\n settings: AuthCookieSettings = {},\n): void {\n const accessName = getAccessTokenCookieName(settings.names);\n const refreshName = getRefreshTokenCookieName(settings.names);\n const accessOptions = accessTokenCookieOptions(\n tokens.accessToken,\n settings.options?.accessToken,\n );\n\n setCookie(cookies, accessName, tokens.accessToken, accessOptions);\n if (tokens.refreshToken) {\n setCookie(\n cookies,\n refreshName,\n tokens.refreshToken,\n refreshTokenCookieOptions(\n tokens.refreshToken,\n settings.options?.refreshToken,\n ),\n );\n }\n}\n\nexport function clearAuthCookies(\n cookies: CookieWriter | undefined,\n settings: AuthCookieSettings = {},\n): void {\n const accessName = getAccessTokenCookieName(settings.names);\n const refreshName = getRefreshTokenCookieName(settings.names);\n const accessOptions = expiredCookieOptions(settings.options?.accessToken);\n const refreshOptions = expiredCookieOptions(settings.options?.refreshToken);\n\n deleteCookie(cookies, accessName, accessOptions);\n deleteCookie(cookies, refreshName, refreshOptions);\n}\n\nexport function setAuthCookieHeaders(\n headers: Headers,\n tokens: {\n accessToken: string;\n refreshToken?: string | null;\n },\n settings: AuthCookieSettings = {},\n): void {\n const accessName = getAccessTokenCookieName(settings.names);\n const refreshName = getRefreshTokenCookieName(settings.names);\n\n appendSetCookie(\n headers,\n accessName,\n tokens.accessToken,\n accessTokenCookieOptions(tokens.accessToken, settings.options?.accessToken),\n );\n if (tokens.refreshToken) {\n appendSetCookie(\n headers,\n refreshName,\n tokens.refreshToken,\n refreshTokenCookieOptions(\n tokens.refreshToken,\n settings.options?.refreshToken,\n ),\n );\n }\n}\n\nexport function clearAuthCookieHeaders(\n headers: Headers,\n settings: AuthCookieSettings = {},\n): void {\n appendSetCookie(\n headers,\n getAccessTokenCookieName(settings.names),\n '',\n expiredCookieOptions(settings.options?.accessToken),\n );\n appendSetCookie(\n headers,\n getRefreshTokenCookieName(settings.names),\n '',\n expiredCookieOptions(settings.options?.refreshToken),\n );\n}\n","/**\n * InsForge SDK Types - only SDK-specific types here\n * Use @insforge/shared-schemas directly for API types\n */\n\nimport type { ErrorCode, UserSchema } from '@insforge/shared-schemas';\n\nexport type InsForgeErrorCode = ErrorCode | (string & {});\n\nexport interface InsForgeConfig {\n /**\n * The base URL of the InsForge backend API\n * @default \"http://localhost:7130\"\n */\n baseUrl?: string;\n\n /**\n * Anonymous API key (optional)\n * Used for public/unauthenticated requests when no user token is set\n */\n anonKey?: string;\n\n /**\n * Static access token (optional)\n * Seeds the client with a fixed bearer token used for all authenticated\n * requests — e.g. a user JWT inside an edge function, or a server-signed\n * JWT from an external auth provider. Disables automatic token refresh\n * and implies server mode unless `isServerMode` is set explicitly.\n */\n accessToken?: string;\n\n /**\n * @deprecated Use `accessToken` instead. Same behavior; `accessToken`\n * takes precedence when both are provided.\n */\n edgeFunctionToken?: string;\n\n /**\n * Direct URL to Deno Subhosting functions (optional)\n * When provided, SDK will try this URL first for function invocations.\n * Falls back to proxy URL if subhosting returns 404.\n * @example \"https://{appKey}.functions.insforge.app\"\n */\n functionsUrl?: string;\n\n /**\n * Custom fetch implementation (useful for Node.js environments)\n */\n fetch?: typeof fetch;\n\n /**\n * Enable server-side auth mode (SSR/Node runtime)\n * In this mode auth endpoints use `client_type=mobile` and refresh_token body flow.\n *\n * @deprecated Use `createServerClient()`, `createBrowserClient()`, and\n * `updateSession()` from `@insforge/sdk/ssr` for SSR apps.\n * @default false\n */\n isServerMode?: boolean;\n\n /**\n * Custom headers to include with every request\n */\n headers?: Record<string, string>;\n\n /**\n * Enable debug logging for HTTP requests and responses.\n * When true, request/response details are logged to the console.\n * Can also be a custom log function for advanced use cases.\n * @default false\n */\n debug?: boolean | ((message: string, ...args: any[]) => void);\n\n /**\n * Request timeout in milliseconds.\n * Requests that exceed this duration will be aborted.\n * Set to 0 to disable timeout.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Maximum number of retry attempts for failed requests.\n * Retries are triggered on network errors and server errors (5xx).\n * Client errors (4xx) are never retried.\n * Set to 0 to disable retries.\n * @default 3\n */\n retryCount?: number;\n\n /**\n * Initial delay in milliseconds before the first retry.\n * The delay doubles with each subsequent attempt (exponential backoff)\n * with ±15% jitter to prevent thundering herd.\n * @default 500\n */\n retryDelay?: number;\n}\n\nexport type InsForgeAdminConfig = Omit<\n InsForgeConfig,\n 'anonKey' | 'accessToken' | 'edgeFunctionToken' | 'isServerMode'\n> & {\n /**\n * Project admin API key. Keep this server-side only.\n */\n apiKey: string;\n};\n\nexport interface AuthSession {\n user: UserSchema;\n accessToken: string;\n expiresAt?: Date;\n}\n\nexport interface AuthRefreshResponse {\n user: UserSchema;\n accessToken: string;\n csrfToken?: string;\n refreshToken?: string;\n}\n\nexport interface ApiError {\n error: InsForgeErrorCode;\n message: string;\n statusCode: number;\n nextActions?: string;\n}\n\nexport class InsForgeError extends Error {\n public statusCode: number;\n public error: InsForgeErrorCode;\n public nextActions?: string;\n\n constructor(\n message: string,\n statusCode: number,\n error: InsForgeErrorCode,\n nextActions?: string,\n ) {\n super(message);\n this.name = 'InsForgeError';\n this.statusCode = statusCode;\n this.error = error;\n this.nextActions = nextActions;\n }\n\n static fromApiError(apiError: ApiError): InsForgeError {\n return new InsForgeError(\n apiError.message,\n apiError.statusCode,\n apiError.error,\n apiError.nextActions,\n );\n }\n}\n","import {\n InsForgeError,\n type AuthRefreshResponse,\n type InsForgeConfig,\n} from '../types';\nimport { ERROR_CODES } from '@insforge/shared-schemas';\nimport {\n clearAuthCookieHeaders,\n getCookieValue,\n getCookieValueFromHeader,\n getRefreshTokenCookieName,\n setAuthCookieHeaders,\n type AuthCookieSettings,\n type CookieStore,\n} from './cookies';\n\nexport interface RefreshAuthOptions\n extends Omit<\n InsForgeConfig,\n 'accessToken' | 'edgeFunctionToken' | 'isServerMode' | 'auth'\n >,\n AuthCookieSettings {\n request?: Request;\n cookies?: Pick<CookieStore, 'get'>;\n refreshToken?: string;\n}\n\nexport interface RefreshAuthResult {\n response: Response;\n data: AuthRefreshResponse | null;\n accessToken: string | null;\n refreshToken: string | null;\n error: InsForgeError | null;\n}\n\nexport type RefreshAuthRouteHandler = (request: Request) => Promise<Response>;\n\nfunction jsonResponse(\n body: unknown,\n init: ResponseInit = {},\n headers = new Headers(init.headers),\n): Response {\n headers.set('Content-Type', 'application/json');\n return new Response(JSON.stringify(body), {\n ...init,\n headers,\n });\n}\n\nfunction normalizeError(error: unknown): InsForgeError {\n if (error instanceof InsForgeError) return error;\n\n if (error && typeof error === 'object') {\n const body = error as {\n error?: unknown;\n message?: unknown;\n statusCode?: unknown;\n };\n return new InsForgeError(\n typeof body.message === 'string'\n ? body.message\n : 'Failed to refresh auth session',\n typeof body.statusCode === 'number' ? body.statusCode : 500,\n typeof body.error === 'string'\n ? body.error\n : ERROR_CODES.UNKNOWN_ERROR,\n );\n }\n\n return new InsForgeError(\n error instanceof Error ? error.message : 'Failed to refresh auth session',\n 500,\n ERROR_CODES.UNKNOWN_ERROR,\n );\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('json')) return null;\n return response.json();\n}\n\nfunction readRefreshToken(options: RefreshAuthOptions): string | null {\n if (options.refreshToken) return options.refreshToken;\n\n const refreshCookieName = getRefreshTokenCookieName(options.names);\n const cookieValue = getCookieValue(options.cookies, refreshCookieName);\n if (cookieValue) return cookieValue;\n\n return getCookieValueFromHeader(\n options.request?.headers.get('cookie'),\n refreshCookieName,\n );\n}\n\nexport async function refreshAuth(\n options: RefreshAuthOptions = {},\n): Promise<RefreshAuthResult> {\n const headers = new Headers();\n const refreshToken = readRefreshToken(options);\n\n if (!refreshToken) {\n clearAuthCookieHeaders(headers, options);\n const error = new InsForgeError(\n 'Refresh token cookie is missing',\n 401,\n ERROR_CODES.AUTH_UNAUTHORIZED,\n );\n return {\n response: jsonResponse(\n {\n error: error.error,\n message: error.message,\n statusCode: error.statusCode,\n },\n { status: error.statusCode },\n headers,\n ),\n data: null,\n accessToken: null,\n refreshToken: null,\n error,\n };\n }\n\n let { baseUrl, anonKey } = options;\n try {\n baseUrl ||= process.env.NEXT_PUBLIC_INSFORGE_URL;\n anonKey ||= process.env.NEXT_PUBLIC_INSFORGE_ANON_KEY;\n } catch {\n // process may be unavailable outside Next.js/browser-bundled envs.\n }\n if (!baseUrl || !anonKey) {\n throw new Error(\n 'Missing InsForge baseUrl or anonKey. Pass baseUrl and anonKey to refreshAuth() or set NEXT_PUBLIC_INSFORGE_URL and NEXT_PUBLIC_INSFORGE_ANON_KEY.',\n );\n }\n\n const fetchImpl =\n options.fetch ??\n (globalThis.fetch\n ? globalThis.fetch.bind(globalThis)\n : (undefined as typeof fetch | undefined));\n if (!fetchImpl) {\n throw new Error(\n 'Fetch is not available. Please provide a fetch implementation.',\n );\n }\n\n const requestHeaders = new Headers(options.headers);\n requestHeaders.set('Authorization', `Bearer ${anonKey}`);\n requestHeaders.set('Content-Type', 'application/json');\n requestHeaders.set('Accept', 'application/json');\n\n let data: AuthRefreshResponse | null = null;\n let error: InsForgeError | null = null;\n\n try {\n const response = await fetchImpl(\n new URL('/api/auth/refresh?client_type=mobile', baseUrl).toString(),\n {\n method: 'POST',\n headers: requestHeaders,\n body: JSON.stringify({ refresh_token: refreshToken }),\n },\n );\n const body = await readJson(response);\n if (!response.ok) {\n error = normalizeError(\n body ?? {\n message: 'Failed to refresh auth session',\n statusCode: response.status,\n error: ERROR_CODES.UNKNOWN_ERROR,\n },\n );\n } else {\n data = body as AuthRefreshResponse;\n }\n } catch (caught) {\n error = normalizeError(caught);\n }\n\n if (error || !data?.accessToken) {\n clearAuthCookieHeaders(headers, options);\n const normalized = normalizeError(error);\n return {\n response: jsonResponse(\n {\n error: normalized.error,\n message: normalized.message,\n statusCode: normalized.statusCode,\n },\n { status: normalized.statusCode || 500 },\n headers,\n ),\n data: null,\n accessToken: null,\n refreshToken: null,\n error: normalized,\n };\n }\n\n const nextRefreshToken = data.refreshToken ?? refreshToken;\n setAuthCookieHeaders(\n headers,\n {\n accessToken: data.accessToken,\n refreshToken: nextRefreshToken,\n },\n options,\n );\n\n const responseBody: AuthRefreshResponse = {\n accessToken: data.accessToken,\n user: data.user,\n csrfToken: data.csrfToken,\n };\n\n return {\n response: jsonResponse(responseBody, { status: 200 }, headers),\n data: responseBody,\n accessToken: data.accessToken,\n refreshToken: nextRefreshToken,\n error: null,\n };\n}\n\nexport function createRefreshAuthRouter(\n options: Omit<RefreshAuthOptions, 'request'> = {},\n): { POST: RefreshAuthRouteHandler } {\n return {\n POST: async (request: Request) =>\n (await refreshAuth({ ...options, request })).response,\n };\n}\n","import { isJwtExpiredOrExpiring } from '../lib/jwt';\nimport type { InsForgeConfig, InsForgeError } from '../types';\nimport {\n clearAuthCookies,\n getAccessTokenCookieName,\n getCookieValue,\n getRefreshTokenCookieName,\n setAuthCookies,\n type AuthCookieSettings,\n type CookieStore,\n} from './cookies';\nimport { refreshAuth } from './refresh';\n\nexport interface UpdateSessionOptions\n extends Omit<\n InsForgeConfig,\n 'accessToken' | 'edgeFunctionToken' | 'isServerMode' | 'auth'\n >,\n AuthCookieSettings {\n requestCookies: CookieStore;\n responseCookies: CookieStore;\n refreshLeewaySeconds?: number;\n}\n\nexport interface UpdateSessionResult {\n refreshed: boolean;\n accessToken: string | null;\n error: InsForgeError | null;\n}\n\nexport async function updateSession(\n options: UpdateSessionOptions,\n): Promise<UpdateSessionResult> {\n const accessCookieName = getAccessTokenCookieName(options.names);\n const refreshCookieName = getRefreshTokenCookieName(options.names);\n const accessToken = getCookieValue(\n options.requestCookies,\n accessCookieName,\n );\n\n if (\n accessToken &&\n !isJwtExpiredOrExpiring(accessToken, options.refreshLeewaySeconds)\n ) {\n return {\n refreshed: false,\n accessToken,\n error: null,\n };\n }\n\n const refreshToken = getCookieValue(\n options.requestCookies,\n refreshCookieName,\n );\n if (!refreshToken) {\n if (accessToken) {\n clearAuthCookies(options.requestCookies, options);\n clearAuthCookies(options.responseCookies, options);\n }\n return {\n refreshed: false,\n accessToken: null,\n error: null,\n };\n }\n\n const result = await refreshAuth({\n ...options,\n refreshToken,\n });\n\n if (result.error || !result.accessToken) {\n clearAuthCookies(options.requestCookies, options);\n clearAuthCookies(options.responseCookies, options);\n return {\n refreshed: false,\n accessToken: null,\n error: result.error,\n };\n }\n\n const tokens = {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken ?? refreshToken,\n };\n setAuthCookies(options.requestCookies, tokens, options);\n setAuthCookies(options.responseCookies, tokens, options);\n\n return {\n refreshed: true,\n accessToken: result.accessToken,\n error: null,\n };\n}\n"],"mappings":"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","names":["error"]}