@djangocfg/api 2.1.581 → 2.1.583
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/README.md +18 -0
- package/dist/auth.cjs +272 -80
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.mjs +272 -80
- package/dist/auth.mjs.map +1 -1
- package/dist/clients.cjs +243 -54
- package/dist/clients.cjs.map +1 -1
- package/dist/clients.mjs +243 -54
- package/dist/clients.mjs.map +1 -1
- package/dist/hooks.cjs +243 -54
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.mjs +243 -54
- package/dist/hooks.mjs.map +1 -1
- package/dist/index.cjs +248 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -1
- package/dist/index.d.ts +85 -1
- package/dist/index.mjs +248 -54
- package/dist/index.mjs.map +1 -1
- package/dist/storage.cjs +269 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.cts +85 -0
- package/dist/storage.d.ts +85 -0
- package/dist/storage.mjs +248 -0
- package/dist/storage.mjs.map +1 -0
- package/package.json +8 -2
- package/src/__tests__/noStorageLiterals.test.ts +27 -0
- package/src/__tests__/storage.test.ts +134 -0
- package/src/__tests__/storageSsr.test.ts +14 -0
- package/src/_api/generated/helpers/auth.ts +27 -64
- package/src/_api/generated/helpers/index.ts +12 -0
- package/src/_api/generated/helpers/keys.ts +328 -0
- package/src/auth/__tests__/authRedirect.test.ts +1 -1
- package/src/auth/__tests__/profileCache.test.ts +1 -1
- package/src/auth/context/AuthContext.tsx +2 -1
- package/src/auth/hooks/useAuthRedirect.ts +3 -2
- package/src/auth/hooks/useGithubAuth.ts +13 -8
- package/src/auth/hooks/useLocalStorage.ts +7 -7
- package/src/auth/hooks/useProfileCache.ts +2 -1
- package/src/auth/hooks/useSessionStorage.ts +7 -7
- package/src/storage.ts +21 -0
package/dist/auth.mjs
CHANGED
|
@@ -92,77 +92,264 @@ var APIError = class extends Error {
|
|
|
92
92
|
}
|
|
93
93
|
};
|
|
94
94
|
|
|
95
|
-
// src/_api/generated/helpers/
|
|
96
|
-
var
|
|
97
|
-
var
|
|
98
|
-
var
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
95
|
+
// src/_api/generated/helpers/keys.ts
|
|
96
|
+
var k = /* @__PURE__ */ __name((key, store, personal) => ({ key, store, personal }), "k");
|
|
97
|
+
var f = /* @__PURE__ */ __name((prefix, store, personal) => ({ prefix, store, personal }), "f");
|
|
98
|
+
var CFG_KEYS = {
|
|
99
|
+
accessToken: k("cfg.auth.access_token", "local", true),
|
|
100
|
+
refreshToken: k("cfg.auth.refresh_token", "local", true),
|
|
101
|
+
apiKey: k("cfg.auth.api_key", "local", true),
|
|
102
|
+
email: k("cfg.auth.email", "local", false),
|
|
103
|
+
emailTs: k("cfg.auth.email_ts", "local", false),
|
|
104
|
+
redirectUrl: k("cfg.auth.redirect_url", "session", true),
|
|
105
|
+
redirectUrlTs: k("cfg.auth.redirect_url_ts", "session", true),
|
|
106
|
+
oauthState: k("cfg.auth.oauth_state", "session", true),
|
|
107
|
+
oauthProvider: k("cfg.auth.oauth_provider", "session", true),
|
|
108
|
+
oauthRememberMe: k("cfg.auth.oauth_remember_me", "session", true),
|
|
109
|
+
profileCache: k("cfg.profile.cache", "local", true),
|
|
110
|
+
monitorSessionId: k("cfg.monitor.session_id", "local", false),
|
|
111
|
+
monitorSessionCookie: k("cfg.monitor.session_id", "cookie", false),
|
|
112
|
+
monitorDebug: k("cfg.monitor.debug", "local", false),
|
|
113
|
+
uiTabId: k("cfg.ui.tab_id", "session", false),
|
|
114
|
+
uiRouterSerial: k("cfg.ui.router_serial", "session", false),
|
|
115
|
+
uiState: k("cfg.ui.state", "local", false),
|
|
116
|
+
chatSpeechLanguage: k("cfg.chat.speech_language", "local", false),
|
|
117
|
+
chatRecentTools: k("cfg.chat.recent_tools", "local", false),
|
|
118
|
+
formsSpeechDebug: k("cfg.forms.speech_debug", "local", false),
|
|
119
|
+
formsSpeechPrefs: k("cfg.forms.speech_prefs", "local", false),
|
|
120
|
+
agentPlaygroundApiKeyId: k("cfg.agent.playground_api_key_id", "session", true),
|
|
121
|
+
agentPlaygroundBearer: k("cfg.agent.playground_bearer", "session", true),
|
|
122
|
+
agentEndpointDoc: k("cfg.agent.endpoint_doc", "session", false)
|
|
123
|
+
};
|
|
124
|
+
var CFG_FAMILIES = {
|
|
125
|
+
chatDraft: f("cfg.chat.draft.", "session", true),
|
|
126
|
+
dataTree: f("cfg.data.tree.", "local", false),
|
|
127
|
+
agentEndpointDraft: f("cfg.agent.endpoint_draft.", "local", false)
|
|
128
|
+
};
|
|
129
|
+
var OWNER_RE = /^[a-z][a-z0-9_]*$/;
|
|
130
|
+
function normalizeSegment(raw) {
|
|
131
|
+
return raw.trim().toLowerCase().replace(/[^a-z0-9_]+/g, "_").replace(/^_+|_+$/g, "");
|
|
132
|
+
}
|
|
133
|
+
__name(normalizeSegment, "normalizeSegment");
|
|
134
|
+
var hasWindow = /* @__PURE__ */ __name(() => typeof window !== "undefined", "hasWindow");
|
|
135
|
+
function nativeStorage(store) {
|
|
136
|
+
if (!hasWindow()) return null;
|
|
137
|
+
try {
|
|
138
|
+
return store === "session" ? window.sessionStorage : window.localStorage;
|
|
139
|
+
} catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
__name(nativeStorage, "nativeStorage");
|
|
144
|
+
function cookieNames() {
|
|
145
|
+
if (!hasWindow()) return [];
|
|
146
|
+
try {
|
|
147
|
+
return document.cookie.split("; ").map((part) => decodeURIComponent(part.split("=")[0] ?? "")).filter(Boolean);
|
|
148
|
+
} catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
__name(cookieNames, "cookieNames");
|
|
153
|
+
function createStorage(owner, options = {}) {
|
|
154
|
+
if (!OWNER_RE.test(owner)) {
|
|
155
|
+
throw new TypeError(`createStorage: owner "${owner}" must match ${OWNER_RE}`);
|
|
156
|
+
}
|
|
157
|
+
const prefix = `${owner}.`;
|
|
158
|
+
const pattern = owner === "cfg" ? /^cfg(\.[a-z0-9_]+)+$/ : new RegExp(`^(cfg|${owner})(\\.[a-z0-9_]+)+$`);
|
|
159
|
+
const cookieMaxAge = options.cookieMaxAgeSeconds ?? 60 * 60 * 24 * 30;
|
|
160
|
+
const specs = Object.values(options.keys ?? {});
|
|
161
|
+
const families = Object.values(options.families ?? {});
|
|
162
|
+
const specByKey = /* @__PURE__ */ new Map();
|
|
163
|
+
for (const spec of specs) specByKey.set(spec.key, [...specByKey.get(spec.key) ?? [], spec]);
|
|
164
|
+
const memory = {
|
|
165
|
+
local: /* @__PURE__ */ new Map(),
|
|
166
|
+
session: /* @__PURE__ */ new Map(),
|
|
167
|
+
cookie: /* @__PURE__ */ new Map()
|
|
168
|
+
};
|
|
169
|
+
const isValid = /* @__PURE__ */ __name((key) => pattern.test(key), "isValid");
|
|
170
|
+
const assertValid = /* @__PURE__ */ __name((key) => {
|
|
171
|
+
if (!isValid(key)) throw new TypeError(`storage key "${key}" must match ${pattern}`);
|
|
172
|
+
}, "assertValid");
|
|
173
|
+
const assertOwned = /* @__PURE__ */ __name((key) => {
|
|
174
|
+
assertValid(key);
|
|
175
|
+
if (!key.startsWith(prefix)) throw new TypeError(`storage key "${key}" is not owned by "${owner}"`);
|
|
176
|
+
}, "assertOwned");
|
|
177
|
+
function rawGet(store, key) {
|
|
178
|
+
if (!hasWindow()) return null;
|
|
179
|
+
if (store === "cookie") {
|
|
180
|
+
try {
|
|
181
|
+
const escaped = encodeURIComponent(key).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
182
|
+
const match = document.cookie.match(new RegExp(`(?:^|;\\s*)${escaped}=([^;]*)`));
|
|
183
|
+
if (match?.[1] !== void 0) return decodeURIComponent(match[1]);
|
|
184
|
+
} catch {
|
|
185
|
+
}
|
|
186
|
+
return memory.cookie.get(key) ?? null;
|
|
107
187
|
}
|
|
108
|
-
},
|
|
109
|
-
set(key, value) {
|
|
110
|
-
if (!isBrowser) return;
|
|
111
188
|
try {
|
|
112
|
-
|
|
113
|
-
|
|
189
|
+
const value = nativeStorage(store)?.getItem(key) ?? null;
|
|
190
|
+
if (value !== null) return value;
|
|
114
191
|
} catch {
|
|
115
192
|
}
|
|
193
|
+
return memory[store].get(key) ?? null;
|
|
116
194
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (!isBrowser) return null;
|
|
195
|
+
__name(rawGet, "rawGet");
|
|
196
|
+
function rawSet(store, key, value) {
|
|
197
|
+
if (!hasWindow()) return false;
|
|
121
198
|
try {
|
|
122
|
-
|
|
199
|
+
if (store === "cookie") {
|
|
200
|
+
const secure = window.location.protocol === "https:" ? "; Secure" : "";
|
|
201
|
+
document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(value)}; Path=/; Max-Age=${cookieMaxAge}; SameSite=Lax${secure}`;
|
|
202
|
+
if (rawGet("cookie", key) === value && !memory.cookie.has(key)) return true;
|
|
203
|
+
memory.cookie.set(key, value);
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const native = nativeStorage(store);
|
|
207
|
+
if (!native) throw new Error("storage unavailable");
|
|
208
|
+
native.setItem(key, value);
|
|
209
|
+
memory[store].delete(key);
|
|
210
|
+
return true;
|
|
123
211
|
} catch {
|
|
124
|
-
|
|
212
|
+
memory[store].set(key, value);
|
|
213
|
+
return false;
|
|
125
214
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
215
|
+
}
|
|
216
|
+
__name(rawSet, "rawSet");
|
|
217
|
+
function rawRemove(store, key) {
|
|
218
|
+
memory[store].delete(key);
|
|
219
|
+
if (!hasWindow()) return;
|
|
129
220
|
try {
|
|
130
|
-
if (
|
|
131
|
-
|
|
221
|
+
if (store === "cookie") {
|
|
222
|
+
const secure = window.location.protocol === "https:" ? "; Secure" : "";
|
|
223
|
+
document.cookie = `${encodeURIComponent(key)}=; Path=/; Max-Age=0; SameSite=Lax${secure}`;
|
|
224
|
+
} else {
|
|
225
|
+
nativeStorage(store)?.removeItem(key);
|
|
226
|
+
}
|
|
132
227
|
} catch {
|
|
133
228
|
}
|
|
134
229
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
230
|
+
__name(rawRemove, "rawRemove");
|
|
231
|
+
function resolveStore(key, store) {
|
|
232
|
+
return store ?? specByKey.get(key)?.[0]?.store ?? "local";
|
|
233
|
+
}
|
|
234
|
+
__name(resolveStore, "resolveStore");
|
|
235
|
+
function listKeys(store, startsWith) {
|
|
236
|
+
const out = [];
|
|
140
237
|
try {
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
238
|
+
const native = nativeStorage(store);
|
|
239
|
+
if (native) {
|
|
240
|
+
for (let i = 0; i < native.length; i += 1) {
|
|
241
|
+
const name = native.key(i);
|
|
242
|
+
if (name?.startsWith(startsWith)) out.push(name);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
145
245
|
} catch {
|
|
146
|
-
return null;
|
|
147
246
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
247
|
+
for (const name of memory[store].keys()) if (name.startsWith(startsWith) && !out.includes(name)) out.push(name);
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
__name(listKeys, "listKeys");
|
|
251
|
+
const familyKey = /* @__PURE__ */ __name((family, id) => {
|
|
252
|
+
const part = normalizeSegment(id);
|
|
253
|
+
if (!part) throw new TypeError("storage family id is empty after normalisation");
|
|
254
|
+
return family.prefix + part;
|
|
255
|
+
}, "familyKey");
|
|
256
|
+
const api = {
|
|
257
|
+
owner,
|
|
258
|
+
key(...parts) {
|
|
259
|
+
const segments = parts.map(normalizeSegment);
|
|
260
|
+
if (segments.length === 0 || segments.some((segment) => !segment)) {
|
|
261
|
+
throw new TypeError(`storage key parts must be non-empty: ${JSON.stringify(parts)}`);
|
|
159
262
|
}
|
|
160
|
-
|
|
263
|
+
return `${prefix}${segments.join(".")}`;
|
|
264
|
+
},
|
|
265
|
+
familyKey,
|
|
266
|
+
isValid,
|
|
267
|
+
read(key, store) {
|
|
268
|
+
assertValid(key);
|
|
269
|
+
const target = resolveStore(key, store);
|
|
270
|
+
return rawGet(target, key);
|
|
271
|
+
},
|
|
272
|
+
write(key, value, store) {
|
|
273
|
+
assertOwned(key);
|
|
274
|
+
const target = resolveStore(key, store);
|
|
275
|
+
return rawSet(target, key, value);
|
|
276
|
+
},
|
|
277
|
+
remove(key, store) {
|
|
278
|
+
assertOwned(key);
|
|
279
|
+
const target = resolveStore(key, store);
|
|
280
|
+
rawRemove(target, key);
|
|
281
|
+
},
|
|
282
|
+
readJSON(key, store) {
|
|
283
|
+
const raw = api.read(key, store);
|
|
284
|
+
if (raw === null) return null;
|
|
285
|
+
try {
|
|
286
|
+
return JSON.parse(raw);
|
|
287
|
+
} catch {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
writeJSON(key, value, store) {
|
|
292
|
+
return api.write(key, JSON.stringify(value), store);
|
|
293
|
+
},
|
|
294
|
+
keys(store = "local") {
|
|
295
|
+
return listKeys(store, prefix);
|
|
296
|
+
},
|
|
297
|
+
clearAll({ all = false } = {}) {
|
|
298
|
+
for (const spec of specs) {
|
|
299
|
+
if (!all && !spec.personal) continue;
|
|
300
|
+
rawRemove(spec.store, spec.key);
|
|
301
|
+
}
|
|
302
|
+
for (const family of families) {
|
|
303
|
+
if (!all && !family.personal) continue;
|
|
304
|
+
for (const name of listKeys(family.store, family.prefix)) rawRemove(family.store, name);
|
|
305
|
+
}
|
|
306
|
+
if (all) {
|
|
307
|
+
for (const store of ["local", "session"]) {
|
|
308
|
+
for (const name of listKeys(store, prefix)) rawRemove(store, name);
|
|
309
|
+
}
|
|
310
|
+
for (const name of cookieNames()) if (name.startsWith(prefix)) rawRemove("cookie", name);
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
onChange(key, listener, store = "local") {
|
|
314
|
+
assertValid(key);
|
|
315
|
+
if (!hasWindow()) return () => {
|
|
316
|
+
};
|
|
317
|
+
const handler = /* @__PURE__ */ __name((event) => {
|
|
318
|
+
if (event.storageArea !== nativeStorage(store)) return;
|
|
319
|
+
if (event.key === null || event.key === key) listener(event.key === null ? null : event.newValue);
|
|
320
|
+
}, "handler");
|
|
321
|
+
window.addEventListener("storage", handler);
|
|
322
|
+
return () => window.removeEventListener("storage", handler);
|
|
161
323
|
}
|
|
162
|
-
}
|
|
324
|
+
};
|
|
325
|
+
return api;
|
|
326
|
+
}
|
|
327
|
+
__name(createStorage, "createStorage");
|
|
328
|
+
var cfgStorage = createStorage("cfg", {
|
|
329
|
+
keys: CFG_KEYS,
|
|
330
|
+
families: CFG_FAMILIES
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
// src/_api/generated/helpers/auth.ts
|
|
334
|
+
var ACCESS_KEY = "cfg.auth.access_token";
|
|
335
|
+
var REFRESH_KEY = "cfg.auth.refresh_token";
|
|
336
|
+
var API_KEY_KEY = "cfg.auth.api_key";
|
|
337
|
+
var storage = true ? cfgStorage : createStorage2("cfg");
|
|
338
|
+
var isBrowser = typeof window !== "undefined";
|
|
339
|
+
var STORE_OF = {
|
|
340
|
+
localStorage: "local",
|
|
341
|
+
sessionStorage: "session",
|
|
342
|
+
cookie: "cookie"
|
|
163
343
|
};
|
|
164
344
|
function backendFor(mode) {
|
|
165
|
-
|
|
345
|
+
const store = STORE_OF[mode];
|
|
346
|
+
return {
|
|
347
|
+
get: /* @__PURE__ */ __name((key) => storage.read(key, store), "get"),
|
|
348
|
+
set(key, value) {
|
|
349
|
+
if (value === null) storage.remove(key, store);
|
|
350
|
+
else storage.write(key, value, store);
|
|
351
|
+
}
|
|
352
|
+
};
|
|
166
353
|
}
|
|
167
354
|
__name(backendFor, "backendFor");
|
|
168
355
|
var _storageMode = "localStorage";
|
|
@@ -351,10 +538,12 @@ var auth = {
|
|
|
351
538
|
notifySessionChanged();
|
|
352
539
|
},
|
|
353
540
|
clearTokens() {
|
|
354
|
-
for (const
|
|
541
|
+
for (const mode of ["localStorage", "sessionStorage", "cookie"]) {
|
|
542
|
+
const backend = backendFor(mode);
|
|
355
543
|
backend.set(ACCESS_KEY, null);
|
|
356
544
|
backend.set(REFRESH_KEY, null);
|
|
357
545
|
}
|
|
546
|
+
storage.clearAll();
|
|
358
547
|
notifySessionChanged();
|
|
359
548
|
},
|
|
360
549
|
/** Session-aware: token PRESENT and not past its `exp` (or a live refresh
|
|
@@ -546,7 +735,7 @@ function dpopEnabled() {
|
|
|
546
735
|
}
|
|
547
736
|
}
|
|
548
737
|
__name(dpopEnabled, "dpopEnabled");
|
|
549
|
-
var _DPOP_DB = "cfg
|
|
738
|
+
var _DPOP_DB = "cfg.auth.dpop";
|
|
550
739
|
var _DPOP_STORE = "keys";
|
|
551
740
|
var _DPOP_KEY_ID = "dpop-ec-p256";
|
|
552
741
|
function _idbOpen() {
|
|
@@ -2881,6 +3070,9 @@ var logAuthFailure = /* @__PURE__ */ __name((log, message, error) => {
|
|
|
2881
3070
|
}, "logAuthFailure");
|
|
2882
3071
|
|
|
2883
3072
|
// src/auth/hooks/useGithubAuth.ts
|
|
3073
|
+
var OAUTH_STATE_KEY = CFG_KEYS.oauthState.key;
|
|
3074
|
+
var OAUTH_PROVIDER_KEY = CFG_KEYS.oauthProvider.key;
|
|
3075
|
+
var OAUTH_REMEMBER_KEY = CFG_KEYS.oauthRememberMe.key;
|
|
2884
3076
|
var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
|
|
2885
3077
|
const { sourceUrl, rememberMe = false, onSuccess, onError, onRequires2FA, redirectUrl, skipRedirect = false } = options;
|
|
2886
3078
|
const router = useCfgRouter();
|
|
@@ -2908,9 +3100,9 @@ var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
|
|
|
2908
3100
|
}
|
|
2909
3101
|
authLogger.info("Redirecting to GitHub...", response.authorization_url);
|
|
2910
3102
|
if (typeof window !== "undefined") {
|
|
2911
|
-
sessionStorage.setItem(
|
|
2912
|
-
sessionStorage.setItem(
|
|
2913
|
-
sessionStorage.setItem(
|
|
3103
|
+
sessionStorage.setItem(OAUTH_STATE_KEY, response.state);
|
|
3104
|
+
sessionStorage.setItem(OAUTH_PROVIDER_KEY, "github");
|
|
3105
|
+
sessionStorage.setItem(OAUTH_REMEMBER_KEY, String(rememberMe));
|
|
2914
3106
|
}
|
|
2915
3107
|
window.location.href = response.authorization_url;
|
|
2916
3108
|
} catch (err) {
|
|
@@ -2933,14 +3125,14 @@ var useGithubAuth = /* @__PURE__ */ __name((options = {}) => {
|
|
|
2933
3125
|
authLogger.info("Processing GitHub OAuth callback...");
|
|
2934
3126
|
let rememberMeForSession = false;
|
|
2935
3127
|
if (typeof window !== "undefined") {
|
|
2936
|
-
const storedState = sessionStorage.getItem(
|
|
3128
|
+
const storedState = sessionStorage.getItem(OAUTH_STATE_KEY);
|
|
2937
3129
|
if (storedState && storedState !== state) {
|
|
2938
3130
|
throw new Error("Invalid OAuth state - possible CSRF attack");
|
|
2939
3131
|
}
|
|
2940
|
-
rememberMeForSession = sessionStorage.getItem(
|
|
2941
|
-
sessionStorage.removeItem(
|
|
2942
|
-
sessionStorage.removeItem(
|
|
2943
|
-
sessionStorage.removeItem(
|
|
3132
|
+
rememberMeForSession = sessionStorage.getItem(OAUTH_REMEMBER_KEY) === "true";
|
|
3133
|
+
sessionStorage.removeItem(OAUTH_STATE_KEY);
|
|
3134
|
+
sessionStorage.removeItem(OAUTH_PROVIDER_KEY);
|
|
3135
|
+
sessionStorage.removeItem(OAUTH_REMEMBER_KEY);
|
|
2944
3136
|
}
|
|
2945
3137
|
const result = await CfgAccountsOauth.cfgAccountsOauthGithubCallbackCreate({
|
|
2946
3138
|
body: { code, state, remember_me: rememberMeForSession },
|
|
@@ -3052,7 +3244,7 @@ function useSessionStorage(key, initialValue) {
|
|
|
3052
3244
|
const key2 = keys[i];
|
|
3053
3245
|
if (key2) {
|
|
3054
3246
|
sessionStorage.removeItem(key2);
|
|
3055
|
-
sessionStorage.removeItem(`${key2}
|
|
3247
|
+
sessionStorage.removeItem(`${key2}_ts`);
|
|
3056
3248
|
}
|
|
3057
3249
|
} catch {
|
|
3058
3250
|
}
|
|
@@ -3082,7 +3274,7 @@ function useSessionStorage(key, initialValue) {
|
|
|
3082
3274
|
authLogger.warn(`Data size too large for key "${key}", removing key`);
|
|
3083
3275
|
try {
|
|
3084
3276
|
window.sessionStorage.removeItem(key);
|
|
3085
|
-
window.sessionStorage.removeItem(`${key}
|
|
3277
|
+
window.sessionStorage.removeItem(`${key}_ts`);
|
|
3086
3278
|
} catch {
|
|
3087
3279
|
}
|
|
3088
3280
|
setStoredValue(valueToStore);
|
|
@@ -3092,20 +3284,20 @@ function useSessionStorage(key, initialValue) {
|
|
|
3092
3284
|
if (typeof window !== "undefined") {
|
|
3093
3285
|
try {
|
|
3094
3286
|
window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3095
|
-
window.sessionStorage.setItem(`${key}
|
|
3287
|
+
window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3096
3288
|
} catch (storageError) {
|
|
3097
3289
|
if (isQuotaExceededError(storageError)) {
|
|
3098
3290
|
authLogger.warn("sessionStorage quota exceeded, clearing old data...");
|
|
3099
3291
|
clearOldData();
|
|
3100
3292
|
try {
|
|
3101
3293
|
window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3102
|
-
window.sessionStorage.setItem(`${key}
|
|
3294
|
+
window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3103
3295
|
} catch (retryError) {
|
|
3104
3296
|
authLogger.error(`Failed to set sessionStorage key "${key}" after clearing old data:`, retryError);
|
|
3105
3297
|
try {
|
|
3106
3298
|
forceClearAll();
|
|
3107
3299
|
window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3108
|
-
window.sessionStorage.setItem(`${key}
|
|
3300
|
+
window.sessionStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3109
3301
|
} catch (finalError) {
|
|
3110
3302
|
authLogger.error(`Failed to set sessionStorage key "${key}" after force clearing:`, finalError);
|
|
3111
3303
|
setStoredValue(valueToStore);
|
|
@@ -3128,14 +3320,14 @@ function useSessionStorage(key, initialValue) {
|
|
|
3128
3320
|
if (typeof window !== "undefined") {
|
|
3129
3321
|
try {
|
|
3130
3322
|
window.sessionStorage.removeItem(key);
|
|
3131
|
-
window.sessionStorage.removeItem(`${key}
|
|
3323
|
+
window.sessionStorage.removeItem(`${key}_ts`);
|
|
3132
3324
|
} catch (removeError) {
|
|
3133
3325
|
if (isQuotaExceededError(removeError)) {
|
|
3134
3326
|
authLogger.warn("sessionStorage quota exceeded during removal, clearing old data...");
|
|
3135
3327
|
clearOldData();
|
|
3136
3328
|
try {
|
|
3137
3329
|
window.sessionStorage.removeItem(key);
|
|
3138
|
-
window.sessionStorage.removeItem(`${key}
|
|
3330
|
+
window.sessionStorage.removeItem(`${key}_ts`);
|
|
3139
3331
|
} catch (retryError) {
|
|
3140
3332
|
authLogger.error(`Failed to remove sessionStorage key "${key}" after clearing:`, retryError);
|
|
3141
3333
|
forceClearAll();
|
|
@@ -3154,7 +3346,7 @@ function useSessionStorage(key, initialValue) {
|
|
|
3154
3346
|
__name(useSessionStorage, "useSessionStorage");
|
|
3155
3347
|
|
|
3156
3348
|
// src/auth/hooks/useAuthRedirect.ts
|
|
3157
|
-
var AUTH_REDIRECT_KEY =
|
|
3349
|
+
var AUTH_REDIRECT_KEY = CFG_KEYS.redirectUrl.key;
|
|
3158
3350
|
var getRedirectFromStorage = /* @__PURE__ */ __name(() => {
|
|
3159
3351
|
if (typeof window === "undefined") return "";
|
|
3160
3352
|
try {
|
|
@@ -3168,7 +3360,7 @@ var clearRedirectFromStorage = /* @__PURE__ */ __name(() => {
|
|
|
3168
3360
|
if (typeof window === "undefined") return;
|
|
3169
3361
|
try {
|
|
3170
3362
|
window.sessionStorage.removeItem(AUTH_REDIRECT_KEY);
|
|
3171
|
-
window.sessionStorage.removeItem(`${AUTH_REDIRECT_KEY}
|
|
3363
|
+
window.sessionStorage.removeItem(`${AUTH_REDIRECT_KEY}_ts`);
|
|
3172
3364
|
} catch {
|
|
3173
3365
|
}
|
|
3174
3366
|
}, "clearRedirectFromStorage");
|
|
@@ -3584,7 +3776,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
3584
3776
|
const key2 = keys[i];
|
|
3585
3777
|
if (key2) {
|
|
3586
3778
|
localStorage.removeItem(key2);
|
|
3587
|
-
localStorage.removeItem(`${key2}
|
|
3779
|
+
localStorage.removeItem(`${key2}_ts`);
|
|
3588
3780
|
}
|
|
3589
3781
|
} catch {
|
|
3590
3782
|
}
|
|
@@ -3614,7 +3806,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
3614
3806
|
authLogger.warn(`Data size too large for key "${key}", removing key`);
|
|
3615
3807
|
try {
|
|
3616
3808
|
window.localStorage.removeItem(key);
|
|
3617
|
-
window.localStorage.removeItem(`${key}
|
|
3809
|
+
window.localStorage.removeItem(`${key}_ts`);
|
|
3618
3810
|
} catch {
|
|
3619
3811
|
}
|
|
3620
3812
|
setStoredValue(valueToStore);
|
|
@@ -3628,7 +3820,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
3628
3820
|
} else {
|
|
3629
3821
|
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3630
3822
|
}
|
|
3631
|
-
window.localStorage.setItem(`${key}
|
|
3823
|
+
window.localStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3632
3824
|
} catch (storageError) {
|
|
3633
3825
|
if (isQuotaExceededError(storageError)) {
|
|
3634
3826
|
authLogger.warn("localStorage quota exceeded, clearing old data...");
|
|
@@ -3639,7 +3831,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
3639
3831
|
} else {
|
|
3640
3832
|
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3641
3833
|
}
|
|
3642
|
-
window.localStorage.setItem(`${key}
|
|
3834
|
+
window.localStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3643
3835
|
} catch (retryError) {
|
|
3644
3836
|
authLogger.error(`Failed to set localStorage key "${key}" after clearing old data:`, retryError);
|
|
3645
3837
|
try {
|
|
@@ -3649,7 +3841,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
3649
3841
|
} else {
|
|
3650
3842
|
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3651
3843
|
}
|
|
3652
|
-
window.localStorage.setItem(`${key}
|
|
3844
|
+
window.localStorage.setItem(`${key}_ts`, Date.now().toString());
|
|
3653
3845
|
} catch (finalError) {
|
|
3654
3846
|
authLogger.error(`Failed to set localStorage key "${key}" after force clearing:`, finalError);
|
|
3655
3847
|
setStoredValue(valueToStore);
|
|
@@ -3672,14 +3864,14 @@ function useLocalStorage(key, initialValue) {
|
|
|
3672
3864
|
if (typeof window !== "undefined") {
|
|
3673
3865
|
try {
|
|
3674
3866
|
window.localStorage.removeItem(key);
|
|
3675
|
-
window.localStorage.removeItem(`${key}
|
|
3867
|
+
window.localStorage.removeItem(`${key}_ts`);
|
|
3676
3868
|
} catch (removeError) {
|
|
3677
3869
|
if (isQuotaExceededError(removeError)) {
|
|
3678
3870
|
authLogger.warn("localStorage quota exceeded during removal, clearing old data...");
|
|
3679
3871
|
clearOldData();
|
|
3680
3872
|
try {
|
|
3681
3873
|
window.localStorage.removeItem(key);
|
|
3682
|
-
window.localStorage.removeItem(`${key}
|
|
3874
|
+
window.localStorage.removeItem(`${key}_ts`);
|
|
3683
3875
|
} catch (retryError) {
|
|
3684
3876
|
authLogger.error(`Failed to remove localStorage key "${key}" after clearing:`, retryError);
|
|
3685
3877
|
forceClearAll();
|
|
@@ -3747,7 +3939,7 @@ function useBase64() {
|
|
|
3747
3939
|
__name(useBase64, "useBase64");
|
|
3748
3940
|
|
|
3749
3941
|
// src/auth/hooks/useProfileCache.ts
|
|
3750
|
-
var CACHE_KEY =
|
|
3942
|
+
var CACHE_KEY = CFG_KEYS.profileCache.key;
|
|
3751
3943
|
var CACHE_VERSION = 1;
|
|
3752
3944
|
var DEFAULT_TTL = 144e5;
|
|
3753
3945
|
function getCachedProfile() {
|
|
@@ -4400,7 +4592,7 @@ var resolveAuthRoutes = /* @__PURE__ */ __name((routes) => ({
|
|
|
4400
4592
|
defaultCallback: routes?.defaultCallback || defaultRoutes.defaultCallback,
|
|
4401
4593
|
defaultAuthCallback: routes?.defaultAuthCallback || routes?.auth || defaultRoutes.defaultAuthCallback
|
|
4402
4594
|
}), "resolveAuthRoutes");
|
|
4403
|
-
var EMAIL_STORAGE_KEY =
|
|
4595
|
+
var EMAIL_STORAGE_KEY = CFG_KEYS.email.key;
|
|
4404
4596
|
var AuthContext = createContext2(void 0);
|
|
4405
4597
|
var AuthProviderInternal = /* @__PURE__ */ __name(({ children, config }) => {
|
|
4406
4598
|
const accounts = useAccountsContext();
|