@vybestack/llxprt-code 0.9.0 → 0.9.2

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.
Files changed (34) hide show
  1. package/README.md +31 -13
  2. package/dist/index.js +9 -5
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +3 -3
  5. package/dist/src/auth/BucketFailoverHandlerImpl.d.ts +2 -0
  6. package/dist/src/auth/BucketFailoverHandlerImpl.js +115 -14
  7. package/dist/src/auth/BucketFailoverHandlerImpl.js.map +1 -1
  8. package/dist/src/auth/BucketFailoverHandlerImpl.spec.js +156 -0
  9. package/dist/src/auth/BucketFailoverHandlerImpl.spec.js.map +1 -1
  10. package/dist/src/gemini.js +3 -3
  11. package/dist/src/gemini.js.map +1 -1
  12. package/dist/src/gemini.test.js +45 -0
  13. package/dist/src/gemini.test.js.map +1 -1
  14. package/dist/src/generated/git-commit.d.ts +1 -1
  15. package/dist/src/generated/git-commit.js +1 -1
  16. package/dist/src/integration-tests/cli-args.integration.test.js +26 -0
  17. package/dist/src/integration-tests/cli-args.integration.test.js.map +1 -1
  18. package/dist/src/providers/aliases/codex.config +1 -0
  19. package/dist/src/providers/providerAliases.codex.test.js +2 -2
  20. package/dist/src/providers/providerAliases.codex.test.js.map +1 -1
  21. package/dist/src/ui/components/Footer.d.ts +1 -0
  22. package/dist/src/ui/components/Footer.js +7 -3
  23. package/dist/src/ui/components/Footer.js.map +1 -1
  24. package/dist/src/ui/layouts/DefaultAppLayout.js +4 -2
  25. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  26. package/dist/src/ui/themes/theme.js +7 -1
  27. package/dist/src/ui/themes/theme.js.map +1 -1
  28. package/dist/src/utils/sandbox-ssh.test.js +73 -50
  29. package/dist/src/utils/sandbox-ssh.test.js.map +1 -1
  30. package/dist/src/utils/sandbox.d.ts +28 -3
  31. package/dist/src/utils/sandbox.js +224 -54
  32. package/dist/src/utils/sandbox.js.map +1 -1
  33. package/dist/tsconfig.build.tsbuildinfo +1 -1
  34. package/package.json +3 -3
package/README.md CHANGED
@@ -1,7 +1,10 @@
1
- # LLxprt Code
1
+ <h1>
2
+ <img src="docs/assets/llxprt.svg" alt="LLxprt logo" width="42" />
3
+ <a href="https://vybestack.dev/llxprt-code.html">LLxprt Code</a>
4
+ </h1>
2
5
 
