woodsportal-client-sdk 4.0.4-dev.8 → 4.0.7-dev.0
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.d.ts +1 -0
- package/dist/adapters/angular/index.js +6 -4
- package/dist/adapters/angular/index.js.map +1 -1
- package/dist/adapters/react/index.d.ts +1 -0
- package/dist/adapters/react/index.js +6 -4
- package/dist/adapters/react/index.js.map +1 -1
- package/dist/adapters/vue/index.d.ts +1 -0
- package/dist/adapters/vue/index.js +6 -4
- package/dist/adapters/vue/index.js.map +1 -1
- package/dist/auth-error-codes-D7CXVBEN.js +3 -0
- package/dist/auth-error-codes-D7CXVBEN.js.map +1 -0
- package/dist/auth-interceptor-policy-BSY5KIIA.js +5 -0
- package/dist/auth-interceptor-policy-BSY5KIIA.js.map +1 -0
- package/dist/auth-utils-XIHNYE63.js +5 -0
- package/dist/{auth-utils-MNMC2QGX.js.map → auth-utils-XIHNYE63.js.map} +1 -1
- package/dist/{chunk-6IRXCBBP.js → chunk-4IKGBHFJ.js} +454 -258
- package/dist/chunk-4IKGBHFJ.js.map +1 -0
- package/dist/chunk-55MIERLJ.js +3 -0
- package/dist/chunk-55MIERLJ.js.map +1 -0
- package/dist/chunk-6ROV3EE2.js +160 -0
- package/dist/chunk-6ROV3EE2.js.map +1 -0
- package/dist/{chunk-IBKBTIT6.js → chunk-7OGXVANB.js} +6 -6
- package/dist/{chunk-IBKBTIT6.js.map → chunk-7OGXVANB.js.map} +1 -1
- package/dist/chunk-ADOV2R3A.js +571 -0
- package/dist/chunk-ADOV2R3A.js.map +1 -0
- package/dist/chunk-COHBSTHF.js +82 -0
- package/dist/chunk-COHBSTHF.js.map +1 -0
- package/dist/chunk-DZC3DJUO.js +156 -0
- package/dist/chunk-DZC3DJUO.js.map +1 -0
- package/dist/{chunk-LCHJO5TU.js → chunk-GVXA7OKY.js} +14 -13
- package/dist/chunk-GVXA7OKY.js.map +1 -0
- package/dist/chunk-J33YFZCS.js +162 -0
- package/dist/chunk-J33YFZCS.js.map +1 -0
- package/dist/{chunk-7Q6HRCUA.js → chunk-OF5OLEE5.js} +3 -3
- package/dist/{chunk-7Q6HRCUA.js.map → chunk-OF5OLEE5.js.map} +1 -1
- package/dist/{chunk-ZEJGWZK3.js → chunk-U66LWTVC.js} +1242 -1269
- package/dist/chunk-U66LWTVC.js.map +1 -0
- package/dist/{chunk-EVRUWZUS.js → chunk-WNBF6FKG.js} +165 -13
- package/dist/chunk-WNBF6FKG.js.map +1 -0
- package/dist/chunk-YOT5RW3R.js +306 -0
- package/dist/chunk-YOT5RW3R.js.map +1 -0
- package/dist/cross-tab-session-OJKWJSNT.js +9 -0
- package/dist/cross-tab-session-OJKWJSNT.js.map +1 -0
- package/dist/entries/auth.d.ts +15 -3
- package/dist/entries/auth.js +9 -4
- package/dist/entries/auth.js.map +1 -1
- package/dist/entries/crm.d.ts +1 -0
- package/dist/entries/crm.js +10 -6
- package/dist/entries/crm.js.map +1 -1
- package/dist/{http-errors-DqdtoJ1y.d.ts → http-errors-_XPPqJ_a.d.ts} +190 -9
- package/dist/index.d.ts +138 -3
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/refresh-lock-UW5RRRTD.js +72 -0
- package/dist/refresh-lock-UW5RRRTD.js.map +1 -0
- package/dist/storage-migration-OCOML7VA.js +4 -0
- package/dist/storage-migration-OCOML7VA.js.map +1 -0
- package/package.json +11 -9
- package/dist/auth-utils-MNMC2QGX.js +0 -3
- package/dist/chunk-6IRXCBBP.js.map +0 -1
- package/dist/chunk-EVRUWZUS.js.map +0 -1
- package/dist/chunk-LCHJO5TU.js.map +0 -1
- package/dist/chunk-QPSCMK4W.js +0 -237
- package/dist/chunk-QPSCMK4W.js.map +0 -1
- package/dist/chunk-ZEJGWZK3.js.map +0 -1
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
import { getStorageKeys, isCookieExpired, stringifyCookieValue, setCookie, parseCookieJson, getCookie, isCorruptCookieRawValue } from './chunk-YOT5RW3R.js';
|
|
2
|
+
import { WP_STORAGE_KEYS, wpClientIframeRefreshKey, wpClientIframeRefreshExpKey } from './chunk-6ROV3EE2.js';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
|
|
5
|
+
// src/main/core/utils/constants.ts
|
|
6
|
+
WP_STORAGE_KEYS.c.auth.login;
|
|
7
|
+
WP_STORAGE_KEYS.c.auth.refresh;
|
|
8
|
+
WP_STORAGE_KEYS.c.auth.portal;
|
|
9
|
+
WP_STORAGE_KEYS.c.auth.sub;
|
|
10
|
+
var HUBSPOT_DATA = WP_STORAGE_KEYS.c.hub;
|
|
11
|
+
var HUB_ID = "hubId";
|
|
12
|
+
var DEV_PORTAL_ID = "devPortalId";
|
|
13
|
+
var PORTAL_ID = "portalId";
|
|
14
|
+
var DEV_API_URL = "devApiUrl";
|
|
15
|
+
|
|
16
|
+
// src/main/core/utils/localStorage.ts
|
|
17
|
+
var memory = /* @__PURE__ */ new Map();
|
|
18
|
+
var memoryStore = {
|
|
19
|
+
getItem(key) {
|
|
20
|
+
return memory.has(key) ? memory.get(key) : null;
|
|
21
|
+
},
|
|
22
|
+
setItem(key, value) {
|
|
23
|
+
memory.set(key, value);
|
|
24
|
+
},
|
|
25
|
+
removeItem(key) {
|
|
26
|
+
memory.delete(key);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
function resolveStore() {
|
|
30
|
+
if (typeof globalThis === "undefined") {
|
|
31
|
+
return memoryStore;
|
|
32
|
+
}
|
|
33
|
+
const ls = globalThis.localStorage;
|
|
34
|
+
if (!ls || typeof ls.getItem !== "function") {
|
|
35
|
+
return memoryStore;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const probeKey = "__woodsportal_client_sdk_ls_probe__";
|
|
39
|
+
ls.setItem(probeKey, "1");
|
|
40
|
+
ls.removeItem(probeKey);
|
|
41
|
+
return ls;
|
|
42
|
+
} catch {
|
|
43
|
+
return memoryStore;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
var storage = {
|
|
47
|
+
set: (key, value) => {
|
|
48
|
+
resolveStore().setItem(key, JSON.stringify(value));
|
|
49
|
+
},
|
|
50
|
+
get: (key) => {
|
|
51
|
+
const item = resolveStore().getItem(key);
|
|
52
|
+
return item ? JSON.parse(item) : null;
|
|
53
|
+
},
|
|
54
|
+
remove: (key) => {
|
|
55
|
+
resolveStore().removeItem(key);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// src/main/core/utils/runtime-hub-context.ts
|
|
60
|
+
var initializedHubId = "";
|
|
61
|
+
var initializedDevPortalId = "";
|
|
62
|
+
var initializedDevApiUrl = "";
|
|
63
|
+
function setRuntimeHttpClientHubContext(partial) {
|
|
64
|
+
if (partial.hubId != null) {
|
|
65
|
+
initializedHubId = partial.hubId;
|
|
66
|
+
}
|
|
67
|
+
if (partial.devPortalId != null) {
|
|
68
|
+
initializedDevPortalId = partial.devPortalId;
|
|
69
|
+
}
|
|
70
|
+
if (partial.devApiUrl != null) {
|
|
71
|
+
initializedDevApiUrl = partial.devApiUrl;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function getRuntimeHttpClientHubId() {
|
|
75
|
+
return initializedHubId;
|
|
76
|
+
}
|
|
77
|
+
function getRuntimeHttpClientDevPortalId() {
|
|
78
|
+
return initializedDevPortalId;
|
|
79
|
+
}
|
|
80
|
+
function getRuntimeHttpClientDevApiUrl() {
|
|
81
|
+
return initializedDevApiUrl;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/main/core/utils/hub-context.ts
|
|
85
|
+
function readStorageField(key) {
|
|
86
|
+
const hubSpotData = storage.get(HUBSPOT_DATA);
|
|
87
|
+
const value = hubSpotData?.[key];
|
|
88
|
+
return value != null && String(value).trim() !== "" ? String(value) : "";
|
|
89
|
+
}
|
|
90
|
+
var config = {
|
|
91
|
+
get hubId() {
|
|
92
|
+
return readStorageField(HUB_ID) || getRuntimeHttpClientHubId();
|
|
93
|
+
},
|
|
94
|
+
get devPortalId() {
|
|
95
|
+
return readStorageField(DEV_PORTAL_ID) || getRuntimeHttpClientDevPortalId();
|
|
96
|
+
},
|
|
97
|
+
get portalId() {
|
|
98
|
+
return readStorageField(PORTAL_ID);
|
|
99
|
+
},
|
|
100
|
+
get devApiUrl() {
|
|
101
|
+
return readStorageField(DEV_API_URL) || getRuntimeHttpClientDevApiUrl();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var setConfig = {
|
|
105
|
+
setDevPortalId(portalId) {
|
|
106
|
+
const existing = storage.get(HUBSPOT_DATA) || {};
|
|
107
|
+
storage.set(HUBSPOT_DATA, {
|
|
108
|
+
...existing,
|
|
109
|
+
[PORTAL_ID]: portalId
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/main/core/http/iframe-session-storage.ts
|
|
115
|
+
var iframeStorageMode = false;
|
|
116
|
+
function setIframeStorageMode(enabled) {
|
|
117
|
+
iframeStorageMode = enabled;
|
|
118
|
+
}
|
|
119
|
+
function isIframeStorageMode() {
|
|
120
|
+
return iframeStorageMode;
|
|
121
|
+
}
|
|
122
|
+
function resolveHubId() {
|
|
123
|
+
const fromWindow = typeof window !== "undefined" ? window.hubSpotData?.hubId : void 0;
|
|
124
|
+
const fromConfig = config.hubId;
|
|
125
|
+
return fromWindow ?? fromConfig ?? "default";
|
|
126
|
+
}
|
|
127
|
+
function iframeKey() {
|
|
128
|
+
return wpClientIframeRefreshKey(resolveHubId());
|
|
129
|
+
}
|
|
130
|
+
function iframeExpKey() {
|
|
131
|
+
return wpClientIframeRefreshExpKey(resolveHubId());
|
|
132
|
+
}
|
|
133
|
+
function readIframeRefreshToken() {
|
|
134
|
+
if (typeof window === "undefined" || !window.localStorage) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const raw = window.localStorage.getItem(iframeKey());
|
|
139
|
+
return raw ? JSON.parse(raw) : null;
|
|
140
|
+
} catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function writeIframeRefreshToken(token, expiresAtMs) {
|
|
145
|
+
if (typeof window === "undefined" || !window.localStorage) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
window.localStorage.setItem(iframeKey(), JSON.stringify(token));
|
|
150
|
+
if (expiresAtMs != null) {
|
|
151
|
+
window.localStorage.setItem(iframeExpKey(), String(expiresAtMs));
|
|
152
|
+
}
|
|
153
|
+
} catch {
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/main/core/utils/error-log-sanitize.ts
|
|
158
|
+
var SENSITIVE_FIELD_NAMES = /* @__PURE__ */ new Set(["token", "refreshtoken", "accesstoken", "password", "secret", "authorization", "otp", "code"]);
|
|
159
|
+
function isSensitiveField(name) {
|
|
160
|
+
const normalized = name.toLowerCase();
|
|
161
|
+
return SENSITIVE_FIELD_NAMES.has(normalized) || normalized.includes("password");
|
|
162
|
+
}
|
|
163
|
+
function redactValue(value) {
|
|
164
|
+
if (value == null || typeof value !== "object") {
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
if (Array.isArray(value)) {
|
|
168
|
+
return value.map(redactValue);
|
|
169
|
+
}
|
|
170
|
+
const input = value;
|
|
171
|
+
const output = {};
|
|
172
|
+
for (const [key, nested] of Object.entries(input)) {
|
|
173
|
+
output[key] = isSensitiveField(key) ? "[redacted]" : redactValue(nested);
|
|
174
|
+
}
|
|
175
|
+
return output;
|
|
176
|
+
}
|
|
177
|
+
function sanitizeAxiosErrorData(data) {
|
|
178
|
+
if (data == null || typeof data !== "object") {
|
|
179
|
+
return data;
|
|
180
|
+
}
|
|
181
|
+
const payload = data;
|
|
182
|
+
const safeFields = ["errorCode", "message", "errorMessage", "detailedMessage", "correlationId", "category", "statusCode"];
|
|
183
|
+
const summary = {};
|
|
184
|
+
for (const field of safeFields) {
|
|
185
|
+
if (field in payload) {
|
|
186
|
+
summary[field] = payload[field];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (Object.keys(summary).length > 0) {
|
|
190
|
+
return summary;
|
|
191
|
+
}
|
|
192
|
+
return redactValue(payload);
|
|
193
|
+
}
|
|
194
|
+
function redactLogMeta(meta) {
|
|
195
|
+
if (meta == null) {
|
|
196
|
+
return meta;
|
|
197
|
+
}
|
|
198
|
+
return redactValue(meta);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// src/main/core/logging/logger.ts
|
|
202
|
+
var LEVEL_RANK = {
|
|
203
|
+
debug: 0,
|
|
204
|
+
info: 1,
|
|
205
|
+
warn: 2,
|
|
206
|
+
error: 3,
|
|
207
|
+
silent: 4
|
|
208
|
+
};
|
|
209
|
+
var DEFAULT_CONFIG = {
|
|
210
|
+
level: "info",
|
|
211
|
+
namespace: "woodsportal-sdk",
|
|
212
|
+
enabled: true,
|
|
213
|
+
httpTracing: true
|
|
214
|
+
};
|
|
215
|
+
var runtimeConfig = { ...DEFAULT_CONFIG };
|
|
216
|
+
var customSinks;
|
|
217
|
+
function shouldEmit(level) {
|
|
218
|
+
if (!runtimeConfig.enabled || runtimeConfig.level === "silent") {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
return LEVEL_RANK[level] >= LEVEL_RANK[runtimeConfig.level];
|
|
222
|
+
}
|
|
223
|
+
function formatPrefix(context) {
|
|
224
|
+
return `[${runtimeConfig.namespace}] ${context}`;
|
|
225
|
+
}
|
|
226
|
+
function defaultDebug(context, message, meta) {
|
|
227
|
+
if (meta != null) {
|
|
228
|
+
console.debug(formatPrefix(context), message, meta);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
console.debug(formatPrefix(context), message);
|
|
232
|
+
}
|
|
233
|
+
function defaultInfo(context, message, meta) {
|
|
234
|
+
if (meta != null) {
|
|
235
|
+
console.info(formatPrefix(context), message, meta);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
console.info(formatPrefix(context), message);
|
|
239
|
+
}
|
|
240
|
+
function defaultWarn(context, message, meta) {
|
|
241
|
+
if (meta != null) {
|
|
242
|
+
console.warn(formatPrefix(context), message, meta);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
console.warn(formatPrefix(context), message);
|
|
246
|
+
}
|
|
247
|
+
function defaultError(context, error, meta) {
|
|
248
|
+
if (axios.isAxiosError(error)) {
|
|
249
|
+
const payload = {
|
|
250
|
+
message: error.message,
|
|
251
|
+
status: error.response?.status,
|
|
252
|
+
statusText: error.response?.statusText,
|
|
253
|
+
data: sanitizeAxiosErrorData(error.response?.data),
|
|
254
|
+
url: error.config?.url,
|
|
255
|
+
method: error.config?.method,
|
|
256
|
+
...redactLogMeta(meta)
|
|
257
|
+
};
|
|
258
|
+
console.error(formatPrefix(context), payload);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (error instanceof Error) {
|
|
262
|
+
if (meta != null) {
|
|
263
|
+
console.error(formatPrefix(context), error.message, error, redactLogMeta(meta));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
console.error(formatPrefix(context), error.message, error);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (meta != null) {
|
|
270
|
+
console.error(formatPrefix(context), error, redactLogMeta(meta));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
console.error(formatPrefix(context), error);
|
|
274
|
+
}
|
|
275
|
+
function configureLogger(config2 = {}) {
|
|
276
|
+
runtimeConfig = {
|
|
277
|
+
level: config2.level ?? DEFAULT_CONFIG.level,
|
|
278
|
+
namespace: config2.namespace ?? DEFAULT_CONFIG.namespace,
|
|
279
|
+
enabled: config2.enabled ?? DEFAULT_CONFIG.enabled,
|
|
280
|
+
httpTracing: config2.httpTracing ?? DEFAULT_CONFIG.httpTracing
|
|
281
|
+
};
|
|
282
|
+
customSinks = config2.sinks;
|
|
283
|
+
}
|
|
284
|
+
function isHttpTracingEnabled() {
|
|
285
|
+
return runtimeConfig.enabled && runtimeConfig.httpTracing && shouldEmit("debug");
|
|
286
|
+
}
|
|
287
|
+
var logger = {
|
|
288
|
+
debug(context, message, meta) {
|
|
289
|
+
if (!shouldEmit("debug")) return;
|
|
290
|
+
const sink = customSinks?.debug ?? defaultDebug;
|
|
291
|
+
sink(context, message, redactLogMeta(meta));
|
|
292
|
+
},
|
|
293
|
+
info(context, message, meta) {
|
|
294
|
+
if (!shouldEmit("info")) return;
|
|
295
|
+
const sink = customSinks?.info ?? defaultInfo;
|
|
296
|
+
sink(context, message, redactLogMeta(meta));
|
|
297
|
+
},
|
|
298
|
+
warn(context, message, meta) {
|
|
299
|
+
if (!shouldEmit("warn")) return;
|
|
300
|
+
const sink = customSinks?.warn ?? defaultWarn;
|
|
301
|
+
sink(context, message, redactLogMeta(meta));
|
|
302
|
+
},
|
|
303
|
+
error(context, error, meta) {
|
|
304
|
+
if (!shouldEmit("error")) return;
|
|
305
|
+
const sink = customSinks?.error ?? defaultError;
|
|
306
|
+
sink(context, error, redactLogMeta(meta));
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// src/main/core/http/token-store.ts
|
|
311
|
+
var accessToken = null;
|
|
312
|
+
var tokenExpiresAt = null;
|
|
313
|
+
var accessTtlMs = null;
|
|
314
|
+
var refreshCallback = null;
|
|
315
|
+
var refreshBufferSeconds = 60;
|
|
316
|
+
var refreshPromise = null;
|
|
317
|
+
var lastRefreshFailed = false;
|
|
318
|
+
var lastSuccessfulRefreshAt = null;
|
|
319
|
+
var sessionLifecycleListener = null;
|
|
320
|
+
var MIN_SHORT_TTL_BUFFER_MS = 5e3;
|
|
321
|
+
var MIN_PROACTIVE_REFRESH_INTERVAL_MS = 3e4;
|
|
322
|
+
function getEffectiveBufferMs(ttlMs) {
|
|
323
|
+
const capMs = refreshBufferSeconds * 1e3;
|
|
324
|
+
let buffer;
|
|
325
|
+
if (ttlMs <= capMs) {
|
|
326
|
+
buffer = Math.max(MIN_SHORT_TTL_BUFFER_MS, Math.floor(ttlMs * 0.2));
|
|
327
|
+
} else {
|
|
328
|
+
buffer = capMs;
|
|
329
|
+
}
|
|
330
|
+
const maxBuffer = Math.max(0, ttlMs - 1e3);
|
|
331
|
+
return Math.min(buffer, maxBuffer);
|
|
332
|
+
}
|
|
333
|
+
function getCurrentBufferMs() {
|
|
334
|
+
if (accessTtlMs != null && accessTtlMs > 0) {
|
|
335
|
+
return getEffectiveBufferMs(accessTtlMs);
|
|
336
|
+
}
|
|
337
|
+
return refreshBufferSeconds * 1e3;
|
|
338
|
+
}
|
|
339
|
+
function getAccessToken() {
|
|
340
|
+
return accessToken;
|
|
341
|
+
}
|
|
342
|
+
function setSessionLifecycleListener(listener) {
|
|
343
|
+
sessionLifecycleListener = listener;
|
|
344
|
+
}
|
|
345
|
+
function notifySessionLifecycleChange() {
|
|
346
|
+
try {
|
|
347
|
+
sessionLifecycleListener?.();
|
|
348
|
+
} catch {
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function markRefreshFailed() {
|
|
352
|
+
lastRefreshFailed = true;
|
|
353
|
+
clearAccessToken();
|
|
354
|
+
notifySessionLifecycleChange();
|
|
355
|
+
}
|
|
356
|
+
function storAccessToken(token, expiresIn) {
|
|
357
|
+
accessToken = token;
|
|
358
|
+
lastRefreshFailed = false;
|
|
359
|
+
if (expiresIn != null && expiresIn > 0) {
|
|
360
|
+
accessTtlMs = expiresIn * 1e3;
|
|
361
|
+
tokenExpiresAt = Date.now() + accessTtlMs;
|
|
362
|
+
} else {
|
|
363
|
+
accessTtlMs = null;
|
|
364
|
+
tokenExpiresAt = null;
|
|
365
|
+
}
|
|
366
|
+
notifySessionLifecycleChange();
|
|
367
|
+
}
|
|
368
|
+
function clearAccessToken() {
|
|
369
|
+
accessToken = null;
|
|
370
|
+
tokenExpiresAt = null;
|
|
371
|
+
accessTtlMs = null;
|
|
372
|
+
lastSuccessfulRefreshAt = null;
|
|
373
|
+
}
|
|
374
|
+
function resetSessionAuthState() {
|
|
375
|
+
lastRefreshFailed = false;
|
|
376
|
+
lastSuccessfulRefreshAt = null;
|
|
377
|
+
}
|
|
378
|
+
function setRefreshBufferSeconds(seconds) {
|
|
379
|
+
refreshBufferSeconds = Math.max(0, seconds);
|
|
380
|
+
}
|
|
381
|
+
function didLastRefreshFail() {
|
|
382
|
+
return lastRefreshFailed;
|
|
383
|
+
}
|
|
384
|
+
function isSessionRefreshExhausted() {
|
|
385
|
+
return lastRefreshFailed;
|
|
386
|
+
}
|
|
387
|
+
function isExpiresAccessToken() {
|
|
388
|
+
if (!accessToken) return true;
|
|
389
|
+
if (tokenExpiresAt === null) return false;
|
|
390
|
+
const bufferMs = getCurrentBufferMs();
|
|
391
|
+
return Date.now() >= tokenExpiresAt - bufferMs;
|
|
392
|
+
}
|
|
393
|
+
function setRefreshCallback(callback) {
|
|
394
|
+
refreshCallback = callback;
|
|
395
|
+
}
|
|
396
|
+
function isRefreshInFlight() {
|
|
397
|
+
return refreshPromise != null;
|
|
398
|
+
}
|
|
399
|
+
async function refreshSession(options = {}) {
|
|
400
|
+
const { force = false } = options;
|
|
401
|
+
if (!force && lastSuccessfulRefreshAt != null && Date.now() - lastSuccessfulRefreshAt < MIN_PROACTIVE_REFRESH_INTERVAL_MS) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if (!refreshCallback) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (!refreshPromise) {
|
|
408
|
+
refreshPromise = (async () => {
|
|
409
|
+
const { withRefreshLock } = await import('./refresh-lock-UW5RRRTD.js');
|
|
410
|
+
await withRefreshLock(async () => {
|
|
411
|
+
const { getRefreshToken: getRefreshToken2 } = await import('./auth-utils-XIHNYE63.js');
|
|
412
|
+
const refreshToken = getRefreshToken2();
|
|
413
|
+
if (!refreshToken) {
|
|
414
|
+
markRefreshFailed();
|
|
415
|
+
const storageKey = getStorageKeys().refreshToken;
|
|
416
|
+
const hasCookieKey = typeof document !== "undefined" && typeof storageKey === "string" && storageKey.length > 0 && document.cookie.includes(`${storageKey}=`);
|
|
417
|
+
logger.warn("auth", "refresh session aborted: missing refresh token", {
|
|
418
|
+
operation: "refreshSession",
|
|
419
|
+
storageKey,
|
|
420
|
+
hasCookieKey,
|
|
421
|
+
iframeStorageMode: isIframeStorageMode()
|
|
422
|
+
});
|
|
423
|
+
throw new Error("Session expired: missing refresh token");
|
|
424
|
+
}
|
|
425
|
+
const result = await refreshCallback(refreshToken);
|
|
426
|
+
if (!result.success || !result.token) {
|
|
427
|
+
markRefreshFailed();
|
|
428
|
+
throw new Error("Session refresh failed");
|
|
429
|
+
}
|
|
430
|
+
lastRefreshFailed = false;
|
|
431
|
+
lastSuccessfulRefreshAt = Date.now();
|
|
432
|
+
});
|
|
433
|
+
})().finally(() => {
|
|
434
|
+
refreshPromise = null;
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
await refreshPromise;
|
|
438
|
+
}
|
|
439
|
+
async function ensureValidRefresh() {
|
|
440
|
+
if (!isExpiresAccessToken()) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
await refreshSession({ force: true });
|
|
444
|
+
}
|
|
445
|
+
function isAuthenticateApp() {
|
|
446
|
+
const token = getAccessToken();
|
|
447
|
+
if (token) {
|
|
448
|
+
const bufferMs = getCurrentBufferMs();
|
|
449
|
+
if (tokenExpiresAt === null || Date.now() < tokenExpiresAt - bufferMs) {
|
|
450
|
+
return true;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (!isCookieExpired(getStorageKeys().refreshToken)) {
|
|
454
|
+
if (lastRefreshFailed && !token) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
function isAuthenticated() {
|
|
462
|
+
return isAuthenticateApp();
|
|
463
|
+
}
|
|
464
|
+
function isAccessTokenExpired() {
|
|
465
|
+
return isExpiresAccessToken();
|
|
466
|
+
}
|
|
467
|
+
function hasRefreshSession() {
|
|
468
|
+
if (isCookieExpired(getStorageKeys().refreshToken)) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
if (lastRefreshFailed && !accessToken) {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
function hasValidAccessToken() {
|
|
477
|
+
return Boolean(getAccessToken()) && !isExpiresAccessToken();
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// src/main/core/http/auth-utils.ts
|
|
481
|
+
function writeJsonCookie(key, data, expire) {
|
|
482
|
+
if (!key) {
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
const serialized = stringifyCookieValue(data);
|
|
486
|
+
if (serialized == null) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
setCookie(key, serialized, expire);
|
|
490
|
+
}
|
|
491
|
+
var setLoggedInDetails = async (data) => {
|
|
492
|
+
return new Promise((resolve) => {
|
|
493
|
+
const keys = getStorageKeys();
|
|
494
|
+
writeJsonCookie(keys.loginDetails, data);
|
|
495
|
+
if (keys.authUser !== keys.loginDetails) {
|
|
496
|
+
writeJsonCookie(keys.authUser, data);
|
|
497
|
+
}
|
|
498
|
+
resolve();
|
|
499
|
+
});
|
|
500
|
+
};
|
|
501
|
+
var setProfileDetails = async (data) => {
|
|
502
|
+
return new Promise((resolve) => {
|
|
503
|
+
writeJsonCookie(getStorageKeys().loginDetails, data);
|
|
504
|
+
resolve();
|
|
505
|
+
});
|
|
506
|
+
};
|
|
507
|
+
function setRefreshToken(token, expiresAt) {
|
|
508
|
+
return new Promise((resolve) => {
|
|
509
|
+
if (!token || typeof token !== "string") {
|
|
510
|
+
resolve();
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
let expiresMs;
|
|
514
|
+
if (typeof expiresAt === "number" && expiresAt > 1e12) {
|
|
515
|
+
expiresMs = expiresAt;
|
|
516
|
+
} else if (typeof expiresAt === "number" && expiresAt > 1e9) {
|
|
517
|
+
expiresMs = expiresAt * 1e3;
|
|
518
|
+
} else {
|
|
519
|
+
expiresMs = Date.now() + (expiresAt || 0) * 1e3;
|
|
520
|
+
}
|
|
521
|
+
const serialized = stringifyCookieValue(token);
|
|
522
|
+
if (serialized != null) {
|
|
523
|
+
setCookie(getStorageKeys().refreshToken, serialized, new Date(expiresMs));
|
|
524
|
+
}
|
|
525
|
+
if (isIframeStorageMode()) {
|
|
526
|
+
writeIframeRefreshToken(token, expiresMs);
|
|
527
|
+
}
|
|
528
|
+
resolve();
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
function setAccessToken(token, expiresIn) {
|
|
532
|
+
return new Promise((resolve) => {
|
|
533
|
+
storAccessToken(token, expiresIn);
|
|
534
|
+
resolve();
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
var setPortal = async (data) => {
|
|
538
|
+
return new Promise((resolve) => {
|
|
539
|
+
writeJsonCookie(getStorageKeys().portal, data ?? {});
|
|
540
|
+
resolve();
|
|
541
|
+
});
|
|
542
|
+
};
|
|
543
|
+
var setSubscriptionType = async (data) => {
|
|
544
|
+
return new Promise((resolve) => {
|
|
545
|
+
writeJsonCookie(getStorageKeys().subscriptionType, data ?? "BASIC");
|
|
546
|
+
resolve();
|
|
547
|
+
});
|
|
548
|
+
};
|
|
549
|
+
function getProfile() {
|
|
550
|
+
return parseCookieJson(getStorageKeys().loginDetails);
|
|
551
|
+
}
|
|
552
|
+
function getRefreshToken() {
|
|
553
|
+
const raw = getCookie(getStorageKeys().refreshToken);
|
|
554
|
+
if (!isCorruptCookieRawValue(raw)) {
|
|
555
|
+
return raw;
|
|
556
|
+
}
|
|
557
|
+
if (isIframeStorageMode()) {
|
|
558
|
+
return readIframeRefreshToken();
|
|
559
|
+
}
|
|
560
|
+
return null;
|
|
561
|
+
}
|
|
562
|
+
function getPortal() {
|
|
563
|
+
return parseCookieJson(getStorageKeys().portal);
|
|
564
|
+
}
|
|
565
|
+
function getSubscriptionType() {
|
|
566
|
+
return parseCookieJson(getStorageKeys().subscriptionType);
|
|
567
|
+
}
|
|
568
|
+
|
|
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-ADOV2R3A.js.map
|
|
571
|
+
//# sourceMappingURL=chunk-ADOV2R3A.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/http/token-store.ts","../src/main/core/http/auth-utils.ts"],"names":["config","getRefreshToken"],"mappings":"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","file":"chunk-ADOV2R3A.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","/**\n\n * Token storage utilities\n\n * These functions handle access token management\n\n */\n\nimport { isCookieExpired } from '../utils/cookie.js'\n\nimport { getStorageKeys } from '../utils/storage-keys'\nimport { isIframeStorageMode } from './iframe-session-storage.js'\nimport { logger } from '../logging/logger.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 markRefreshFailed(): void {\n lastRefreshFailed = true\n clearAccessToken()\n notifySessionLifecycleChange()\n}\n\nexport function storAccessToken(token: string, expiresIn?: number): void {\n accessToken = token\n\n lastRefreshFailed = false\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 refresh-failure / throttle state after cookies and memory token are wiped. */\nexport function resetSessionAuthState(): void {\n lastRefreshFailed = false\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 return lastRefreshFailed\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 (!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 const { withRefreshLock } = await import('./refresh-lock.js')\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 (!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 (isCookieExpired(getStorageKeys().refreshToken)) {\n return false\n }\n if (lastRefreshFailed && !accessToken) {\n return false\n }\n return true\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 } 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\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"]}
|