openai-ws-opencode 0.1.28 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -115,13 +115,27 @@ Then point OpenCode at the packed tarball through the plugin array:
115
115
 
116
116
  Direct `file:///absolute/path/dist/index.js` imports are useful for debugging, but npm/tarball installs better match how OpenCode resolves dependencies.
117
117
 
118
+ ## Scale controls and load harness
119
+
120
+ Transport limits are boot-latched from env at process start. Defaults: process max sockets 64, provider max 32, max connecting 8, prewarm max connecting 2 with demand reserve 1, one active connection/turn per session scope, per-stream queue 1024 messages / 16 MiB, aggregate queue 256 MiB.
121
+
122
+ Raising `OPENAI_WS_PROCESS_MAX_SOCKETS` above 64 requires positive `OPENAI_WS_SHED_MAX_SESSIONS`, `OPENAI_WS_SHED_LAG_MS`, and `OPENAI_WS_SHED_RSS_MB`, and the aggregate queue must be at most 25% of that RSS guard.
123
+
124
+ Deterministic local harness (no live OpenAI):
125
+
126
+ ```sh
127
+ bun scripts/ws-load-harness.ts --streams 1000 --mode cold --json
128
+ ```
129
+
130
+ Modes: `cold`, `warm`, `blackhole`, `slow-reader`, `abrupt-close`, `provider-limit`.
131
+
118
132
  ## Development
119
133
 
120
134
  ```sh
121
135
  bun install
122
136
  bun run lint
123
137
  bun run typecheck
124
- bun test
138
+ bun run test
125
139
  bun run build
126
140
  npm pack --dry-run
127
141
  ```
package/bin/setup.js CHANGED
@@ -20,7 +20,7 @@ var CODEX_CLI_NPM_ENDPOINT = "https://registry.npmjs.org/-/package/@openai%2Fcod
20
20
  var OPENAI_MODELS_ENDPOINT = `${OPENAI_API_BASE}/models`;
21
21
  var OPENAI_WS_BETA = "responses_websockets=2026-02-06";
22
22
  var CODEX_ORIGINATOR = "opencode";
23
- var USER_AGENT = "openai-ws-opencode/0.1.28";
23
+ var USER_AGENT = "openai-ws-opencode/0.1.30";
24
24
 
25
25
  // src/models/catalog.ts
26
26
  var DEFAULT_TIMEOUT_MS = 800;
@@ -13,7 +13,7 @@ export declare const OPENAI_WS_BETA = "responses_websockets=2026-02-06";
13
13
  export declare const CODEX_ORIGINATOR = "opencode";
14
14
  export declare const CODEX_RESPONSES_ORIGINATOR = "codex-tui";
15
15
  export declare const CODEX_RESPONSES_BETA_FEATURES = "remote_compaction_v2";
16
- export declare const USER_AGENT = "openai-ws-opencode/0.1.28";
16
+ export declare const USER_AGENT = "openai-ws-opencode/0.1.30";
17
17
  export declare const CODEX_OAUTH_SCOPE = "openid profile email offline_access";
18
18
  export declare const OAUTH_PORT = 1455;
19
19
  export declare const X_CODEX_TURN_STATE_HEADER = "x-codex-turn-state";
package/dist/constants.js CHANGED
@@ -13,7 +13,7 @@ export const OPENAI_WS_BETA = "responses_websockets=2026-02-06";
13
13
  export const CODEX_ORIGINATOR = "opencode";
14
14
  export const CODEX_RESPONSES_ORIGINATOR = "codex-tui";
15
15
  export const CODEX_RESPONSES_BETA_FEATURES = "remote_compaction_v2";
16
- export const USER_AGENT = "openai-ws-opencode/0.1.28";
16
+ export const USER_AGENT = "openai-ws-opencode/0.1.30";
17
17
  export const CODEX_OAUTH_SCOPE = "openid profile email offline_access";
18
18
  export const OAUTH_PORT = 1455;
