@arbidocs/client 0.3.20 → 0.3.22
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/index.cjs +25 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +25 -35
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -341,18 +341,23 @@ function createBearerAuthMiddleware(config) {
|
|
|
341
341
|
|
|
342
342
|
// src/middleware/auto-relogin.ts
|
|
343
343
|
function createAutoReloginMiddleware(config) {
|
|
344
|
+
const cloneCache = /* @__PURE__ */ new WeakMap();
|
|
344
345
|
return {
|
|
346
|
+
async onRequest({ request }) {
|
|
347
|
+
try {
|
|
348
|
+
cloneCache.set(request, request.clone());
|
|
349
|
+
} catch {
|
|
350
|
+
}
|
|
351
|
+
},
|
|
345
352
|
async onResponse({ response, request }) {
|
|
346
353
|
if (response.status === 400) {
|
|
347
354
|
const isSafeMethod = ["GET", "HEAD", "DELETE"].includes(request.method);
|
|
348
355
|
if (isSafeMethod) {
|
|
349
|
-
console.info("[API] 400 error on protected endpoint - triggering instant re-login");
|
|
350
356
|
const newToken = await config.reloginHandler();
|
|
351
357
|
if (newToken) {
|
|
352
|
-
const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
return fetch(newRequest);
|
|
358
|
+
const retryRequest = cloneCache.get(request) ?? request.clone();
|
|
359
|
+
retryRequest.headers.set("Authorization", `Bearer ${newToken}`);
|
|
360
|
+
return fetch(retryRequest);
|
|
356
361
|
}
|
|
357
362
|
}
|
|
358
363
|
}
|
|
@@ -362,13 +367,17 @@ function createAutoReloginMiddleware(config) {
|
|
|
362
367
|
if (!isExcluded) {
|
|
363
368
|
const newToken = await config.reloginHandler();
|
|
364
369
|
if (newToken) {
|
|
370
|
+
const cached = cloneCache.get(request);
|
|
371
|
+
if (cached) {
|
|
372
|
+
cached.headers.set("Authorization", `Bearer ${newToken}`);
|
|
373
|
+
return fetch(cached);
|
|
374
|
+
}
|
|
365
375
|
try {
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
console.warn("[API] Could not clone request for retry:", cloneError);
|
|
376
|
+
const retryRequest = request.clone();
|
|
377
|
+
retryRequest.headers.set("Authorization", `Bearer ${newToken}`);
|
|
378
|
+
return fetch(retryRequest);
|
|
379
|
+
} catch {
|
|
380
|
+
console.warn("[API] Could not retry request after re-login (body already consumed)");
|
|
372
381
|
config.onRetryCloneFailed?.();
|
|
373
382
|
}
|
|
374
383
|
}
|
|
@@ -387,12 +396,10 @@ function createReloginHandler(deps) {
|
|
|
387
396
|
let lastSuccessTime = 0;
|
|
388
397
|
return function instantReLogin() {
|
|
389
398
|
if (reloginPromise) {
|
|
390
|
-
console.info("[API] Re-login already in progress, waiting...");
|
|
391
399
|
return reloginPromise;
|
|
392
400
|
}
|
|
393
401
|
const elapsed = Date.now() - lastSuccessTime;
|
|
394
402
|
if (lastSuccessToken && elapsed < RELOGIN_COOLDOWN_MS) {
|
|
395
|
-
console.info(`[API] Re-login skipped (cooldown, ${elapsed}ms since last success)`);
|
|
396
403
|
return Promise.resolve(lastSuccessToken);
|
|
397
404
|
}
|
|
398
405
|
reloginPromise = (async () => {
|
|
@@ -400,12 +407,12 @@ function createReloginHandler(deps) {
|
|
|
400
407
|
await deps.crypto.ensureReady();
|
|
401
408
|
const userEmail = deps.authState.getUserEmail();
|
|
402
409
|
if (!userEmail) {
|
|
403
|
-
console.warn("[API]
|
|
410
|
+
console.warn("[API] Re-login aborted: no user email");
|
|
404
411
|
return null;
|
|
405
412
|
}
|
|
406
413
|
const session = await deps.sessionStorage.getSession();
|
|
407
414
|
if (!session) {
|
|
408
|
-
console.warn("[API]
|
|
415
|
+
console.warn("[API] Re-login aborted: no session");
|
|
409
416
|
return null;
|
|
410
417
|
}
|
|
411
418
|
const ed25519PublicKey = session.signingPrivateKey.slice(32, 64);
|
|
@@ -416,37 +423,21 @@ function createReloginHandler(deps) {
|
|
|
416
423
|
const timestamp = Math.floor(Date.now() / 1e3);
|
|
417
424
|
const message = `${userEmail}|${timestamp}`;
|
|
418
425
|
const signature = deps.crypto.signMessage(message, session.signingPrivateKey);
|
|
419
|
-
console.info("[API] Attempting instant re-login");
|
|
420
426
|
const ssoState = deps.authState.getSsoState();
|
|
421
|
-
console.info("[API] Re-login SSO mode:", ssoState.isSsoMode);
|
|
422
|
-
console.info("[API] Auth0 authenticated:", ssoState.isAuth0Authenticated);
|
|
423
|
-
console.info("[API] Persisted Auth0 token available:", !!ssoState.auth0AccessToken);
|
|
424
427
|
const isSsoAccount = ssoState.isSsoMode || ssoState.isAuth0Authenticated || !!ssoState.auth0AccessToken;
|
|
425
428
|
let ssoToken = null;
|
|
426
429
|
if (deps.ssoTokenProvider) {
|
|
427
|
-
console.info("[API] SSO token provider available: true");
|
|
428
430
|
try {
|
|
429
431
|
ssoToken = await deps.ssoTokenProvider.getToken();
|
|
430
|
-
console.info(
|
|
431
|
-
"[API] Got SSO token from provider:",
|
|
432
|
-
ssoToken ? "yes (length: " + ssoToken.length + ")" : "no"
|
|
433
|
-
);
|
|
434
432
|
} catch (error) {
|
|
435
433
|
console.error("[API] Failed to get SSO token from provider:", error);
|
|
436
434
|
}
|
|
437
|
-
} else {
|
|
438
|
-
console.info("[API] SSO token provider available: false");
|
|
439
435
|
}
|
|
440
436
|
if (!ssoToken && ssoState.auth0AccessToken) {
|
|
441
437
|
ssoToken = ssoState.auth0AccessToken;
|
|
442
|
-
console.info(
|
|
443
|
-
"[API] Using persisted SSO token (length:",
|
|
444
|
-
ssoToken.length,
|
|
445
|
-
") - may be expired"
|
|
446
|
-
);
|
|
447
438
|
}
|
|
448
439
|
if (!ssoToken && isSsoAccount) {
|
|
449
|
-
console.warn("[API] SSO account
|
|
440
|
+
console.warn("[API] Re-login aborted: SSO account but no token available");
|
|
450
441
|
return null;
|
|
451
442
|
}
|
|
452
443
|
const loginResult = await deps.loginProvider.login({
|
|
@@ -456,7 +447,7 @@ function createReloginHandler(deps) {
|
|
|
456
447
|
ssoToken: ssoToken ?? void 0
|
|
457
448
|
});
|
|
458
449
|
if (!loginResult) {
|
|
459
|
-
console.warn("[API]
|
|
450
|
+
console.warn("[API] Re-login failed");
|
|
460
451
|
return null;
|
|
461
452
|
}
|
|
462
453
|
await deps.sessionStorage.saveSession({
|
|
@@ -494,7 +485,6 @@ function createReloginHandler(deps) {
|
|
|
494
485
|
selectedWorkspaceId,
|
|
495
486
|
encryptedWorkspaceKey
|
|
496
487
|
);
|
|
497
|
-
console.info("[API] Workspace re-opened after re-login");
|
|
498
488
|
}
|
|
499
489
|
}
|
|
500
490
|
} catch (error) {
|
|
@@ -506,7 +496,7 @@ function createReloginHandler(deps) {
|
|
|
506
496
|
lastSuccessTime = Date.now();
|
|
507
497
|
return activeToken;
|
|
508
498
|
} catch (error) {
|
|
509
|
-
console.error("[API]
|
|
499
|
+
console.error("[API] Re-login error:", error);
|
|
510
500
|
lastSuccessToken = null;
|
|
511
501
|
lastSuccessTime = 0;
|
|
512
502
|
return null;
|