(run)
| 35 | } |
| 36 | |
| 37 | async function withServer(run) { |
| 38 | const traceFile = path.join(os.tmpdir(), `e2e-vertex-${process.pid}-${(process.hrtime.bigint() % 1000000n).toString()}.jsonl`); |
| 39 | const saved = { m: process.env.EVOMAP_PROXY_TRACE, f: process.env.EVOMAP_PROXY_TRACE_FILE, e: process.env.EVOMAP_PROXY_TRACE_ENCRYPTION }; |
| 40 | process.env.EVOMAP_PROXY_TRACE = 'full'; |
| 41 | process.env.EVOMAP_PROXY_TRACE_FILE = traceFile; |
| 42 | process.env.EVOMAP_PROXY_TRACE_ENCRYPTION = '0'; |
| 43 | try { fs.unlinkSync(traceFile); } catch { /* fresh */ } |
| 44 | captured = null; |
| 45 | |
| 46 | const silent = { log() {}, warn() {}, error() {} }; |
| 47 | const routes = { 'POST /v1/projects/:project/locations/:location/publishers/google/models/:modelAction': buildVertexHandler({ vertexProxy: mockVertex, logger: silent }) }; |
| 48 | const srv = new ProxyHttpServer(routes, { port: 0, logger: silent }); |
| 49 | srv.token = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; |
| 50 | srv.server = http.createServer((req, res) => srv._handleRequest(req, res)); |
| 51 | const port = await new Promise((resolve) => srv.server.listen(0, '127.0.0.1', () => resolve(srv.server.address().port))); |
| 52 | srv.actualPort = port; |
| 53 | |
| 54 | const call = ({ reqPath, body }) => new Promise((resolve, reject) => { |
| 55 | const req = http.request({ host: '127.0.0.1', port, path: reqPath, method: 'POST', |
| 56 | headers: { 'content-type': 'application/json', authorization: 'Bearer aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'user-agent': 'google-genai-sdk/1.0' } }, (res) => { |
| 57 | const chunks = []; |
| 58 | res.on('data', (d) => chunks.push(d)); |
| 59 | res.on('end', () => resolve({ status: res.statusCode, bytes: Buffer.concat(chunks) })); |
| 60 | }); |
| 61 | req.on('error', reject); |
| 62 | req.end(JSON.stringify(body)); |
| 63 | }); |
| 64 | |
| 65 | const readRows = async (expected = 1) => { |
| 66 | let lines = []; |
| 67 | for (let i = 0; i < 150; i++) { |
| 68 | if (fs.existsSync(traceFile)) { |
| 69 | lines = fs.readFileSync(traceFile, 'utf8').trim().split('\n').filter(Boolean); |
| 70 | if (lines.length >= expected) break; |
| 71 | } |
| 72 | await sleep(20); |
| 73 | } |
| 74 | return lines.map((l) => JSON.parse(l)); |
| 75 | }; |
| 76 | |
| 77 | try { |
| 78 | await run({ call, readRows }); |
| 79 | } finally { |
| 80 | await new Promise((r) => srv.server.close(r)); |
| 81 | try { fs.unlinkSync(traceFile); } catch { /* ignore */ } |
| 82 | process.env.EVOMAP_PROXY_TRACE = saved.m; process.env.EVOMAP_PROXY_TRACE_FILE = saved.f; process.env.EVOMAP_PROXY_TRACE_ENCRYPTION = saved.e; |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | const VPATH = '/v1/projects/my-proj/locations/us-central1/publishers/google/models/gemini-2.0-flash'; |
| 87 | const body = { contents: [{ role: 'user', parts: [{ text: 'hi' }] }] }; |
no test coverage detected