openai-ws-opencode 0.1.0

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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/SECURITY.md +11 -0
  4. package/bin/setup.js +239 -0
  5. package/dist/auth/oauth.d.ts +55 -0
  6. package/dist/auth/oauth.d.ts.map +1 -0
  7. package/dist/auth/oauth.js +205 -0
  8. package/dist/auth/oauth.js.map +1 -0
  9. package/dist/auth/tokens.d.ts +19 -0
  10. package/dist/auth/tokens.d.ts.map +1 -0
  11. package/dist/auth/tokens.js +59 -0
  12. package/dist/auth/tokens.js.map +1 -0
  13. package/dist/constants.d.ts +17 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +17 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/models/defaults.d.ts +16 -0
  22. package/dist/models/defaults.d.ts.map +1 -0
  23. package/dist/models/defaults.js +82 -0
  24. package/dist/models/defaults.js.map +1 -0
  25. package/dist/models/resolve.d.ts +112 -0
  26. package/dist/models/resolve.d.ts.map +1 -0
  27. package/dist/models/resolve.js +159 -0
  28. package/dist/models/resolve.js.map +1 -0
  29. package/dist/plugin.d.ts +4 -0
  30. package/dist/plugin.d.ts.map +1 -0
  31. package/dist/plugin.js +142 -0
  32. package/dist/plugin.js.map +1 -0
  33. package/dist/testing.d.ts +7 -0
  34. package/dist/testing.d.ts.map +1 -0
  35. package/dist/testing.js +7 -0
  36. package/dist/testing.js.map +1 -0
  37. package/dist/transport/body.d.ts +3 -0
  38. package/dist/transport/body.d.ts.map +1 -0
  39. package/dist/transport/body.js +22 -0
  40. package/dist/transport/body.js.map +1 -0
  41. package/dist/transport/bridge.d.ts +3 -0
  42. package/dist/transport/bridge.d.ts.map +1 -0
  43. package/dist/transport/bridge.js +78 -0
  44. package/dist/transport/bridge.js.map +1 -0
  45. package/dist/transport/headers.d.ts +32 -0
  46. package/dist/transport/headers.d.ts.map +1 -0
  47. package/dist/transport/headers.js +55 -0
  48. package/dist/transport/headers.js.map +1 -0
  49. package/dist/transport/pool.d.ts +56 -0
  50. package/dist/transport/pool.d.ts.map +1 -0
  51. package/dist/transport/pool.js +259 -0
  52. package/dist/transport/pool.js.map +1 -0
  53. package/package.json +59 -0
