lemon-model 1.2.3 → 1.2.4
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/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/socket/decorators.js +266 -0
- package/dist/esm/socket/decorators.js.map +1 -0
- package/dist/esm/socket/index.js +2 -0
- package/dist/esm/socket/index.js.map +1 -1
- package/dist/esm/socket/multi.js +94 -0
- package/dist/esm/socket/multi.js.map +1 -0
- package/dist/esm/socket/socket.js +82 -22
- package/dist/esm/socket/socket.js.map +1 -1
- package/dist/esm/socket/transport.js +385 -3
- package/dist/esm/socket/transport.js.map +1 -1
- package/dist/esm/sync/client.js +166 -0
- package/dist/esm/sync/client.js.map +1 -0
- package/dist/esm/sync/index.js +14 -0
- package/dist/esm/sync/index.js.map +1 -0
- package/dist/esm/sync/machine.js +181 -0
- package/dist/esm/sync/machine.js.map +1 -0
- package/dist/esm/sync/network.js +273 -0
- package/dist/esm/sync/network.js.map +1 -0
- package/dist/esm/sync/testing.js +44 -0
- package/dist/esm/sync/testing.js.map +1 -0
- package/dist/esm/sync/ticker.js +53 -0
- package/dist/esm/sync/ticker.js.map +1 -0
- package/dist/esm/sync/types.js +2 -0
- package/dist/{proxy → esm/sync}/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/socket/client/index.d.ts +9 -0
- package/dist/{proxy → socket/client}/index.js +8 -11
- package/dist/socket/client/index.js.map +1 -0
- package/dist/socket/client/keep-alive-controller.d.ts +35 -0
- package/dist/socket/client/keep-alive-controller.js +101 -0
- package/dist/socket/client/keep-alive-controller.js.map +1 -0
- package/dist/socket/client/message-router.d.ts +15 -0
- package/dist/socket/client/message-router.js +52 -0
- package/dist/socket/client/message-router.js.map +1 -0
- package/dist/socket/client/pending-request-store.d.ts +24 -0
- package/dist/socket/client/pending-request-store.js +78 -0
- package/dist/socket/client/pending-request-store.js.map +1 -0
- package/dist/socket/client/reconnect-controller.d.ts +56 -0
- package/dist/socket/client/reconnect-controller.js +177 -0
- package/dist/socket/client/reconnect-controller.js.map +1 -0
- package/dist/socket/client/rotation-controller.d.ts +32 -0
- package/dist/socket/client/rotation-controller.js +76 -0
- package/dist/socket/client/rotation-controller.js.map +1 -0
- package/dist/socket/client/shared-timer-scheduler.d.ts +17 -0
- package/dist/socket/client/shared-timer-scheduler.js +77 -0
- package/dist/socket/client/shared-timer-scheduler.js.map +1 -0
- package/dist/socket/client/socket-client.d.ts +2 -0
- package/dist/socket/client/socket-client.js +219 -0
- package/dist/socket/client/socket-client.js.map +1 -0
- package/dist/socket/client/types.d.ts +101 -0
- package/dist/socket/client/types.js +3 -0
- package/dist/socket/client/types.js.map +1 -0
- package/dist/socket/client/websocket-client-transport.d.ts +23 -0
- package/dist/socket/client/websocket-client-transport.js +152 -0
- package/dist/socket/client/websocket-client-transport.js.map +1 -0
- package/dist/socket/decorators.d.ts +38 -0
- package/dist/socket/decorators.js +271 -0
- package/dist/socket/decorators.js.map +1 -0
- package/dist/socket/index.d.ts +2 -0
- package/dist/socket/index.js +2 -0
- package/dist/socket/index.js.map +1 -1
- package/dist/socket/multi.d.ts +33 -0
- package/dist/socket/multi.js +98 -0
- package/dist/socket/multi.js.map +1 -0
- package/dist/socket/socket.d.ts +22 -4
- package/dist/socket/socket.js +82 -22
- package/dist/socket/socket.js.map +1 -1
- package/dist/socket/transport.d.ts +124 -6
- package/dist/socket/transport.js +389 -4
- package/dist/socket/transport.js.map +1 -1
- package/dist/sync/client.d.ts +16 -0
- package/dist/sync/client.js +171 -0
- package/dist/sync/client.js.map +1 -0
- package/dist/sync/index.d.ts +10 -0
- package/dist/sync/index.js +30 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/machine.d.ts +3 -0
- package/dist/sync/machine.js +185 -0
- package/dist/sync/machine.js.map +1 -0
- package/dist/sync/network.d.ts +38 -0
- package/dist/sync/network.js +278 -0
- package/dist/sync/network.js.map +1 -0
- package/dist/sync/testing.d.ts +38 -0
- package/dist/sync/testing.js +48 -0
- package/dist/sync/testing.js.map +1 -0
- package/dist/sync/ticker.d.ts +21 -0
- package/dist/sync/ticker.js +57 -0
- package/dist/sync/ticker.js.map +1 -0
- package/dist/sync/types.d.ts +115 -0
- package/dist/sync/types.js +3 -0
- package/dist/sync/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/proxy/index.d.ts +0 -12
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/proxy.d.ts +0 -75
- package/dist/proxy/proxy.js +0 -198
- package/dist/proxy/proxy.js.map +0 -1
- package/dist/proxy/transport.d.ts +0 -123
- package/dist/proxy/transport.js +0 -401
- package/dist/proxy/transport.js.map +0 -1
- package/dist/proxy/types.d.ts +0 -89
- package/dist/proxy/types.js +0 -12
package/dist/proxy/proxy.d.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `proxy/proxy.ts`
|
|
3
|
-
* - HTTP-backed Gemini-compatible GenAI adapter.
|
|
4
|
-
* - works in browser and Node by relying only on the standard `fetch` API.
|
|
5
|
-
* - in transport mode HTTP only triggers generation; the final response is
|
|
6
|
-
* collected from a configured `ProxyTransportReceiver` (e.g. over WebSocket).
|
|
7
|
-
*
|
|
8
|
-
* @author Claire <claude@lemoncloud.io>
|
|
9
|
-
* @date 2026-06-08 initial version
|
|
10
|
-
*
|
|
11
|
-
* @copyright (C) lemoncloud.io 2026 - All Rights Reserved.
|
|
12
|
-
*/
|
|
13
|
-
import { ProxyGenAI, ProxyGenAIGenerateContentParams, ProxyGenAIGenerateContentResponse, ProxyTransportReceiver } from './types';
|
|
14
|
-
/** transport query mode for `HttpAbstractGenAI` endpoints. */
|
|
15
|
-
export declare type HttpAbstractGenAITransportQuery = 'transportId' | 'flows';
|
|
16
|
-
/** override names for transport query keys (avoid hard-coding). */
|
|
17
|
-
export interface HttpAbstractGenAITransportQueryKeys {
|
|
18
|
-
/** flows connection-id key, default `connection` */
|
|
19
|
-
connection?: string;
|
|
20
|
-
/** flows transport-flag key, default `transport` (value `1`) */
|
|
21
|
-
transport?: string;
|
|
22
|
-
/** legacy transport-id key, default `transportId` */
|
|
23
|
-
transportId?: string;
|
|
24
|
-
}
|
|
25
|
-
/** options for wiring `HttpAbstractGenAI` to an agents/flows generate endpoint */
|
|
26
|
-
export interface HttpAbstractGenAIOptions {
|
|
27
|
-
/** extra HTTP request headers */
|
|
28
|
-
headers?: Record<string, string>;
|
|
29
|
-
/** fetch override for tests, browsers, or custom runtimes */
|
|
30
|
-
fetch?: typeof fetch;
|
|
31
|
-
/** optional WebSocket/API Gateway transport connection id */
|
|
32
|
-
transportId?: string;
|
|
33
|
-
/** receiver used when the final response is delivered through JSONTransport */
|
|
34
|
-
transport?: ProxyTransportReceiver;
|
|
35
|
-
/** transport query mode; default `transportId` keeps the original behavior */
|
|
36
|
-
transportQuery?: HttpAbstractGenAITransportQuery;
|
|
37
|
-
/** override transport query key names */
|
|
38
|
-
transportQueryKeys?: HttpAbstractGenAITransportQueryKeys;
|
|
39
|
-
/** fully custom transport endpoint builder; takes precedence over `transportQuery` */
|
|
40
|
-
asTransportEndpoint?: (endpoint: string, transportId: string) => string;
|
|
41
|
-
}
|
|
42
|
-
export declare const $gemini: {
|
|
43
|
-
/**
|
|
44
|
-
* Convert common agents/flows `GenAIResponse` shapes back into a Gemini-like
|
|
45
|
-
* `models.generateContent()` response shape.
|
|
46
|
-
* - data URL image output is restored to `candidates[0].content.parts[0].inlineData`.
|
|
47
|
-
* - text output is restored to `text` and a text part.
|
|
48
|
-
* - usage/cost and `$run`/`usageId`/`model` records are preserved when present.
|
|
49
|
-
*/
|
|
50
|
-
asGenerateContentResponse(data: any): ProxyGenAIGenerateContentResponse;
|
|
51
|
-
};
|
|
52
|
-
/** HTTP-backed Gemini-compatible GenAI adapter. */
|
|
53
|
-
export declare class HttpAbstractGenAI implements ProxyGenAI {
|
|
54
|
-
protected readonly endpoint: string;
|
|
55
|
-
/** captured raw generateContent params, useful in specs and diagnostics */
|
|
56
|
-
calls: ProxyGenAIGenerateContentParams[];
|
|
57
|
-
private readonly fetcher?;
|
|
58
|
-
private readonly headers;
|
|
59
|
-
private readonly transportId?;
|
|
60
|
-
private readonly transport?;
|
|
61
|
-
private readonly transportQuery;
|
|
62
|
-
private readonly transportQueryKeys;
|
|
63
|
-
private readonly asTransportEndpointFn?;
|
|
64
|
-
constructor(endpoint: string, options?: HttpAbstractGenAIOptions);
|
|
65
|
-
readonly models: {
|
|
66
|
-
generateContent: (params: ProxyGenAIGenerateContentParams) => Promise<ProxyGenAIGenerateContentResponse>;
|
|
67
|
-
};
|
|
68
|
-
private waitTransport;
|
|
69
|
-
protected asEndpoint(): string;
|
|
70
|
-
private asAgentGenerateBody;
|
|
71
|
-
private withoutSystemInstruction;
|
|
72
|
-
private asPrompt;
|
|
73
|
-
private isImageRequest;
|
|
74
|
-
private hasInlineData;
|
|
75
|
-
}
|
package/dist/proxy/proxy.js
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
-
var t = {};
|
|
13
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
-
t[p] = s[p];
|
|
15
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
-
t[p[i]] = s[p[i]];
|
|
19
|
-
}
|
|
20
|
-
return t;
|
|
21
|
-
};
|
|
22
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.HttpAbstractGenAI = exports.$gemini = void 0;
|
|
24
|
-
const asDataUrl = (data) => {
|
|
25
|
-
const matched = data.match(/^data:(.*?);base64,(.*)$/);
|
|
26
|
-
return matched ? { mimeType: matched[1] || 'image/png', data: matched[2] || '' } : undefined;
|
|
27
|
-
};
|
|
28
|
-
const onlyDefined = (data) => {
|
|
29
|
-
const out = {};
|
|
30
|
-
for (const key of Object.keys(data)) {
|
|
31
|
-
if (data[key] !== undefined)
|
|
32
|
-
out[key] = data[key];
|
|
33
|
-
}
|
|
34
|
-
return out;
|
|
35
|
-
};
|
|
36
|
-
const callFetch = (fetcher, input, init) => fetcher.call(globalThis, input, init);
|
|
37
|
-
/** map both `promptToken/...` and `inputTokenCount/...` usage shapes into Gemini usageMetadata. */
|
|
38
|
-
const asUsageMetadata = (usage) => {
|
|
39
|
-
var _a, _b, _c;
|
|
40
|
-
if (!usage || typeof usage !== 'object')
|
|
41
|
-
return undefined;
|
|
42
|
-
const usageMetadata = onlyDefined({
|
|
43
|
-
promptTokenCount: (_a = usage.promptToken) !== null && _a !== void 0 ? _a : usage.inputTokenCount,
|
|
44
|
-
thoughtsTokenCount: (_b = usage.completionToken) !== null && _b !== void 0 ? _b : usage.outputTokenCount,
|
|
45
|
-
totalTokenCount: (_c = usage.totalToken) !== null && _c !== void 0 ? _c : usage.totalTokenCount,
|
|
46
|
-
});
|
|
47
|
-
return Object.keys(usageMetadata).length > 0 ? usageMetadata : undefined;
|
|
48
|
-
};
|
|
49
|
-
exports.$gemini = {
|
|
50
|
-
/**
|
|
51
|
-
* Convert common agents/flows `GenAIResponse` shapes back into a Gemini-like
|
|
52
|
-
* `models.generateContent()` response shape.
|
|
53
|
-
* - data URL image output is restored to `candidates[0].content.parts[0].inlineData`.
|
|
54
|
-
* - text output is restored to `text` and a text part.
|
|
55
|
-
* - usage/cost and `$run`/`usageId`/`model` records are preserved when present.
|
|
56
|
-
*/
|
|
57
|
-
asGenerateContentResponse(data) {
|
|
58
|
-
var _a, _b;
|
|
59
|
-
const content = (_a = data === null || data === void 0 ? void 0 : data.output) === null || _a === void 0 ? void 0 : _a.content;
|
|
60
|
-
const dataUrl = content && typeof content === 'object' ? content === null || content === void 0 ? void 0 : content.data : undefined;
|
|
61
|
-
const matched = typeof dataUrl === 'string' ? asDataUrl(dataUrl) : undefined;
|
|
62
|
-
const text = typeof content === 'string' ? content : typeof dataUrl === 'string' && !matched ? dataUrl : '';
|
|
63
|
-
const candidate = (_b = data === null || data === void 0 ? void 0 : data.candidate) !== null && _b !== void 0 ? _b : (matched
|
|
64
|
-
? {
|
|
65
|
-
content: {
|
|
66
|
-
parts: [
|
|
67
|
-
{
|
|
68
|
-
inlineData: {
|
|
69
|
-
mimeType: matched.mimeType,
|
|
70
|
-
data: matched.data,
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
}
|
|
76
|
-
: text
|
|
77
|
-
? {
|
|
78
|
-
content: {
|
|
79
|
-
parts: [{ text }],
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
: undefined);
|
|
83
|
-
return onlyDefined({
|
|
84
|
-
text,
|
|
85
|
-
candidates: candidate ? [candidate] : undefined,
|
|
86
|
-
usageMetadata: asUsageMetadata(data === null || data === void 0 ? void 0 : data.usage),
|
|
87
|
-
$run: data === null || data === void 0 ? void 0 : data.$run,
|
|
88
|
-
usageId: data === null || data === void 0 ? void 0 : data.usageId,
|
|
89
|
-
model: data === null || data === void 0 ? void 0 : data.model,
|
|
90
|
-
cost: data === null || data === void 0 ? void 0 : data.cost,
|
|
91
|
-
});
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
/** HTTP-backed Gemini-compatible GenAI adapter. */
|
|
95
|
-
class HttpAbstractGenAI {
|
|
96
|
-
constructor(endpoint, options = {}) {
|
|
97
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
98
|
-
this.endpoint = endpoint;
|
|
99
|
-
/** captured raw generateContent params, useful in specs and diagnostics */
|
|
100
|
-
this.calls = [];
|
|
101
|
-
this.models = {
|
|
102
|
-
generateContent: (params) => __awaiter(this, void 0, void 0, function* () {
|
|
103
|
-
this.calls.push(params);
|
|
104
|
-
const task = () => __awaiter(this, void 0, void 0, function* () {
|
|
105
|
-
var _j;
|
|
106
|
-
const fetcher = (_j = this.fetcher) !== null && _j !== void 0 ? _j : globalThis.fetch;
|
|
107
|
-
if (typeof fetcher !== 'function') {
|
|
108
|
-
throw new Error(`@fetch is required (no global fetch available) - HttpAbstractGenAI`);
|
|
109
|
-
}
|
|
110
|
-
const response = yield callFetch(fetcher, this.asEndpoint(), {
|
|
111
|
-
method: 'POST',
|
|
112
|
-
headers: Object.assign({ 'content-type': 'application/json' }, this.headers),
|
|
113
|
-
body: JSON.stringify(this.asAgentGenerateBody(params)),
|
|
114
|
-
});
|
|
115
|
-
if (!response.ok) {
|
|
116
|
-
const text = yield response.text().catch(() => '');
|
|
117
|
-
throw new Error(`HTTP ${response.status} ${response.statusText}`.trim() + (text ? ` - ${text}` : ''));
|
|
118
|
-
}
|
|
119
|
-
return response.json();
|
|
120
|
-
});
|
|
121
|
-
const data = this.transportId ? yield this.waitTransport(task) : yield task();
|
|
122
|
-
return exports.$gemini.asGenerateContentResponse(data);
|
|
123
|
-
}),
|
|
124
|
-
};
|
|
125
|
-
this.fetcher = options.fetch;
|
|
126
|
-
this.headers = (_a = options.headers) !== null && _a !== void 0 ? _a : {};
|
|
127
|
-
this.transportId = options.transportId;
|
|
128
|
-
this.transport = options.transport;
|
|
129
|
-
this.transportQuery = (_b = options.transportQuery) !== null && _b !== void 0 ? _b : 'transportId';
|
|
130
|
-
this.transportQueryKeys = {
|
|
131
|
-
connection: (_d = (_c = options.transportQueryKeys) === null || _c === void 0 ? void 0 : _c.connection) !== null && _d !== void 0 ? _d : 'connection',
|
|
132
|
-
transport: (_f = (_e = options.transportQueryKeys) === null || _e === void 0 ? void 0 : _e.transport) !== null && _f !== void 0 ? _f : 'transport',
|
|
133
|
-
transportId: (_h = (_g = options.transportQueryKeys) === null || _g === void 0 ? void 0 : _g.transportId) !== null && _h !== void 0 ? _h : 'transportId',
|
|
134
|
-
};
|
|
135
|
-
this.asTransportEndpointFn = options.asTransportEndpoint;
|
|
136
|
-
}
|
|
137
|
-
waitTransport(task) {
|
|
138
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
-
if (!this.transport)
|
|
140
|
-
throw new Error(`@transport is required when transportId is set - HttpAbstractGenAI`);
|
|
141
|
-
return this.transport.wait(this.transportId, task);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
asEndpoint() {
|
|
145
|
-
if (!this.transportId)
|
|
146
|
-
return this.endpoint;
|
|
147
|
-
if (this.asTransportEndpointFn)
|
|
148
|
-
return this.asTransportEndpointFn(this.endpoint, this.transportId);
|
|
149
|
-
const url = new URL(this.endpoint, 'http://localhost');
|
|
150
|
-
if (this.transportQuery === 'flows') {
|
|
151
|
-
url.searchParams.set(this.transportQueryKeys.connection, this.transportId);
|
|
152
|
-
url.searchParams.set(this.transportQueryKeys.transport, '1');
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
url.searchParams.set(this.transportQueryKeys.transportId, this.transportId);
|
|
156
|
-
}
|
|
157
|
-
if (/^https?:\/\//.test(this.endpoint))
|
|
158
|
-
return url.toString();
|
|
159
|
-
return `${url.pathname}${url.search}${url.hash}`;
|
|
160
|
-
}
|
|
161
|
-
asAgentGenerateBody(params) {
|
|
162
|
-
var _a;
|
|
163
|
-
const config = this.withoutSystemInstruction(params.config);
|
|
164
|
-
const system = (_a = params.config) === null || _a === void 0 ? void 0 : _a.systemInstruction;
|
|
165
|
-
return {
|
|
166
|
-
model: params.model,
|
|
167
|
-
prompt: this.asPrompt(params.contents),
|
|
168
|
-
system,
|
|
169
|
-
image: this.isImageRequest(params),
|
|
170
|
-
config,
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
withoutSystemInstruction(config) {
|
|
174
|
-
if (!config)
|
|
175
|
-
return undefined;
|
|
176
|
-
const { systemInstruction } = config, rest = __rest(config, ["systemInstruction"]);
|
|
177
|
-
return Object.keys(rest).length > 0 ? rest : undefined;
|
|
178
|
-
}
|
|
179
|
-
asPrompt(contents) {
|
|
180
|
-
if (typeof contents === 'string')
|
|
181
|
-
return contents;
|
|
182
|
-
return { type: 'user', content: contents };
|
|
183
|
-
}
|
|
184
|
-
isImageRequest(params) {
|
|
185
|
-
var _a, _b;
|
|
186
|
-
const modalities = (_b = (_a = params.config) === null || _a === void 0 ? void 0 : _a.responseModalities) !== null && _b !== void 0 ? _b : [];
|
|
187
|
-
const hasImageModality = modalities.some(modality => `${modality}`.toUpperCase() === 'IMAGE');
|
|
188
|
-
const hasInlineImage = this.hasInlineData(params.contents);
|
|
189
|
-
const imageModel = params.model.includes('image') || params.model.includes('imagen');
|
|
190
|
-
return hasImageModality || hasInlineImage || imageModel ? true : undefined;
|
|
191
|
-
}
|
|
192
|
-
hasInlineData(contents) {
|
|
193
|
-
const list = Array.isArray(contents) ? contents : [contents];
|
|
194
|
-
return list.some(content => { var _a; return typeof content !== 'string' && ((_a = content.parts) === null || _a === void 0 ? void 0 : _a.some(part => !!part.inlineData)); });
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
exports.HttpAbstractGenAI = HttpAbstractGenAI;
|
|
198
|
-
//# sourceMappingURL=proxy.js.map
|
package/dist/proxy/proxy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `proxy/transport.ts`
|
|
3
|
-
* - browser/WebSocket helpers for receiving proxy generate results over JSONTransport.
|
|
4
|
-
* - depends on a minimal `WebSocketCompatible` contract, not the DOM `WebSocket` type,
|
|
5
|
-
* so it stays usable in browsers, Node, and custom UI runtimes.
|
|
6
|
-
*
|
|
7
|
-
* @author Claire <claude@lemoncloud.io>
|
|
8
|
-
* @date 2026-06-08 initial version
|
|
9
|
-
*
|
|
10
|
-
* @copyright (C) lemoncloud.io 2026 - All Rights Reserved.
|
|
11
|
-
*/
|
|
12
|
-
import { JSONTransportOptions } from '../socket/transport';
|
|
13
|
-
import { NetworkMessageHandler, NetworkSupportable, SocketErrorHandler, SocketNetworkOptions, SocketReadyState, SocketUnsubscribe } from '../socket/types';
|
|
14
|
-
import { ProxyTransportReceiver } from './types';
|
|
15
|
-
/** event map required from a browser-like WebSocket object */
|
|
16
|
-
export interface WebSocketCompatibleEventMap {
|
|
17
|
-
open: unknown;
|
|
18
|
-
close: unknown;
|
|
19
|
-
error: unknown;
|
|
20
|
-
message: {
|
|
21
|
-
data: unknown;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Minimal WebSocket-compatible contract.
|
|
26
|
-
*
|
|
27
|
-
* This keeps the proxy package usable in browsers, tests, and custom UI runtimes
|
|
28
|
-
* without depending directly on the DOM `WebSocket` type.
|
|
29
|
-
*/
|
|
30
|
-
export interface WebSocketCompatible {
|
|
31
|
-
readonly CONNECTING?: number;
|
|
32
|
-
readonly OPEN?: number;
|
|
33
|
-
readonly CLOSING?: number;
|
|
34
|
-
readonly CLOSED?: number;
|
|
35
|
-
readonly readyState: number;
|
|
36
|
-
send(data: string): void;
|
|
37
|
-
addEventListener<K extends keyof WebSocketCompatibleEventMap>(type: K, handler: (event: WebSocketCompatibleEventMap[K]) => void, options?: {
|
|
38
|
-
once?: boolean;
|
|
39
|
-
}): void;
|
|
40
|
-
removeEventListener<K extends keyof WebSocketCompatibleEventMap>(type: K, handler: (event: WebSocketCompatibleEventMap[K]) => void): void;
|
|
41
|
-
}
|
|
42
|
-
/** options for the standard WebSocket connection-id handshake */
|
|
43
|
-
export interface WebSocketConnectionIdOptions {
|
|
44
|
-
/** message sent after socket open, usually `device.save` */
|
|
45
|
-
connectMessage?: string;
|
|
46
|
-
/** timeout for open and connection-id response */
|
|
47
|
-
timeoutMs?: number;
|
|
48
|
-
/** custom extractor when a service returns a different connection-id shape */
|
|
49
|
-
extract?: (message: unknown) => string | undefined;
|
|
50
|
-
}
|
|
51
|
-
/** options for receiving a single JSONTransport response */
|
|
52
|
-
export interface ProxyTransportReceiverOptions<T extends object = object> {
|
|
53
|
-
timeoutMs?: number;
|
|
54
|
-
jsonTransport?: JSONTransportOptions;
|
|
55
|
-
validate?: (data: T) => boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Unwrap a raw WebSocket message into a transport packet string.
|
|
58
|
-
* - by default the raw message is expected to be a transport packet directly.
|
|
59
|
-
* - set this when the gateway wraps frames, e.g. `{ body: "..." }` or `{ data: ... }`.
|
|
60
|
-
* - return `undefined` to ignore a non-transport message.
|
|
61
|
-
*/
|
|
62
|
-
extractPacket?: (message: string) => string | undefined;
|
|
63
|
-
}
|
|
64
|
-
/** JSONTransport-backed receiver used by `HttpAbstractGenAI` transport mode */
|
|
65
|
-
export declare class JSONProxyTransportReceiver<T extends object = object> implements ProxyTransportReceiver<T> {
|
|
66
|
-
private readonly network;
|
|
67
|
-
private readonly options;
|
|
68
|
-
private readonly transport;
|
|
69
|
-
private pending?;
|
|
70
|
-
constructor(network: NetworkSupportable, options?: ProxyTransportReceiverOptions<T>);
|
|
71
|
-
/**
|
|
72
|
-
* Run an HTTP trigger task and resolve with the next complete JSONTransport payload.
|
|
73
|
-
*
|
|
74
|
-
* Only one pending wait is supported per receiver instance.
|
|
75
|
-
*/
|
|
76
|
-
wait(transportId: string, task: () => Promise<unknown>): Promise<T>;
|
|
77
|
-
/** detach listeners and reject an in-flight wait */
|
|
78
|
-
detach(): void;
|
|
79
|
-
private resolve;
|
|
80
|
-
private reject;
|
|
81
|
-
}
|
|
82
|
-
/** create a receiver that filters raw network packets down to JSONTransport frames */
|
|
83
|
-
export declare const createProxyTransportReceiver: <T extends object = object>(network: NetworkSupportable, options?: ProxyTransportReceiverOptions<T>) => JSONProxyTransportReceiver<T>;
|
|
84
|
-
/** extract a connection id from known API Gateway/WebSocket handshake response shapes */
|
|
85
|
-
export declare const extractWebSocketConnectionId: (message: unknown) => string | undefined;
|
|
86
|
-
/**
|
|
87
|
-
* Wait until a WebSocket is open, send the handshake message, and resolve the
|
|
88
|
-
* first connection id found in inbound messages.
|
|
89
|
-
*/
|
|
90
|
-
export declare const waitWebSocketConnectionId: (ws: WebSocketCompatible, options?: WebSocketConnectionIdOptions) => Promise<string>;
|
|
91
|
-
/**
|
|
92
|
-
* Adapter from browser-like WebSocket objects to `NetworkSupportable`.
|
|
93
|
-
*
|
|
94
|
-
* The adapter does not own externally supplied WebSocket instances. `close()` is
|
|
95
|
-
* intentionally equivalent to `detach()`; callers that created the WebSocket should
|
|
96
|
-
* close it themselves when they want the underlying connection closed.
|
|
97
|
-
*/
|
|
98
|
-
export declare class BrowserWebSocketNetwork implements NetworkSupportable {
|
|
99
|
-
private readonly ws;
|
|
100
|
-
private readonly messageHandlers;
|
|
101
|
-
private readonly errorHandlers;
|
|
102
|
-
private readonly opened;
|
|
103
|
-
private readyOpenHandler?;
|
|
104
|
-
private readyErrorHandler?;
|
|
105
|
-
private detached;
|
|
106
|
-
private readonly handleOpen;
|
|
107
|
-
private readonly handleMessage;
|
|
108
|
-
private readonly handleError;
|
|
109
|
-
private readonly handleClose;
|
|
110
|
-
constructor(ws: WebSocketCompatible);
|
|
111
|
-
get readyState(): SocketReadyState;
|
|
112
|
-
ready(): Promise<void>;
|
|
113
|
-
send(data: string): void;
|
|
114
|
-
onMessage(handler: NetworkMessageHandler): SocketUnsubscribe;
|
|
115
|
-
configure(_options: SocketNetworkOptions): void;
|
|
116
|
-
onError(handler: SocketErrorHandler): SocketUnsubscribe;
|
|
117
|
-
close(): void;
|
|
118
|
-
/** remove all listeners without closing the externally owned WebSocket */
|
|
119
|
-
detach(): void;
|
|
120
|
-
private isOpen;
|
|
121
|
-
private stateValue;
|
|
122
|
-
private detachReadyListeners;
|
|
123
|
-
}
|