{"version":3,"sources":["../../src/inference/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport http from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { afterEach, describe, expect, it } from 'vitest';\nimport { APIConnectionError, APIStatusError, APITimeoutError } from '../_exceptions.js';\nimport { connectWs } from './utils.js';\n\nconst servers: http.Server[] = [];\n\nasync function rejectWebSocket(statusCode: number): Promise<string> {\n  const server = http.createServer((_request, response) => {\n    response.writeHead(statusCode);\n    response.end();\n  });\n  servers.push(server);\n  await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));\n  const { port } = server.address() as AddressInfo;\n  return `ws://127.0.0.1:${port}`;\n}\n\nafterEach(async () => {\n  await Promise.all(\n    servers.splice(0).map(\n      (server) =>\n        new Promise<void>((resolve, reject) => {\n          server.close((error) => (error ? reject(error) : resolve()));\n        }),\n    ),\n  );\n});\n\ndescribe('connectWs', () => {\n  it('surfaces a 429 response as a retryable status error', async () => {\n    const url = await rejectWebSocket(429);\n\n    const error = await connectWs(url, {}, 1_000).catch((error: unknown) => error);\n\n    expect(error).toBeInstanceOf(APIStatusError);\n    expect(error).toMatchObject({\n      message: 'Unexpected server response: 429',\n      statusCode: 429,\n      retryable: true,\n      body: null,\n    });\n  });\n\n  it('surfaces a 401 response as a non-retryable status error', async () => {\n    const url = await rejectWebSocket(401);\n\n    const error = await connectWs(url, {}, 1_000).catch((error: unknown) => error);\n\n    expect(error).toBeInstanceOf(APIStatusError);\n    expect(error).toMatchObject({\n      message: 'Unexpected server response: 401',\n      statusCode: 401,\n      retryable: false,\n      body: null,\n    });\n  });\n\n  it('surfaces a 500 response as a retryable status error', async () => {\n    const url = await rejectWebSocket(500);\n\n    const error = await connectWs(url, {}, 1_000).catch((error: unknown) => error);\n\n    expect(error).toBeInstanceOf(APIStatusError);\n    expect(error).toMatchObject({\n      message: 'Unexpected server response: 500',\n      statusCode: 500,\n      retryable: true,\n      body: null,\n    });\n  });\n\n  it('does not expose the message from a network error', async () => {\n    const error = await connectWs('ws://127.0.0.1:1', {}, 1_000).catch((error: unknown) => error);\n\n    expect(error).toBeInstanceOf(APIConnectionError);\n    expect(error).toMatchObject({\n      message: 'Error connecting to LiveKit WebSocket',\n      retryable: true,\n    });\n  });\n\n  it('times out an unresponsive handshake', async () => {\n    const server = http.createServer(() => {});\n    servers.push(server);\n    await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));\n    const { port } = server.address() as AddressInfo;\n\n    const error = await connectWs(`ws://127.0.0.1:${port}`, {}, 25).catch(\n      (error: unknown) => error,\n    );\n\n    expect(error).toBeInstanceOf(APITimeoutError);\n    expect((error as Error).message).toBe('Timeout connecting to LiveKit WebSocket');\n  });\n});\n"],"mappings":"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","names":["http","error"]}