Files
openclaw/extensions/openai/realtime-quicksilver-session-limit.test.ts
Peter Steinberger dc60a9442d feat(talk): support GPT-Live over gateway relay (#115831)
* 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
2026-07-29 12:54:23 -04:00

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);
}
}
});
});