commandcode-api-proxy 0.1.4 → 0.3.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.
package/dist/upstream.js CHANGED
@@ -9,7 +9,7 @@ import { logger } from "./logger.js";
9
9
  */
10
10
  export function buildHeaders(apiKey, ccVersion, body) {
11
11
  const sessionId = body.threadId;
12
- logger.debug(`Sending Authorization: Bearer ${apiKey.slice(0, 12)}... (length: ${apiKey.length})`);
12
+ logger.debug(`Sending Authorization header (key length: ${apiKey.length})`);
13
13
  return {
14
14
  "Content-Type": "application/json",
15
15
  Accept: "application/json, */*",
@@ -47,44 +47,83 @@ function generateTraceparent() {
47
47
  * regardless of the downstream client's `stream` flag. For non-streaming
48
48
  * downstream requests, the caller drains the returned `stream` into events.
49
49
  *
50
+ * Retryable failures (HTTP 5xx/429, timeouts, network errors) are retried up
51
+ * to MAX_RETRIES times with linear backoff — but ONLY before the stream starts.
52
+ * A client-initiated abort (caller already disconnected) is never retried.
53
+ *
50
54
  * Returns a Readable of parsed CCEvents. Callers MUST consume or destroy it.
51
55
  */
56
+ const MAX_RETRIES = 2;
57
+ const RETRY_BACKOFF_MS = 500;
58
+ function sleep(ms, signal) {
59
+ return new Promise((resolve) => {
60
+ const t = setTimeout(resolve, ms);
61
+ signal?.addEventListener("abort", () => {
62
+ clearTimeout(t);
63
+ resolve();
64
+ }, { once: true });
65
+ });
66
+ }
52
67
  export async function sendToCC(body, options, signal) {
53
- const { apiBase, apiKey, ccVersion, timeoutMs = 300_000 } = options;
68
+ const { apiBase, apiKey, ccVersion, timeoutMs = 600_000, idleTimeoutMs = 120_000, } = options;
54
69
  const url = `${apiBase}/alpha/generate`;
55
70
  // CC's API is always streaming — force it on so the upstream stays a stream.
56
71
  body.params.stream = true;
57
- const controller = new AbortController();
58
- const combinedSignal = signal ? combineSignals(signal, controller.signal) : controller.signal;
59
- const timeout = setTimeout(() => controller.abort(new Error("Upstream timeout")), timeoutMs);
60
- try {
61
- const response = await fetch(url, {
62
- method: "POST",
63
- headers: buildHeaders(apiKey, ccVersion, body),
64
- body: JSON.stringify(body),
65
- signal: combinedSignal,
66
- });
67
- clearTimeout(timeout);
68
- if (!response.ok) {
69
- const errorText = await response.text().catch(() => "");
70
- const isRetryable = response.status >= 500 || response.status === 429;
71
- throw new UpstreamError(`CC API ${response.status}: ${errorText || response.statusText}`, response.status, isRetryable);
72
- }
73
- if (!response.body) {
74
- throw new UpstreamError("CC API returned no body", 0, true);
72
+ let lastError = null;
73
+ for (let attempt = 1; attempt <= MAX_RETRIES + 1; attempt++) {
74
+ // Per-attempt timeout so one dead connection can't burn the whole budget.
75
+ const controller = new AbortController();
76
+ const combinedSignal = signal ? combineSignals(signal, controller.signal) : controller.signal;
77
+ const timeout = setTimeout(() => controller.abort(new Error("Upstream timeout")), timeoutMs);
78
+ try {
79
+ const response = await fetch(url, {
80
+ method: "POST",
81
+ headers: buildHeaders(apiKey, ccVersion, body),
82
+ body: JSON.stringify(body),
83
+ signal: combinedSignal,
84
+ });
85
+ clearTimeout(timeout);
86
+ if (!response.ok) {
87
+ const errorText = await response.text().catch(() => "");
88
+ const retryable = response.status >= 500 || response.status === 429;
89
+ lastError = new UpstreamError(`CC API ${response.status}: ${errorText || response.statusText}`, response.status, retryable);
90
+ if (retryable && attempt <= MAX_RETRIES) {
91
+ logger.warn(`CC upstream ${response.status}, retrying ${attempt}/${MAX_RETRIES}...`);
92
+ await sleep(RETRY_BACKOFF_MS * attempt, signal);
93
+ continue;
94
+ }
95
+ throw lastError;
96
+ }
97
+ if (!response.body) {
98
+ throw new UpstreamError("CC API returned no body", 0, true);
99
+ }
100
+ return {
101
+ stream: nodeReaderToStream(response.body.getReader(), {
102
+ idleTimeoutMs,
103
+ abortSignal: signal,
104
+ }),
105
+ };
75
106
  }
76
- const stream = nodeReaderToStream(response.body.getReader());
77
- return { stream };
78
- }
79
- catch (err) {
80
- clearTimeout(timeout);
81
- if (err instanceof UpstreamError)
82
- throw err;
83
- if (err.name === "AbortError") {
84
- throw new UpstreamError("Request aborted", 0, true);
107
+ catch (err) {
108
+ clearTimeout(timeout);
109
+ if (err instanceof UpstreamError)
110
+ throw err;
111
+ // Distinguish a client-initiated abort (caller is gone — never retry, it
112
+ // only wastes a request) from a timeout/network blip (retryable).
113
+ const aborted = err.name === "AbortError";
114
+ if (aborted && signal?.aborted) {
115
+ throw new UpstreamError("Request aborted", 0, true);
116
+ }
117
+ lastError = new UpstreamError(aborted ? "Upstream timeout" : `Upstream request failed: ${err.message}`, 0, true);
118
+ if (attempt <= MAX_RETRIES) {
119
+ logger.warn(`CC upstream ${aborted ? "timeout" : "error"}, retrying ${attempt}/${MAX_RETRIES}...`);
120
+ await sleep(RETRY_BACKOFF_MS * attempt, signal);
121
+ continue;
122
+ }
123
+ throw lastError;
85
124
  }
86
- throw new UpstreamError(`Upstream request failed: ${err.message}`, 0, true);
87
125
  }
126
+ throw lastError ?? new UpstreamError("Upstream request failed after retries", 0, true);
88
127
  }
89
128
  /**
90
129
  * Drain a CCEvent stream into an array. Used for non-streaming downstream
@@ -125,21 +164,96 @@ function combineSignals(...signals) {
125
164
  }
126
165
  return controller.signal;
127
166
  }
128
- function nodeReaderToStream(reader) {
167
+ function nodeReaderToStream(reader, opts = {}) {
129
168
  const decoder = new TextDecoder();
130
169
  let buffer = "";
131
- return new Readable({
170
+ // Lines parsed from the current upstream chunk that haven't been pushed yet.
171
+ // Kept in closure scope so backpressure mid-chunk doesn't drop them: when
172
+ // push() returns false we return out of read(), and resume here on the next
173
+ // read() call instead of starting a fresh reader.read().
174
+ let pendingLines = [];
175
+ let upstreamDone = false;
176
+ let readerReleased = false;
177
+ // Idle timeout: detect a stalled upstream (TCP open, no chunks arriving).
178
+ // Reset on every successful read(). If it fires we abort the reader so
179
+ // pumpStream's error path synthesizes a clean finish for the client
180
+ // instead of hanging forever waiting on a dead connection.
181
+ const idleMs = opts.idleTimeoutMs ?? 0;
182
+ let idleTimer = null;
183
+ const armIdle = () => {
184
+ if (idleMs <= 0)
185
+ return;
186
+ disarmIdle();
187
+ idleTimer = setTimeout(() => {
188
+ const err = new Error(`CC upstream idle timeout: no data for ${idleMs}ms`);
189
+ err.name = "IdleTimeoutError";
190
+ // Cancel the reader — pending read() will reject with this reason.
191
+ const cancel = reader.cancel;
192
+ if (typeof cancel === "function") {
193
+ cancel.call(reader, err).catch(() => { });
194
+ }
195
+ }, idleMs);
196
+ // Don't keep the event loop alive just for the idle timer.
197
+ idleTimer.unref?.();
198
+ };
199
+ const disarmIdle = () => {
200
+ if (idleTimer) {
201
+ clearTimeout(idleTimer);
202
+ idleTimer = null;
203
+ }
204
+ };
205
+ // Release the underlying reader when the consumer destroys this stream
206
+ // (e.g. client disconnected). Otherwise CC keeps generating tokens nobody
207
+ // will read, burning the user's quota until upstream's own timeout fires.
208
+ const releaseReader = () => {
209
+ disarmIdle();
210
+ if (readerReleased)
211
+ return;
212
+ readerReleased = true;
213
+ const cancel = reader.cancel;
214
+ if (typeof cancel === "function") {
215
+ cancel.call(reader).catch(() => {
216
+ /* already closed */
217
+ });
218
+ }
219
+ };
220
+ const stream = new Readable({
132
221
  objectMode: true,
222
+ emitClose: true,
223
+ destroy(err, cb) {
224
+ releaseReader();
225
+ cb(err);
226
+ },
133
227
  async read() {
134
228
  try {
135
229
  while (true) {
230
+ // Drain anything left over from a previous chunk that was
231
+ // interrupted by backpressure before we read more from upstream.
232
+ while (pendingLines.length > 0) {
233
+ const line = pendingLines.shift();
234
+ const result = parseCCLine(line);
235
+ if (result.type === "event" && result.event) {
236
+ if (!this.push(result.event))
237
+ return; // still backpressured
238
+ }
239
+ }
240
+ if (upstreamDone) {
241
+ this.push(null);
242
+ return;
243
+ }
244
+ armIdle();
136
245
  const { done, value } = await reader.read();
246
+ disarmIdle();
137
247
  if (done) {
138
- // Flush remaining buffer
248
+ upstreamDone = true;
249
+ releaseReader();
250
+ // Flush trailing partial line (no newline terminator).
139
251
  if (buffer.trim()) {
140
252
  const result = parseCCLine(buffer);
253
+ buffer = "";
141
254
  if (result.type === "event" && result.event) {
142
- this.push(result.event);
255
+ if (!this.push(result.event))
256
+ return; // backpressured; null next read
143
257
  }
144
258
  }
145
259
  this.push(null);
@@ -147,21 +261,31 @@ function nodeReaderToStream(reader) {
147
261
  }
148
262
  buffer += decoder.decode(value, { stream: true });
149
263
  const lines = buffer.split("\n");
264
+ // Last segment is the partial line awaiting its newline; keep it.
150
265
  buffer = lines.pop() ?? "";
151
- for (const line of lines) {
152
- const result = parseCCLine(line);
153
- if (result.type === "event" && result.event) {
154
- const canContinue = this.push(result.event);
155
- if (!canContinue)
156
- return;
157
- }
158
- }
266
+ pendingLines = lines;
159
267
  }
160
268
  }
161
269
  catch (err) {
270
+ releaseReader();
162
271
  this.destroy(err);
163
272
  }
164
273
  },
165
274
  });
275
+ // If the caller aborts (client disconnect), make sure a pending read()
276
+ // wakes up. The reader.cancel() in destroy() handles the converse.
277
+ if (opts.abortSignal) {
278
+ const sig = opts.abortSignal;
279
+ if (sig.aborted) {
280
+ releaseReader();
281
+ }
282
+ else {
283
+ sig.addEventListener("abort", () => {
284
+ disarmIdle();
285
+ stream.destroy(new Error("Client disconnected"));
286
+ }, { once: true });
287
+ }
288
+ }
289
+ return stream;
166
290
  }
167
291
  //# sourceMappingURL=upstream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandcode-api-proxy",
3
- "version": "0.1.4",
3
+ "version": "0.3.0",
4
4
  "description": "OpenAI-compatible API proxy for Command Code. Use your Command Code subscription from any OpenAI client.",
5
5
  "keywords": [
6
6
  "ai-proxy",
@@ -27,6 +27,20 @@
27
27
  ],
28
28
  "type": "module",
29
29
  "main": "./dist/proxy.js",
30
+ "scripts": {
31
+ "build": "tsc && tsc-alias",
32
+ "start": "node dist/proxy.js",
33
+ "dev": "tsx src/proxy.ts",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "test:coverage": "vitest run --coverage",
37
+ "lint": "vp lint",
38
+ "fmt": "vp fmt",
39
+ "fmt:check": "vp fmt --check",
40
+ "auth": "tsx src/proxy.ts auth",
41
+ "check": "vp check",
42
+ "prepublishOnly": "pnpm build && pnpm test"
43
+ },
30
44
  "devDependencies": {
31
45
  "@types/node": "^24.0.0",
32
46
  "ai": "^5.0.206",
@@ -39,17 +53,5 @@
39
53
  "engines": {
40
54
  "node": ">=24.0.0"
41
55
  },
42
- "scripts": {
43
- "build": "tsc && tsc-alias",
44
- "start": "node dist/proxy.js",
45
- "dev": "tsx src/proxy.ts",
46
- "test": "vitest run",
47
- "test:watch": "vitest",
48
- "test:coverage": "vitest run --coverage",
49
- "lint": "vp lint",
50
- "fmt": "vp fmt",
51
- "fmt:check": "vp fmt --check",
52
- "auth": "tsx src/proxy.ts auth",
53
- "check": "vp check"
54
- }
55
- }
56
+ "packageManager": "pnpm@10.32.1"
57
+ }