mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-26 04:15:48 -06:00
dc60a9442d
* feat(talk): add GPT-Live gateway relay peer * fix(talk): ignore duplicate GPT-Live sideband audio * fix(openai): harden GPT-Live relay startup * fix(deps): replace vulnerable werift ip helper * fix(deps): scope werift ip override version * fix(openai): normalize relay startup errors * test(ci): register GPT-Live gateway live shard * fix(talk): tighten GPT-Live relay readiness * fix(talk): keep relay override helper private * fix(talk): resolve relay readiness with launch model * fix(openai): preserve GPT-Live media clock * fix(talk): align GPT-Live relay readiness and framing * fix(openai): expire pending GPT-Live reservations * fix(openai): harden GPT-Live delegation audio * style(openai): satisfy RTP reorder lint
84 lines
2.8 KiB
TypeScript
84 lines
2.8 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import {
|
|
releaseOpenAIQuicksilverSession,
|
|
reserveOpenAIQuicksilverSession,
|
|
} from "./realtime-quicksilver-session-limit.js";
|
|
|
|
describe("GPT-Live shared session limit", () => {
|
|
it("prunes expired pending offers before reserving a relay session", () => {
|
|
const owners = Array.from({ length: 9 }, () => Symbol("quicksilver-session"));
|
|
const now = 1_000_000;
|
|
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
try {
|
|
for (const owner of owners.slice(0, 8)) {
|
|
reserveOpenAIQuicksilverSession(owner, { expiresAtMs: now + 1 });
|
|
}
|
|
vi.mocked(Date.now).mockReturnValue(now + 1);
|
|
expect(() => reserveOpenAIQuicksilverSession(owners[8])).not.toThrow();
|
|
} finally {
|
|
for (const owner of owners) {
|
|
releaseOpenAIQuicksilverSession(owner);
|
|
}
|
|
vi.restoreAllMocks();
|
|
}
|
|
});
|
|
|
|
it("keeps unexpired pending offers within the shared cap", () => {
|
|
const owners = Array.from({ length: 9 }, () => Symbol("quicksilver-session"));
|
|
const now = 1_000_000;
|
|
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
try {
|
|
for (const owner of owners.slice(0, 8)) {
|
|
reserveOpenAIQuicksilverSession(owner, { expiresAtMs: now + 1 });
|
|
}
|
|
expect(() => reserveOpenAIQuicksilverSession(owners[8])).toThrow(
|
|
"Too many concurrent OpenAI GPT-Live sessions",
|
|
);
|
|
} finally {
|
|
for (const owner of owners) {
|
|
releaseOpenAIQuicksilverSession(owner);
|
|
}
|
|
vi.restoreAllMocks();
|
|
}
|
|
});
|
|
|
|
it("does not expire established sessions", () => {
|
|
const owners = Array.from({ length: 9 }, () => Symbol("quicksilver-session"));
|
|
const now = 1_000_000;
|
|
vi.spyOn(Date, "now").mockReturnValue(now);
|
|
try {
|
|
for (const owner of owners.slice(0, 8)) {
|
|
reserveOpenAIQuicksilverSession(owner, { expiresAtMs: now + 1 });
|
|
reserveOpenAIQuicksilverSession(owner);
|
|
}
|
|
vi.mocked(Date.now).mockReturnValue(now + 60_000);
|
|
expect(() => reserveOpenAIQuicksilverSession(owners[8])).toThrow(
|
|
"Too many concurrent OpenAI GPT-Live sessions",
|
|
);
|
|
} finally {
|
|
for (const owner of owners) {
|
|
releaseOpenAIQuicksilverSession(owner);
|
|
}
|
|
vi.restoreAllMocks();
|
|
}
|
|
});
|
|
|
|
it("releases reservations explicitly", () => {
|
|
const owners = Array.from({ length: 9 }, () => Symbol("quicksilver-session"));
|
|
try {
|
|
for (const owner of owners.slice(0, 8)) {
|
|
reserveOpenAIQuicksilverSession(owner);
|
|
}
|
|
expect(() => reserveOpenAIQuicksilverSession(owners[8])).toThrow(
|
|
"Too many concurrent OpenAI GPT-Live sessions",
|
|
);
|
|
releaseOpenAIQuicksilverSession(owners[0]);
|
|
expect(() => reserveOpenAIQuicksilverSession(owners[8])).not.toThrow();
|
|
} finally {
|
|
for (const owner of owners) {
|
|
releaseOpenAIQuicksilverSession(owner);
|
|
}
|
|
}
|
|
});
|
|
});
|