Improve event stream resilience
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import { afterEach, describe, expect, it } from 'vitest';
|
||||
import { EventEmitter } from 'node:events';
|
||||
import express from 'express';
|
||||
import path from 'path';
|
||||
|
||||
import { registerOpenCodeProxy } from './lib/opencode/proxy.js';
|
||||
import { registerOpenCodeProxy, writeSseChunkWithBackpressure } from './lib/opencode/proxy.js';
|
||||
|
||||
const listen = (app, host = '127.0.0.1') => new Promise((resolve, reject) => {
|
||||
const server = app.listen(0, host, () => resolve(server));
|
||||
@@ -81,6 +82,27 @@ describe('OpenCode proxy SSE forwarding', () => {
|
||||
expect(seenAuthorization).toBe('Bearer test-token');
|
||||
});
|
||||
|
||||
it('waits for drain when writing to a slow SSE response', async () => {
|
||||
const writes = [];
|
||||
const res = new EventEmitter();
|
||||
res.writableEnded = false;
|
||||
res.destroyed = false;
|
||||
res.write = (value) => {
|
||||
writes.push(value);
|
||||
return false;
|
||||
};
|
||||
const controller = new AbortController();
|
||||
|
||||
const write = writeSseChunkWithBackpressure(res, Buffer.from('data: {"ok":true}\n\n'), controller.signal);
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||
expect(writes).toHaveLength(1);
|
||||
|
||||
res.emit('drain');
|
||||
|
||||
await expect(write).resolves.toBe(true);
|
||||
});
|
||||
|
||||
it('routes generic API requests through external OpenCode base URL', async () => {
|
||||
const upstream = express();
|
||||
upstream.get('/config/providers', (_req, res) => {
|
||||
|
||||
Reference in New Issue
Block a user