19
19
  export const X_CODEX_TURN_STATE_HEADER = "x-codex-turn-state";
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,qBAAqB,CAAA;AA6ExD,QAAA,MAAM,qBAAqB,EAAE,MAuK5B,CAAA;AAED,eAAe,qBAAqB,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAiGxD,QAAA,MAAM,qBAAqB,EAAE,MAuM5B,CAAA;AAED,eAAe,qBAAqB,CAAA"}
package/dist/plugin.js CHANGED
@@ -6,8 +6,8 @@ import { fetchCodexCatalog, fetchOpenAIModelIds, resolveCodexClientVersion } fro
6
6
  import { CODEX_EFFECTIVE_CONTEXT_WINDOW, CODEX_OUTPUT_TOKEN_LIMIT, OPENAI_WS_MODELS } from "./models/defaults.js";
7
7
  import { resolveModelsForApiKey, resolveModelsForOAuth } from "./models/resolve.js";
8
8
  import { prepareHttpFallbackBody } from "./transport/body.js";
9
- import { bridgeWebSocket } from "./transport/bridge.js";
10
- import { closeConnections, ensureWarmConnection, invalidateStaleAuthConnections } from "./transport/pool.js";
9
+ import { abortAllBridgeStreams, abortBridgeStreamsForSession, bridgeWebSocket } from "./transport/bridge.js";
10
+ import { clearAllTransportState, clearSessionTransportState, closeConnections, ensureWarmConnection, invalidateStaleAuthConnections, } from "./transport/pool.js";
11
11
  import { extractTransportContext, httpAuthHeaders, transportIdentity } from "./transport/headers.js";
12
12
  function stableHash(value) {
13
13
  return crypto.createHash("sha256").update(JSON.stringify(value ?? "")).digest("hex").slice(0, 32);
@@ -52,7 +52,17 @@ function shouldBridge(url, init) {
52
52
  (url.pathname.includes("/v1/responses") || url.pathname.includes("/backend-api/codex/responses")) &&
53
53
  typeof init.body === "string");
54
54
  }
