@payez/next-mvp 4.0.43 → 4.0.45
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.
- package/dist/lib/api-handler.js +30 -13
- package/package.json +1 -1
- package/src/lib/api-handler.ts +31 -14
package/dist/lib/api-handler.js
CHANGED
|
@@ -173,7 +173,9 @@ class ApiHandler {
|
|
|
173
173
|
return { success: false, reason: 'SESSION_EXPIRED' };
|
|
174
174
|
}
|
|
175
175
|
const { session: sessionData } = sessionWithVersion;
|
|
176
|
-
|
|
176
|
+
// Sessions may store the access token under either field name
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
178
|
+
let accessToken = sessionData.idpAccessToken || sessionData.accessToken || null;
|
|
177
179
|
let userRoles = Array.isArray(sessionData.roles) ? sessionData.roles : [];
|
|
178
180
|
// Merge roles from JWT token
|
|
179
181
|
try {
|
|
@@ -183,12 +185,19 @@ class ApiHandler {
|
|
|
183
185
|
}
|
|
184
186
|
}
|
|
185
187
|
catch { /* ignore */ }
|
|
186
|
-
// Check if token needs refresh
|
|
187
|
-
// Skip
|
|
188
|
+
// Check if token needs refresh.
|
|
189
|
+
// Skip the optimization (hasRefreshToken check) when access token is missing —
|
|
190
|
+
// some session shapes store the refresh token under different field names,
|
|
191
|
+
// and we still want a refresh attempt to populate the access token.
|
|
188
192
|
const thresholdMs = 5 * 60 * 1000;
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
|
|
193
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
194
|
+
const expires = sessionData.idpAccessTokenExpires || sessionData.accessTokenExpires || 0;
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
196
|
+
const hasRefreshToken = !!(sessionData.idpRefreshToken || sessionData.refreshToken);
|
|
197
|
+
const accessTokenStale = !accessToken || (expires - Date.now()) <= thresholdMs;
|
|
198
|
+
// If we already have a fresh access token, skip refresh entirely (no lock).
|
|
199
|
+
// If we don't, only attempt refresh when we have a refresh token to use.
|
|
200
|
+
const needsRefresh = accessTokenStale && hasRefreshToken;
|
|
192
201
|
if (needsRefresh) {
|
|
193
202
|
const refreshResult = await this.handleCoordinatedRefresh(req, token, sessionData, ctx);
|
|
194
203
|
if (refreshResult.blocked) {
|
|
@@ -297,11 +306,17 @@ class ApiHandler {
|
|
|
297
306
|
// Double-check if still needs refresh
|
|
298
307
|
const latest = await (0, session_store_1.getSession)(sessionToken);
|
|
299
308
|
const thresholdMs = 5 * 60 * 1000;
|
|
300
|
-
|
|
301
|
-
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
|
+
const latestAny = latest;
|
|
311
|
+
// Sessions may store the access token under either `accessToken` or `idpAccessToken`,
|
|
312
|
+
// and expiry under `accessTokenExpires` or `idpAccessTokenExpires`.
|
|
313
|
+
const latestAccessToken = latestAny?.accessToken || latestAny?.idpAccessToken;
|
|
314
|
+
const latestExpires = latestAny?.accessTokenExpires || latestAny?.idpAccessTokenExpires || 0;
|
|
315
|
+
const stillNeeds = !latestAccessToken || (latestExpires - Date.now()) <= thresholdMs;
|
|
316
|
+
if (!stillNeeds && latestAccessToken) {
|
|
302
317
|
return {
|
|
303
|
-
accessToken:
|
|
304
|
-
roles: Array.isArray(latest
|
|
318
|
+
accessToken: latestAccessToken,
|
|
319
|
+
roles: Array.isArray(latest?.roles) ? latest.roles : [],
|
|
305
320
|
};
|
|
306
321
|
}
|
|
307
322
|
// Use centralized internal API helper for server-to-server refresh calls
|
|
@@ -310,10 +325,12 @@ class ApiHandler {
|
|
|
310
325
|
return {};
|
|
311
326
|
}
|
|
312
327
|
const refreshed = await (0, session_store_1.getSession)(sessionToken);
|
|
313
|
-
|
|
328
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
329
|
+
const refreshedAccessToken = refreshed?.accessToken || refreshed?.idpAccessToken;
|
|
330
|
+
if (refreshedAccessToken) {
|
|
314
331
|
return {
|
|
315
|
-
accessToken:
|
|
316
|
-
roles: Array.isArray(refreshed
|
|
332
|
+
accessToken: refreshedAccessToken,
|
|
333
|
+
roles: Array.isArray(refreshed?.roles) ? refreshed.roles : [],
|
|
317
334
|
};
|
|
318
335
|
}
|
|
319
336
|
return {};
|
package/package.json
CHANGED
package/src/lib/api-handler.ts
CHANGED
|
@@ -267,7 +267,9 @@ export class ApiHandler {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
const { session: sessionData } = sessionWithVersion;
|
|
270
|
-
|
|
270
|
+
// Sessions may store the access token under either field name
|
|
271
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
272
|
+
let accessToken = sessionData.idpAccessToken || (sessionData as any).accessToken || null;
|
|
271
273
|
let userRoles: string[] = Array.isArray(sessionData.roles) ? sessionData.roles : [];
|
|
272
274
|
|
|
273
275
|
// Merge roles from JWT token
|
|
@@ -278,12 +280,19 @@ export class ApiHandler {
|
|
|
278
280
|
}
|
|
279
281
|
} catch { /* ignore */ }
|
|
280
282
|
|
|
281
|
-
// Check if token needs refresh
|
|
282
|
-
// Skip
|
|
283
|
+
// Check if token needs refresh.
|
|
284
|
+
// Skip the optimization (hasRefreshToken check) when access token is missing —
|
|
285
|
+
// some session shapes store the refresh token under different field names,
|
|
286
|
+
// and we still want a refresh attempt to populate the access token.
|
|
283
287
|
const thresholdMs = 5 * 60 * 1000;
|
|
284
|
-
|
|
285
|
-
const
|
|
286
|
-
|
|
288
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
289
|
+
const expires = sessionData.idpAccessTokenExpires || (sessionData as any).accessTokenExpires || 0;
|
|
290
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
+
const hasRefreshToken = !!(sessionData.idpRefreshToken || (sessionData as any).refreshToken);
|
|
292
|
+
const accessTokenStale = !accessToken || (expires - Date.now()) <= thresholdMs;
|
|
293
|
+
// If we already have a fresh access token, skip refresh entirely (no lock).
|
|
294
|
+
// If we don't, only attempt refresh when we have a refresh token to use.
|
|
295
|
+
const needsRefresh = accessTokenStale && hasRefreshToken;
|
|
287
296
|
|
|
288
297
|
if (needsRefresh) {
|
|
289
298
|
const refreshResult = await this.handleCoordinatedRefresh(req, token, sessionData, ctx);
|
|
@@ -418,12 +427,18 @@ export class ApiHandler {
|
|
|
418
427
|
// Double-check if still needs refresh
|
|
419
428
|
const latest = await getSession(sessionToken);
|
|
420
429
|
const thresholdMs = 5 * 60 * 1000;
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
430
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
431
|
+
const latestAny = latest as any;
|
|
432
|
+
// Sessions may store the access token under either `accessToken` or `idpAccessToken`,
|
|
433
|
+
// and expiry under `accessTokenExpires` or `idpAccessTokenExpires`.
|
|
434
|
+
const latestAccessToken = latestAny?.accessToken || latestAny?.idpAccessToken;
|
|
435
|
+
const latestExpires = latestAny?.accessTokenExpires || latestAny?.idpAccessTokenExpires || 0;
|
|
436
|
+
const stillNeeds = !latestAccessToken || (latestExpires - Date.now()) <= thresholdMs;
|
|
437
|
+
|
|
438
|
+
if (!stillNeeds && latestAccessToken) {
|
|
424
439
|
return {
|
|
425
|
-
accessToken:
|
|
426
|
-
roles: Array.isArray(latest
|
|
440
|
+
accessToken: latestAccessToken,
|
|
441
|
+
roles: Array.isArray(latest?.roles) ? latest.roles : [],
|
|
427
442
|
};
|
|
428
443
|
}
|
|
429
444
|
|
|
@@ -440,10 +455,12 @@ export class ApiHandler {
|
|
|
440
455
|
}
|
|
441
456
|
|
|
442
457
|
const refreshed = await getSession(sessionToken);
|
|
443
|
-
|
|
458
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
459
|
+
const refreshedAccessToken = (refreshed as any)?.accessToken || (refreshed as any)?.idpAccessToken;
|
|
460
|
+
if (refreshedAccessToken) {
|
|
444
461
|
return {
|
|
445
|
-
accessToken:
|
|
446
|
-
roles: Array.isArray(refreshed
|
|
462
|
+
accessToken: refreshedAccessToken,
|
|
463
|
+
roles: Array.isArray(refreshed?.roles) ? refreshed.roles : [],
|
|
447
464
|
};
|
|
448
465
|
}
|
|
449
466
|
|