@@ -0,0 +1,259 @@
1
+ import crypto from "node:crypto";
2
+ import WebSocket from "ws";
3
+ const DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
4
+ const MAX_RECONNECT_ATTEMPTS = 3;
5
+ const RECONNECT_DELAY_MS = 100;
6
+ const IDLE_EVICT_MS = 120_000;
7
+ let WebSocketImpl = WebSocket;
8
+ export const connectionPool = [];
9
+ export const readyState = {
10
+ CONNECTING: 0,
11
+ OPEN: 1,
12
+ CLOSING: 2,
13
+ CLOSED: 3,
14
+ };
15
+ function on(ws, event, listener) {
16
+ if (ws.on)
17
+ ws.on(event, listener);
18
+ else
19
+ ws.addEventListener?.(event, listener);
20
+ }
21
+ function off(ws, event, listener) {
22
+ if (ws.off)
23
+ ws.off(event, listener);
24
+ else
25
+ ws.removeEventListener?.(event, listener);
26
+ }
27
+ function scopeKey(wsUrl, headers) {
28
+ const auth = Object.entries(headers)
29
+ .filter(([key]) => ["authorization", "chatgpt-account-id", "originator", "openai-beta"].includes(key.toLowerCase()))
30
+ .sort(([a], [b]) => a.localeCompare(b))
31
+ .map(([key, value]) => `${key}:${value}`)
32
+ .join("\n");
33
+ return `${wsUrl}::${crypto.createHash("sha256").update(auth).digest("hex")}`;
34
+ }
35
+ function clearTimer(timer) {
36
+ if (timer)
37
+ clearTimeout(timer);
38
+ }
39
+ function detach(conn) {
40
+ if (conn.detach) {
41
+ conn.detach();
42
+ conn.detach = null;
43
+ }
44
+ clearTimer(conn.connectTimer);
45
+ clearTimer(conn.idleTimer);
46
+ clearTimer(conn.retryTimer);
47
+ conn.connectTimer = null;
48
+ conn.idleTimer = null;
49
+ conn.retryTimer = null;
50
+ }
51
+ function remove(conn) {
52
+ const index = connectionPool.indexOf(conn);
53
+ if (index >= 0)
54
+ connectionPool.splice(index, 1);
55
+ detach(conn);
56
+ }
57
+ function release(conn) {
58
+ conn.lastSessionID = conn.activeSessionID;
59
+ conn.lastAgent = conn.activeAgent;
60
+ conn.pending = null;
61
+ conn.activeSessionID = undefined;
62
+ conn.activeAgent = undefined;
63
+ conn.busy = false;
64
+ conn.reconnectAttempts = 0;
65
+ const timer = setTimeout(() => {
66
+ if (!conn.busy) {
67
+ remove(conn);
68
+ conn.ws?.close(1000, "idle eviction");
69
+ }
70
+ }, IDLE_EVICT_MS);
71
+ if (typeof timer === "object" && "unref" in timer)
72
+ timer.unref();
73
+ conn.idleTimer = timer;
74
+ }
75
+ function fail(conn, error, closeSocket) {
76
+ const pending = conn.pending;
77
+ if (pending && !pending.done) {
78
+ pending.done = true;
79
+ try {
80
+ pending.controller.error(error);
81
+ }
82
+ catch { }
83
+ }
84
+ conn.pending = null;
85
+ conn.busy = false;
86
+ conn.activeSessionID = undefined;
87
+ conn.activeAgent = undefined;
88
+ if (closeSocket) {
89
+ remove(conn);
90
+ try {
91
+ conn.ws?.terminate?.();
92
+ conn.ws?.close(1000, "aborted");
93
+ }
94
+ catch { }
95
+ }
96
+ }
97
+ function parseFrames(data) {
98
+ const text = typeof data === "string" ? data : Buffer.isBuffer(data) ? data.toString("utf8") : String(data);
99
+ const lines = text
100
+ .split(/\r?\n/)
101
+ .map((line) => line.trim())
102
+ .filter(Boolean);
103
+ const candidates = lines.length ? lines : [text];
104
+ const frames = [];
105
+ for (const candidate of candidates) {
106
+ try {
107
+ const parsed = JSON.parse(candidate);
108
+ if (parsed && typeof parsed === "object")
109
+ frames.push(parsed);
110
+ }
111
+ catch { }
112
+ }
113
+ return frames;
114
+ }
115
+ function enqueueSSE(conn, frame) {
116
+ const pending = conn.pending;
117
+ if (!pending || pending.done)
118
+ return;
119
+ const eventType = typeof frame.type === "string" ? frame.type : "message";
120
+ const encoded = new TextEncoder().encode(`event: ${eventType}\ndata: ${JSON.stringify(frame)}\n\n`);
121
+ pending.forwarded = true;
122
+ pending.controller.enqueue(encoded);
123
+ if (["response.completed", "response.failed", "response.incomplete", "error"].includes(eventType)) {
124
+ pending.done = true;
125
+ pending.controller.close();
126
+ release(conn);
127
+ }
128
+ }
129
+ function connect(conn) {
130
+ const ws = new WebSocketImpl(conn.wsUrl, { headers: conn.headers });
131
+ const generation = ++conn.generation;
132
+ conn.ws = ws;
133
+ clearTimer(conn.retryTimer);
134
+ conn.retryTimer = null;
135
+ clearTimer(conn.connectTimer);
136
+ const connectTimer = setTimeout(() => {
137
+ if (generation !== conn.generation || ws.readyState === readyState.OPEN)
138
+ return;
139
+ fail(conn, new Error("WebSocket connection timed out"), true);
140
+ }, DEFAULT_CONNECT_TIMEOUT_MS);
141
+ if (typeof connectTimer === "object" && "unref" in connectTimer)
142
+ connectTimer.unref();
143
+ conn.connectTimer = connectTimer;
144
+ const handleOpen = () => {
145
+ if (generation !== conn.generation)
146
+ return;
147
+ clearTimer(conn.connectTimer);
148
+ conn.connectTimer = null;
149
+ if (conn.pending && !conn.pending.done) {
150
+ ws.send(JSON.stringify({ type: "response.create", ...conn.pending.body }));
151
+ conn.pending.sent = true;
152
+ }
153
+ };
154
+ const handleMessage = (data) => {
155
+ if (generation !== conn.generation)
156
+ return;
157
+ for (const frame of parseFrames(data))
158
+ enqueueSSE(conn, frame);
159
+ };
160
+ const handleError = () => {
161
+ if (generation !== conn.generation)
162
+ return;
163
+ handleSocketLoss(conn);
164
+ };
165
+ const handleClose = () => {
166
+ if (generation !== conn.generation)
167
+ return;
168
+ handleSocketLoss(conn);
169
+ };
170
+ on(ws, "open", handleOpen);
171
+ on(ws, "message", handleMessage);
172
+ on(ws, "error", handleError);
173
+ on(ws, "close", handleClose);
174
+ conn.detach = () => {
175
+ off(ws, "open", handleOpen);
176
+ off(ws, "message", handleMessage);
177
+ off(ws, "error", handleError);
178
+ off(ws, "close", handleClose);
179
+ };
180
+ }
181
+ function handleSocketLoss(conn) {
182
+ clearTimer(conn.connectTimer);
183
+ conn.connectTimer = null;
184
+ const pending = conn.pending;
185
+ if (!pending || pending.done) {
186
+ remove(conn);
187
+ return;
188
+ }
189
+ if (!pending.sent && conn.reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
190
+ conn.reconnectAttempts++;
191
+ detach(conn);
192
+ const timer = setTimeout(() => {
193
+ conn.retryTimer = null;
194
+ if (!connectionPool.includes(conn) || !conn.pending || conn.pending.done || conn.pending.sent)
195
+ return;
196
+ connect(conn);
197
+ }, RECONNECT_DELAY_MS);
198
+ if (typeof timer === "object" && "unref" in timer)
199
+ timer.unref();
200
+ conn.retryTimer = timer;
201
+ return;
202
+ }
203
+ fail(conn, new Error("WebSocket closed after stream started"), true);
204
+ }
205
+ function create(wsUrl, headers) {
206
+ const conn = {
207
+ ws: null,
208
+ wsUrl,
209
+ headers,
210
+ scopeKey: scopeKey(wsUrl, headers),
211
+ busy: false,
212
+ pending: null,
213
+ generation: 0,
214
+ reconnectAttempts: 0,
215
+ idleTimer: null,
216
+ connectTimer: null,
217
+ retryTimer: null,
218
+ detach: null,
219
+ };
220
+ connectionPool.push(conn);
221
+ connect(conn);
222
+ return conn;
223
+ }
224
+ export function acquireConnection(wsUrl, headers, context) {
225
+ const key = scopeKey(wsUrl, headers);
226
+ const reusable = connectionPool.find((conn) => !conn.busy &&
227
+ conn.scopeKey === key &&
228
+ conn.ws?.readyState === readyState.OPEN &&
229
+ (!context.sessionID || !conn.lastSessionID || conn.lastSessionID === context.sessionID) &&
230
+ (!context.agent || !conn.lastAgent || conn.lastAgent === context.agent));
231
+ const conn = reusable ?? create(wsUrl, headers);
232
+ clearTimer(conn.idleTimer);
233
+ conn.idleTimer = null;
234
+ conn.busy = true;
235
+ return conn;
236
+ }
237
+ export function closeConnections(predicate = () => true) {
238
+ for (const conn of [...connectionPool]) {
239
+ if (!predicate(conn))
240
+ continue;
241
+ fail(conn, new Error("Session disposed"), true);
242
+ }
243
+ }
244
+ export function resetPoolForTesting() {
245
+ for (const conn of [...connectionPool]) {
246
+ try {
247
+ conn.ws?.close(1000, "test reset");
248
+ }
249
+ catch { }
250
+ remove(conn);
251
+ }
252
+ }
253
+ export function setWebSocketConstructorForTesting(ctor) {
254
+ WebSocketImpl = ctor;
255
+ }
256
+ export function resetWebSocketConstructorForTesting() {
257
+ WebSocketImpl = WebSocket;
258
+ }
259
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/transport/pool.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "openai-ws-opencode",
3
+ "version": "0.1.0",
4
+ "description": "OpenCode plugin for OpenAI Responses WebSocket transport.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/jaredboynton/openai-ws-opencode.git"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ },
18
+ "./testing": {
19
+ "types": "./dist/testing.d.ts",
20
+ "import": "./dist/testing.js"
21
+ }
22
+ },
23
+ "bin": {
24
+ "openai-ws-opencode": "./bin/setup.js"
25
+ },
26
+ "files": [
27
+ "dist/",
28
+ "bin/setup.js",
29
+ "README.md",
30
+ "SECURITY.md",
31
+ "LICENSE",
32
+ "package.json"
33
+ ],
34
+ "scripts": {
35
+ "lint": "tsc --noEmit -p tsconfig.json",
36
+ "typecheck": "tsc --noEmit -p tsconfig.json",
37
+ "test": "vitest run",
38
+ "build": "tsc -p tsconfig.build.json && bun build ./bin/setup.ts --target=node --format=esm --outfile=bin/setup.js --external=jsonc-parser",
39
+ "prepack": "bun run build",
40
+ "prepublishOnly": "bun run lint && bun run typecheck && bun test && bun run build"
41
+ },
42
+ "dependencies": {
43
+ "jsonc-parser": "^3.3.1",
44
+ "ws": "^8.18.3"
45
+ },
46
+ "peerDependencies": {
47
+ "@opencode-ai/plugin": ">=1.0.0 <2"
48
+ },
49
+ "devDependencies": {
50
+ "@opencode-ai/plugin": "^1.14.41",
51
+ "@types/node": "^22.15.0",
52
+ "@types/ws": "^8.18.1",
53
+ "typescript": "^5.8.3",
54
+ "vitest": "^3.2.4"
55
+ },
56
+ "trustedDependencies": [
57
+ "esbuild"
58
+ ]
59
+ }