import { describe, expect, it } from 'vitest' import { AgentClient, browserTokenProvider } from '../../../packages/client/src/index' describe('客户端 SDK:浏览器令牌', () => { it('缓存令牌、并发共用一次获取、过期前 60 秒换新', async () => { let calls = 0 let ttl = 3600_000 const provider = browserTokenProvider(async () => { calls++ await new Promise(r => setTimeout(r, 10)) return { token: `bt_${calls}`, expiresAt: new Date(Date.now() + ttl).toISOString() } }) const [a, b] = await Promise.all([provider({ refresh: false }), provider({ refresh: false })]) expect([a, b, calls]).toEqual(['bt_1', 'bt_1', 1]) expect(await provider({ refresh: false })).toBe('bt_1') expect(await provider({ refresh: true })).toBe('bt_2') ttl = 30_000 // 快过期的令牌下次使用时换新 expect(await provider({ refresh: true })).toBe('bt_3') expect(await provider({ refresh: false })).toBe('bt_4') }) it('401 时刷新令牌并重试一次;不携带跨域 Cookie', async () => { const seen: { auth: string | null; credentials: RequestInit['credentials'] }[] = [] const fetchImpl = (async (_url: string, init: RequestInit) => { const auth = (init.headers as Record).authorization ?? null seen.push({ auth, credentials: init.credentials }) return auth === 'Bearer bt_new' ? new Response('[]', { status: 200 }) : new Response(JSON.stringify({ error: { code: 'invalid_token', message: 'x' } }), { status: 401 }) }) as typeof fetch const client = new AgentClient({ baseUrl: 'https://agent.example.com', fetch: fetchImpl, getToken: ({ refresh }) => (refresh ? 'bt_new' : 'bt_old') }) expect(await client.profiles()).toEqual([]) expect(seen).toEqual([{ auth: 'Bearer bt_old', credentials: 'same-origin' }, { auth: 'Bearer bt_new', credentials: 'same-origin' }]) }) })