55
+ function matchesSessionConnection(conn, sessionID) {
56
+ return (conn.activeSessionID === sessionID ||
57
+ conn.lastSessionID === sessionID ||
58
+ conn.headers.session_id === sessionID ||
59
+ conn.headers["session-id"] === sessionID);
60
+ }
55
61
  const OpenAIWebSocketPlugin = async ({ client }) => {
62
+ let currentIdentity;
63
+ const setIdentity = (identity) => {
64
+ currentIdentity = identity;
65
+ };
56
66
  const hooks = {
57
67
  "chat.headers": async (input, output) => {
58
68
  if (input.model.providerID !== PROVIDER_ID)
@@ -62,6 +72,18 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
62
72
  headers[INTERNAL_AGENT_HEADER] = input.agent;
63
73
  headers[INTERNAL_MODEL_HEADER] = input.model.id ?? input.model.modelID;
64
74
  headers[INTERNAL_PREFIX_HASH_HEADER] = stableHash(input.message);
75
+ const identity = currentIdentity;
76
+ if (!identity)
77
+ return;
78
+ try {
79
+ ensureWarmConnection(identity.wsUrl, identity.wsHeaders, {
80
+ sessionID: input.sessionID,
81
+ agent: input.agent,
82
+ });
83
+ }
84
+ catch {
85
+ // Best-effort prewarm: admission/network failures must not break chat.headers.
86
+ }
65
87
  },
66
88
  "chat.params": async (input, _output) => {
67
89
  if (input.model.providerID !== PROVIDER_ID)
@@ -85,20 +107,28 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
85
107
  event: async ({ event }) => {
86
108
  if (event.type === "session.deleted") {
87
109
  const deletedSessionID = event.properties?.info?.id;
88
- closeConnections((conn) => conn.activeSessionID === deletedSessionID || conn.lastSessionID === deletedSessionID);
110
+ if (typeof deletedSessionID === "string" && deletedSessionID) {
111
+ abortBridgeStreamsForSession(deletedSessionID, new Error("Session disposed"));
112
+ closeConnections((conn) => matchesSessionConnection(conn, deletedSessionID));
113
+ clearSessionTransportState(deletedSessionID);
114
+ }
89
115
  return;
90
116
  }
91
117
  const eventType = String(event.type);
92
118
  if (eventType === "server.instance.disposed" || eventType === "global.disposed") {
119
+ abortAllBridgeStreams(new Error("Session disposed"));
93
120
  closeConnections();
121
+ clearAllTransportState();
94
122
  }
95
123
  },
96
124
  auth: {
97
125
  provider: PROVIDER_ID,
98
126
  async loader(getAuth, provider) {
99
127
  const auth = (await getAuth().catch(() => undefined));
100
- if (!auth)
128
+ if (!auth) {
129
+ setIdentity(undefined);
101
130
  return {};
131
+ }
102
132
  if (auth?.type === "api" && auth.key) {
103
133
  const apiKey = auth.key;
104
134
  if (provider) {
@@ -107,7 +137,7 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
107
137
  }
108
138
  const identity = transportIdentity({ type: "api", apiKey });
109
139
  invalidateStaleAuthConnections(identity.wsUrl, identity.wsHeaders);
110
- ensureWarmConnection(identity.wsUrl, identity.wsHeaders);
140
+ setIdentity({ wsUrl: identity.wsUrl, wsHeaders: identity.wsHeaders });
111
141
  return {
112
142
  apiKey,
113
143
  baseURL: OPENAI_API_BASE,
@@ -152,6 +182,7 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
152
182
  initialAuth = await resolveOAuthAuth(auth, client);
153
183
  }
154
184
  catch {
185
+ setIdentity(undefined);
155
186
  if (provider)
156
187
  provider.models = resolveModelsForOAuth(undefined, provider.models);
157
188
  return {};
@@ -163,18 +194,21 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
163
194
  }
164
195
  const initialIdentity = transportIdentity({ type: "oauth", accessToken: initialAuth.accessToken, accountId: initialAuth.accountId }, initialClientVersion);
165
196
  invalidateStaleAuthConnections(initialIdentity.wsUrl, initialIdentity.wsHeaders);
166
- ensureWarmConnection(initialIdentity.wsUrl, initialIdentity.wsHeaders);
197
+ setIdentity({ wsUrl: initialIdentity.wsUrl, wsHeaders: initialIdentity.wsHeaders });
167
198
  return {
168
199
  apiKey: initialAuth.accessToken,
169
200
  baseURL: CODEX_API_BASE,
170
201
  async fetch(input, init) {
171
202
  const currentAuth = (await getAuth());
172
- if (currentAuth?.type !== "oauth")
203
+ if (currentAuth?.type !== "oauth") {
204
+ setIdentity(undefined);
173
205
  throw new Error("OpenAI WebSocket OAuth auth is missing");
206
+ }
174
207
  const { accessToken, accountId } = await resolveOAuthAuth(currentAuth, client);
175
208
  const clientVersion = await resolveCodexClientVersion();
176
209
  const identity = transportIdentity({ type: "oauth", accessToken, accountId }, clientVersion);
177
210
  invalidateStaleAuthConnections(identity.wsUrl, identity.wsHeaders);
211
+ setIdentity({ wsUrl: identity.wsUrl, wsHeaders: identity.wsHeaders });
178
212
  const url = typeof input === "string" ? new URL(input) : input instanceof URL ? input : new URL(input.url);
179
213
  const context = extractTransportContext(init?.headers);
180
214
  if (shouldBridge(url, init)) {
@@ -211,6 +245,7 @@ const OpenAIWebSocketPlugin = async ({ client }) => {
211
245
  },
212
246
  };
213
247
  }
248
+ setIdentity(undefined);
214
249
  return {};
215
250
  },
216
251
  methods: oauthMethods,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/testing.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { oauthTesting } from "./auth/oauth.js";
2
2
  export { prepareBody, prepareHttpFallbackBody } from "./transport/body.js";
3
3
  export { apiKeyWebSocketHeaders, oauthWebSocketHeaders, extractTransportContext, transportIdentity } from "./transport/headers.js";
4
- export { connectionPool, readyState, ensureWarmConnection, invalidateStaleAuthConnections, resetPoolForTesting, resetWebSocketConstructorForTesting, setWebSocketConstructorForTesting, getTransportSnapshotForTesting, } from "./transport/pool.js";
4
+ export { connectionPool, readyState, ensureWarmConnection, clearTransportContextState, clearSessionTransportState, clearAllTransportState, invalidateStaleAuthConnections, resetPoolForTesting, resetWebSocketConstructorForTesting, setWebSocketConstructorForTesting, getTransportSnapshotForTesting, } from "./transport/pool.js";
5
5
  export { bridgeWebSocket } from "./transport/bridge.js";
6
6
  export { fallbackCodexClientVersion, fetchCodexCatalog, fetchOpenAIModelIds, resetCatalogCacheForTesting, resolveCodexClientVersion } from "./models/catalog.js";
7
7
  export { resolveModels, resolveModelsForApiKey, resolveModelsForOAuth, providerConfig } from "./models/resolve.js";
@@ -13,6 +13,7 @@ export declare function setTransportConfigForTesting(partial: Partial<TransportC
13
13
  export declare function resetTransportConfigForTesting(): void;
14
14
  /** Fixed-cardinality coordinator snapshot (no secrets / raw IDs). */
15
15
  export declare function transportSnapshot(): {
16
+ contextEntries: number;
16
17
  physicalSockets: number;
17
18
  connecting: number;
18
19
  prewarming: number;
@@ -46,6 +47,7 @@ export declare function transportSnapshot(): {
46
47
  connect_failure: number;
47
48
  handshake_timeout: number;
48
49
  stale_auth: number;
50
+ other: number;
49
51
  };
50
52
  httpByReason: {
51
53
  provider_breaker: number;
@@ -59,8 +61,10 @@ export declare function transportSnapshot(): {
59
61
  memory_guard: number;
60
62
  connect_failure: number;
61
63
  handshake_timeout: number;
64
+ stale_auth: number;
62
65
  provider_connection_limit: number;
63
66
  previous_response_not_found: number;
67
+ other: number;
64
68
  };
65
69
  leaseAttempts: number;
66
70
  leaseAdmissions: number;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAClI,OAAO,EACL,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,mCAAmC,EACnC,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAChK,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClH,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAU5D,oEAAoE;AACpE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,QAG7E;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,SAG7C;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEhC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAClI,OAAO,EACL,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,mBAAmB,EACnB,mCAAmC,EACnC,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAChK,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClH,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAU5D,oEAAoE;AACpE,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,QAG7E;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,SAG7C;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEhC"}
package/dist/testing.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { oauthTesting } from "./auth/oauth.js";
2
2
  export { prepareBody, prepareHttpFallbackBody } from "./transport/body.js";
3
3
  export { apiKeyWebSocketHeaders, oauthWebSocketHeaders, extractTransportContext, transportIdentity } from "./transport/headers.js";
4
- export { connectionPool, readyState, ensureWarmConnection, invalidateStaleAuthConnections, resetPoolForTesting, resetWebSocketConstructorForTesting, setWebSocketConstructorForTesting, getTransportSnapshotForTesting, } from "./transport/pool.js";
4
+ export { connectionPool, readyState, ensureWarmConnection, clearTransportContextState, clearSessionTransportState, clearAllTransportState, invalidateStaleAuthConnections, resetPoolForTesting, resetWebSocketConstructorForTesting, setWebSocketConstructorForTesting, getTransportSnapshotForTesting, } from "./transport/pool.js";
5
5
  export { bridgeWebSocket } from "./transport/bridge.js";
6
6
  export { fallbackCodexClientVersion, fetchCodexCatalog, fetchOpenAIModelIds, resetCatalogCacheForTesting, resolveCodexClientVersion } from "./models/catalog.js";
7
7
  export { resolveModels, resolveModelsForApiKey, resolveModelsForOAuth, providerConfig } from "./models/resolve.js";
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAClI,OAAO,EACL,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,mCAAmC,EACnC,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAChK,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClH,OAAO,EACL,sBAAsB,EACtB,eAAe,GAEhB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,8BAA8B,IAAI,uBAAuB,EACzD,4BAA4B,IAAI,qBAAqB,GACtD,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,qBAAqB,CAAA;AAE5B,oEAAoE;AACpE,MAAM,UAAU,4BAA4B,CAAC,OAAiC;IAC5E,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9B,kCAAkC,EAAE,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B;IAC5C,uBAAuB,EAAE,CAAA;IACzB,kCAAkC,EAAE,CAAA;AACtC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,8BAA8B,EAAE,CAAA;AACzC,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAClI,OAAO,EACL,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,mBAAmB,EACnB,mCAAmC,EACnC,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAChK,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClH,OAAO,EACL,sBAAsB,EACtB,eAAe,GAEhB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,8BAA8B,IAAI,uBAAuB,EACzD,4BAA4B,IAAI,qBAAqB,GACtD,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,qBAAqB,CAAA;AAE5B,oEAAoE;AACpE,MAAM,UAAU,4BAA4B,CAAC,OAAiC;IAC5E,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC9B,kCAAkC,EAAE,CAAA;AACtC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B;IAC5C,uBAAuB,EAAE,CAAA;IACzB,kCAAkC,EAAE,CAAA;AACtC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,8BAA8B,EAAE,CAAA;AACzC,CAAC"}
@@ -5,6 +5,12 @@ export type FallbackFetchContext = {
5
5
  clearPreviousResponseId?: boolean;
6
6
  };
7
7
  type FallbackFetch = (signal: AbortSignal, context?: FallbackFetchContext) => Promise<Response>;
8
+ /** Fixed-cardinality active bridge count for tests (no session IDs). */
9
+ export declare function activeBridgeStreamCountForTesting(): number;
10
+ /** Abort active bridge turns for a session (hashed identity; idempotent). */
11
+ export declare function abortBridgeStreamsForSession(sessionID: string, reason?: unknown): void;
12
+ /** Abort every active bridge turn (idempotent). */
13
+ export declare function abortAllBridgeStreams(reason?: unknown): void;
8
14
  export declare function bridgeWebSocket(wsUrl: string, headers: Record<string, string>, requestBody: Record<string, unknown>, isOAuth: boolean, context?: TransportContext, signal?: AbortSignal, fallbackFetch?: FallbackFetch): Response;
9
15
  export {};
10
16
  //# sourceMappingURL=bridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/transport/bridge.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG;IACjC,mFAAmF;IACnF,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC,CAAA;AAED,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AA2L/F,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,gBAAqB,EAC9B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,aAAa,GAC5B,QAAQ,CAkOV"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/transport/bridge.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,gEAAgE;AAChE,MAAM,MAAM,oBAAoB,GAAG;IACjC,mFAAmF;IACnF,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC,CAAA;AAED,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAqC/F,wEAAwE;AACxE,wBAAgB,iCAAiC,IAAI,MAAM,CAE1D;AAED,6EAA6E;AAC7E,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAItF;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5D;AA0MD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,gBAAqB,EAC9B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,aAAa,GAC5B,QAAQ,CAuSV"}
@@ -1,10 +1,57 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { prepareBody } from "./body.js";
2
- import { acquireConnection, allocateStreamKey, closeConnection, closeConnections, sendPending, } from "./pool.js";
3
+ import { acquireConnection, allocateStreamKey, clearTransportContextState, closeConnection, closeConnections, sendPending, } from "./pool.js";
3
4
  import { transportConfig } from "./config.js";
4
5
  import { getTransportCoordinator } from "./coordinator.js";
5
6
  import { CODEX_WS_URL } from "../constants.js";
6
7
  import { isTransportFallbackEligible, WebSocketTransportError } from "./errors.js";
7
8
  const encoder = new TextEncoder();
9
+ const activeBridgeStreams = new Set();
10
+ const activeBridgeStreamsBySession = new Map();
11
+ function hashSessionIdentity(sessionID) {
12
+ return createHash("sha256").update(sessionID).digest("hex");
13
+ }
14
+ function registerBridgeStream(sessionID, handle) {
15
+ activeBridgeStreams.add(handle);
16
+ if (!sessionID)
17
+ return;
18
+ const key = hashSessionIdentity(sessionID);
19
+ let set = activeBridgeStreamsBySession.get(key);
20
+ if (!set) {
21
+ set = new Set();
22
+ activeBridgeStreamsBySession.set(key, set);
23
+ }
24
+ set.add(handle);
25
+ }
26
+ function unregisterBridgeStream(sessionID, handle) {
27
+ activeBridgeStreams.delete(handle);
28
+ if (!sessionID)
29
+ return;
30
+ const key = hashSessionIdentity(sessionID);
31
+ const set = activeBridgeStreamsBySession.get(key);
32
+ if (!set)
33
+ return;
34
+ set.delete(handle);
35
+ if (set.size === 0)
36
+ activeBridgeStreamsBySession.delete(key);
37
+ }
38
+ /** Fixed-cardinality active bridge count for tests (no session IDs). */
39
+ export function activeBridgeStreamCountForTesting() {
40
+ return activeBridgeStreams.size;
41
+ }
42
+ /** Abort active bridge turns for a session (hashed identity; idempotent). */
43
+ export function abortBridgeStreamsForSession(sessionID, reason) {
44
+ const set = activeBridgeStreamsBySession.get(hashSessionIdentity(sessionID));
45
+ if (!set || set.size === 0)
46
+ return;
47
+ for (const handle of [...set])
48
+ handle.abort(reason);
49
+ }
50
+ /** Abort every active bridge turn (idempotent). */
51
+ export function abortAllBridgeStreams(reason) {
52
+ for (const handle of [...activeBridgeStreams])
53
+ handle.abort(reason);
54
+ }
8
55
  function providerForUrl(wsUrl) {
9
56
  return wsUrl === CODEX_WS_URL || wsUrl.includes("chatgpt.com/backend-api/codex") ? "codex" : "openai";
10
57
  }
@@ -46,6 +93,13 @@ function abortPending(conn, error) {
46
93
  function abortError(signal) {
47
94
  return signal?.reason instanceof Error ? signal.reason : new DOMException("Aborted", "AbortError");
48
95
  }
96
+ function asAbortError(reason) {
97
+ if (reason instanceof Error)
98
+ return reason;
99
+ if (reason === undefined)
100
+ return new DOMException("Aborted", "AbortError");
101
+ return new DOMException(String(reason), "AbortError");
102
+ }
49
103
  function queueOverflowError() {
50
104
  return new WebSocketTransportError({
51
105
  code: "queue_overflow",
@@ -56,6 +110,16 @@ function queueOverflowError() {
56
110
  safeToReplay: false,
57
111
  });
58
112
  }
113
+ function isSseContentType(value) {
114
+ if (!value)
115
+ return false;
116
+ const media = value.split(";", 1)[0].trim().toLowerCase();
117
+ return media === "text/event-stream";
118
+ }
119
+ function fallbackResponseError(response) {
120
+ const contentType = response.headers.get("content-type") ?? "";
121
+ return new Error(`HTTP fallback failed: status=${response.status} content-type=${contentType || "unknown"}`);
122
+ }
59
123
  class BoundedSseSink {
60
124
  provider;
61
125
  streamKey;
@@ -192,19 +256,44 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
192
256
  let fallbackStarted = false;
193
257
  let fallbackPiping = false;
194
258
  let fallbackContext;
259
+ let fallbackReader = null;
195
260
  let sink;
196
261
  let streamController;
197
262
  let streamSettled = false;
263
+ let registered = false;
198
264
  const streamKey = allocateStreamKey();
199
265
  const provider = providerForUrl(wsUrl);
266
+ const sessionID = context.sessionID;
200
267
  const cleanupAbort = () => {
201
268
  if (signal)
202
269
  signal.removeEventListener("abort", onAbort);
203
270
  };
271
+ const cancelFallbackReader = () => {
272
+ const reader = fallbackReader;
273
+ fallbackReader = null;
274
+ if (!reader)
275
+ return;
276
+ try {
277
+ void reader.cancel().catch(() => { });
278
+ }
279
+ catch { }
280
+ try {
281
+ reader.releaseLock();
282
+ }
283
+ catch { }
284
+ };
285
+ const unregister = () => {
286
+ if (!registered)
287
+ return;
288
+ registered = false;
289
+ unregisterBridgeStream(sessionID, bridgeHandle);
290
+ };
204
291
  const finalize = () => {
205
292
  finalized = true;
206
293
  cleanupAbort();
294
+ cancelFallbackReader();
207
295
  fallbackController.abort(new DOMException("Stream finalized", "AbortError"));
296
+ unregister();
208
297
  };
209
298
  const settleError = (error) => {
210
299
  if (streamSettled)
@@ -238,13 +327,31 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
238
327
  fallbackPiping = true;
239
328
  try {
240
329
  const response = await fallbackFetch(fallbackController.signal, fallbackContext);
241
- if (finalized || sink.getError())
330
+ if (finalized || sink.getError()) {
331
+ try {
332
+ await response.body?.cancel();
333
+ }
334
+ catch { }
335
+ return;
336
+ }
337
+ if (!response.ok || !isSseContentType(response.headers.get("content-type"))) {
338
+ const error = fallbackResponseError(response);
339
+ try {
340
+ await response.body?.cancel();
341
+ }
342
+ catch { }
343
+ try {
344
+ sink.error(error);
345
+ }
346
+ catch { }
242
347
  return;
348
+ }
243
349
  if (!response.body) {
244
350
  sink.close();
245
351
  return;
246
352
  }
247
353
  const reader = response.body.getReader();
354
+ fallbackReader = reader;
248
355
  try {
249
356
  while (!finalized && !sink.getError()) {
250
357
  const { value, done } = await reader.read();
@@ -261,7 +368,12 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
261
368
  }
262
369
  }
263
370
  finally {
264
- reader.releaseLock();
371
+ if (fallbackReader === reader)
372
+ fallbackReader = null;
373
+ try {
374
+ reader.releaseLock();
375
+ }
376
+ catch { }
265
377
  }
266
378
  if (!finalized && !sink.getError())
267
379
  sink.close();
@@ -284,18 +396,22 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
284
396
  if (!isTransportFallbackEligible(error))
285
397
  return false;
286
398
  fallbackStarted = true;
399
+ // Clear WSS continuation + turn state for this exact hashed context once before HTTP fallback.
400
+ // Does not mutate the caller request body; previous_response hint stays typed below.
401
+ clearTransportContextState(wsUrl, headers, context);
287
402
  if (error instanceof WebSocketTransportError && error.code === "previous_response_not_found") {
288
403
  fallbackContext = { clearPreviousResponseId: true };
289
404
  }
290
405
  noteFallback(error);
291
406
  return true;
292
407
  };
293
- const onAbort = () => {
408
+ const abortBridge = (reason) => {
294
409
  if (finalized)
295
410
  return;
296
411
  finalized = true;
297
412
  cleanupAbort();
298
- const error = abortError(signal);
413
+ const error = asAbortError(reason ?? (signal ? abortError(signal) : undefined));
414
+ cancelFallbackReader();
299
415
  fallbackController.abort(error);
300
416
  if (conn)
301
417
  abortPending(conn, error);
@@ -306,6 +422,13 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
306
422
  }
307
423
  catch { }
308
424
  }
425
+ unregister();
426
+ };
427
+ const bridgeHandle = {
428
+ abort: abortBridge,
429
+ };
430
+ const onAbort = () => {
431
+ abortBridge(signal ? abortError(signal) : undefined);
309
432
  };
310
433
  const startStream = (acquired, streamSink) => {
311
434
  conn = acquired;
@@ -340,6 +463,8 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
340
463
  };
341
464
  sendPending(conn);
342
465
  };
466
+ // highWaterMark: 0 so pull() reflects real reader demand; unread first chunks
467
+ // stay in BoundedSseSink and honor per-stream / aggregate queue caps.
343
468
  const readable = new ReadableStream({
344
469
  start(controller) {
345
470
  streamController = controller;
@@ -349,6 +474,8 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
349
474
  controller.error(abortError(signal));
350
475
  return;
351
476
  }
477
+ registered = true;
478
+ registerBridgeStream(sessionID, bridgeHandle);
352
479
  sink = new BoundedSseSink(provider, streamKey, () => {
353
480
  const err = sink?.getError();
354
481
  if (!err)
@@ -410,17 +537,22 @@ export function bridgeWebSocket(wsUrl, headers, requestBody, isOAuth, context =
410
537
  },
411
538
  cancel() {
412
539
  // Terminal-but-undrained sinks set finalized before the consumer drains; still release.
413
- if (streamSettled)
540
+ if (streamSettled) {
541
+ cancelFallbackReader();
542
+ unregister();
414
543
  return;
544
+ }
415
545
  streamSettled = true;
416
546
  finalized = true;
417
547
  cleanupAbort();
548
+ cancelFallbackReader();
418
549
  fallbackController.abort(new DOMException("Aborted", "AbortError"));
419
550
  sink?.cancel();
420
551
  if (conn)
421
552
  abortPending(conn, new DOMException("Aborted", "AbortError"));
553
+ unregister();
422
554
  },
423
- });
555
+ }, { highWaterMark: 0 });
424
556
  return new Response(readable, {
425
557
  status: 200,
426
558
  headers: {