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