woodsportal-client-sdk 4.0.7-dev.0 → 4.0.7-dev.10
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/adapters/angular/index.js +6 -6
- package/dist/adapters/react/index.js +6 -6
- package/dist/adapters/vue/index.js +6 -6
- package/dist/auth-interceptor-policy-CKXBTGBT.js +5 -0
- package/dist/{auth-interceptor-policy-BSY5KIIA.js.map → auth-interceptor-policy-CKXBTGBT.js.map} +1 -1
- package/dist/auth-utils-LT4JXJER.js +5 -0
- package/dist/{auth-utils-XIHNYE63.js.map → auth-utils-LT4JXJER.js.map} +1 -1
- package/dist/{chunk-ADOV2R3A.js → chunk-5NONTYJA.js} +237 -11
- package/dist/chunk-5NONTYJA.js.map +1 -0
- package/dist/{chunk-YOT5RW3R.js → chunk-6XIX6R4X.js} +8 -5
- package/dist/chunk-6XIX6R4X.js.map +1 -0
- package/dist/{chunk-7OGXVANB.js → chunk-AR6QQMVD.js} +4 -4
- package/dist/{chunk-7OGXVANB.js.map → chunk-AR6QQMVD.js.map} +1 -1
- package/dist/{chunk-OF5OLEE5.js → chunk-DKWFLCSO.js} +3 -3
- package/dist/{chunk-OF5OLEE5.js.map → chunk-DKWFLCSO.js.map} +1 -1
- package/dist/{chunk-U66LWTVC.js → chunk-JKB2SWUN.js} +62 -10
- package/dist/chunk-JKB2SWUN.js.map +1 -0
- package/dist/{chunk-4IKGBHFJ.js → chunk-JVM47MG5.js} +82 -31
- package/dist/chunk-JVM47MG5.js.map +1 -0
- package/dist/{chunk-WNBF6FKG.js → chunk-PQQSIYD3.js} +19 -8
- package/dist/chunk-PQQSIYD3.js.map +1 -0
- package/dist/{chunk-DZC3DJUO.js → chunk-PRGN3FF6.js} +13 -4
- package/dist/chunk-PRGN3FF6.js.map +1 -0
- package/dist/{chunk-GVXA7OKY.js → chunk-QIM5H7OG.js} +23 -6
- package/dist/chunk-QIM5H7OG.js.map +1 -0
- package/dist/{chunk-6ROV3EE2.js → chunk-UDAPRD7Z.js} +16 -5
- package/dist/chunk-UDAPRD7Z.js.map +1 -0
- package/dist/{chunk-J33YFZCS.js → chunk-XIKYPNO5.js} +8 -7
- package/dist/chunk-XIKYPNO5.js.map +1 -0
- package/dist/cross-tab-session-WEIUJDZN.js +9 -0
- package/dist/{cross-tab-session-OJKWJSNT.js.map → cross-tab-session-WEIUJDZN.js.map} +1 -1
- package/dist/entries/auth.d.ts +5 -2
- package/dist/entries/auth.js +8 -8
- package/dist/entries/auth.js.map +1 -1
- package/dist/entries/crm.d.ts +2 -2
- package/dist/entries/crm.js +9 -7
- package/dist/entries/crm.js.map +1 -1
- package/dist/{http-errors-_XPPqJ_a.d.ts → http-errors-CCCQECil.d.ts} +21 -2
- package/dist/index.d.ts +18 -4
- package/dist/index.js +15 -13
- package/dist/index.js.map +1 -1
- package/dist/{cache-purge-Ca4idzyy.d.ts → pipeline-ui-DbEzI_v1.d.ts} +13 -1
- package/dist/storage-migration-2NVJ3GNQ.js +4 -0
- package/dist/{storage-migration-OCOML7VA.js.map → storage-migration-2NVJ3GNQ.js.map} +1 -1
- package/package.json +1 -1
- package/dist/auth-interceptor-policy-BSY5KIIA.js +0 -5
- package/dist/auth-utils-XIHNYE63.js +0 -5
- package/dist/chunk-4IKGBHFJ.js.map +0 -1
- package/dist/chunk-6ROV3EE2.js.map +0 -1
- package/dist/chunk-ADOV2R3A.js.map +0 -1
- package/dist/chunk-DZC3DJUO.js.map +0 -1
- package/dist/chunk-GVXA7OKY.js.map +0 -1
- package/dist/chunk-J33YFZCS.js.map +0 -1
- package/dist/chunk-U66LWTVC.js.map +0 -1
- package/dist/chunk-WNBF6FKG.js.map +0 -1
- package/dist/chunk-YOT5RW3R.js.map +0 -1
- package/dist/cross-tab-session-OJKWJSNT.js +0 -9
- package/dist/refresh-lock-UW5RRRTD.js +0 -72
- package/dist/refresh-lock-UW5RRRTD.js.map +0 -1
- package/dist/storage-migration-OCOML7VA.js +0 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { bindStoreWithActions } from '../../chunk-AYTO6ND7.js';
|
|
2
|
-
import { createAdapterHooks } from '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
5
|
-
import '../../chunk-
|
|
6
|
-
import '../../chunk-
|
|
7
|
-
import '../../chunk-
|
|
2
|
+
import { createAdapterHooks } from '../../chunk-AR6QQMVD.js';
|
|
3
|
+
import '../../chunk-DKWFLCSO.js';
|
|
4
|
+
import '../../chunk-JKB2SWUN.js';
|
|
5
|
+
import '../../chunk-5NONTYJA.js';
|
|
6
|
+
import '../../chunk-6XIX6R4X.js';
|
|
7
|
+
import '../../chunk-UDAPRD7Z.js';
|
|
8
8
|
import { inject, DestroyRef, signal } from '@angular/core';
|
|
9
9
|
|
|
10
10
|
function createAngularStoreComposable(store, actions) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createAdapterHooks } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
5
|
-
import '../../chunk-
|
|
6
|
-
import '../../chunk-
|
|
1
|
+
import { createAdapterHooks } from '../../chunk-AR6QQMVD.js';
|
|
2
|
+
import '../../chunk-DKWFLCSO.js';
|
|
3
|
+
import '../../chunk-JKB2SWUN.js';
|
|
4
|
+
import '../../chunk-5NONTYJA.js';
|
|
5
|
+
import '../../chunk-6XIX6R4X.js';
|
|
6
|
+
import '../../chunk-UDAPRD7Z.js';
|
|
7
7
|
import { useSyncExternalStore } from 'react';
|
|
8
8
|
|
|
9
9
|
function createReactStoreComposable(store, actions) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { bindStoreWithActions } from '../../chunk-AYTO6ND7.js';
|
|
2
|
-
import { createAdapterHooks } from '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
5
|
-
import '../../chunk-
|
|
6
|
-
import '../../chunk-
|
|
7
|
-
import '../../chunk-
|
|
2
|
+
import { createAdapterHooks } from '../../chunk-AR6QQMVD.js';
|
|
3
|
+
import '../../chunk-DKWFLCSO.js';
|
|
4
|
+
import '../../chunk-JKB2SWUN.js';
|
|
5
|
+
import '../../chunk-5NONTYJA.js';
|
|
6
|
+
import '../../chunk-6XIX6R4X.js';
|
|
7
|
+
import '../../chunk-UDAPRD7Z.js';
|
|
8
8
|
import { reactive, onScopeDispose } from 'vue';
|
|
9
9
|
|
|
10
10
|
function createVueStoreComposable(store, actions) {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { isOptionalAuthFailureUrl, isRefreshEndpointUrl, isSessionProbeUrl, persistAuthError, readPersistedAuthError, resolveAuthErrorAction } from './chunk-PRGN3FF6.js';
|
|
2
|
+
import './chunk-COHBSTHF.js';
|
|
3
|
+
import './chunk-UDAPRD7Z.js';
|
|
4
|
+
//# sourceMappingURL=auth-interceptor-policy-CKXBTGBT.js.map
|
|
5
|
+
//# sourceMappingURL=auth-interceptor-policy-CKXBTGBT.js.map
|
package/dist/{auth-interceptor-policy-BSY5KIIA.js.map → auth-interceptor-policy-CKXBTGBT.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"auth-interceptor-policy-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"auth-interceptor-policy-CKXBTGBT.js"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { clearRefreshToken, getPortal, getProfile, getRefreshToken, getSubscriptionType, setAccessToken, setLoggedInDetails, setPortal, setProfileDetails, setRefreshToken, setSubscriptionType } from './chunk-5NONTYJA.js';
|
|
2
|
+
import './chunk-6XIX6R4X.js';
|
|
3
|
+
import './chunk-UDAPRD7Z.js';
|
|
4
|
+
//# sourceMappingURL=auth-utils-LT4JXJER.js.map
|
|
5
|
+
//# sourceMappingURL=auth-utils-LT4JXJER.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"auth-utils-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"auth-utils-LT4JXJER.js"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getStorageKeys,
|
|
2
|
-
import { WP_STORAGE_KEYS, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './chunk-
|
|
1
|
+
import { isCookieExpired, getStorageKeys, getCookie, isCorruptCookieRawValue, stringifyCookieValue, setCookie, parseCookieJson, removeCookie } from './chunk-6XIX6R4X.js';
|
|
2
|
+
import { WP_STORAGE_KEYS, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './chunk-UDAPRD7Z.js';
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
|
|
5
5
|
// src/main/core/utils/constants.ts
|
|
@@ -307,6 +307,156 @@ var logger = {
|
|
|
307
307
|
}
|
|
308
308
|
};
|
|
309
309
|
|
|
310
|
+
// src/main/core/auth/mfa-pending-token-storage.ts
|
|
311
|
+
function keysForLane(lane) {
|
|
312
|
+
const mfa = lane === "a" ? WP_STORAGE_KEYS.a.mfa : WP_STORAGE_KEYS.c.mfa;
|
|
313
|
+
return {
|
|
314
|
+
token: mfa.pendingToken,
|
|
315
|
+
exp: mfa.pendingTokenExp
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function readExpiresAt(raw) {
|
|
319
|
+
if (raw == null || raw === "") {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
const parsed = Number(raw);
|
|
323
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
324
|
+
}
|
|
325
|
+
function getSessionStorage() {
|
|
326
|
+
if (typeof globalThis === "undefined") {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
if (globalThis.sessionStorage != null) {
|
|
331
|
+
return globalThis.sessionStorage;
|
|
332
|
+
}
|
|
333
|
+
const win = globalThis.window;
|
|
334
|
+
return win?.sessionStorage ?? null;
|
|
335
|
+
} catch {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function storeMfaPendingAccessToken(token, expiresInSeconds, lane = "c") {
|
|
340
|
+
const storage2 = getSessionStorage();
|
|
341
|
+
if (!storage2) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (!token || typeof token !== "string") {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const keys = keysForLane(lane);
|
|
348
|
+
const expiresAt = typeof expiresInSeconds === "number" && expiresInSeconds > 0 ? Date.now() + expiresInSeconds * 1e3 : Date.now() + 15 * 60 * 1e3;
|
|
349
|
+
try {
|
|
350
|
+
storage2.setItem(keys.token, token);
|
|
351
|
+
storage2.setItem(keys.exp, String(expiresAt));
|
|
352
|
+
} catch {
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function readMfaPendingAccessToken(lane = "c") {
|
|
356
|
+
const storage2 = getSessionStorage();
|
|
357
|
+
if (!storage2) {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
const keys = keysForLane(lane);
|
|
361
|
+
try {
|
|
362
|
+
const token = storage2.getItem(keys.token);
|
|
363
|
+
if (!token) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
const expiresAt = readExpiresAt(storage2.getItem(keys.exp));
|
|
367
|
+
if (expiresAt == null || Date.now() >= expiresAt) {
|
|
368
|
+
clearMfaPendingAccessToken(lane);
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
return { token, expiresAt };
|
|
372
|
+
} catch {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function clearMfaPendingAccessToken(lane = "c") {
|
|
377
|
+
const storage2 = getSessionStorage();
|
|
378
|
+
if (!storage2) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const keys = keysForLane(lane);
|
|
382
|
+
try {
|
|
383
|
+
storage2.removeItem(keys.token);
|
|
384
|
+
storage2.removeItem(keys.exp);
|
|
385
|
+
} catch {
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function isMfaPendingAccessSession(lane = "c") {
|
|
389
|
+
return readMfaPendingAccessToken(lane) != null;
|
|
390
|
+
}
|
|
391
|
+
async function hydrateMfaPendingAccessToken(input) {
|
|
392
|
+
const lane = input.lane ?? "c";
|
|
393
|
+
const pending = readMfaPendingAccessToken(lane);
|
|
394
|
+
if (!pending) {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
const ttlSeconds = Math.max(1, Math.floor((pending.expiresAt - Date.now()) / 1e3));
|
|
398
|
+
await input.setAccessToken(pending.token, ttlSeconds);
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// src/main/core/http/refresh-lock.ts
|
|
403
|
+
var LOCK_NAME = "wp.client.auth.refresh";
|
|
404
|
+
var STORAGE_LOCK_KEY = WP_STORAGE_KEYS.c.auth.refreshLock;
|
|
405
|
+
var LOCK_TTL_MS = 3e4;
|
|
406
|
+
async function withNavigatorLock(fn) {
|
|
407
|
+
if (typeof navigator !== "undefined" && navigator.locks?.request) {
|
|
408
|
+
return navigator.locks.request(LOCK_NAME, fn);
|
|
409
|
+
}
|
|
410
|
+
return fn();
|
|
411
|
+
}
|
|
412
|
+
function tryAcquireStorageLock() {
|
|
413
|
+
if (typeof window === "undefined" || !window.localStorage) {
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
try {
|
|
417
|
+
const raw = window.localStorage.getItem(STORAGE_LOCK_KEY);
|
|
418
|
+
const now = Date.now();
|
|
419
|
+
if (raw) {
|
|
420
|
+
const ts = Number(raw);
|
|
421
|
+
if (Number.isFinite(ts) && now - ts < LOCK_TTL_MS) {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
window.localStorage.setItem(STORAGE_LOCK_KEY, String(now));
|
|
426
|
+
return true;
|
|
427
|
+
} catch {
|
|
428
|
+
return true;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function releaseStorageLock() {
|
|
432
|
+
if (typeof window === "undefined" || !window.localStorage) {
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
try {
|
|
436
|
+
window.localStorage.removeItem(STORAGE_LOCK_KEY);
|
|
437
|
+
} catch {
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
async function waitForStorageLock(maxWaitMs = LOCK_TTL_MS) {
|
|
441
|
+
const start = Date.now();
|
|
442
|
+
while (Date.now() - start < maxWaitMs) {
|
|
443
|
+
if (tryAcquireStorageLock()) {
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
async function withRefreshLock(fn) {
|
|
450
|
+
return withNavigatorLock(async () => {
|
|
451
|
+
await waitForStorageLock();
|
|
452
|
+
try {
|
|
453
|
+
return await fn();
|
|
454
|
+
} finally {
|
|
455
|
+
releaseStorageLock();
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
|
|
310
460
|
// src/main/core/http/token-store.ts
|
|
311
461
|
var accessToken = null;
|
|
312
462
|
var tokenExpiresAt = null;
|
|
@@ -348,14 +498,52 @@ function notifySessionLifecycleChange() {
|
|
|
348
498
|
} catch {
|
|
349
499
|
}
|
|
350
500
|
}
|
|
501
|
+
function persistRefreshExhausted() {
|
|
502
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
try {
|
|
506
|
+
window.sessionStorage.setItem(WP_STORAGE_KEYS.c.auth.refreshExhausted, JSON.stringify({ ts: Date.now() }));
|
|
507
|
+
} catch {
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function clearPersistedRefreshExhausted() {
|
|
511
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
try {
|
|
515
|
+
window.sessionStorage.removeItem(WP_STORAGE_KEYS.c.auth.refreshExhausted);
|
|
516
|
+
} catch {
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
function readPersistedRefreshExhausted() {
|
|
520
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
try {
|
|
524
|
+
return Boolean(window.sessionStorage.getItem(WP_STORAGE_KEYS.c.auth.refreshExhausted));
|
|
525
|
+
} catch {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function hydrateSessionRefreshState() {
|
|
530
|
+
if (readPersistedRefreshExhausted()) {
|
|
531
|
+
lastRefreshFailed = true;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
function clearSessionRefreshExhaustedState() {
|
|
535
|
+
lastRefreshFailed = false;
|
|
536
|
+
clearPersistedRefreshExhausted();
|
|
537
|
+
}
|
|
351
538
|
function markRefreshFailed() {
|
|
352
539
|
lastRefreshFailed = true;
|
|
540
|
+
persistRefreshExhausted();
|
|
353
541
|
clearAccessToken();
|
|
354
542
|
notifySessionLifecycleChange();
|
|
355
543
|
}
|
|
356
544
|
function storAccessToken(token, expiresIn) {
|
|
357
545
|
accessToken = token;
|
|
358
|
-
|
|
546
|
+
clearSessionRefreshExhaustedState();
|
|
359
547
|
if (expiresIn != null && expiresIn > 0) {
|
|
360
548
|
accessTtlMs = expiresIn * 1e3;
|
|
361
549
|
tokenExpiresAt = Date.now() + accessTtlMs;
|
|
@@ -372,7 +560,6 @@ function clearAccessToken() {
|
|
|
372
560
|
lastSuccessfulRefreshAt = null;
|
|
373
561
|
}
|
|
374
562
|
function resetSessionAuthState() {
|
|
375
|
-
lastRefreshFailed = false;
|
|
376
563
|
lastSuccessfulRefreshAt = null;
|
|
377
564
|
}
|
|
378
565
|
function setRefreshBufferSeconds(seconds) {
|
|
@@ -382,7 +569,14 @@ function didLastRefreshFail() {
|
|
|
382
569
|
return lastRefreshFailed;
|
|
383
570
|
}
|
|
384
571
|
function isSessionRefreshExhausted() {
|
|
385
|
-
|
|
572
|
+
if (lastRefreshFailed) {
|
|
573
|
+
return true;
|
|
574
|
+
}
|
|
575
|
+
if (readPersistedRefreshExhausted()) {
|
|
576
|
+
lastRefreshFailed = true;
|
|
577
|
+
return true;
|
|
578
|
+
}
|
|
579
|
+
return false;
|
|
386
580
|
}
|
|
387
581
|
function isExpiresAccessToken() {
|
|
388
582
|
if (!accessToken) return true;
|
|
@@ -398,6 +592,9 @@ function isRefreshInFlight() {
|
|
|
398
592
|
}
|
|
399
593
|
async function refreshSession(options = {}) {
|
|
400
594
|
const { force = false } = options;
|
|
595
|
+
if (isMfaPendingAccessSession("c") || isMfaPendingAccessSession("a")) {
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
401
598
|
if (!force && lastSuccessfulRefreshAt != null && Date.now() - lastSuccessfulRefreshAt < MIN_PROACTIVE_REFRESH_INTERVAL_MS) {
|
|
402
599
|
return;
|
|
403
600
|
}
|
|
@@ -406,9 +603,8 @@ async function refreshSession(options = {}) {
|
|
|
406
603
|
}
|
|
407
604
|
if (!refreshPromise) {
|
|
408
605
|
refreshPromise = (async () => {
|
|
409
|
-
const { withRefreshLock } = await import('./refresh-lock-UW5RRRTD.js');
|
|
410
606
|
await withRefreshLock(async () => {
|
|
411
|
-
const { getRefreshToken: getRefreshToken2 } = await import('./auth-utils-
|
|
607
|
+
const { getRefreshToken: getRefreshToken2 } = await import('./auth-utils-LT4JXJER.js');
|
|
412
608
|
const refreshToken = getRefreshToken2();
|
|
413
609
|
if (!refreshToken) {
|
|
414
610
|
markRefreshFailed();
|
|
@@ -437,6 +633,9 @@ async function refreshSession(options = {}) {
|
|
|
437
633
|
await refreshPromise;
|
|
438
634
|
}
|
|
439
635
|
async function ensureValidRefresh() {
|
|
636
|
+
if (isMfaPendingAccessSession("c") || isMfaPendingAccessSession("a")) {
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
440
639
|
if (!isExpiresAccessToken()) {
|
|
441
640
|
return;
|
|
442
641
|
}
|
|
@@ -465,7 +664,14 @@ function isAccessTokenExpired() {
|
|
|
465
664
|
return isExpiresAccessToken();
|
|
466
665
|
}
|
|
467
666
|
function hasRefreshSession() {
|
|
468
|
-
if (
|
|
667
|
+
if (isSessionRefreshExhausted() && !accessToken) {
|
|
668
|
+
return false;
|
|
669
|
+
}
|
|
670
|
+
const refreshKey = getStorageKeys().refreshToken;
|
|
671
|
+
if (!refreshKey || isCookieExpired(refreshKey)) {
|
|
672
|
+
return false;
|
|
673
|
+
}
|
|
674
|
+
if (!readRefreshTokenValue()) {
|
|
469
675
|
return false;
|
|
470
676
|
}
|
|
471
677
|
if (lastRefreshFailed && !accessToken) {
|
|
@@ -473,6 +679,17 @@ function hasRefreshSession() {
|
|
|
473
679
|
}
|
|
474
680
|
return true;
|
|
475
681
|
}
|
|
682
|
+
function readRefreshTokenValue() {
|
|
683
|
+
const key = getStorageKeys().refreshToken;
|
|
684
|
+
const raw = getCookie(key);
|
|
685
|
+
if (!isCorruptCookieRawValue(raw)) {
|
|
686
|
+
return raw;
|
|
687
|
+
}
|
|
688
|
+
if (isIframeStorageMode()) {
|
|
689
|
+
return readIframeRefreshToken();
|
|
690
|
+
}
|
|
691
|
+
return null;
|
|
692
|
+
}
|
|
476
693
|
function hasValidAccessToken() {
|
|
477
694
|
return Boolean(getAccessToken()) && !isExpiresAccessToken();
|
|
478
695
|
}
|
|
@@ -559,6 +776,15 @@ function getRefreshToken() {
|
|
|
559
776
|
}
|
|
560
777
|
return null;
|
|
561
778
|
}
|
|
779
|
+
function clearRefreshToken() {
|
|
780
|
+
const key = getStorageKeys().refreshToken;
|
|
781
|
+
if (key) {
|
|
782
|
+
removeCookie(key);
|
|
783
|
+
}
|
|
784
|
+
if (isIframeStorageMode()) {
|
|
785
|
+
writeIframeRefreshToken("", 0);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
562
788
|
function getPortal() {
|
|
563
789
|
return parseCookieJson(getStorageKeys().portal);
|
|
564
790
|
}
|
|
@@ -566,6 +792,6 @@ function getSubscriptionType() {
|
|
|
566
792
|
return parseCookieJson(getStorageKeys().subscriptionType);
|
|
567
793
|
}
|
|
568
794
|
|
|
569
|
-
export { DEV_API_URL, DEV_PORTAL_ID, HUBSPOT_DATA, HUB_ID, clearAccessToken, config, configureLogger, didLastRefreshFail, ensureValidRefresh, getAccessToken, getPortal, getProfile, getRefreshToken, getSubscriptionType, hasRefreshSession, hasValidAccessToken, isAccessTokenExpired, isAuthenticateApp, isAuthenticated, isExpiresAccessToken, isHttpTracingEnabled, isRefreshInFlight, isSessionRefreshExhausted, logger, refreshSession, resetSessionAuthState, sanitizeAxiosErrorData, setAccessToken, setConfig, setIframeStorageMode, setLoggedInDetails, setPortal, setProfileDetails, setRefreshBufferSeconds, setRefreshCallback, setRefreshToken, setRuntimeHttpClientHubContext, setSessionLifecycleListener, setSubscriptionType, storAccessToken, storage };
|
|
570
|
-
//# sourceMappingURL=chunk-
|
|
571
|
-
//# sourceMappingURL=chunk-
|
|
795
|
+
export { DEV_API_URL, DEV_PORTAL_ID, HUBSPOT_DATA, HUB_ID, clearAccessToken, clearMfaPendingAccessToken, clearRefreshToken, clearSessionRefreshExhaustedState, config, configureLogger, didLastRefreshFail, ensureValidRefresh, getAccessToken, getPortal, getProfile, getRefreshToken, getSubscriptionType, hasRefreshSession, hasValidAccessToken, hydrateMfaPendingAccessToken, hydrateSessionRefreshState, isAccessTokenExpired, isAuthenticateApp, isAuthenticated, isExpiresAccessToken, isHttpTracingEnabled, isMfaPendingAccessSession, isRefreshInFlight, isSessionRefreshExhausted, logger, readMfaPendingAccessToken, refreshSession, resetSessionAuthState, sanitizeAxiosErrorData, setAccessToken, setConfig, setIframeStorageMode, setLoggedInDetails, setPortal, setProfileDetails, setRefreshBufferSeconds, setRefreshCallback, setRefreshToken, setRuntimeHttpClientHubContext, setSessionLifecycleListener, setSubscriptionType, storAccessToken, storage, storeMfaPendingAccessToken };
|
|
796
|
+
//# sourceMappingURL=chunk-5NONTYJA.js.map
|
|
797
|
+
//# sourceMappingURL=chunk-5NONTYJA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/main/core/utils/constants.ts","../src/main/core/utils/localStorage.ts","../src/main/core/utils/runtime-hub-context.ts","../src/main/core/utils/hub-context.ts","../src/main/core/http/iframe-session-storage.ts","../src/main/core/utils/error-log-sanitize.ts","../src/main/core/logging/logger.ts","../src/main/core/auth/mfa-pending-token-storage.ts","../src/main/core/http/refresh-lock.ts","../src/main/core/http/token-store.ts","../src/main/core/http/auth-utils.ts"],"names":["config","storage","getRefreshToken"],"mappings":"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","file":"chunk-5NONTYJA.js","sourcesContent":["import { WP_STORAGE_KEYS } from './wp-storage-keys'\n\n// cookies (canonical wp.c.* names)\nexport const LOGIN_DETAILS = WP_STORAGE_KEYS.c.auth.login\nexport const REFRESH_TOKEN = WP_STORAGE_KEYS.c.auth.refresh\nexport const PORTAL = WP_STORAGE_KEYS.c.auth.portal\nexport const SUBSCRIPTION_TYPE = WP_STORAGE_KEYS.c.auth.sub\n\n// hub context fields inside wp.c.hub JSON blob\nexport const HUBSPOT_DATA = WP_STORAGE_KEYS.c.hub\nexport const HUB_ID = 'hubId'\nexport const DEV_PORTAL_ID = 'devPortalId'\nexport const PORTAL_ID = 'portalId'\nexport const DEV_API_URL = 'devApiUrl'\n","type StringStore = {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nconst memory = new Map<string, string>()\n\nconst memoryStore: StringStore = {\n getItem(key: string) {\n return memory.has(key) ? memory.get(key)! : null\n },\n setItem(key: string, value: string) {\n memory.set(key, value)\n },\n removeItem(key: string) {\n memory.delete(key)\n }\n}\n\nfunction resolveStore(): StringStore {\n if (typeof globalThis === 'undefined') {\n return memoryStore\n }\n const ls = (globalThis as unknown as { localStorage?: StringStore }).localStorage\n if (!ls || typeof ls.getItem !== 'function') {\n return memoryStore\n }\n try {\n const probeKey = '__woodsportal_client_sdk_ls_probe__'\n ls.setItem(probeKey, '1')\n ls.removeItem(probeKey)\n return ls\n } catch {\n return memoryStore\n }\n}\n\nexport const storage = {\n set: (key: string, value: unknown) => {\n resolveStore().setItem(key, JSON.stringify(value))\n },\n\n get: <T>(key: string): T | null => {\n const item = resolveStore().getItem(key)\n return item ? (JSON.parse(item) as T) : null\n },\n\n remove: (key: string) => {\n resolveStore().removeItem(key)\n }\n}\n","/** Initialized HTTP client hub context — fallback when storage is empty (avoids import cycles). */\nlet initializedHubId = ''\nlet initializedDevPortalId = ''\nlet initializedDevApiUrl = ''\n\nexport function setRuntimeHttpClientHubContext(partial: { hubId?: string; devPortalId?: string; devApiUrl?: string }): void {\n if (partial.hubId != null) {\n initializedHubId = partial.hubId\n }\n if (partial.devPortalId != null) {\n initializedDevPortalId = partial.devPortalId\n }\n if (partial.devApiUrl != null) {\n initializedDevApiUrl = partial.devApiUrl\n }\n}\n\nexport function getRuntimeHttpClientHubId(): string {\n return initializedHubId\n}\n\nexport function getRuntimeHttpClientDevPortalId(): string {\n return initializedDevPortalId\n}\n\nexport function getRuntimeHttpClientDevApiUrl(): string {\n return initializedDevApiUrl\n}\n\n/** @internal Vitest only */\nexport function resetRuntimeHttpClientHubContextForTests(): void {\n initializedHubId = ''\n initializedDevPortalId = ''\n initializedDevApiUrl = ''\n}\n","import { Config, HubspotStorage } from '../types'\nimport { HUBSPOT_DATA, HUB_ID, DEV_PORTAL_ID, PORTAL_ID, DEV_API_URL } from './constants'\nimport { storage } from './localStorage'\nimport { getRuntimeHttpClientDevApiUrl, getRuntimeHttpClientDevPortalId, getRuntimeHttpClientHubId } from './runtime-hub-context'\n\nfunction readStorageField(key: string): string {\n const hubSpotData = storage.get<Record<string, string>>(HUBSPOT_DATA)\n const value = hubSpotData?.[key]\n return value != null && String(value).trim() !== '' ? String(value) : ''\n}\n\nexport const config = {\n get hubId() {\n return readStorageField(HUB_ID) || getRuntimeHttpClientHubId()\n },\n get devPortalId() {\n return readStorageField(DEV_PORTAL_ID) || getRuntimeHttpClientDevPortalId()\n },\n get portalId() {\n return readStorageField(PORTAL_ID)\n },\n get devApiUrl() {\n return readStorageField(DEV_API_URL) || getRuntimeHttpClientDevApiUrl()\n }\n} satisfies Config\n\nexport const setConfig = {\n setDevPortalId(portalId: string) {\n const existing = storage.get<HubspotStorage>(HUBSPOT_DATA) || {}\n\n storage.set(HUBSPOT_DATA, {\n ...existing,\n [PORTAL_ID]: portalId\n })\n }\n}\n","/**\n * Iframe-safe refresh token persistence (HubSpot CMS editor third-party cookie fallback).\n */\n\nimport { wpClientIframeRefreshExpKey, wpClientIframeRefreshKey, WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\nimport { config } from '../utils/hub-context'\n\nlet iframeStorageMode = false\n\nexport function setIframeStorageMode(enabled: boolean): void {\n iframeStorageMode = enabled\n}\n\nexport function isIframeStorageMode(): boolean {\n return iframeStorageMode\n}\n\nfunction resolveHubId(): string | number {\n const fromWindow =\n typeof window !== 'undefined' ? (window as Window & { hubSpotData?: { hubId?: string | number } }).hubSpotData?.hubId : undefined\n const fromConfig = config.hubId\n return fromWindow ?? fromConfig ?? 'default'\n}\n\nfunction iframeKey(): string {\n return wpClientIframeRefreshKey(resolveHubId())\n}\n\nfunction iframeExpKey(): string {\n return wpClientIframeRefreshExpKey(resolveHubId())\n}\n\nexport function readIframeRefreshToken(): string | null {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null\n }\n try {\n const raw = window.localStorage.getItem(iframeKey())\n return raw ? (JSON.parse(raw) as string) : null\n } catch {\n return null\n }\n}\n\nexport function writeIframeRefreshToken(token: string, expiresAtMs?: number): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.setItem(iframeKey(), JSON.stringify(token))\n if (expiresAtMs != null) {\n window.localStorage.setItem(iframeExpKey(), String(expiresAtMs))\n }\n } catch {\n // private mode / blocked storage\n }\n}\n\nexport function clearIframeRefreshToken(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.removeItem(iframeKey())\n window.localStorage.removeItem(iframeExpKey())\n } catch {\n // ignore\n }\n}\n\nexport function iframeRefreshTokenExpired(): boolean {\n if (typeof window === 'undefined' || !window.localStorage) {\n return true\n }\n try {\n const expRaw = window.localStorage.getItem(iframeExpKey())\n if (!expRaw) {\n return false\n }\n const exp = Number(expRaw)\n return Number.isFinite(exp) && Date.now() > exp\n } catch {\n return true\n }\n}\n\nexport function listIframeRefreshKeyPrefixes(): string[] {\n return ['wp_iframe_rt_', WP_STORAGE_KEYS.c.auth.iframeRtPrefix]\n}\n","const SENSITIVE_FIELD_NAMES = new Set(['token', 'refreshtoken', 'accesstoken', 'password', 'secret', 'authorization', 'otp', 'code'])\n\nfunction isSensitiveField(name: string): boolean {\n const normalized = name.toLowerCase()\n return SENSITIVE_FIELD_NAMES.has(normalized) || normalized.includes('password')\n}\n\nfunction redactValue(value: unknown): unknown {\n if (value == null || typeof value !== 'object') {\n return value\n }\n if (Array.isArray(value)) {\n return value.map(redactValue)\n }\n\n const input = value as Record<string, unknown>\n const output: Record<string, unknown> = {}\n for (const [key, nested] of Object.entries(input)) {\n output[key] = isSensitiveField(key) ? '[redacted]' : redactValue(nested)\n }\n return output\n}\n\n/** Prefer structured API error fields; fall back to redacted payload. */\nexport function sanitizeAxiosErrorData(data: unknown): unknown {\n if (data == null || typeof data !== 'object') {\n return data\n }\n\n const payload = data as Record<string, unknown>\n const safeFields = ['errorCode', 'message', 'errorMessage', 'detailedMessage', 'correlationId', 'category', 'statusCode'] as const\n\n const summary: Record<string, unknown> = {}\n for (const field of safeFields) {\n if (field in payload) {\n summary[field] = payload[field]\n }\n }\n\n if (Object.keys(summary).length > 0) {\n return summary\n }\n\n return redactValue(payload)\n}\n\n/** Redact sensitive keys from arbitrary log metadata. */\nexport function redactLogMeta(meta: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (meta == null) {\n return meta\n }\n return redactValue(meta) as Record<string, unknown>\n}\n","import axios from 'axios'\nimport { sanitizeAxiosErrorData, redactLogMeta } from '../utils/error-log-sanitize'\nimport type { LogLevel, LogMeta, LoggerConfig, SdkLogger } from './logger-types'\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4\n}\n\nconst DEFAULT_CONFIG = {\n level: 'info' as LogLevel,\n namespace: 'woodsportal-sdk',\n enabled: true,\n httpTracing: true\n}\n\nlet runtimeConfig = { ...DEFAULT_CONFIG }\nlet customSinks: LoggerConfig['sinks']\n\nfunction shouldEmit(level: LogLevel): boolean {\n if (!runtimeConfig.enabled || runtimeConfig.level === 'silent') {\n return false\n }\n return LEVEL_RANK[level] >= LEVEL_RANK[runtimeConfig.level]\n}\n\nfunction formatPrefix(context: string): string {\n return `[${runtimeConfig.namespace}] ${context}`\n}\n\nfunction defaultDebug(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.debug(formatPrefix(context), message, meta)\n return\n }\n console.debug(formatPrefix(context), message)\n}\n\nfunction defaultInfo(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.info(formatPrefix(context), message, meta)\n return\n }\n console.info(formatPrefix(context), message)\n}\n\nfunction defaultWarn(context: string, message: string, meta?: LogMeta): void {\n if (meta != null) {\n console.warn(formatPrefix(context), message, meta)\n return\n }\n console.warn(formatPrefix(context), message)\n}\n\nfunction defaultError(context: string, error: unknown, meta?: LogMeta): void {\n if (axios.isAxiosError(error)) {\n const payload = {\n message: error.message,\n status: error.response?.status,\n statusText: error.response?.statusText,\n data: sanitizeAxiosErrorData(error.response?.data),\n url: error.config?.url,\n method: error.config?.method,\n ...redactLogMeta(meta)\n }\n console.error(formatPrefix(context), payload)\n return\n }\n\n if (error instanceof Error) {\n if (meta != null) {\n console.error(formatPrefix(context), error.message, error, redactLogMeta(meta))\n return\n }\n console.error(formatPrefix(context), error.message, error)\n return\n }\n\n if (meta != null) {\n console.error(formatPrefix(context), error, redactLogMeta(meta))\n return\n }\n console.error(formatPrefix(context), error)\n}\n\nexport function configureLogger(config: LoggerConfig = {}): void {\n runtimeConfig = {\n level: config.level ?? DEFAULT_CONFIG.level,\n namespace: config.namespace ?? DEFAULT_CONFIG.namespace,\n enabled: config.enabled ?? DEFAULT_CONFIG.enabled,\n httpTracing: config.httpTracing ?? DEFAULT_CONFIG.httpTracing\n }\n customSinks = config.sinks\n}\n\n/** Test helper — restore defaults between test files. */\nexport function resetLoggerForTests(): void {\n runtimeConfig = { ...DEFAULT_CONFIG }\n customSinks = undefined\n}\n\nexport function isHttpTracingEnabled(): boolean {\n return runtimeConfig.enabled && runtimeConfig.httpTracing && shouldEmit('debug')\n}\n\nexport function getLoggerLevel(): LogLevel {\n return runtimeConfig.level\n}\n\nexport const logger: SdkLogger = {\n debug(context, message, meta) {\n if (!shouldEmit('debug')) return\n const sink = customSinks?.debug ?? defaultDebug\n sink(context, message, redactLogMeta(meta))\n },\n info(context, message, meta) {\n if (!shouldEmit('info')) return\n const sink = customSinks?.info ?? defaultInfo\n sink(context, message, redactLogMeta(meta))\n },\n warn(context, message, meta) {\n if (!shouldEmit('warn')) return\n const sink = customSinks?.warn ?? defaultWarn\n sink(context, message, redactLogMeta(meta))\n },\n error(context, error, meta) {\n if (!shouldEmit('error')) return\n const sink = customSinks?.error ?? defaultError\n sink(context, error, redactLogMeta(meta))\n }\n}\n\nexport type { LogLevel, LogMeta, LoggerConfig, SdkLogger } from './logger-types'\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\n\nexport type MfaStorageLane = 'c' | 'a'\n\ntype MfaPendingTokenKeys = {\n token: string\n exp: string\n}\n\nfunction keysForLane(lane: MfaStorageLane): MfaPendingTokenKeys {\n const mfa = lane === 'a' ? WP_STORAGE_KEYS.a.mfa : WP_STORAGE_KEYS.c.mfa\n return {\n token: mfa.pendingToken,\n exp: mfa.pendingTokenExp\n }\n}\n\nexport type MfaPendingAccessToken = {\n token: string\n expiresAt: number\n}\n\nfunction readExpiresAt(raw: string | null): number | null {\n if (raw == null || raw === '') {\n return null\n }\n const parsed = Number(raw)\n return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction getSessionStorage(): Storage | null {\n if (typeof globalThis === 'undefined') {\n return null\n }\n try {\n if (globalThis.sessionStorage != null) {\n return globalThis.sessionStorage\n }\n const win = globalThis.window as (Window & typeof globalThis) | undefined\n return win?.sessionStorage ?? null\n } catch {\n return null\n }\n}\n\n/** Persist temp MFA access JWT for mid-gate page refresh (tab-scoped sessionStorage). */\nexport function storeMfaPendingAccessToken(token: string, expiresInSeconds: number | undefined, lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n if (!token || typeof token !== 'string') {\n return\n }\n\n const keys = keysForLane(lane)\n const expiresAt =\n typeof expiresInSeconds === 'number' && expiresInSeconds > 0 ? Date.now() + expiresInSeconds * 1000 : Date.now() + 15 * 60 * 1000\n\n try {\n storage.setItem(keys.token, token)\n storage.setItem(keys.exp, String(expiresAt))\n } catch {\n // ignore quota / private mode\n }\n}\n\n/** Read temp MFA JWT if present and not expired. */\nexport function readMfaPendingAccessToken(lane: MfaStorageLane = 'c'): MfaPendingAccessToken | null {\n const storage = getSessionStorage()\n if (!storage) {\n return null\n }\n\n const keys = keysForLane(lane)\n try {\n const token = storage.getItem(keys.token)\n if (!token) {\n return null\n }\n\n const expiresAt = readExpiresAt(storage.getItem(keys.exp))\n if (expiresAt == null || Date.now() >= expiresAt) {\n clearMfaPendingAccessToken(lane)\n return null\n }\n\n return { token, expiresAt }\n } catch {\n return null\n }\n}\n\nexport function clearMfaPendingAccessToken(lane: MfaStorageLane = 'c'): void {\n const storage = getSessionStorage()\n if (!storage) {\n return\n }\n\n const keys = keysForLane(lane)\n try {\n storage.removeItem(keys.token)\n storage.removeItem(keys.exp)\n } catch {\n // ignore\n }\n}\n\n/** True when sessionStorage holds a valid temp MFA access JWT for the lane. */\nexport function isMfaPendingAccessSession(lane: MfaStorageLane = 'c'): boolean {\n return readMfaPendingAccessToken(lane) != null\n}\n\nexport type HydrateMfaPendingAccessTokenInput = {\n lane?: MfaStorageLane\n setAccessToken: (token: string, expiresInSeconds?: number) => void | Promise<void>\n}\n\n/** Restore in-memory MFA temp JWT from sessionStorage after refresh. Returns true when hydrated. */\nexport async function hydrateMfaPendingAccessToken(input: HydrateMfaPendingAccessTokenInput): Promise<boolean> {\n const lane = input.lane ?? 'c'\n const pending = readMfaPendingAccessToken(lane)\n if (!pending) {\n return false\n }\n\n const ttlSeconds = Math.max(1, Math.floor((pending.expiresAt - Date.now()) / 1000))\n await input.setAccessToken(pending.token, ttlSeconds)\n return true\n}\n","import { WP_STORAGE_KEYS } from '../utils/wp-storage-keys'\n\nconst LOCK_NAME = 'wp.client.auth.refresh'\nconst STORAGE_LOCK_KEY = WP_STORAGE_KEYS.c.auth.refreshLock\nconst LOCK_TTL_MS = 30_000\n\nasync function withNavigatorLock<T>(fn: () => Promise<T>): Promise<T> {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return navigator.locks.request(LOCK_NAME, fn)\n }\n return fn()\n}\n\nfunction tryAcquireStorageLock(): boolean {\n if (typeof window === 'undefined' || !window.localStorage) {\n return true\n }\n try {\n const raw = window.localStorage.getItem(STORAGE_LOCK_KEY)\n const now = Date.now()\n if (raw) {\n const ts = Number(raw)\n if (Number.isFinite(ts) && now - ts < LOCK_TTL_MS) {\n return false\n }\n }\n window.localStorage.setItem(STORAGE_LOCK_KEY, String(now))\n return true\n } catch {\n return true\n }\n}\n\nfunction releaseStorageLock(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n window.localStorage.removeItem(STORAGE_LOCK_KEY)\n } catch {\n // ignore\n }\n}\n\nasync function waitForStorageLock(maxWaitMs = LOCK_TTL_MS): Promise<void> {\n const start = Date.now()\n while (Date.now() - start < maxWaitMs) {\n if (tryAcquireStorageLock()) {\n return\n }\n await new Promise((r) => setTimeout(r, 200))\n }\n}\n\n/**\n * Cross-tab singleflight around refresh token rotation.\n */\nexport async function withRefreshLock<T>(fn: () => Promise<T>): Promise<T> {\n return withNavigatorLock(async () => {\n await waitForStorageLock()\n try {\n return await fn()\n } finally {\n releaseStorageLock()\n }\n })\n}\n\n/** Test-only: drop stale cross-tab refresh lock from localStorage. */\nexport function clearRefreshLockForTests(): void {\n try {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n window.localStorage.removeItem(STORAGE_LOCK_KEY)\n } catch {\n // ignore — jsdom may be torn down between files\n }\n}\n","/**\n\n * Token storage utilities\n\n * These functions handle access token management\n\n */\n\nimport { getCookie, isCookieExpired, isCorruptCookieRawValue } from '../utils/cookie.js'\n\nimport { getStorageKeys } from '../utils/storage-keys'\nimport { WP_STORAGE_KEYS } from '../utils/wp-storage-keys.js'\nimport { isIframeStorageMode, readIframeRefreshToken } from './iframe-session-storage.js'\nimport { logger } from '../logging/logger.js'\nimport { isMfaPendingAccessSession } from '../auth/mfa-pending-token-storage.js'\nimport { withRefreshLock } from './refresh-lock.js'\n\nlet accessToken: string | null = null\n\nlet tokenExpiresAt: number | null = null\n\nlet accessTtlMs: number | null = null\n\nlet refreshCallback: ((refreshToken: string) => Promise<{ token: string | null; success: boolean }>) | null = null\n\nlet refreshBufferSeconds = 60\n\nlet refreshPromise: Promise<void> | null = null\n\nlet lastRefreshFailed = false\n\nlet lastSuccessfulRefreshAt: number | null = null\n\nlet sessionLifecycleListener: (() => void) | null = null\n\nconst MIN_SHORT_TTL_BUFFER_MS = 5_000\n\nconst MIN_PROACTIVE_REFRESH_INTERVAL_MS = 30_000\n\n/** Exported for unit tests. */\n\nexport function getEffectiveBufferMs(ttlMs: number): number {\n const capMs = refreshBufferSeconds * 1000\n\n let buffer: number\n if (ttlMs <= capMs) {\n buffer = Math.max(MIN_SHORT_TTL_BUFFER_MS, Math.floor(ttlMs * 0.2))\n } else {\n buffer = capMs\n }\n\n // Buffer must stay inside the token lifetime — otherwise every request looks \"expired\".\n const maxBuffer = Math.max(0, ttlMs - 1_000)\n return Math.min(buffer, maxBuffer)\n}\n\nfunction getCurrentBufferMs(): number {\n if (accessTtlMs != null && accessTtlMs > 0) {\n return getEffectiveBufferMs(accessTtlMs)\n }\n\n return refreshBufferSeconds * 1000\n}\n\nexport function getAccessToken(): string | null {\n return accessToken\n}\n\nexport function setSessionLifecycleListener(listener: (() => void) | null): void {\n sessionLifecycleListener = listener\n}\n\nfunction notifySessionLifecycleChange(): void {\n try {\n sessionLifecycleListener?.()\n } catch {\n // ignore listener errors\n }\n}\n\nfunction persistRefreshExhausted(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n window.sessionStorage.setItem(WP_STORAGE_KEYS.c.auth.refreshExhausted, JSON.stringify({ ts: Date.now() }))\n } catch {\n // ignore quota / private mode\n }\n}\n\nfunction clearPersistedRefreshExhausted(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n window.sessionStorage.removeItem(WP_STORAGE_KEYS.c.auth.refreshExhausted)\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedRefreshExhausted(): boolean {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return false\n }\n try {\n return Boolean(window.sessionStorage.getItem(WP_STORAGE_KEYS.c.auth.refreshExhausted))\n } catch {\n return false\n }\n}\n\n/** Restore in-memory refresh-failure state after a full page reload (same tab). */\nexport function hydrateSessionRefreshState(): void {\n if (readPersistedRefreshExhausted()) {\n lastRefreshFailed = true\n }\n}\n\nexport function clearSessionRefreshExhaustedState(): void {\n lastRefreshFailed = false\n clearPersistedRefreshExhausted()\n}\n\nfunction markRefreshFailed(): void {\n lastRefreshFailed = true\n persistRefreshExhausted()\n clearAccessToken()\n notifySessionLifecycleChange()\n}\n\nexport function storAccessToken(token: string, expiresIn?: number): void {\n accessToken = token\n\n clearSessionRefreshExhaustedState()\n\n if (expiresIn != null && expiresIn > 0) {\n accessTtlMs = expiresIn * 1000\n\n tokenExpiresAt = Date.now() + accessTtlMs\n } else {\n accessTtlMs = null\n\n tokenExpiresAt = null\n }\n\n notifySessionLifecycleChange()\n}\n\nexport function clearAccessToken(): void {\n accessToken = null\n\n tokenExpiresAt = null\n\n accessTtlMs = null\n\n lastSuccessfulRefreshAt = null\n}\n\n/** Clears proactive refresh throttle only — refresh exhaustion survives until login or T3 sessionStorage clear. */\nexport function resetSessionAuthState(): void {\n lastSuccessfulRefreshAt = null\n}\n\nexport function setRefreshBufferSeconds(seconds: number): void {\n refreshBufferSeconds = Math.max(0, seconds)\n}\n\nexport function getRefreshBufferSeconds(): number {\n return refreshBufferSeconds\n}\n\nexport function didLastRefreshFail(): boolean {\n return lastRefreshFailed\n}\n\n/** Alias for route guards — refresh was attempted and failed with no new access JWT. */\nexport function isSessionRefreshExhausted(): boolean {\n if (lastRefreshFailed) {\n return true\n }\n if (readPersistedRefreshExhausted()) {\n lastRefreshFailed = true\n return true\n }\n return false\n}\n\nexport function isExpiresAccessToken(): boolean {\n if (!accessToken) return true\n\n if (tokenExpiresAt === null) return false\n\n const bufferMs = getCurrentBufferMs()\n\n return Date.now() >= tokenExpiresAt - bufferMs\n}\n\n/**\n\n * Set the refresh callback function\n\n * This is called by the HTTP client during initialization\n\n */\n\nexport function setRefreshCallback(callback: (refreshToken: string) => Promise<{ token: string | null; success: boolean }>): void {\n refreshCallback = callback\n}\n\nexport function isRefreshInFlight(): boolean {\n return refreshPromise != null\n}\n\nexport type RefreshSessionOptions = {\n /** Bypass min proactive refresh interval (e.g. 401 retry, cold bootstrap). */\n\n force?: boolean\n}\n\n/** Single deduped refresh entry point for bootstrap, HTTP client, and visibility handlers. */\n\nexport async function refreshSession(options: RefreshSessionOptions = {}): Promise<void> {\n const { force = false } = options\n\n if (isMfaPendingAccessSession('c') || isMfaPendingAccessSession('a')) {\n return\n }\n\n if (!force && lastSuccessfulRefreshAt != null && Date.now() - lastSuccessfulRefreshAt < MIN_PROACTIVE_REFRESH_INTERVAL_MS) {\n return\n }\n\n if (!refreshCallback) {\n return\n }\n\n if (!refreshPromise) {\n refreshPromise = (async () => {\n await withRefreshLock(async () => {\n const { getRefreshToken } = await import('./auth-utils.js')\n const refreshToken = getRefreshToken()\n\n if (!refreshToken) {\n markRefreshFailed()\n\n const storageKey = getStorageKeys().refreshToken\n const hasCookieKey =\n typeof document !== 'undefined' &&\n typeof storageKey === 'string' &&\n storageKey.length > 0 &&\n document.cookie.includes(`${storageKey}=`)\n\n logger.warn('auth', 'refresh session aborted: missing refresh token', {\n operation: 'refreshSession',\n storageKey,\n hasCookieKey,\n iframeStorageMode: isIframeStorageMode()\n })\n\n throw new Error('Session expired: missing refresh token')\n }\n\n const result = await refreshCallback!(refreshToken)\n\n if (!result.success || !result.token) {\n markRefreshFailed()\n\n throw new Error('Session refresh failed')\n }\n\n lastRefreshFailed = false\n\n lastSuccessfulRefreshAt = Date.now()\n })\n })().finally(() => {\n refreshPromise = null\n })\n }\n\n await refreshPromise\n}\n\n/**\n\n * Ensures the access token is valid, refreshing if necessary.\n\n * Throws when refresh is required but fails (avoids bearer-less 401 loops).\n\n */\n\nexport async function ensureValidRefresh(): Promise<void> {\n if (isMfaPendingAccessSession('c') || isMfaPendingAccessSession('a')) {\n return\n }\n\n if (!isExpiresAccessToken()) {\n return\n }\n\n // Pre-request refresh must not be throttled by the proactive min interval.\n await refreshSession({ force: true })\n}\n\nexport function isAuthenticateApp() {\n const token = getAccessToken()\n\n if (token) {\n const bufferMs = getCurrentBufferMs()\n\n if (tokenExpiresAt === null || Date.now() < tokenExpiresAt - bufferMs) {\n return true\n }\n }\n\n if (!isCookieExpired(getStorageKeys().refreshToken)) {\n if (lastRefreshFailed && !token) {\n return false\n }\n return true\n }\n\n return false\n}\n\n/** Preferred 3.0 name for {@link isAuthenticateApp}. */\n\nexport function isAuthenticated() {\n return isAuthenticateApp()\n}\n\n/** Preferred 3.0 name for {@link isExpiresAccessToken}. */\n\nexport function isAccessTokenExpired() {\n return isExpiresAccessToken()\n}\n\nexport function hasRefreshSession(): boolean {\n if (isSessionRefreshExhausted() && !accessToken) {\n return false\n }\n const refreshKey = getStorageKeys().refreshToken\n if (!refreshKey || isCookieExpired(refreshKey)) {\n return false\n }\n if (!readRefreshTokenValue()) {\n return false\n }\n if (lastRefreshFailed && !accessToken) {\n return false\n }\n return true\n}\n\nfunction readRefreshTokenValue(): string | null {\n const key = getStorageKeys().refreshToken\n const raw = getCookie(key)\n if (!isCorruptCookieRawValue(raw)) {\n return raw\n }\n if (isIframeStorageMode()) {\n return readIframeRefreshToken()\n }\n return null\n}\n\nexport function hasValidAccessToken(): boolean {\n return Boolean(getAccessToken()) && !isExpiresAccessToken()\n}\n","/**\n\n * Authentication utility functions\n\n * These handle refresh token management\n\n */\n\nimport { setCookie, parseCookieJson, stringifyCookieValue, getCookie, isCorruptCookieRawValue, removeCookie } from '../utils/cookie'\n\nimport { getStorageKeys } from '../utils/storage-keys'\n\nimport { storAccessToken } from './token-store'\n\nimport { isIframeStorageMode, readIframeRefreshToken, writeIframeRefreshToken } from './iframe-session-storage'\n\nfunction writeJsonCookie(key: string | undefined, data: unknown, expire?: number | Date): void {\n if (!key) {\n return\n }\n\n const serialized = stringifyCookieValue(data)\n\n if (serialized == null) {\n return\n }\n\n setCookie(key, serialized, expire)\n}\n\n// Set data\n\nexport const setLoggedInDetails = async (data: any) => {\n return new Promise((resolve: any) => {\n const keys = getStorageKeys()\n\n writeJsonCookie(keys.loginDetails, data)\n\n if (keys.authUser !== keys.loginDetails) {\n writeJsonCookie(keys.authUser, data)\n }\n\n resolve()\n })\n}\n\nexport const setProfileDetails = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().loginDetails, data)\n\n resolve()\n })\n}\n\nexport function setRefreshToken(token: string, expiresAt: number) {\n return new Promise((resolve: any) => {\n if (!token || typeof token !== 'string') {\n resolve()\n\n return\n }\n\n let expiresMs: number\n\n if (typeof expiresAt === 'number' && expiresAt > 1_000_000_000_000) {\n expiresMs = expiresAt\n } else if (typeof expiresAt === 'number' && expiresAt > 1_000_000_000) {\n expiresMs = expiresAt * 1000\n } else {\n expiresMs = Date.now() + (expiresAt || 0) * 1000\n }\n\n const serialized = stringifyCookieValue(token)\n\n if (serialized != null) {\n setCookie(getStorageKeys().refreshToken, serialized, new Date(expiresMs))\n }\n\n if (isIframeStorageMode()) {\n writeIframeRefreshToken(token, expiresMs)\n }\n\n resolve()\n })\n}\n\nexport function setAccessToken(token: string, expiresIn?: number) {\n return new Promise((resolve: any) => {\n storAccessToken(token, expiresIn)\n\n resolve()\n })\n}\n\nexport const setPortal = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().portal, data ?? {})\n\n resolve()\n })\n}\n\nexport const setSubscriptionType = async (data: any) => {\n return new Promise((resolve: any) => {\n writeJsonCookie(getStorageKeys().subscriptionType, data ?? 'BASIC')\n\n resolve()\n })\n}\n\n// Get data\n\nexport function getProfile(): string | null {\n return parseCookieJson(getStorageKeys().loginDetails)\n}\n\nexport function getRefreshToken(): string | null {\n const raw = getCookie(getStorageKeys().refreshToken)\n\n if (!isCorruptCookieRawValue(raw)) {\n return raw\n }\n\n if (isIframeStorageMode()) {\n return readIframeRefreshToken()\n }\n\n return null\n}\n\n/** Clears stored refresh token (e.g. when entering MFA pending gate). */\nexport function clearRefreshToken(): void {\n const key = getStorageKeys().refreshToken\n if (key) {\n removeCookie(key)\n }\n if (isIframeStorageMode()) {\n writeIframeRefreshToken('', 0)\n }\n}\n\nexport function getPortal(): any | null {\n return parseCookieJson(getStorageKeys().portal)\n}\n\nexport function getSubscriptionType(): string | null {\n return parseCookieJson<string>(getStorageKeys().subscriptionType)\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WP_STORAGE_KEYS, CLIENT_COOKIE_MIGRATIONS, CLIENT_SESSION_STORAGE_MIGRATIONS, LEGACY_CLIENT_AUTH_COOKIES, LEGACY_CLIENT_SESSION_EXACT, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey, WP_UI_THEME } from './chunk-
|
|
1
|
+
import { WP_STORAGE_KEYS, CLIENT_COOKIE_MIGRATIONS, CLIENT_SESSION_STORAGE_MIGRATIONS, LEGACY_CLIENT_AUTH_COOKIES, LEGACY_CLIENT_SESSION_EXACT, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey, WP_UI_THEME } from './chunk-UDAPRD7Z.js';
|
|
2
2
|
import Cookies from 'js-cookie';
|
|
3
3
|
|
|
4
4
|
// src/main/core/utils/storage-keys.ts
|
|
@@ -77,6 +77,9 @@ function parseCookieJson(key) {
|
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
var removeCookie = (key) => {
|
|
81
|
+
return Cookies.remove(key);
|
|
82
|
+
};
|
|
80
83
|
var clearClientAuthCookies = () => {
|
|
81
84
|
getClientAuthCookieNamesToClear().forEach((name) => Cookies.remove(name));
|
|
82
85
|
for (const legacyAccess of ["woodsportal_access_token", "AUTH_CRED"]) {
|
|
@@ -263,7 +266,7 @@ function clearClientSessionStorageKeys() {
|
|
|
263
266
|
if (key.startsWith("woodsportal.mfa.") || key.startsWith("wp.c.mfa.")) {
|
|
264
267
|
keysToRemove.push(key);
|
|
265
268
|
}
|
|
266
|
-
if (key === WP_STORAGE_KEYS.c.auth.err || key === "authError") {
|
|
269
|
+
if (key === WP_STORAGE_KEYS.c.auth.err || key === WP_STORAGE_KEYS.c.auth.refreshExhausted || key === "authError") {
|
|
267
270
|
keysToRemove.push(key);
|
|
268
271
|
}
|
|
269
272
|
if (key === WP_STORAGE_KEYS.c.sso.cb || key === "sso_callback_processed") {
|
|
@@ -301,6 +304,6 @@ function clearStaleIframeRefreshForOtherHubs(activeHubId) {
|
|
|
301
304
|
}
|
|
302
305
|
}
|
|
303
306
|
|
|
304
|
-
export { clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureStorageKeys, getClientAuthCookieNamesToClear, getCookie, getStorageKeys, isCookieExpired, isCorruptCookieRawValue, migrateLegacyStorageKeys, parseCookieJson, resetStorageKeysForTests, setCookie, stringifyCookieValue };
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
306
|
-
//# sourceMappingURL=chunk-
|
|
307
|
+
export { clearClientAuthCookies, clearClientIframeRefreshLocalKeys, clearClientSessionStorageKeys, clearStaleIframeRefreshForOtherHubs, configureStorageKeys, getClientAuthCookieNamesToClear, getCookie, getStorageKeys, isCookieExpired, isCorruptCookieRawValue, migrateLegacyStorageKeys, parseCookieJson, removeCookie, resetStorageKeysForTests, setCookie, stringifyCookieValue };
|
|
308
|
+
//# sourceMappingURL=chunk-6XIX6R4X.js.map
|
|
309
|
+
//# sourceMappingURL=chunk-6XIX6R4X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/main/core/utils/storage-keys.ts","../src/main/core/utils/cookie.ts","../src/main/core/utils/storage-migration.ts"],"names":["Cookies"],"mappings":"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","file":"chunk-6XIX6R4X.js","sourcesContent":["import { WP_STORAGE_KEYS } from './wp-storage-keys'\n\nexport interface StorageKeyConfig {\n loginDetails?: string\n refreshToken?: string\n portal?: string\n subscriptionType?: string\n authUser?: string\n pagination?: string\n routeMenu?: string\n associationView?: string\n emailVerified?: string\n}\n\nconst defaults: Required<StorageKeyConfig> = {\n loginDetails: WP_STORAGE_KEYS.c.auth.login,\n refreshToken: WP_STORAGE_KEYS.c.auth.refresh,\n portal: WP_STORAGE_KEYS.c.auth.portal,\n subscriptionType: WP_STORAGE_KEYS.c.auth.sub,\n authUser: WP_STORAGE_KEYS.c.auth.login,\n pagination: WP_STORAGE_KEYS.c.ui.pag,\n routeMenu: WP_STORAGE_KEYS.c.ui.menu,\n associationView: WP_STORAGE_KEYS.c.ui.assoc,\n emailVerified: WP_STORAGE_KEYS.c.auth.emailOk\n}\n\nlet runtimeKeys: Required<StorageKeyConfig> = { ...defaults }\n\nexport function configureStorageKeys(overrides: StorageKeyConfig = {}): void {\n runtimeKeys = { ...defaults, ...runtimeKeys, ...overrides }\n if (overrides.authUser === undefined) {\n runtimeKeys.authUser = runtimeKeys.loginDetails\n }\n}\n\n/** Test helper — restore default cookie key names. */\nexport function resetStorageKeysForTests(): void {\n runtimeKeys = { ...defaults }\n}\n\nexport function getStorageKeys(): Readonly<Required<StorageKeyConfig>> {\n return runtimeKeys\n}\n\nexport { WP_STORAGE_KEYS } from './wp-storage-keys'\n","import Cookies from 'js-cookie'\nimport { getClientAuthCookieNamesToClear } from './storage-migration'\n\nfunction cookieSecureFlag(): boolean {\n if (typeof window === 'undefined') return true\n return window.location.protocol === 'https:'\n}\n\n/** Values that must never be persisted in readable cookies. */\nexport function isCorruptCookieRawValue(raw: string | null | undefined): boolean {\n return raw == null || raw === '' || raw === 'undefined' || raw === 'null'\n}\n\n/** Serialize a value for cookie storage; returns null when write should be skipped. */\nexport function stringifyCookieValue(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null\n }\n if (typeof value === 'string') {\n return isCorruptCookieRawValue(value) ? null : value\n }\n const serialized = JSON.stringify(value)\n if (serialized === undefined || isCorruptCookieRawValue(serialized)) {\n return null\n }\n return serialized\n}\n\nexport const setCookie = (key: string, value: string, expire?: number | Date) => {\n if (!key || isCorruptCookieRawValue(value)) {\n return undefined\n }\n return Cookies.set(key, value, {\n expires: expire,\n sameSite: cookieSecureFlag() ? 'none' : 'lax',\n secure: cookieSecureFlag()\n })\n}\n\nexport const getCookie: any = (key: any) => {\n return Cookies.get(key)\n}\n\n/** Parse JSON stored in a cookie; removes corrupt values on read (self-heal). */\nexport function parseCookieJson<T = unknown>(key: string | null | undefined): T | null {\n if (key == null || key === '') {\n return null\n }\n const raw = getCookie(key)\n if (isCorruptCookieRawValue(raw)) {\n if (raw === 'undefined' || raw === 'null') {\n Cookies.remove(key)\n }\n return null\n }\n try {\n return JSON.parse(raw) as T\n } catch {\n Cookies.remove(key)\n return null\n }\n}\n\nexport const removeCookie = (key: any) => {\n return Cookies.remove(key)\n}\n\n/** Clears client-portal session cookies only (does not wipe admin cookies on shared localhost). */\nexport const clearClientAuthCookies = () => {\n getClientAuthCookieNamesToClear().forEach((name) => Cookies.remove(name))\n for (const legacyAccess of ['woodsportal_access_token', 'AUTH_CRED']) {\n Cookies.remove(legacyAccess)\n }\n}\n\n/** @deprecated Prefer {@link clearClientAuthCookies} */\nexport const removeAllCookie = clearClientAuthCookies\n\nexport const isCookieExpired = (key: string): boolean => {\n const value = Cookies.get(key)\n if (value === undefined) {\n return true\n }\n try {\n const parsed = JSON.parse(value)\n if (parsed && typeof parsed === 'object' && 'expiresAt' in parsed) {\n const expiresAt = (parsed as { expiresAt?: number }).expiresAt\n return typeof expiresAt === 'number' && Date.now() > expiresAt\n }\n return false\n } catch {\n // Plain string values (e.g. refresh token) rely on browser cookie expiry.\n return false\n }\n}\n","import Cookies from 'js-cookie'\nimport {\n CLIENT_COOKIE_MIGRATIONS,\n CLIENT_SESSION_STORAGE_MIGRATIONS,\n LEGACY_CLIENT_AUTH_COOKIES,\n LEGACY_CLIENT_SESSION_EXACT,\n WP_STORAGE_KEYS,\n WP_UI_THEME,\n wpClientIframeRefreshKey,\n wpClientIframeRefreshExpKey\n} from './wp-storage-keys'\nimport { getStorageKeys } from './storage-keys'\nimport { isCorruptCookieRawValue } from './cookie'\n\nfunction migrateCookiePair(legacy: string, canonical: string): void {\n const value = Cookies.get(legacy)\n if (value === undefined) {\n return\n }\n if (isCorruptCookieRawValue(value)) {\n Cookies.remove(legacy)\n return\n }\n if (!Cookies.get(canonical)) {\n Cookies.set(canonical, value)\n }\n Cookies.remove(legacy)\n}\n\nfunction migrateLocalStoragePair(legacy: string, canonical: string): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const value = window.localStorage.getItem(legacy)\n if (value == null) {\n return\n }\n if (!window.localStorage.getItem(canonical)) {\n window.localStorage.setItem(canonical, value)\n }\n window.localStorage.removeItem(legacy)\n } catch {\n // private mode\n }\n}\n\nfunction migrateSessionStoragePair(legacy: string, canonical: string): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n const value = window.sessionStorage.getItem(legacy)\n if (value == null) {\n return\n }\n if (!window.sessionStorage.getItem(canonical)) {\n window.sessionStorage.setItem(canonical, value)\n }\n window.sessionStorage.removeItem(legacy)\n } catch {\n // ignore\n }\n}\n\nfunction migrateIframeRefreshKeys(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const keys = Object.keys(window.localStorage).filter((k) => k.startsWith('wp_iframe_rt_'))\n for (const legacyKey of keys) {\n const suffix = legacyKey.slice('wp_iframe_rt_'.length)\n if (suffix.endsWith('_exp')) {\n continue\n }\n const hubId = suffix\n const token = window.localStorage.getItem(legacyKey)\n const exp = window.localStorage.getItem(`${legacyKey}_exp`)\n const newKey = wpClientIframeRefreshKey(hubId)\n const newExpKey = wpClientIframeRefreshExpKey(hubId)\n if (token != null && !window.localStorage.getItem(newKey)) {\n window.localStorage.setItem(newKey, token)\n }\n if (exp != null && !window.localStorage.getItem(newExpKey)) {\n window.localStorage.setItem(newExpKey, exp)\n }\n window.localStorage.removeItem(legacyKey)\n window.localStorage.removeItem(`${legacyKey}_exp`)\n }\n } catch {\n // ignore\n }\n}\n\nfunction removeLegacyAccessTokenCookies(): void {\n const keys = getStorageKeys()\n const legacyAccess = ['woodsportal_access_token', 'AUTH_CRED']\n for (const name of legacyAccess) {\n Cookies.remove(name)\n }\n if (keys.authUser && keys.authUser !== keys.loginDetails) {\n // legacy duplicate profile mirror — uplift handled by migration; drop separate user cookie\n Cookies.remove(keys.authUser)\n }\n}\n\n/**\n * One-time uplift: read legacy browser keys, write canonical `wp.*` keys, delete legacy.\n * Safe to call on every boot (idempotent).\n */\nexport function migrateLegacyStorageKeys(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n for (const [legacy, canonical] of CLIENT_COOKIE_MIGRATIONS) {\n migrateCookiePair(legacy, canonical)\n }\n\n migrateLocalStoragePair('hubSpotData', WP_STORAGE_KEYS.c.hub)\n migrateLocalStoragePair('theme', WP_UI_THEME)\n\n for (const [legacy, canonical] of CLIENT_SESSION_STORAGE_MIGRATIONS) {\n migrateSessionStoragePair(legacy, canonical)\n }\n\n migrateIframeRefreshKeys()\n removeLegacyAccessTokenCookies()\n\n // Drop dead forget-password key\n try {\n window.sessionStorage?.removeItem('entredEmail')\n } catch {\n // ignore\n }\n}\n\n/** All client auth cookie names to remove on logout (canonical + legacy + configured). */\nexport function getClientAuthCookieNamesToClear(): string[] {\n const keys = getStorageKeys()\n const configured = [\n keys.loginDetails,\n keys.refreshToken,\n keys.portal,\n keys.subscriptionType,\n keys.authUser,\n keys.pagination,\n keys.routeMenu,\n keys.associationView,\n keys.emailVerified\n ].filter((name): name is string => Boolean(name))\n\n const canonical = [\n WP_STORAGE_KEYS.c.auth.login,\n WP_STORAGE_KEYS.c.auth.refresh,\n WP_STORAGE_KEYS.c.auth.portal,\n WP_STORAGE_KEYS.c.auth.sub,\n WP_STORAGE_KEYS.c.auth.emailOk,\n WP_STORAGE_KEYS.c.ui.pag,\n WP_STORAGE_KEYS.c.ui.menu,\n WP_STORAGE_KEYS.c.ui.assoc\n ]\n\n return [...new Set([...configured, ...canonical, ...LEGACY_CLIENT_AUTH_COOKIES])]\n}\n\nexport function clearClientSessionStorageKeys(): void {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return\n }\n try {\n for (const [legacy, canonical] of CLIENT_SESSION_STORAGE_MIGRATIONS) {\n if (\n canonical === WP_STORAGE_KEYS.c.login.email ||\n canonical === WP_STORAGE_KEYS.c.login.force ||\n canonical === WP_STORAGE_KEYS.c.login.passkey ||\n canonical === WP_STORAGE_KEYS.c.login.done\n ) {\n continue\n }\n window.sessionStorage.removeItem(legacy)\n window.sessionStorage.removeItem(canonical)\n }\n for (const key of LEGACY_CLIENT_SESSION_EXACT) {\n if (key === 'entredEmail') {\n window.sessionStorage.removeItem(key)\n }\n }\n const preservedLoginKeys = new Set([\n WP_STORAGE_KEYS.c.login.email,\n WP_STORAGE_KEYS.c.login.force,\n WP_STORAGE_KEYS.c.login.passkey,\n WP_STORAGE_KEYS.c.login.done,\n 'woodsportal.login.email',\n 'woodsportal.login.forcePreLogin',\n 'woodsportal.login.passkeyPrimaryEnrolled',\n 'woodsportal.login.preLoginCompletedKey'\n ])\n const keysToRemove: string[] = []\n for (let i = 0; i < window.sessionStorage.length; i++) {\n const key = window.sessionStorage.key(i)\n if (!key || preservedLoginKeys.has(key)) continue\n if (key.startsWith('woodsportal.mfa.') || key.startsWith('wp.c.mfa.')) {\n keysToRemove.push(key)\n }\n if (key === WP_STORAGE_KEYS.c.auth.err || key === WP_STORAGE_KEYS.c.auth.refreshExhausted || key === 'authError') {\n keysToRemove.push(key)\n }\n if (key === WP_STORAGE_KEYS.c.sso.cb || key === 'sso_callback_processed') {\n keysToRemove.push(key)\n }\n }\n keysToRemove.forEach((k) => window.sessionStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n\nexport function clearClientIframeRefreshLocalKeys(): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n return\n }\n try {\n const keys = Object.keys(window.localStorage).filter(\n (k) => k.startsWith('wp_iframe_rt_') || k.startsWith(WP_STORAGE_KEYS.c.auth.iframeRtPrefix)\n )\n keys.forEach((k) => window.localStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n\nexport function clearStaleIframeRefreshForOtherHubs(activeHubId: string | number | undefined): void {\n if (activeHubId == null || typeof window === 'undefined' || !window.localStorage) {\n return\n }\n const activePrefix = WP_STORAGE_KEYS.c.auth.iframeRtPrefix\n const activeKey = wpClientIframeRefreshKey(activeHubId)\n try {\n const keys = Object.keys(window.localStorage).filter(\n (k) => (k.startsWith('wp_iframe_rt_') || k.startsWith(activePrefix)) && k !== activeKey && k !== wpClientIframeRefreshExpKey(activeHubId)\n )\n keys.forEach((k) => window.localStorage.removeItem(k))\n } catch {\n // ignore\n }\n}\n"]}
|