@@ -187,6 +187,60 @@ describe("provider local service", () => {
|
187 | 187 | await waitForProbeFailure(healthUrl); |
188 | 188 | }); |
189 | 189 | |
| 190 | +it("cancels local service health probe response bodies", async () => { |
| 191 | +let socketClosed = false; |
| 192 | +const sockets = new Set<net.Socket>(); |
| 193 | +const server = net.createServer((socket) => { |
| 194 | +sockets.add(socket); |
| 195 | +socket.on("error", () => undefined); |
| 196 | +socket.on("close", () => { |
| 197 | +sockets.delete(socket); |
| 198 | +socketClosed = true; |
| 199 | +}); |
| 200 | +socket.write( |
| 201 | +["HTTP/1.1 200 OK", "Content-Type: application/json", "", '{"ok":true}'].join("\r\n"), |
| 202 | +); |
| 203 | +}); |
| 204 | +await new Promise<void>((resolve, reject) => { |
| 205 | +server.once("error", reject); |
| 206 | +server.listen(0, "127.0.0.1", () => { |
| 207 | +server.off("error", reject); |
| 208 | +resolve(); |
| 209 | +}); |
| 210 | +}); |
| 211 | +const address = server.address(); |
| 212 | +if (!address || typeof address === "string") { |
| 213 | +throw new Error("missing test server port"); |
| 214 | +} |
| 215 | +const model = attachModelProviderLocalService( |
| 216 | +{ |
| 217 | +id: "demo", |
| 218 | +provider: "local-body-cleanup", |
| 219 | +api: "openai-completions", |
| 220 | +baseUrl: `http://127.0.0.1:${address.port}/v1`, |
| 221 | +} as unknown as Model<"openai-completions">, |
| 222 | +{ |
| 223 | +command: process.execPath, |
| 224 | +args: ["--version"], |
| 225 | +healthUrl: `http://127.0.0.1:${address.port}/v1/models`, |
| 226 | +readyTimeoutMs: 1_000, |
| 227 | +idleStopMs: 1, |
| 228 | +}, |
| 229 | +); |
| 230 | + |
| 231 | +try { |
| 232 | +await expect(ensureModelProviderLocalService(model)).resolves.toBeUndefined(); |
| 233 | +await expect.poll(() => socketClosed, { timeout: 1000, interval: 20 }).toBe(true); |
| 234 | +} finally { |
| 235 | +for (const socket of sockets) { |
| 236 | +socket.destroy(); |
| 237 | +} |
| 238 | +await new Promise<void>((resolve, reject) => { |
| 239 | +server.close((error) => (error ? reject(error) : resolve())); |
| 240 | +}); |
| 241 | +} |
| 242 | +}); |
| 243 | + |
190 | 244 | it("serializes concurrent cold starts for the same local service", async () => { |
191 | 245 | const port = await freePort(); |
192 | 246 | const healthUrl = `http://127.0.0.1:${port}/v1/models`; |
|