mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-01 12:52:11 +03:00
Allow chat core callers to disable the emergency fallback path during routed retries and expose proxy cache reset helpers for deterministic state handling. Add regression coverage for chat routing edge cases, combo strategies, stream utilities, cursor SSE termination, and JSON-to-SQLite db migration behavior.
79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
pipeWithDisconnect,
|
|
createStreamController,
|
|
createDisconnectAwareStream,
|
|
} from "../../open-sse/utils/streamHandler.ts";
|
|
|
|
import { wantsProgress, createProgressTransform } from "../../open-sse/utils/progressTracker.ts";
|
|
|
|
test("wantsProgress detects X-OmniRoute-Progress header correctly", () => {
|
|
const headersObj = { "x-omniroute-progress": "true" };
|
|
assert.equal(wantsProgress(new Headers(headersObj)), true);
|
|
|
|
const headersMap = new Map([["x-omniroute-progress", "true"]]);
|
|
assert.equal(wantsProgress(headersMap), true);
|
|
|
|
const headersPlain = { "x-omniroute-progress": "true" };
|
|
assert.equal(wantsProgress(headersPlain), true);
|
|
|
|
assert.equal(wantsProgress({ "x-omniroute-progress": "false" }), false);
|
|
assert.equal(wantsProgress(null), false);
|
|
assert.equal(wantsProgress({}), false);
|
|
});
|
|
|
|
test("createProgressTransform maps SSE text output to valid byte stream with progress", async () => {
|
|
const transform = createProgressTransform({ signal: new AbortController().signal });
|
|
const writer = transform.writable.getWriter();
|
|
|
|
writer.write(new TextEncoder().encode('data: {"chunk":"one"}\n\n'));
|
|
writer.write(new TextEncoder().encode('data: {"chunk":"two"}\n\n'));
|
|
writer.write(new TextEncoder().encode("data: [DONE]\n\n"));
|
|
writer.close();
|
|
|
|
const reader = transform.readable.getReader();
|
|
const decoder = new TextDecoder();
|
|
let result = "";
|
|
|
|
while (true) {
|
|
const { done, value } = await reader.read();
|
|
if (done) break;
|
|
result += decoder.decode(value);
|
|
}
|
|
|
|
assert.match(result, /data: \{"chunk":"one"\}/);
|
|
assert.match(result, /data: \{"chunk":"two"\}/);
|
|
assert.match(result, /data: \[DONE\]/);
|
|
assert.match(result, /event: progress/); // progress check
|
|
assert.match(result, /done":true/);
|
|
});
|
|
|
|
test("createStreamController returns valid controller", () => {
|
|
let completeLogged = false;
|
|
let disconnectLogged = false;
|
|
|
|
const originalLog = console.log;
|
|
console.log = (msg) => {
|
|
if (msg.includes("complete")) completeLogged = true;
|
|
if (msg.includes("disconnect")) disconnectLogged = true;
|
|
};
|
|
|
|
const sc = createStreamController({
|
|
connectionId: "conn_1",
|
|
onStreamComplete: () => {},
|
|
});
|
|
|
|
assert.equal(typeof sc.signal, "object");
|
|
|
|
sc.handleComplete();
|
|
assert.equal(completeLogged, true);
|
|
assert.equal(sc.isConnected(), false);
|
|
|
|
sc.handleDisconnect();
|
|
assert.equal(disconnectLogged, false);
|
|
|
|
console.log = originalLog;
|
|
});
|