@vybestack/llxprt-code-auth 0.10.0 → 0.11.0-nightly.260728.ffaa8d5d7
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/src/proxy/framing.d.ts +2 -0
- package/dist/src/proxy/framing.js +6 -0
- package/dist/src/proxy/framing.js.map +1 -1
- package/dist/src/proxy/proxy-socket-client.d.ts +8 -1
- package/dist/src/proxy/proxy-socket-client.js +87 -13
- package/dist/src/proxy/proxy-socket-client.js.map +1 -1
- package/dist/src/proxy/proxy-token-store.d.ts +1 -1
- package/dist/src/proxy/proxy-token-store.js +2 -2
- package/dist/src/proxy/proxy-token-store.js.map +1 -1
- package/package.json +51 -1
- package/src/proxy/framing.ts +9 -0
- package/src/proxy/proxy-socket-client.ts +108 -37
- package/src/proxy/proxy-token-store.ts +2 -2
|
@@ -22,11 +22,13 @@ export interface FrameDecoderOptions {
|
|
|
22
22
|
* callback returns. Use this to close the connection or log the error.
|
|
23
23
|
*/
|
|
24
24
|
onPartialFrameTimeout?: () => void;
|
|
25
|
+
maxFramesPerFeed?: number;
|
|
25
26
|
}
|
|
26
27
|
export declare class FrameDecoder {
|
|
27
28
|
private buffer;
|
|
28
29
|
private partialFrameTimer;
|
|
29
30
|
private readonly onPartialFrameTimeout?;
|
|
31
|
+
private readonly maxFramesPerFeed?;
|
|
30
32
|
constructor(options?: FrameDecoderOptions);
|
|
31
33
|
feed(chunk: Buffer): Array<Record<string, unknown>>;
|
|
32
34
|
reset(): void;
|
|
@@ -34,8 +34,10 @@ export class FrameDecoder {
|
|
|
34
34
|
buffer = Buffer.alloc(0);
|
|
35
35
|
partialFrameTimer = null;
|
|
36
36
|
onPartialFrameTimeout;
|
|
37
|
+
maxFramesPerFeed;
|
|
37
38
|
constructor(options = {}) {
|
|
38
39
|
this.onPartialFrameTimeout = options.onPartialFrameTimeout;
|
|
40
|
+
this.maxFramesPerFeed = options.maxFramesPerFeed;
|
|
39
41
|
}
|
|
40
42
|
feed(chunk) {
|
|
41
43
|
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
@@ -60,6 +62,10 @@ export class FrameDecoder {
|
|
|
60
62
|
throw new FrameError(`Invalid JSON in frame: ${e.message}`);
|
|
61
63
|
}
|
|
62
64
|
frames.push(parsed);
|
|
65
|
+
if (this.maxFramesPerFeed !== undefined &&
|
|
66
|
+
frames.length > this.maxFramesPerFeed) {
|
|
67
|
+
throw new FrameError('Too many frames in one chunk');
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
return frames;
|
|
65
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/proxy/framing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,gFAAgF;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AACpC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,gFAAgF;AAEhF,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,OAAgC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../src/proxy/framing.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export type ProxyResponse = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare class ProxySocketClient {
|
|
17
17
|
private readonly socketPath;
|
|
18
|
+
private readonly capabilityToken;
|
|
18
19
|
private socket;
|
|
19
20
|
private decoder;
|
|
20
21
|
private pendingRequests;
|
|
@@ -22,7 +23,7 @@ export declare class ProxySocketClient {
|
|
|
22
23
|
private idleTimer;
|
|
23
24
|
private connectingPromise;
|
|
24
25
|
private handshakeResolver;
|
|
25
|
-
constructor(socketPath: string);
|
|
26
|
+
constructor(socketPath: string, capabilityToken?: string);
|
|
26
27
|
ensureConnected(): Promise<void>;
|
|
27
28
|
private isConnected;
|
|
28
29
|
request(op: string, payload: Record<string, unknown>): Promise<ProxyResponse>;
|
|
@@ -33,6 +34,12 @@ export declare class ProxySocketClient {
|
|
|
33
34
|
private connect;
|
|
34
35
|
private handshake;
|
|
35
36
|
private onData;
|
|
37
|
+
/**
|
|
38
|
+
* Processes a single decoded frame. Returns true if the socket was
|
|
39
|
+
* destroyed and the caller should stop iterating.
|
|
40
|
+
*/
|
|
41
|
+
private processFrame;
|
|
42
|
+
private resolveHandshake;
|
|
36
43
|
private resolvePendingRequest;
|
|
37
44
|
private onError;
|
|
38
45
|
private onClose;
|
|
@@ -16,8 +16,28 @@ import { encodeFrame, FrameDecoder } from './framing.js';
|
|
|
16
16
|
export const REQUEST_TIMEOUT_MS = 30000;
|
|
17
17
|
export const IDLE_TIMEOUT_MS = 300000;
|
|
18
18
|
export const PROTOCOL_VERSION = 1;
|
|
19
|
+
/** Validates that a decoded frame has the shape of a ProxyResponse, guarding
|
|
20
|
+
* against adversarial or malformed server responses with unexpected types
|
|
21
|
+
* for `ok`, `code`, or `error`. */
|
|
22
|
+
function isProxyResponseFrame(frame) {
|
|
23
|
+
if (typeof frame.ok !== 'boolean')
|
|
24
|
+
return false;
|
|
25
|
+
if (frame.code !== undefined && typeof frame.code !== 'string')
|
|
26
|
+
return false;
|
|
27
|
+
if (frame.error !== undefined && typeof frame.error !== 'string')
|
|
28
|
+
return false;
|
|
29
|
+
if (frame.retryAfter !== undefined && typeof frame.retryAfter !== 'number')
|
|
30
|
+
return false;
|
|
31
|
+
if (frame.data !== undefined &&
|
|
32
|
+
(typeof frame.data !== 'object' ||
|
|
33
|
+
frame.data === null ||
|
|
34
|
+
Array.isArray(frame.data)))
|
|
35
|
+
return false;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
19
38
|
export class ProxySocketClient {
|
|
20
39
|
socketPath;
|
|
40
|
+
capabilityToken;
|
|
21
41
|
socket = null;
|
|
22
42
|
decoder = new FrameDecoder({
|
|
23
43
|
onPartialFrameTimeout: () => this.handlePartialFrameTimeout(),
|
|
@@ -27,8 +47,9 @@ export class ProxySocketClient {
|
|
|
27
47
|
idleTimer = null;
|
|
28
48
|
connectingPromise = null;
|
|
29
49
|
handshakeResolver = null;
|
|
30
|
-
constructor(socketPath) {
|
|
50
|
+
constructor(socketPath, capabilityToken) {
|
|
31
51
|
this.socketPath = socketPath;
|
|
52
|
+
this.capabilityToken = capabilityToken;
|
|
32
53
|
}
|
|
33
54
|
async ensureConnected() {
|
|
34
55
|
if (this.socket !== null && this.handshakeComplete) {
|
|
@@ -99,8 +120,19 @@ export class ProxySocketClient {
|
|
|
99
120
|
this.decoder.reset();
|
|
100
121
|
}
|
|
101
122
|
async connectAndHandshake() {
|
|
102
|
-
|
|
103
|
-
|
|
123
|
+
try {
|
|
124
|
+
await this.connect();
|
|
125
|
+
await this.handshake();
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
try {
|
|
129
|
+
this.destroy(err instanceof Error ? err.message : 'Handshake failed');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Swallow cleanup errors so the original failure is not masked
|
|
133
|
+
}
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
104
136
|
}
|
|
105
137
|
async connect() {
|
|
106
138
|
this.socket = net.createConnection(this.socketPath);
|
|
@@ -118,10 +150,14 @@ export class ProxySocketClient {
|
|
|
118
150
|
this.socket.unref();
|
|
119
151
|
}
|
|
120
152
|
async handshake() {
|
|
153
|
+
const payload = { minVersion: 1, maxVersion: 1 };
|
|
154
|
+
if (this.capabilityToken) {
|
|
155
|
+
payload.capabilityToken = this.capabilityToken;
|
|
156
|
+
}
|
|
121
157
|
const request = {
|
|
122
158
|
v: PROTOCOL_VERSION,
|
|
123
159
|
op: 'handshake',
|
|
124
|
-
payload
|
|
160
|
+
payload,
|
|
125
161
|
};
|
|
126
162
|
this.socket.write(encodeFrame(request));
|
|
127
163
|
const response = await new Promise((resolve, reject) => {
|
|
@@ -142,7 +178,15 @@ export class ProxySocketClient {
|
|
|
142
178
|
};
|
|
143
179
|
});
|
|
144
180
|
if (response.ok !== true) {
|
|
145
|
-
|
|
181
|
+
if (response.code === 'UNAUTHORIZED') {
|
|
182
|
+
throw new Error('Credential proxy authentication failed: ' +
|
|
183
|
+
(response.error ?? 'invalid or missing capability token'));
|
|
184
|
+
}
|
|
185
|
+
const codeInfo = response.code ? ` [${response.code}]` : '';
|
|
186
|
+
throw new Error('Handshake failed' +
|
|
187
|
+
codeInfo +
|
|
188
|
+
': ' +
|
|
189
|
+
(response.error ?? 'unknown error'));
|
|
146
190
|
}
|
|
147
191
|
this.handshakeComplete = true;
|
|
148
192
|
this.resetIdleTimer();
|
|
@@ -151,19 +195,42 @@ export class ProxySocketClient {
|
|
|
151
195
|
try {
|
|
152
196
|
const frames = this.decoder.feed(chunk);
|
|
153
197
|
for (const frame of frames) {
|
|
154
|
-
if (this.
|
|
155
|
-
|
|
156
|
-
this.handshakeResolver = null;
|
|
157
|
-
resolver.resolve(frame);
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
this.resolvePendingRequest(frame);
|
|
198
|
+
if (this.processFrame(frame))
|
|
199
|
+
return;
|
|
161
200
|
}
|
|
162
201
|
}
|
|
163
202
|
catch {
|
|
164
203
|
this.destroy('Frame decode error');
|
|
165
204
|
}
|
|
166
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Processes a single decoded frame. Returns true if the socket was
|
|
208
|
+
* destroyed and the caller should stop iterating.
|
|
209
|
+
*/
|
|
210
|
+
processFrame(frame) {
|
|
211
|
+
if (this.handshakeResolver) {
|
|
212
|
+
this.resolveHandshake(frame);
|
|
213
|
+
return this.socket === null;
|
|
214
|
+
}
|
|
215
|
+
this.resolvePendingRequest(frame);
|
|
216
|
+
return this.socket === null;
|
|
217
|
+
}
|
|
218
|
+
resolveHandshake(frame) {
|
|
219
|
+
const resolver = this.handshakeResolver;
|
|
220
|
+
if (resolver === null) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
this.handshakeResolver = null;
|
|
224
|
+
if (isProxyResponseFrame(frame)) {
|
|
225
|
+
resolver.resolve(frame);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Reject first, then clean up. destroy() will not double-reject
|
|
229
|
+
// because handshakeResolver was already nulled above.
|
|
230
|
+
resolver.reject(new Error('Malformed handshake response from proxy'));
|
|
231
|
+
this.destroy('Malformed handshake response from proxy');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
167
234
|
resolvePendingRequest(frame) {
|
|
168
235
|
const id = frame.id;
|
|
169
236
|
if (!id) {
|
|
@@ -173,7 +240,14 @@ export class ProxySocketClient {
|
|
|
173
240
|
if (pending) {
|
|
174
241
|
clearTimeout(pending.timer);
|
|
175
242
|
this.pendingRequests.delete(id);
|
|
176
|
-
|
|
243
|
+
if (isProxyResponseFrame(frame)) {
|
|
244
|
+
pending.resolve(frame);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
pending.reject(new Error(`Malformed response for request ${id}`));
|
|
248
|
+
this.destroy('Malformed response from proxy — connection reset');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
177
251
|
}
|
|
178
252
|
}
|
|
179
253
|
onError(_err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ import { type TokenStore } from '../token-store.js';
|
|
|
16
16
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
17
17
|
export declare class ProxyTokenStore implements TokenStore {
|
|
18
18
|
private readonly client;
|
|
19
|
-
constructor(socketPath: string);
|
|
19
|
+
constructor(socketPath: string, capabilityToken?: string);
|
|
20
20
|
getToken(provider: string, bucket?: string): Promise<OAuthToken | null>;
|
|
21
21
|
saveToken(provider: string, token: OAuthToken, bucket?: string): Promise<void>;
|
|
22
22
|
removeToken(provider: string, bucket?: string): Promise<void>;
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
7
7
|
export class ProxyTokenStore {
|
|
8
8
|
client;
|
|
9
|
-
constructor(socketPath) {
|
|
10
|
-
this.client = new ProxySocketClient(socketPath);
|
|
9
|
+
constructor(socketPath, capabilityToken) {
|
|
10
|
+
this.client = new ProxySocketClient(socketPath, capabilityToken);
|
|
11
11
|
}
|
|
12
12
|
async getToken(provider, bucket) {
|
|
13
13
|
const response = await this.client.request('get_token', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../src/proxy/proxy-token-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,eAAe;IACT,MAAM,CAAoB;IAE3C,YAAY,UAAkB;
|
|
1
|
+
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../src/proxy/proxy-token-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vybestack/llxprt-code-auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0-nightly.260728.ffaa8d5d7",
|
|
4
4
|
"description": "LLxprt Code Auth — authentication and authorization domain",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -15,6 +15,56 @@
|
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
16
|
"bun": "./index.ts",
|
|
17
17
|
"import": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./oauth-errors.js": {
|
|
20
|
+
"types": "./dist/src/oauth-errors.d.ts",
|
|
21
|
+
"bun": "./src/oauth-errors.ts",
|
|
22
|
+
"import": "./dist/src/oauth-errors.js"
|
|
23
|
+
},
|
|
24
|
+
"./oauth-ui-bridge.js": {
|
|
25
|
+
"types": "./dist/src/oauth-ui-bridge.d.ts",
|
|
26
|
+
"bun": "./src/oauth-ui-bridge.ts",
|
|
27
|
+
"import": "./dist/src/oauth-ui-bridge.js"
|
|
28
|
+
},
|
|
29
|
+
"./precedence.js": {
|
|
30
|
+
"types": "./dist/src/precedence.d.ts",
|
|
31
|
+
"bun": "./src/precedence.ts",
|
|
32
|
+
"import": "./dist/src/precedence.js"
|
|
33
|
+
},
|
|
34
|
+
"./token-merge.js": {
|
|
35
|
+
"types": "./dist/src/token-merge.d.ts",
|
|
36
|
+
"bun": "./src/token-merge.ts",
|
|
37
|
+
"import": "./dist/src/token-merge.js"
|
|
38
|
+
},
|
|
39
|
+
"./token-sanitization.js": {
|
|
40
|
+
"types": "./dist/src/token-sanitization.d.ts",
|
|
41
|
+
"bun": "./src/token-sanitization.ts",
|
|
42
|
+
"import": "./dist/src/token-sanitization.js"
|
|
43
|
+
},
|
|
44
|
+
"./types.js": {
|
|
45
|
+
"types": "./dist/src/types.d.ts",
|
|
46
|
+
"bun": "./src/types.ts",
|
|
47
|
+
"import": "./dist/src/types.js"
|
|
48
|
+
},
|
|
49
|
+
"./flows/codex-device-flow.js": {
|
|
50
|
+
"types": "./dist/src/flows/codex-device-flow.d.ts",
|
|
51
|
+
"bun": "./src/flows/codex-device-flow.ts",
|
|
52
|
+
"import": "./dist/src/flows/codex-device-flow.js"
|
|
53
|
+
},
|
|
54
|
+
"./proxy/framing.js": {
|
|
55
|
+
"types": "./dist/src/proxy/framing.d.ts",
|
|
56
|
+
"bun": "./src/proxy/framing.ts",
|
|
57
|
+
"import": "./dist/src/proxy/framing.js"
|
|
58
|
+
},
|
|
59
|
+
"./proxy/proxy-provider-key-storage.js": {
|
|
60
|
+
"types": "./dist/src/proxy/proxy-provider-key-storage.d.ts",
|
|
61
|
+
"bun": "./src/proxy/proxy-provider-key-storage.ts",
|
|
62
|
+
"import": "./dist/src/proxy/proxy-provider-key-storage.js"
|
|
63
|
+
},
|
|
64
|
+
"./proxy/proxy-token-store.js": {
|
|
65
|
+
"types": "./dist/src/proxy/proxy-token-store.d.ts",
|
|
66
|
+
"bun": "./src/proxy/proxy-token-store.ts",
|
|
67
|
+
"import": "./dist/src/proxy/proxy-token-store.js"
|
|
18
68
|
}
|
|
19
69
|
},
|
|
20
70
|
"scripts": {
|
package/src/proxy/framing.ts
CHANGED
|
@@ -46,15 +46,18 @@ export interface FrameDecoderOptions {
|
|
|
46
46
|
* callback returns. Use this to close the connection or log the error.
|
|
47
47
|
*/
|
|
48
48
|
onPartialFrameTimeout?: () => void;
|
|
49
|
+
maxFramesPerFeed?: number;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
export class FrameDecoder {
|
|
52
53
|
private buffer: Buffer = Buffer.alloc(0);
|
|
53
54
|
private partialFrameTimer: ReturnType<typeof setTimeout> | null = null;
|
|
54
55
|
private readonly onPartialFrameTimeout?: () => void;
|
|
56
|
+
private readonly maxFramesPerFeed?: number;
|
|
55
57
|
|
|
56
58
|
constructor(options: FrameDecoderOptions = {}) {
|
|
57
59
|
this.onPartialFrameTimeout = options.onPartialFrameTimeout;
|
|
60
|
+
this.maxFramesPerFeed = options.maxFramesPerFeed;
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
feed(chunk: Buffer): Array<Record<string, unknown>> {
|
|
@@ -83,6 +86,12 @@ export class FrameDecoder {
|
|
|
83
86
|
throw new FrameError(`Invalid JSON in frame: ${(e as Error).message}`);
|
|
84
87
|
}
|
|
85
88
|
frames.push(parsed);
|
|
89
|
+
if (
|
|
90
|
+
this.maxFramesPerFeed !== undefined &&
|
|
91
|
+
frames.length > this.maxFramesPerFeed
|
|
92
|
+
) {
|
|
93
|
+
throw new FrameError('Too many frames in one chunk');
|
|
94
|
+
}
|
|
86
95
|
}
|
|
87
96
|
|
|
88
97
|
return frames;
|
|
@@ -28,6 +28,28 @@ export type ProxyResponse = {
|
|
|
28
28
|
retryAfter?: number;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
/** Validates that a decoded frame has the shape of a ProxyResponse, guarding
|
|
32
|
+
* against adversarial or malformed server responses with unexpected types
|
|
33
|
+
* for `ok`, `code`, or `error`. */
|
|
34
|
+
function isProxyResponseFrame(
|
|
35
|
+
frame: Record<string, unknown>,
|
|
36
|
+
): frame is ProxyResponse {
|
|
37
|
+
if (typeof frame.ok !== 'boolean') return false;
|
|
38
|
+
if (frame.code !== undefined && typeof frame.code !== 'string') return false;
|
|
39
|
+
if (frame.error !== undefined && typeof frame.error !== 'string')
|
|
40
|
+
return false;
|
|
41
|
+
if (frame.retryAfter !== undefined && typeof frame.retryAfter !== 'number')
|
|
42
|
+
return false;
|
|
43
|
+
if (
|
|
44
|
+
frame.data !== undefined &&
|
|
45
|
+
(typeof frame.data !== 'object' ||
|
|
46
|
+
frame.data === null ||
|
|
47
|
+
Array.isArray(frame.data))
|
|
48
|
+
)
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
31
53
|
interface PendingRequest {
|
|
32
54
|
resolve: (value: ProxyResponse) => void;
|
|
33
55
|
reject: (reason: Error) => void;
|
|
@@ -36,6 +58,7 @@ interface PendingRequest {
|
|
|
36
58
|
|
|
37
59
|
export class ProxySocketClient {
|
|
38
60
|
private readonly socketPath: string;
|
|
61
|
+
private readonly capabilityToken: string | undefined;
|
|
39
62
|
private socket: net.Socket | null = null;
|
|
40
63
|
private decoder: FrameDecoder = new FrameDecoder({
|
|
41
64
|
onPartialFrameTimeout: () => this.handlePartialFrameTimeout(),
|
|
@@ -45,12 +68,13 @@ export class ProxySocketClient {
|
|
|
45
68
|
private idleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
46
69
|
private connectingPromise: Promise<void> | null = null;
|
|
47
70
|
private handshakeResolver: {
|
|
48
|
-
resolve: (value:
|
|
71
|
+
resolve: (value: ProxyResponse) => void;
|
|
49
72
|
reject: (reason: Error) => void;
|
|
50
73
|
} | null = null;
|
|
51
74
|
|
|
52
|
-
constructor(socketPath: string) {
|
|
75
|
+
constructor(socketPath: string, capabilityToken?: string) {
|
|
53
76
|
this.socketPath = socketPath;
|
|
77
|
+
this.capabilityToken = capabilityToken;
|
|
54
78
|
}
|
|
55
79
|
|
|
56
80
|
async ensureConnected(): Promise<void> {
|
|
@@ -134,8 +158,17 @@ export class ProxySocketClient {
|
|
|
134
158
|
}
|
|
135
159
|
|
|
136
160
|
private async connectAndHandshake(): Promise<void> {
|
|
137
|
-
|
|
138
|
-
|
|
161
|
+
try {
|
|
162
|
+
await this.connect();
|
|
163
|
+
await this.handshake();
|
|
164
|
+
} catch (err) {
|
|
165
|
+
try {
|
|
166
|
+
this.destroy(err instanceof Error ? err.message : 'Handshake failed');
|
|
167
|
+
} catch {
|
|
168
|
+
// Swallow cleanup errors so the original failure is not masked
|
|
169
|
+
}
|
|
170
|
+
throw err;
|
|
171
|
+
}
|
|
139
172
|
}
|
|
140
173
|
|
|
141
174
|
private async connect(): Promise<void> {
|
|
@@ -155,39 +188,49 @@ export class ProxySocketClient {
|
|
|
155
188
|
}
|
|
156
189
|
|
|
157
190
|
private async handshake(): Promise<void> {
|
|
191
|
+
const payload: Record<string, unknown> = { minVersion: 1, maxVersion: 1 };
|
|
192
|
+
if (this.capabilityToken) {
|
|
193
|
+
payload.capabilityToken = this.capabilityToken;
|
|
194
|
+
}
|
|
158
195
|
const request = {
|
|
159
196
|
v: PROTOCOL_VERSION,
|
|
160
197
|
op: 'handshake',
|
|
161
|
-
payload
|
|
198
|
+
payload,
|
|
162
199
|
};
|
|
163
200
|
this.socket!.write(encodeFrame(request));
|
|
164
201
|
|
|
165
|
-
const response = await new Promise<
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
originalReject(reason);
|
|
184
|
-
};
|
|
185
|
-
},
|
|
186
|
-
);
|
|
202
|
+
const response = await new Promise<ProxyResponse>((resolve, reject) => {
|
|
203
|
+
this.handshakeResolver = { resolve, reject };
|
|
204
|
+
const timer = setTimeout(() => {
|
|
205
|
+
this.handshakeResolver = null;
|
|
206
|
+
reject(new Error(`Handshake timed out after ${REQUEST_TIMEOUT_MS}ms`));
|
|
207
|
+
}, REQUEST_TIMEOUT_MS);
|
|
208
|
+
|
|
209
|
+
const originalResolve = this.handshakeResolver.resolve;
|
|
210
|
+
this.handshakeResolver.resolve = (value) => {
|
|
211
|
+
clearTimeout(timer);
|
|
212
|
+
originalResolve(value);
|
|
213
|
+
};
|
|
214
|
+
const originalReject = this.handshakeResolver.reject;
|
|
215
|
+
this.handshakeResolver.reject = (reason) => {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
originalReject(reason);
|
|
218
|
+
};
|
|
219
|
+
});
|
|
187
220
|
|
|
188
221
|
if (response.ok !== true) {
|
|
222
|
+
if (response.code === 'UNAUTHORIZED') {
|
|
223
|
+
throw new Error(
|
|
224
|
+
'Credential proxy authentication failed: ' +
|
|
225
|
+
(response.error ?? 'invalid or missing capability token'),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
const codeInfo = response.code ? ` [${response.code}]` : '';
|
|
189
229
|
throw new Error(
|
|
190
|
-
'
|
|
230
|
+
'Handshake failed' +
|
|
231
|
+
codeInfo +
|
|
232
|
+
': ' +
|
|
233
|
+
(response.error ?? 'unknown error'),
|
|
191
234
|
);
|
|
192
235
|
}
|
|
193
236
|
this.handshakeComplete = true;
|
|
@@ -198,20 +241,42 @@ export class ProxySocketClient {
|
|
|
198
241
|
try {
|
|
199
242
|
const frames = this.decoder.feed(chunk);
|
|
200
243
|
for (const frame of frames) {
|
|
201
|
-
if (this.
|
|
202
|
-
const resolver = this.handshakeResolver;
|
|
203
|
-
this.handshakeResolver = null;
|
|
204
|
-
resolver.resolve(frame);
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
this.resolvePendingRequest(frame);
|
|
244
|
+
if (this.processFrame(frame)) return;
|
|
209
245
|
}
|
|
210
246
|
} catch {
|
|
211
247
|
this.destroy('Frame decode error');
|
|
212
248
|
}
|
|
213
249
|
}
|
|
214
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Processes a single decoded frame. Returns true if the socket was
|
|
253
|
+
* destroyed and the caller should stop iterating.
|
|
254
|
+
*/
|
|
255
|
+
private processFrame(frame: Record<string, unknown>): boolean {
|
|
256
|
+
if (this.handshakeResolver) {
|
|
257
|
+
this.resolveHandshake(frame);
|
|
258
|
+
return this.socket === null;
|
|
259
|
+
}
|
|
260
|
+
this.resolvePendingRequest(frame);
|
|
261
|
+
return this.socket === null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private resolveHandshake(frame: Record<string, unknown>): void {
|
|
265
|
+
const resolver = this.handshakeResolver;
|
|
266
|
+
if (resolver === null) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
this.handshakeResolver = null;
|
|
270
|
+
if (isProxyResponseFrame(frame)) {
|
|
271
|
+
resolver.resolve(frame);
|
|
272
|
+
} else {
|
|
273
|
+
// Reject first, then clean up. destroy() will not double-reject
|
|
274
|
+
// because handshakeResolver was already nulled above.
|
|
275
|
+
resolver.reject(new Error('Malformed handshake response from proxy'));
|
|
276
|
+
this.destroy('Malformed handshake response from proxy');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
215
280
|
private resolvePendingRequest(frame: Record<string, unknown>): void {
|
|
216
281
|
const id = frame.id as string | undefined;
|
|
217
282
|
if (!id) {
|
|
@@ -221,7 +286,13 @@ export class ProxySocketClient {
|
|
|
221
286
|
if (pending) {
|
|
222
287
|
clearTimeout(pending.timer);
|
|
223
288
|
this.pendingRequests.delete(id);
|
|
224
|
-
|
|
289
|
+
if (isProxyResponseFrame(frame)) {
|
|
290
|
+
pending.resolve(frame);
|
|
291
|
+
} else {
|
|
292
|
+
pending.reject(new Error(`Malformed response for request ${id}`));
|
|
293
|
+
this.destroy('Malformed response from proxy — connection reset');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
225
296
|
}
|
|
226
297
|
}
|
|
227
298
|
|
|
@@ -20,8 +20,8 @@ import { ProxySocketClient } from './proxy-socket-client.js';
|
|
|
20
20
|
export class ProxyTokenStore implements TokenStore {
|
|
21
21
|
private readonly client: ProxySocketClient;
|
|
22
22
|
|
|
23
|
-
constructor(socketPath: string) {
|
|
24
|
-
this.client = new ProxySocketClient(socketPath);
|
|
23
|
+
constructor(socketPath: string, capabilityToken?: string) {
|
|
24
|
+
this.client = new ProxySocketClient(socketPath, capabilityToken);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
async getToken(
|