| 123456789101112131415161718192021222324252627282930313233 |
- 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<string, string>).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' }])
- })
- })
|