Improve event stream resilience

This commit is contained in:
Bohdan Triapitsyn
2026-04-24 12:30:11 +03:00
parent f0c3d5e326
commit 9d9af7e263
8 changed files with 240 additions and 2 deletions
+23 -1
View File
@@ -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) => {