@arbidocs/client 0.3.21 → 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 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 newRequest = request.clone();
353
- newRequest.headers.set("Authorization", `Bearer ${newToken}`);
354
- console.info("[API] Retrying request after re-login");
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 newRequest = request.clone();
367
- newRequest.headers.set("Authorization", `Bearer ${newToken}`);
368
- console.info("[API] Retrying request after re-login:", request.method, request.url);
369
- return fetch(newRequest);
370
- } catch (cloneError) {
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] No user email found for instant re-login");
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] No session found for instant re-login");
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 requires token but none available - aborting re-login");
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] Instant re-login failed");
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] Instant re-login error:", error);
499
+ console.error("[API] Re-login error:", error);
510
500
  lastSuccessToken = null;
511
501
  lastSuccessTime = 0;
512
502
  return null;