@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.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
|
|
346
|
-
|
|
347
|
-
|
|
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
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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]
|
|
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]
|
|
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
|
|
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]
|
|
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]
|
|
492
|
+
console.error("[API] Re-login error:", error);
|
|
503
493
|
lastSuccessToken = null;
|
|
504
494
|
lastSuccessTime = 0;
|
|
505
495
|
return null;
|