@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.
@@ -173,7 +173,9 @@ class ApiHandler {
173
173
  return { success: false, reason: 'SESSION_EXPIRED' };
174
174
  }
175
175
  const { session: sessionData } = sessionWithVersion;
176
- let accessToken = sessionData.idpAccessToken || null;
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 entirely if there's no refresh token nothing to refresh with
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
- const expires = sessionData.idpAccessTokenExpires || 0;
190
- const hasRefreshToken = !!sessionData.idpRefreshToken;
191
- const needsRefresh = hasRefreshToken && (!accessToken || (expires - Date.now()) <= thresholdMs);
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
- const stillNeeds = !latest?.accessToken || ((latest?.accessTokenExpires || 0) - Date.now()) <= thresholdMs;
301
- if (!stillNeeds && latest?.accessToken) {
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: latest.accessToken,
304
- roles: Array.isArray(latest.roles) ? latest.roles : [],
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
- if (refreshed?.accessToken) {
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: refreshed.accessToken,
316
- roles: Array.isArray(refreshed.roles) ? refreshed.roles : [],
332
+ accessToken: refreshedAccessToken,
333
+ roles: Array.isArray(refreshed?.roles) ? refreshed.roles : [],
317
334
  };
318
335
  }
319
336
  return {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payez/next-mvp",
3
- "version": "4.0.43",
3
+ "version": "4.0.45",
4
4
  "sideEffects": false,
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -267,7 +267,9 @@ export class ApiHandler {
267
267
  }
268
268
 
269
269
  const { session: sessionData } = sessionWithVersion;
270
- let accessToken = sessionData.idpAccessToken || null;
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 entirely if there's no refresh token nothing to refresh with
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
- const expires = sessionData.idpAccessTokenExpires || 0;
285
- const hasRefreshToken = !!sessionData.idpRefreshToken;
286
- const needsRefresh = hasRefreshToken && (!accessToken || (expires - Date.now()) <= thresholdMs);
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
- const stillNeeds = !latest?.accessToken || ((latest?.accessTokenExpires || 0) - Date.now()) <= thresholdMs;
422
-
423
- if (!stillNeeds && latest?.accessToken) {
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: latest.accessToken,
426
- roles: Array.isArray(latest.roles) ? latest.roles : [],
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
- if (refreshed?.accessToken) {
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: refreshed.accessToken,
446
- roles: Array.isArray(refreshed.roles) ? refreshed.roles : [],
462
+ accessToken: refreshedAccessToken,
463
+ roles: Array.isArray(refreshed?.roles) ? refreshed.roles : [],
447
464
  };
448
465
  }
449
466