3
6
  [![LLxprt Code CI](https://github.com/vybestack/llxprt-code/actions/workflows/ci.yml/badge.svg)](https://github.com/vybestack/llxprt-code/actions/workflows/ci.yml)
4
- &nbsp;[![Mentioned in Awesome Gemini CLI](https://awesome.re/mentioned-badge.svg)](https://github.com/Piebald-AI/awesome-gemini-cli)&nbsp;[![Discord Server](https://dcbadge.limes.pink/api/server/https://discord.gg/Wc6dZqWWYv?style=flat)](https://discord.gg/Wc6dZqWWYv)&nbsp;![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/vybestack/llxprt-code?utm_source=oss&utm_medium=github&utm_campaign=vybestack%2Fllxprt-code&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews)
7
+ &nbsp;[![Discord Server](https://dcbadge.limes.pink/api/server/https://discord.gg/Wc6dZqWWYv?style=flat)](https://discord.gg/Wc6dZqWWYv)&nbsp;![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/vybestack/llxprt-code?utm_source=oss&utm_medium=github&utm_campaign=vybestack%2Fllxprt-code&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews)
5
8
 
6
9
  ![LLxprt Code Screenshot](./docs/assets/llxprt-screenshot.png)
7
10
 
@@ -45,7 +48,7 @@ Get started immediately with powerful LLM options:
45
48
  - **Load Balancer Profiles**: Balance requests across providers or accounts with automatic failover
46
49
  - **Free Tier Support**: Start coding immediately with Gemini or Qwen free tiers
47
50
  - **Provider Flexibility**: Switch between any Anthropic, Gemini, OpenAI, Kimi, or OpenAI-compatible provider
48
- - **Top Open Models**: Works seamlessly with GLM-5, Kimi K 2.5, MiniMax M2.5, and Qwen 3.5 Next Coder
51
+ - **Top Open Models**: Works seamlessly with GLM 5, Kimi K2.5, MiniMax M2.5, and Qwen 3 Coder Next
49
52
  - **Local Models**: Run models locally with LM Studio, llama.cpp for complete privacy
50
53
  - **Privacy First**: No telemetry by default, local processing available
51
54
  - **Subagent Flexibility**: Create agents with different models, providers, or settings
@@ -53,8 +56,15 @@ Get started immediately with powerful LLM options:
53
56
  - **Zed Integration**: Native Zed editor integration for seamless workflow
54
57
 
55
58
  ```bash
56
- # Install and get started
59
+ # macOS (Homebrew)
60
+ brew tap vybestack/homebrew-tap
61
+ brew update
62
+ brew install llxprt-code
63
+
64
+ # npm
57
65
  npm install -g @vybestack/llxprt-code
66
+
67
+ # Start coding
58
68
  llxprt
59
69
 
60
70
  # Try without installing
@@ -75,13 +85,21 @@ LLxprt Code is a command-line AI assistant designed for developers who want powe
75
85
 
76
86
  ## Quick Start
77
87
 
78
- 1. **Prerequisites:** Node.js 20+ installed
88
+ 1. **Prerequisites:** Node.js 20+ installed (not required for Homebrew)
79
89
  2. **Install:**
90
+
80
91
  ```bash
92
+ # macOS (Homebrew)
93
+ brew tap vybestack/homebrew-tap
94
+ brew update
95
+ brew install llxprt-code
96
+
97
+ # npm
81
98
  npm install -g @vybestack/llxprt-code
82
99
  # Or try without installing:
83
100
  npx @vybestack/llxprt-code
84
101
  ```
102
+
85
103
  3. **Run:** `llxprt`
86
104
  4. **Choose provider:** Use `/provider` to select your preferred LLM service
87
105
  5. **Start coding:** Ask questions, generate code, or analyze projects
@@ -103,7 +121,7 @@ llxprt
103
121
  - **Multi-Account Failover** - Configure multiple OAuth buckets that failover automatically on rate limits
104
122
  - **Load Balancer Profiles** - Balance across providers/accounts with roundrobin or failover policies
105
123
  - **Extensive Provider Support** - Anthropic, Gemini, OpenAI, Kimi, and any OpenAI-compatible provider [**Provider Guide →**](./docs/providers/quick-reference.md)
106
- - **Top Open Models** - GLM-5, Kimi K2.5, MiniMax M2.5, Qwen 3.5 Next Coder
124
+ - **Top Open Models** - GLM 5, Kimi K2.5, MiniMax M2.5, Qwen 3 Coder Next
107
125
  - **Local Model Support** - LM Studio, llama.cpp, Ollama for complete privacy
108
126
  - **Profile System** - Save provider configurations and model settings
109
127
  - **Advanced Subagents** - Isolated AI assistants with different models/providers
@@ -138,7 +156,7 @@ llxprt "Generate unit tests for payment module" > tests/payment.test.js
138
156
 
139
157
  LLxprt Code works seamlessly with the best open-weight models:
140
158
 
141
- ### Kimi K2 Thinking
159
+ ### Kimi K2.5
142
160
 
143
161
  - **Context Window**: 262,144 tokens
144
162
  - **Architecture**: Trillion-parameter MoE (32B active)
@@ -147,27 +165,27 @@ LLxprt Code works seamlessly with the best open-weight models:
147
165
 
148
166
  ```bash
149
167
  /provider kimi
150
- /model kimi-k2-thinking
168
+ /model kimi-for-coding
151
169
  # Or via Synthetic/Chutes:
152
170
  /provider synthetic
153
- /model hf:moonshotai/Kimi-K2-Thinking
171
+ /model hf:moonshotai/Kimi-K2.5
154
172
  ```
155
173
 
156
- ### GLM-4.7
174
+ ### GLM 5
157
175
 
158
176
  - **Context Window**: 200,000 tokens
159
177
  - **Max Output**: 131,072 tokens
160
178
  - **Architecture**: Mixture-of-Experts with 355B total parameters (32B active)
161
179
  - **Strengths**: Coding, multi-step planning, tool integration
162
180
 
163
- ### MiniMax M2.1
181
+ ### MiniMax M2.5
164
182
 
165
183
  - **Context Window**: 196,608 tokens
166
184
  - **Architecture**: MoE with 230B total parameters (10B active)
167
185
  - **Strengths**: Coding workflows, multi-step agents, tool calling
168
186
  - **Cost**: Only 8% of Claude Sonnet, ~2x faster
169
187
 
170
- ### Qwen3 Coder 480B
188
+ ### Qwen 3 Coder Next
171
189
 
172
190
  - **Context Window**: 262,144 tokens
173
191
  - **Max Output**: 65,536 tokens
@@ -211,7 +229,7 @@ Create specialized AI assistants with isolated contexts and different configurat
211
229
  Each subagent can be configured with:
212
230
 
213
231
  - **Different providers** (Gemini vs Anthropic vs Qwen vs Local)
214
- - **Different models** (Flash vs Sonnet vs GLM-5 vs Custom)
232
+ - **Different models** (Flash vs Sonnet vs GLM 5 vs Custom)
215
233
  - **Different tool access** (Restrict or allow specific tools)
216
234
  - **Different settings** (Temperature, timeouts, max turns)
217
235
  - **Isolated runtime context** (No memory or state crossover)
package/dist/index.js CHANGED
@@ -6,23 +6,27 @@
6
6
  */
7
7
  // Note: Using --no-deprecation in shebang to suppress deprecation warnings from dependencies
8
8
  import { main } from './src/gemini.js';
9
- import { FatalError } from '@vybestack/llxprt-code-core';
9
+ import { FatalError, writeToStderr } from '@vybestack/llxprt-code-core';
10
10
  // --- Global Entry Point ---
11
+ // Use writeToStderr instead of console.error so that fatal errors are always
12
+ // visible even after patchStdio() has redirected process.stderr.write to the
13
+ // internal event bus (which may not have listeners yet). Fixes #1667 where
14
+ // config validation errors were silently swallowed.
11
15
  main().catch((error) => {
12
16
  if (error instanceof FatalError) {
13
17
  let errorMessage = error.message;
14
18
  if (!process.env['NO_COLOR']) {
15
19
  errorMessage = `\x1b[31m${errorMessage}\x1b[0m`;
16
20
  }
17
- console.error(errorMessage);
21
+ writeToStderr(`${errorMessage}\n`);
18
22
  process.exit(error.exitCode);
19
23
  }
20
- console.error('An unexpected critical error occurred:');
24
+ writeToStderr('An unexpected critical error occurred:\n');
21
25
  if (error instanceof Error) {
22
- console.error(error.stack);
26
+ writeToStderr(`${error.stack}\n`);
23
27
  }
24
28
  else {
25
- console.error(String(error));
29
+ writeToStderr(`${String(error)}\n`);
26
30
  }
27
31
  process.exit(1);
28
32
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,6FAA6F;AAE7F,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,6BAA6B;AAC7B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,YAAY,GAAG,WAAW,YAAY,SAAS,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,6FAA6F;AAE7F,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAExE,6BAA6B;AAC7B,6EAA6E;AAC7E,6EAA6E;AAC7E,4EAA4E;AAC5E,oDAAoD;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,YAAY,GAAG,WAAW,YAAY,SAAS,CAAC;QAClD,CAAC;QACD,aAAa,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,aAAa,CAAC,0CAA0C,CAAC,CAAC;IAC1D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,aAAa,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vybestack/llxprt-code",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "LLxprt Code",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "dist"
35
35
  ],
36
36
  "config": {
37
- "sandboxImageUri": "ghcr.io/vybestack/llxprt-code/sandbox:0.9.0"
37
+ "sandboxImageUri": "ghcr.io/vybestack/llxprt-code/sandbox:0.9.2"
38
38
  },
39
39
  "dependencies": {
40
40
  "@agentclientprotocol/sdk": "^0.14.1",
@@ -44,7 +44,7 @@
44
44
  "@iarna/toml": "^2.2.5",
45
45
  "@modelcontextprotocol/sdk": "^1.25.2",
46
46
  "@types/update-notifier": "^6.0.8",
47
- "@vybestack/llxprt-code-core": "0.9.0",
47
+ "@vybestack/llxprt-code-core": "0.9.2",
48
48
  "ansi-regex": "^6.2.2",
49
49
  "chalk": "^5.3.0",
50
50
  "cli-spinners": "2.9.2",
@@ -25,6 +25,8 @@ export declare class BucketFailoverHandlerImpl implements BucketFailoverHandler
25
25
  private readonly provider;
26
26
  private readonly oauthManager;
27
27
  private triedBucketsThisSession;
28
+ private ensureBucketsAuthInFlight;
29
+ private foregroundReauthInFlightByBucket;
28
30
  /**
29
31
  * @plan PLAN-20260223-ISSUE1598.P05
30
32
  * @requirement REQ-1598-IC09
@@ -25,6 +25,8 @@ export class BucketFailoverHandlerImpl {
25
25
  provider;
26
26
  oauthManager;
27
27
  triedBucketsThisSession;
28
+ ensureBucketsAuthInFlight = null;
29
+ foregroundReauthInFlightByBucket = new Map();
28
30
  /**
29
31
  * @plan PLAN-20260223-ISSUE1598.P05
30
32
  * @requirement REQ-1598-IC09
@@ -294,17 +296,93 @@ export class BucketFailoverHandlerImpl {
294
296
  candidateBucket = currentBucket;
295
297
  }
296
298
  if (candidateBucket !== undefined) {
297
- try {
298
- logger.debug(`Attempting foreground reauth for bucket: ${candidateBucket}`);
299
- await this.oauthManager.authenticate(this.provider, candidateBucket);
300
- // Verify token exists after reauth (REQ-1598-FL08)
301
- const token = await this.oauthManager.getOAuthToken(this.provider, candidateBucket);
302
- if (token === null) {
303
- logger.warn(`Foreground reauth succeeded but token is null for bucket: ${candidateBucket}`);
304
- this.lastFailoverReasons[candidateBucket] = 'reauth-failed';
299
+ const existingForegroundReauth = this.foregroundReauthInFlightByBucket.get(candidateBucket);
300
+ if (existingForegroundReauth) {
301
+ return existingForegroundReauth;
302
+ }
303
+ const pass3Promise = (async () => {
304
+ const eagerAuthInFlight = this.ensureBucketsAuthInFlight;
305
+ if (eagerAuthInFlight) {
306
+ logger.debug(`Foreground reauth waiting for in-flight eager auth (provider=${this.provider}, bucket=${candidateBucket})`);
307
+ try {
308
+ await eagerAuthInFlight;
309
+ }
310
+ catch (error) {
311
+ logger.debug(`In-flight eager auth failed before pass-3 reauth for ${candidateBucket}:`, error);
312
+ }
313
+ }
314
+ // Re-check whether token became available while this failover attempt was
315
+ // evaluating candidates (e.g. concurrent turn-boundary eager auth).
316
+ let existingToken = null;
317
+ try {
318
+ existingToken = await this.oauthManager.getOAuthToken(this.provider, candidateBucket);
319
+ }
320
+ catch (error) {
321
+ logger.debug(`Token re-check failed before pass-3 reauth for ${candidateBucket}:`, error);
322
+ }
323
+ if (existingToken !== null) {
324
+ const bucketIndex = this.buckets.indexOf(candidateBucket);
325
+ if (bucketIndex >= 0) {
326
+ this.currentBucketIndex = bucketIndex;
327
+ }
305
328
  this.triedBucketsThisSession.add(candidateBucket);
329
+ try {
330
+ this.oauthManager.setSessionBucket(this.provider, candidateBucket);
331
+ }
332
+ catch (setError) {
333
+ logger.warn(`Failed to set session bucket during pass-3 token re-check switch: ${setError}`);
334
+ // Continue anyway
335
+ }
336
+ logger.warn(() => `Bucket failover: switched from ${currentBucket} to ${candidateBucket} after token became available`);
337
+ return true;
306
338
  }
307
- else {
339
+ const lateEagerAuthInFlight = this.ensureBucketsAuthInFlight;
340
+ if (lateEagerAuthInFlight) {
341
+ logger.debug(`Foreground reauth detected late in-flight eager auth (provider=${this.provider}, bucket=${candidateBucket})`);
342
+ try {
343
+ await lateEagerAuthInFlight;
344
+ }
345
+ catch (error) {
346
+ logger.debug(`Late in-flight eager auth failed before pass-3 reauth for ${candidateBucket}:`, error);
347
+ }
348
+ }
349
+ // Final TOCTOU guard: token state may have changed after the initial
350
+ // snapshot/re-checks, including when eager auth started and completed
351
+ // between checks. Re-check one last time before interactive auth.
352
+ let tokenBeforeForegroundAuth = null;
353
+ try {
354
+ tokenBeforeForegroundAuth = await this.oauthManager.getOAuthToken(this.provider, candidateBucket);
355
+ }
356
+ catch (error) {
357
+ logger.debug(`Final token re-check failed before pass-3 reauth for ${candidateBucket}:`, error);
358
+ }
359
+ if (tokenBeforeForegroundAuth !== null) {
360
+ const bucketIndex = this.buckets.indexOf(candidateBucket);
361
+ if (bucketIndex >= 0) {
362
+ this.currentBucketIndex = bucketIndex;
363
+ }
364
+ this.triedBucketsThisSession.add(candidateBucket);
365
+ try {
366
+ this.oauthManager.setSessionBucket(this.provider, candidateBucket);
367
+ }
368
+ catch (setError) {
369
+ logger.warn(`Failed to set session bucket during final pass-3 token re-check switch: ${setError}`);
370
+ // Continue anyway
371
+ }
372
+ logger.warn(() => `Bucket failover: switched from ${currentBucket} to ${candidateBucket} after final token re-check`);
373
+ return true;
374
+ }
375
+ try {
376
+ logger.debug(`Attempting foreground reauth for bucket: ${candidateBucket}`);
377
+ await this.oauthManager.authenticate(this.provider, candidateBucket);
378
+ // Verify token exists after reauth (REQ-1598-FL08)
379
+ const token = await this.oauthManager.getOAuthToken(this.provider, candidateBucket);
380
+ if (token === null) {
381
+ logger.warn(`Foreground reauth succeeded but token is null for bucket: ${candidateBucket}`);
382
+ this.lastFailoverReasons[candidateBucket] = 'reauth-failed';
383
+ this.triedBucketsThisSession.add(candidateBucket);
384
+ return false;
385
+ }
308
386
  // Reauth succeeded — switch bucket
309
387
  const bucketIndex = this.buckets.indexOf(candidateBucket);
310
388
  if (bucketIndex >= 0) {
@@ -321,11 +399,22 @@ export class BucketFailoverHandlerImpl {
321
399
  logger.warn(() => `Bucket failover: switched from ${currentBucket} to ${candidateBucket} after reauth`);
322
400
  return true;
323
401
  }
402
+ catch (reauthError) {
403
+ logger.warn(`Foreground reauth failed for bucket ${candidateBucket}:`, reauthError);
404
+ this.lastFailoverReasons[candidateBucket] = 'reauth-failed';
405
+ this.triedBucketsThisSession.add(candidateBucket);
406
+ return false;
407
+ }
408
+ })();
409
+ this.foregroundReauthInFlightByBucket.set(candidateBucket, pass3Promise);
410
+ try {
411
+ return await pass3Promise;
324
412
  }
325
- catch (reauthError) {
326
- logger.warn(`Foreground reauth failed for bucket ${candidateBucket}:`, reauthError);
327
- this.lastFailoverReasons[candidateBucket] = 'reauth-failed';
328
- this.triedBucketsThisSession.add(candidateBucket);
413
+ finally {
414
+ const current = this.foregroundReauthInFlightByBucket.get(candidateBucket);
415
+ if (current === pass3Promise) {
416
+ this.foregroundReauthInFlightByBucket.delete(candidateBucket);
417
+ }
329
418
  }
330
419
  }
331
420
  // All passes exhausted — failover unsuccessful
@@ -355,7 +444,19 @@ export class BucketFailoverHandlerImpl {
355
444
  if (this.buckets.length <= 1) {
356
445
  return;
357
446
  }
358
- await this.oauthManager.authenticateMultipleBuckets(this.provider, this.buckets);
447
+ if (this.ensureBucketsAuthInFlight) {
448
+ await this.ensureBucketsAuthInFlight;
449
+ return;
450
+ }
451
+ const authPromise = this.oauthManager
452
+ .authenticateMultipleBuckets(this.provider, this.buckets)
453
+ .finally(() => {
454
+ if (this.ensureBucketsAuthInFlight === authPromise) {
455
+ this.ensureBucketsAuthInFlight = null;
456
+ }
457
+ });
458
+ this.ensureBucketsAuthInFlight = authPromise;
459
+ await authPromise;
359
460
  }
360
461
  /**
361
462
  * Reset the session tracking so failover can try buckets again in a new request.
@@ -1 +1 @@
1
- {"version":3,"file":"BucketFailoverHandlerImpl.js","sourceRoot":"","sources":["../../../src/auth/BucketFailoverHandlerImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BucketFailoverHandlerImpl.js","sourceRoot":"","sources":["../../../src/auth/BucketFailoverHandlerImpl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,WAAW,GAIZ,MAAM,6BAA6B,CAAC;AAGrC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,gCAAgC,CAAC,CAAC;AAEjE;;;;;;;GAOG;AACH,MAAM,OAAO,yBAAyB;IAC5B,OAAO,CAAW;IAClB,kBAAkB,CAAS;IAClB,QAAQ,CAAS;IACjB,YAAY,CAAe;IACpC,uBAAuB,CAAc;IACrC,yBAAyB,GAAyB,IAAI,CAAC;IACvD,gCAAgC,GAAG,IAAI,GAAG,EAG/C,CAAC;IAEJ;;;;OAIG;IACK,mBAAmB,GAAwC,EAAE,CAAC;IAEtE,YAAY,OAAiB,EAAE,QAAgB,EAAE,YAA0B;QACzE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,uBAAuB,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjD,8DAA8D;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1D,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,2DAA2D;YAC3D,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;YAChD,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACnD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,sDAAsD;QACtD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAE9B,oEAAoE;QACpE,qEAAqE;QACrE,6BAA6B;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9C,+DAA+D;QAC/D,qCAAqC;QACrC,+DAA+D;QAE/D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,GAA+B,IAAI,CAAC;QAE9C,oDAAoD;QACpD,IACE,OAAO,EAAE,gBAAgB,KAAK,GAAG;YACjC,OAAO,EAAE,gBAAgB,KAAK,GAAG,EACjC,CAAC;YACD,MAAM,GAAG,iBAAiB,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE;gBAC9D,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,aAAa;gBACrB,MAAM,EAAE,OAAO,CAAC,gBAAgB;aACjC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,yDAAyD;YACzD,yEAAyE;YACzE,IAAI,WAAW,GAAsB,IAAI,CAAC;YAC1C,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY;qBAClC,aAAa,EAAE;qBACf,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,yCAAyC;gBACzC,MAAM,CAAC,IAAI,CACT,yBAAyB,IAAI,CAAC,QAAQ,IAAI,aAAa,GAAG,EAC1D,KAAK,CACN,CAAC;gBACF,MAAM,GAAG,UAAU,CAAC;YACtB,CAAC;YAED,IAAI,WAAW,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;gBAEjD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;oBACtB,0EAA0E;oBAC1E,IAAI,CAAC;wBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAC1D,IAAI,CAAC,QAAQ,EACb,aAAa,CACd,CAAC;wBACF,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;4BACrD,+EAA+E;4BAC/E,MAAM,CAAC,KAAK,CACV,8DAA8D,EAC9D;gCACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gCACvB,MAAM,EAAE,aAAa;6BACtB,CACF,CAAC;4BACF,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;oBAAC,OAAO,YAAY,EAAE,CAAC;wBACtB,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,YAAY,CAAC,CAAC;oBACtE,CAAC;oBACD,kCAAkC;oBAClC,MAAM,GAAG,wBAAwB,CAAC;gBACpC,CAAC;qBAAM,IACL,OAAO,EAAE,gBAAgB,KAAK,GAAG;oBACjC,OAAO,EAAE,gBAAgB,KAAK,GAAG,EACjC,CAAC;oBACD,oEAAoE;oBACpE,mEAAmE;oBACnE,6DAA6D;oBAC7D,MAAM,GAAG,wBAAwB,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,qEAAqE;oBACrE,MAAM,GAAG,SAAS,CAAC;gBACrB,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC3B,oCAAoC;gBACpC,MAAM,GAAG,UAAU,CAAC;YACtB,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;QACjD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEhD,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;YAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,aAAa;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,+DAA+D;QAC/D,2DAA2D;QAC3D,oCAAoC;QACpC,6EAA6E;QAC7E,+CAA+C;QAC/C,+DAA+D;QAE/D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,6DAA6D;YAC7D,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,2DAA2D;gBAC3D,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;gBAC/C,CAAC;gBACD,SAAS;YACX,CAAC;YAED,4DAA4D;YAC5D,IAAI,WAAW,GAAsB,IAAI,CAAC;YAC1C,IAAI,CAAC;gBACH,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY;qBAClC,aAAa,EAAE;qBACf,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAEjD,kDAAkD;YAClD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAC1D,IAAI,CAAC,QAAQ,EACb,MAAM,CACP,CAAC;oBACF,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;wBACrD,oCAAoC;wBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACjD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;4BACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;wBACxC,CAAC;wBACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBACzC,IAAI,CAAC;4BACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAC5D,CAAC;wBAAC,OAAO,QAAQ,EAAE,CAAC;4BAClB,MAAM,CAAC,IAAI,CACT,uDAAuD,QAAQ,EAAE,CAClE,CAAC;4BACF,uEAAuE;wBACzE,CAAC;wBACD,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,CACH,gCAAgC,MAAM,uBAAuB,aAAa,EAAE,CAC/E,CAAC;wBACF,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAAC,OAAO,YAAY,EAAE,CAAC;oBACtB,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,GAAG,EAAE,YAAY,CAAC,CAAC;gBAC9D,CAAC;gBACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,wBAAwB,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,2FAA2F;YAC3F,IAAI,KAAK,GAAsB,IAAI,CAAC;YACpC,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CACT,2BAA2B,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,EACrD,KAAK,CACN,CAAC;gBACF,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,mEAAmE;YACnE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CACT,sDAAsD,QAAQ,EAAE,CACjE,CAAC;gBACF,kBAAkB;YACpB,CAAC;YACD,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,CAAC,kCAAkC,aAAa,OAAO,MAAM,EAAE,CACrE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,+DAA+D;QAC/D,uDAAuD;QACvD,oCAAoC;QACpC,iEAAiE;QACjE,gDAAgD;QAChD,+DAA+D;QAE/D,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,mEAAmE;QACnE,IAAI,eAAe,GAAuB,SAAS,CAAC;QACpD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,cAAc,GAClB,YAAY,KAAK,wBAAwB;gBACzC,YAAY,KAAK,UAAU,CAAC;YAC9B,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,eAAe,GAAG,MAAM,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QACD,yEAAyE;QACzE,IACE,eAAe,KAAK,SAAS;YAC7B,aAAa;YACb,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,KAAK,wBAAwB;gBACnE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC,EACzD,CAAC;YACD,eAAe,GAAG,aAAa,CAAC;QAClC,CAAC;QAED,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,wBAAwB,GAC5B,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7D,IAAI,wBAAwB,EAAE,CAAC;gBAC7B,OAAO,wBAAwB,CAAC;YAClC,CAAC;YAED,MAAM,YAAY,GAAG,CAAC,KAAK,IAAsB,EAAE;gBACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,CAAC;gBACzD,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,CAAC,KAAK,CACV,gEAAgE,IAAI,CAAC,QAAQ,YAAY,eAAe,GAAG,CAC5G,CAAC;oBACF,IAAI,CAAC;wBACH,MAAM,iBAAiB,CAAC;oBAC1B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CACV,wDAAwD,eAAe,GAAG,EAC1E,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,0EAA0E;gBAC1E,oEAAoE;gBACpE,IAAI,aAAa,GAAsB,IAAI,CAAC;gBAC5C,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CACnD,IAAI,CAAC,QAAQ,EACb,eAAe,CAChB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CACV,kDAAkD,eAAe,GAAG,EACpE,KAAK,CACN,CAAC;gBACJ,CAAC;gBAED,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBAC1D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;wBACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;oBACxC,CAAC;oBACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAClD,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBACrE,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,MAAM,CAAC,IAAI,CACT,qEAAqE,QAAQ,EAAE,CAChF,CAAC;wBACF,kBAAkB;oBACpB,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,CACH,kCAAkC,aAAa,OAAO,eAAe,+BAA+B,CACvG,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,qBAAqB,GAAG,IAAI,CAAC,yBAAyB,CAAC;gBAC7D,IAAI,qBAAqB,EAAE,CAAC;oBAC1B,MAAM,CAAC,KAAK,CACV,kEAAkE,IAAI,CAAC,QAAQ,YAAY,eAAe,GAAG,CAC9G,CAAC;oBACF,IAAI,CAAC;wBACH,MAAM,qBAAqB,CAAC;oBAC9B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CACV,6DAA6D,eAAe,GAAG,EAC/E,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,qEAAqE;gBACrE,sEAAsE;gBACtE,kEAAkE;gBAClE,IAAI,yBAAyB,GAAsB,IAAI,CAAC;gBACxD,IAAI,CAAC;oBACH,yBAAyB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAC/D,IAAI,CAAC,QAAQ,EACb,eAAe,CAChB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CACV,wDAAwD,eAAe,GAAG,EAC1E,KAAK,CACN,CAAC;gBACJ,CAAC;gBAED,IAAI,yBAAyB,KAAK,IAAI,EAAE,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBAC1D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;wBACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;oBACxC,CAAC;oBACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAClD,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBACrE,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,MAAM,CAAC,IAAI,CACT,2EAA2E,QAAQ,EAAE,CACtF,CAAC;wBACF,kBAAkB;oBACpB,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,CACH,kCAAkC,aAAa,OAAO,eAAe,6BAA6B,CACrG,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,CACV,4CAA4C,eAAe,EAAE,CAC9D,CAAC;oBACF,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBAErE,mDAAmD;oBACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CACjD,IAAI,CAAC,QAAQ,EACb,eAAe,CAChB,CAAC;oBACF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACnB,MAAM,CAAC,IAAI,CACT,6DAA6D,eAAe,EAAE,CAC/E,CAAC;wBACF,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;wBAC5D,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBAClD,OAAO,KAAK,CAAC;oBACf,CAAC;oBAED,mCAAmC;oBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;oBAC1D,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;wBACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;oBACxC,CAAC;oBACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAClD,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;oBACrE,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,MAAM,CAAC,IAAI,CACT,sDAAsD,QAAQ,EAAE,CACjE,CAAC;wBACF,kBAAkB;oBACpB,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,CACH,kCAAkC,aAAa,OAAO,eAAe,eAAe,CACvF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CACT,uCAAuC,eAAe,GAAG,EACzD,WAAW,CACZ,CAAC;oBACF,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;oBAC5D,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAClD,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YACzE,IAAI,CAAC;gBACH,OAAO,MAAM,YAAY,CAAC;YAC5B,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,GACX,IAAI,CAAC,gCAAgC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7D,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;oBAC7B,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,CAAC,KAAK,CACV,GAAG,EAAE,CACH,uDAAuD,IAAI,CAAC,QAAQ,EAAE,CACzE,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE;YACrD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa;YACb,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,0BAA0B;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,yBAAyB,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY;aAClC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;aACxD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,IAAI,CAAC,yBAAyB,KAAK,WAAW,EAAE,CAAC;gBACnD,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,IAAI,CAAC,yBAAyB,GAAG,WAAW,CAAC;QAC7C,MAAM,WAAW,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,sBAAsB;QACpB,OAAO,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACzC,CAAC;CACF"}
@@ -908,5 +908,161 @@ describe('ensureBucketsAuthenticated', () => {
908
908
  // Assert
909
909
  expect(oauthManager.authenticateMultipleBuckets).not.toHaveBeenCalled();
910
910
  });
911
+ it('coalesces concurrent ensureBucketsAuthenticated calls into one in-flight auth run', async () => {
912
+ // Arrange
913
+ const tokenStore = new MemoryTokenStore();
914
+ let resolveAuthRun;
915
+ const authRunPromise = new Promise((resolve) => {
916
+ resolveAuthRun = resolve;
917
+ });
918
+ const oauthManager = {
919
+ getOAuthToken: vi.fn(async () => null),
920
+ getTokenStore: vi.fn(() => tokenStore),
921
+ setSessionBucket: vi.fn(),
922
+ getSessionBucket: vi.fn(() => undefined),
923
+ authenticate: vi.fn(async () => { }),
924
+ authenticateMultipleBuckets: vi.fn(async () => authRunPromise),
925
+ };
926
+ const handler = new BucketFailoverHandlerImpl(['bucket-a', 'bucket-b', 'bucket-c'], 'anthropic', oauthManager);
927
+ // Act
928
+ const first = handler.ensureBucketsAuthenticated();
929
+ const second = handler.ensureBucketsAuthenticated();
930
+ // Assert (before completion): only one underlying auth run started
931
+ expect(oauthManager.authenticateMultipleBuckets).toHaveBeenCalledTimes(1);
932
+ // Complete in-flight run and verify both callers resolve
933
+ resolveAuthRun?.();
934
+ await Promise.all([first, second]);
935
+ expect(oauthManager.authenticateMultipleBuckets).toHaveBeenCalledTimes(1);
936
+ });
937
+ it('clears in-flight state after failure so a later call can retry', async () => {
938
+ // Arrange
939
+ const tokenStore = new MemoryTokenStore();
940
+ const oauthManager = {
941
+ getOAuthToken: vi.fn(async () => null),
942
+ getTokenStore: vi.fn(() => tokenStore),
943
+ setSessionBucket: vi.fn(),
944
+ getSessionBucket: vi.fn(() => undefined),
945
+ authenticate: vi.fn(async () => { }),
946
+ authenticateMultipleBuckets: vi
947
+ .fn()
948
+ .mockRejectedValueOnce(new Error('first auth attempt failed'))
949
+ .mockResolvedValueOnce(undefined),
950
+ };
951
+ const handler = new BucketFailoverHandlerImpl(['bucket-a', 'bucket-b'], 'anthropic', oauthManager);
952
+ // Act / Assert
953
+ await expect(handler.ensureBucketsAuthenticated()).rejects.toThrow('first auth attempt failed');
954
+ await expect(handler.ensureBucketsAuthenticated()).resolves.toBeUndefined();
955
+ expect(oauthManager.authenticateMultipleBuckets).toHaveBeenCalledTimes(2);
956
+ });
957
+ it('reuses token from in-flight eager auth in tryFailover pass 3 without duplicate authenticate call', async () => {
958
+ // Arrange
959
+ const tokenStore = new MemoryTokenStore();
960
+ let releaseEagerAuth;
961
+ const eagerAuthPromise = new Promise((resolve) => {
962
+ releaseEagerAuth = resolve;
963
+ });
964
+ const oauthManager = {
965
+ getOAuthToken: vi.fn(async (_provider, bucket) => tokenStore.getToken('anthropic', bucket)),
966
+ getTokenStore: vi.fn(() => tokenStore),
967
+ setSessionBucket: vi.fn(),
968
+ getSessionBucket: vi.fn(() => 'bucket-a'),
969
+ authenticate: vi.fn(async () => {
970
+ throw new Error('pass-3 authenticate should not be called');
971
+ }),
972
+ authenticateMultipleBuckets: vi.fn(async () => {
973
+ await eagerAuthPromise;
974
+ await tokenStore.saveToken('anthropic', makeToken('eager-token'), 'bucket-b');
975
+ }),
976
+ };
977
+ const handler = new BucketFailoverHandlerImpl(['bucket-a', 'bucket-b'], 'anthropic', oauthManager);
978
+ // Start eager auth and leave it in-flight while failover starts
979
+ const ensurePromise = handler.ensureBucketsAuthenticated();
980
+ const failoverPromise = handler.tryFailover({ triggeringStatus: 401 });
981
+ releaseEagerAuth?.();
982
+ await ensurePromise;
983
+ // Assert
984
+ await expect(failoverPromise).resolves.toBe(true);
985
+ expect(handler.getCurrentBucket()).toBe('bucket-b');
986
+ expect(oauthManager.authenticate).not.toHaveBeenCalled();
987
+ expect(oauthManager.setSessionBucket).toHaveBeenCalledWith('anthropic', 'bucket-b');
988
+ });
989
+ it('coalesces concurrent pass-3 foreground reauth for the same bucket', async () => {
990
+ // Arrange
991
+ const tokenStore = new MemoryTokenStore();
992
+ // Current bucket starts with no token to force pass-3 foreground auth.
993
+ let releaseForegroundAuth;
994
+ const foregroundAuthGate = new Promise((resolve) => {
995
+ releaseForegroundAuth = resolve;
996
+ });
997
+ const oauthManager = {
998
+ getOAuthToken: vi.fn(async (_provider, bucket) => tokenStore.getToken('anthropic', bucket)),
999
+ getTokenStore: vi.fn(() => tokenStore),
1000
+ setSessionBucket: vi.fn(),
1001
+ getSessionBucket: vi.fn(() => 'bucket-a'),
1002
+ authenticate: vi.fn(async (_provider, bucket) => {
1003
+ await foregroundAuthGate;
1004
+ await tokenStore.saveToken('anthropic', makeToken('pass3-token'), bucket ?? 'default');
1005
+ }),
1006
+ authenticateMultipleBuckets: vi.fn(async () => undefined),
1007
+ };
1008
+ const handler = new BucketFailoverHandlerImpl(['bucket-a'], 'anthropic', oauthManager);
1009
+ // Act: Launch two failovers concurrently that both need pass-3 reauth.
1010
+ const first = handler.tryFailover({ triggeringStatus: 401 });
1011
+ const second = handler.tryFailover({ triggeringStatus: 401 });
1012
+ // Allow the shared pass-3 authenticate call to complete.
1013
+ releaseForegroundAuth?.();
1014
+ // Assert: both calls succeed but only one foreground authenticate occurs.
1015
+ await expect(first).resolves.toBe(true);
1016
+ await expect(second).resolves.toBe(true);
1017
+ expect(oauthManager.authenticate).toHaveBeenCalledTimes(1);
1018
+ expect(oauthManager.authenticate).toHaveBeenCalledWith('anthropic', 'bucket-a');
1019
+ });
1020
+ it('re-checks late-started eager auth before pass-3 foreground reauth', async () => {
1021
+ // Arrange
1022
+ const tokenStore = new MemoryTokenStore();
1023
+ let releaseFirstGetOAuthToken;
1024
+ const firstGetOAuthTokenGate = new Promise((resolve) => {
1025
+ releaseFirstGetOAuthToken = resolve;
1026
+ });
1027
+ let releaseEagerAuth;
1028
+ const eagerAuthGate = new Promise((resolve) => {
1029
+ releaseEagerAuth = resolve;
1030
+ });
1031
+ let getOAuthTokenCalls = 0;
1032
+ const oauthManager = {
1033
+ getOAuthToken: vi.fn(async (_provider, bucket) => {
1034
+ getOAuthTokenCalls += 1;
1035
+ if (getOAuthTokenCalls === 1) {
1036
+ await firstGetOAuthTokenGate;
1037
+ return null;
1038
+ }
1039
+ return tokenStore.getToken('anthropic', bucket);
1040
+ }),
1041
+ getTokenStore: vi.fn(() => tokenStore),
1042
+ setSessionBucket: vi.fn(),
1043
+ getSessionBucket: vi.fn(() => 'bucket-b'),
1044
+ authenticate: vi.fn(async (_provider, bucket) => {
1045
+ await tokenStore.saveToken('anthropic', makeToken('pass3-token'), bucket ?? 'default');
1046
+ }),
1047
+ authenticateMultipleBuckets: vi.fn(async () => {
1048
+ await eagerAuthGate;
1049
+ await tokenStore.saveToken('anthropic', makeToken('late-eager-token'), 'bucket-a');
1050
+ }),
1051
+ };
1052
+ const handler = new BucketFailoverHandlerImpl(['bucket-a', 'bucket-b'], 'anthropic', oauthManager);
1053
+ const failoverPromise = handler.tryFailover({ triggeringStatus: 401 });
1054
+ // Start eager auth after pass-3 started, while first token check is blocked.
1055
+ const ensurePromise = handler.ensureBucketsAuthenticated();
1056
+ // Allow first check to complete with null so pass-3 executes late in-flight re-check.
1057
+ releaseFirstGetOAuthToken?.();
1058
+ // Keep eager auth in-flight until pass-3 reaches late guard.
1059
+ await Promise.resolve();
1060
+ releaseEagerAuth?.();
1061
+ await ensurePromise;
1062
+ await expect(failoverPromise).resolves.toBe(true);
1063
+ expect(getOAuthTokenCalls).toBe(2);
1064
+ expect(oauthManager.authenticate).not.toHaveBeenCalled();
1065
+ expect(handler.getCurrentBucket()).toBe('bucket-a');
1066
+ });
911
1067
  });
912
1068
  //# sourceMappingURL=BucketFailoverHandlerImpl.spec.js.map