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