@zhin.js/client 1.1.5 → 1.1.6
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 +25 -19
- package/client/app.test.ts +37 -0
- package/client/app.ts +130 -138
- package/client/bootstrap/loadConsoleEntries.test.ts +0 -15
- package/client/bootstrap/loadConsoleEntries.ts +1 -20
- package/client/console-client-context.ts +24 -0
- package/client/console-client.test.ts +46 -0
- package/client/console-client.ts +70 -0
- package/client/console-events.ts +4 -3
- package/client/console-utils/remoteApi.ts +0 -7
- package/client/index.ts +21 -13
- package/client/persistence/idb-store.test.ts +0 -18
- package/client/persistence/idb-store.ts +3 -6
- package/client/{websocket/manager.test.ts → transport/console-transport.test.ts} +79 -34
- package/client/{websocket/manager.ts → transport/console-transport.ts} +237 -178
- package/client/{websocket → transport}/hooks.ts +240 -23
- package/client/transport/index.ts +23 -0
- package/client/{websocket → transport}/types.ts +11 -17
- package/client/types.ts +0 -3
- package/client/workroom/registerWorkroomConsole.test.ts +0 -1
- package/dist/app.d.ts +17 -52
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +110 -95
- package/dist/app.js.map +1 -1
- package/dist/bootstrap/loadConsoleEntries.d.ts +0 -6
- package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -1
- package/dist/bootstrap/loadConsoleEntries.js +0 -9
- package/dist/bootstrap/loadConsoleEntries.js.map +1 -1
- package/dist/console-client-context.d.ts +9 -0
- package/dist/console-client-context.d.ts.map +1 -0
- package/dist/console-client-context.js +13 -0
- package/dist/console-client-context.js.map +1 -0
- package/dist/console-client.d.ts +25 -0
- package/dist/console-client.d.ts.map +1 -0
- package/dist/console-client.js +45 -0
- package/dist/console-client.js.map +1 -0
- package/dist/console-events.d.ts +1 -0
- package/dist/console-events.d.ts.map +1 -1
- package/dist/console-events.js +3 -3
- package/dist/console-events.js.map +1 -1
- package/dist/console-utils/remoteApi.d.ts +0 -1
- package/dist/console-utils/remoteApi.d.ts.map +1 -1
- package/dist/console-utils/remoteApi.js +0 -6
- package/dist/console-utils/remoteApi.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/persistence/idb-store.d.ts.map +1 -1
- package/dist/persistence/idb-store.js +3 -5
- package/dist/persistence/idb-store.js.map +1 -1
- package/dist/transport/console-transport.d.ts +217 -0
- package/dist/transport/console-transport.d.ts.map +1 -0
- package/dist/{websocket/manager.js → transport/console-transport.js} +147 -165
- package/dist/transport/console-transport.js.map +1 -0
- package/dist/transport/hooks.d.ts +253 -0
- package/dist/transport/hooks.d.ts.map +1 -0
- package/dist/{websocket → transport}/hooks.js +234 -19
- package/dist/transport/hooks.js.map +1 -0
- package/dist/transport/index.d.ts +4 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +4 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/{websocket → transport}/types.d.ts +10 -13
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/{websocket → transport}/types.js +4 -9
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/client/runtime/index.ts +0 -12
- package/client/websocket/index.ts +0 -11
- package/client/websocket/instance.ts +0 -24
- package/client/websocket/remote-settings.ts +0 -47
- package/dist/runtime/index.d.ts +0 -6
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -10
- package/dist/runtime/index.js.map +0 -1
- package/dist/websocket/hooks.d.ts +0 -114
- package/dist/websocket/hooks.d.ts.map +0 -1
- package/dist/websocket/hooks.js.map +0 -1
- package/dist/websocket/index.d.ts +0 -7
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -7
- package/dist/websocket/index.js.map +0 -1
- package/dist/websocket/instance.d.ts +0 -5
- package/dist/websocket/instance.d.ts.map +0 -1
- package/dist/websocket/instance.js +0 -21
- package/dist/websocket/instance.js.map +0 -1
- package/dist/websocket/manager.d.ts +0 -131
- package/dist/websocket/manager.d.ts.map +0 -1
- package/dist/websocket/manager.js.map +0 -1
- package/dist/websocket/remote-settings.d.ts +0 -5
- package/dist/websocket/remote-settings.d.ts.map +0 -1
- package/dist/websocket/remote-settings.js +0 -47
- package/dist/websocket/remote-settings.js.map +0 -1
- package/dist/websocket/types.d.ts.map +0 -1
- package/dist/websocket/types.js.map +0 -1
- /package/client/{websocket → transport}/hooks.test.ts +0 -0
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { ConnectionState,
|
|
2
|
-
import { getApiBase,
|
|
1
|
+
import { ConnectionState, ConnectionError, ConsoleTransportError, MessageError, } from './types.js';
|
|
2
|
+
import { getApiBase, getToken, resolveApiUrl } from '../console-utils/remoteApi.js';
|
|
3
3
|
import { applyConsoleEvent } from "../persistence/idb-store.js";
|
|
4
4
|
import { fetchConsoleEventHistory } from '../console-events.js';
|
|
5
|
-
import { CONSOLE_EVENT_RECOVERY_GAP_EVENT, SIDE_EVENT_PUSH,
|
|
6
|
-
export class
|
|
7
|
-
ws = null;
|
|
5
|
+
import { CONFIG_RPC, PLUGIN_RPC, ENDPOINT_RPC, CONSOLE_EVENT_RECOVERY_GAP_EVENT, SIDE_EVENT_PUSH, parseConsoleSseFrame, } from "@zhin.js/console-protocol";
|
|
6
|
+
export class ConsoleTransport {
|
|
8
7
|
config;
|
|
9
8
|
callbacks;
|
|
10
9
|
state = ConnectionState.DISCONNECTED;
|
|
11
10
|
reconnectAttempts = 0;
|
|
12
11
|
reconnectTimer = null;
|
|
13
12
|
requestId = 0;
|
|
14
|
-
pendingRequests = new Map();
|
|
15
13
|
connectedListeners = new Set();
|
|
16
14
|
eventListeners = new Map();
|
|
17
15
|
recoveryGapListeners = new Set();
|
|
@@ -19,10 +17,11 @@ export class WebSocketManager {
|
|
|
19
17
|
eventRuntimeId = '';
|
|
20
18
|
lastEventId = 0;
|
|
21
19
|
durableCursorBlocked = false;
|
|
22
|
-
|
|
20
|
+
disposed = false;
|
|
21
|
+
connectionGeneration = 0;
|
|
23
22
|
constructor(config = {}, callbacks = {}) {
|
|
24
23
|
this.config = {
|
|
25
|
-
|
|
24
|
+
fetch: config.fetch ?? globalThis.fetch,
|
|
26
25
|
reconnectInterval: config.reconnectInterval ?? 3000,
|
|
27
26
|
maxReconnectAttempts: config.maxReconnectAttempts ?? 10,
|
|
28
27
|
requestTimeout: config.requestTimeout ?? 10000,
|
|
@@ -30,11 +29,13 @@ export class WebSocketManager {
|
|
|
30
29
|
this.callbacks = callbacks;
|
|
31
30
|
}
|
|
32
31
|
onConnectionChange(listener) {
|
|
32
|
+
this.assertActive();
|
|
33
33
|
this.connectedListeners.add(listener);
|
|
34
34
|
return () => this.connectedListeners.delete(listener);
|
|
35
35
|
}
|
|
36
36
|
/** Subscribe by event name; known names infer their exact payload type. */
|
|
37
37
|
onConsoleEvent(type, listener) {
|
|
38
|
+
this.assertActive();
|
|
38
39
|
let listeners = this.eventListeners.get(type);
|
|
39
40
|
if (!listeners) {
|
|
40
41
|
listeners = new Set();
|
|
@@ -50,6 +51,7 @@ export class WebSocketManager {
|
|
|
50
51
|
}
|
|
51
52
|
/** Observe a non-resumable cursor so domain views can perform a full resync. */
|
|
52
53
|
onConsoleEventRecoveryGap(listener) {
|
|
54
|
+
this.assertActive();
|
|
53
55
|
this.recoveryGapListeners.add(listener);
|
|
54
56
|
return () => this.recoveryGapListeners.delete(listener);
|
|
55
57
|
}
|
|
@@ -58,29 +60,17 @@ export class WebSocketManager {
|
|
|
58
60
|
l(connected);
|
|
59
61
|
}
|
|
60
62
|
connect() {
|
|
61
|
-
|
|
62
|
-
void this.connectRestSse();
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
63
|
+
this.assertActive();
|
|
65
64
|
if (this.state === ConnectionState.CONNECTED || this.state === ConnectionState.CONNECTING)
|
|
66
65
|
return;
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
this.ws = new WebSocket(this.config.url);
|
|
70
|
-
this.attachEventHandlers();
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
this.handleConnectionError(new ConnectionError("Failed to create WebSocket", error));
|
|
74
|
-
this.setState(ConnectionState.RECONNECTING);
|
|
75
|
-
this.notifyConnection(false);
|
|
76
|
-
this.scheduleReconnect();
|
|
77
|
-
}
|
|
66
|
+
const generation = ++this.connectionGeneration;
|
|
67
|
+
void this.connectSse(generation);
|
|
78
68
|
}
|
|
79
|
-
async
|
|
69
|
+
async connectSse(generation) {
|
|
80
70
|
// Host without http.token allows unauthenticated SSE (authenticateHttp
|
|
81
71
|
// returns full when TokenRegistry is empty). Still open the stream so
|
|
82
72
|
// local dev Console receives hmr:reload / message.receive broadcasts.
|
|
83
|
-
const token =
|
|
73
|
+
const token = getToken();
|
|
84
74
|
this.setState(ConnectionState.CONNECTING);
|
|
85
75
|
this.sseAbort?.abort();
|
|
86
76
|
this.sseAbort = new AbortController();
|
|
@@ -91,16 +81,22 @@ export class WebSocketManager {
|
|
|
91
81
|
if (token)
|
|
92
82
|
headers.Authorization = `Bearer ${token}`;
|
|
93
83
|
await this.recoverEventHistory(this.sseAbort.signal);
|
|
84
|
+
if (!this.isCurrentConnection(generation))
|
|
85
|
+
return;
|
|
94
86
|
const params = new URLSearchParams();
|
|
95
87
|
if (this.eventRuntimeId)
|
|
96
88
|
params.set('runtimeId', this.eventRuntimeId);
|
|
97
89
|
if (this.lastEventId > 0)
|
|
98
90
|
params.set('after', String(this.lastEventId));
|
|
99
91
|
const suffix = params.size ? `?${params}` : '';
|
|
100
|
-
const res = await fetch(resolveApiUrl(`/api/events${suffix}`), {
|
|
92
|
+
const res = await this.config.fetch(resolveApiUrl(`/api/events${suffix}`), {
|
|
101
93
|
headers,
|
|
102
94
|
signal: this.sseAbort.signal,
|
|
103
95
|
});
|
|
96
|
+
if (!this.isCurrentConnection(generation)) {
|
|
97
|
+
await res.body?.cancel();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
104
100
|
if (!res.ok || !res.body) {
|
|
105
101
|
throw new ConnectionError(`SSE failed: HTTP ${res.status}`);
|
|
106
102
|
}
|
|
@@ -108,29 +104,30 @@ export class WebSocketManager {
|
|
|
108
104
|
this.reconnectAttempts = 0;
|
|
109
105
|
this.notifyConnection(true);
|
|
110
106
|
this.callbacks.onConnect?.();
|
|
111
|
-
void this.pumpSse(res.body);
|
|
107
|
+
void this.pumpSse(res.body, generation);
|
|
112
108
|
}
|
|
113
109
|
catch (error) {
|
|
110
|
+
if (!this.isCurrentConnection(generation))
|
|
111
|
+
return;
|
|
114
112
|
if (error.name === "AbortError")
|
|
115
113
|
return;
|
|
116
|
-
//
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
console.error("[Console transport] SSE connect error:", error);
|
|
114
|
+
// Reconnect timers only run while the transport remains in RECONNECTING.
|
|
115
|
+
const connectionError = error instanceof Error ? error : new Error(String(error));
|
|
116
|
+
this.callbacks.onError?.(connectionError);
|
|
117
|
+
console.error("[Console transport] SSE connect error:", connectionError);
|
|
121
118
|
this.setState(ConnectionState.RECONNECTING);
|
|
122
119
|
this.notifyConnection(false);
|
|
123
120
|
this.scheduleReconnect();
|
|
124
121
|
}
|
|
125
122
|
}
|
|
126
|
-
async pumpSse(body) {
|
|
123
|
+
async pumpSse(body, generation) {
|
|
127
124
|
const reader = body.getReader();
|
|
128
125
|
const decoder = new TextDecoder();
|
|
129
126
|
let buffer = "";
|
|
130
127
|
try {
|
|
131
128
|
while (true) {
|
|
132
129
|
const { done, value } = await reader.read();
|
|
133
|
-
if (done)
|
|
130
|
+
if (done || !this.isCurrentConnection(generation))
|
|
134
131
|
break;
|
|
135
132
|
buffer += decoder.decode(value, { stream: true });
|
|
136
133
|
const parts = buffer.split(/\r?\n\r?\n/u);
|
|
@@ -156,9 +153,10 @@ export class WebSocketManager {
|
|
|
156
153
|
/* closed */
|
|
157
154
|
}
|
|
158
155
|
finally {
|
|
159
|
-
if (this.state === ConnectionState.CONNECTED) {
|
|
156
|
+
if (this.isCurrentConnection(generation) && this.state === ConnectionState.CONNECTED) {
|
|
160
157
|
this.notifyConnection(false);
|
|
161
158
|
this.setState(ConnectionState.RECONNECTING);
|
|
159
|
+
this.callbacks.onDisconnect?.();
|
|
162
160
|
this.scheduleReconnect();
|
|
163
161
|
}
|
|
164
162
|
}
|
|
@@ -175,7 +173,7 @@ export class WebSocketManager {
|
|
|
175
173
|
}
|
|
176
174
|
for (;;) {
|
|
177
175
|
const query = { runtimeId, after, limit: 500 };
|
|
178
|
-
const page = await fetchConsoleEventHistory(query, { signal });
|
|
176
|
+
const page = await fetchConsoleEventHistory(query, { signal, fetch: this.config.fetch });
|
|
179
177
|
if (page.runtimeId !== runtimeId) {
|
|
180
178
|
runtimeId = page.runtimeId;
|
|
181
179
|
after = 0;
|
|
@@ -209,7 +207,7 @@ export class WebSocketManager {
|
|
|
209
207
|
&& event.runtimeId === this.eventRuntimeId
|
|
210
208
|
&& event.eventId <= this.lastEventId)
|
|
211
209
|
return;
|
|
212
|
-
const message =
|
|
210
|
+
const message = Object.freeze({
|
|
213
211
|
type: event.type,
|
|
214
212
|
data: event.data,
|
|
215
213
|
runtimeId: event.runtimeId,
|
|
@@ -260,60 +258,26 @@ export class WebSocketManager {
|
|
|
260
258
|
}
|
|
261
259
|
}
|
|
262
260
|
disconnect() {
|
|
261
|
+
const wasConnected = this.state === ConnectionState.CONNECTED;
|
|
262
|
+
this.connectionGeneration += 1;
|
|
263
263
|
this.clearReconnectTimer();
|
|
264
|
-
this.clearPendingRequests();
|
|
265
264
|
this.sseAbort?.abort();
|
|
266
265
|
this.sseAbort = null;
|
|
267
|
-
if (this.ws) {
|
|
268
|
-
this.ws.close();
|
|
269
|
-
this.ws = null;
|
|
270
|
-
}
|
|
271
266
|
this.setState(ConnectionState.DISCONNECTED);
|
|
272
267
|
this.notifyConnection(false);
|
|
268
|
+
if (wasConnected)
|
|
269
|
+
this.callbacks.onDisconnect?.();
|
|
273
270
|
}
|
|
274
271
|
send(message) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
return;
|
|
278
|
-
}
|
|
279
|
-
if (!this.isConnected())
|
|
280
|
-
throw new WebSocketError("WebSocket is not connected", "NOT_CONNECTED");
|
|
281
|
-
try {
|
|
282
|
-
this.ws.send(JSON.stringify(message));
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
throw new MessageError("Failed to send message", error);
|
|
286
|
-
}
|
|
272
|
+
this.assertActive();
|
|
273
|
+
void this.sendRequest(message);
|
|
287
274
|
}
|
|
288
275
|
async sendRequest(message) {
|
|
289
|
-
|
|
290
|
-
return this.sendRestRequest(message);
|
|
291
|
-
}
|
|
292
|
-
if (!this.isConnected())
|
|
293
|
-
throw new WebSocketError("WebSocket is not connected", "NOT_CONNECTED");
|
|
294
|
-
return new Promise((resolve, reject) => {
|
|
295
|
-
const requestId = ++this.requestId;
|
|
296
|
-
const messageWithId = { ...message, requestId };
|
|
297
|
-
const timer = setTimeout(() => {
|
|
298
|
-
this.pendingRequests.delete(requestId);
|
|
299
|
-
reject(new RequestTimeoutError(requestId));
|
|
300
|
-
}, this.config.requestTimeout);
|
|
301
|
-
this.pendingRequests.set(requestId, { resolve: resolve, reject, timer });
|
|
302
|
-
try {
|
|
303
|
-
this.ws.send(JSON.stringify(messageWithId));
|
|
304
|
-
}
|
|
305
|
-
catch (error) {
|
|
306
|
-
this.pendingRequests.delete(requestId);
|
|
307
|
-
clearTimeout(timer);
|
|
308
|
-
reject(new MessageError("Failed to send request", error));
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
async sendRestRequest(message) {
|
|
276
|
+
this.assertActive();
|
|
313
277
|
// Host may run without http.token (local smoke). Only require a token when
|
|
314
278
|
// one is configured client-side; otherwise POST without Authorization and
|
|
315
279
|
// let the Host accept (TokenRegistry empty → full scope).
|
|
316
|
-
const token =
|
|
280
|
+
const token = getToken();
|
|
317
281
|
const requestId = ++this.requestId;
|
|
318
282
|
const body = { ...message, requestId };
|
|
319
283
|
try {
|
|
@@ -322,7 +286,7 @@ export class WebSocketManager {
|
|
|
322
286
|
};
|
|
323
287
|
if (token)
|
|
324
288
|
headers.Authorization = `Bearer ${token}`;
|
|
325
|
-
const res = await fetch(resolveApiUrl("/api/console/request"), {
|
|
289
|
+
const res = await this.config.fetch(resolveApiUrl("/api/console/request"), {
|
|
326
290
|
method: "POST",
|
|
327
291
|
headers,
|
|
328
292
|
body: JSON.stringify(body),
|
|
@@ -330,31 +294,96 @@ export class WebSocketManager {
|
|
|
330
294
|
});
|
|
331
295
|
const json = (await res.json());
|
|
332
296
|
if (!res.ok || json.success === false) {
|
|
333
|
-
throw new
|
|
297
|
+
throw new ConsoleTransportError(json.error ?? `HTTP ${res.status}`, "SERVER_ERROR");
|
|
334
298
|
}
|
|
335
299
|
return json.data;
|
|
336
300
|
}
|
|
337
301
|
catch (error) {
|
|
338
|
-
if (error instanceof
|
|
302
|
+
if (error instanceof ConsoleTransportError)
|
|
339
303
|
throw error;
|
|
340
304
|
throw new MessageError("REST request failed", error);
|
|
341
305
|
}
|
|
342
306
|
}
|
|
343
307
|
isConnected() {
|
|
344
|
-
|
|
345
|
-
return this.state === ConnectionState.CONNECTED;
|
|
346
|
-
}
|
|
347
|
-
return this.ws?.readyState === WebSocket.OPEN;
|
|
308
|
+
return this.state === ConnectionState.CONNECTED;
|
|
348
309
|
}
|
|
349
310
|
getState() {
|
|
350
311
|
return this.state;
|
|
351
312
|
}
|
|
313
|
+
dispose() {
|
|
314
|
+
if (this.disposed)
|
|
315
|
+
return;
|
|
316
|
+
this.disconnect();
|
|
317
|
+
this.disposed = true;
|
|
318
|
+
this.connectedListeners.clear();
|
|
319
|
+
this.eventListeners.clear();
|
|
320
|
+
this.recoveryGapListeners.clear();
|
|
321
|
+
}
|
|
352
322
|
async getConfig(pluginName) {
|
|
353
|
-
return this.sendRequest({ type:
|
|
323
|
+
return this.sendRequest({ type: CONFIG_RPC.GET, pluginName });
|
|
324
|
+
}
|
|
325
|
+
async planPluginInstall(packageName) {
|
|
326
|
+
return this.sendRequest({ type: PLUGIN_RPC.PLAN_INSTALL, packageName });
|
|
327
|
+
}
|
|
328
|
+
async installPlugin(packageName, expectedRevision) {
|
|
329
|
+
return this.sendRequest({ type: PLUGIN_RPC.INSTALL, packageName, expectedRevision });
|
|
330
|
+
}
|
|
331
|
+
async planPluginUninstall(packageName) {
|
|
332
|
+
return this.sendRequest({ type: PLUGIN_RPC.PLAN_UNINSTALL, packageName });
|
|
333
|
+
}
|
|
334
|
+
async uninstallPlugin(packageName, expectedRevision) {
|
|
335
|
+
return this.sendRequest({
|
|
336
|
+
type: PLUGIN_RPC.UNINSTALL,
|
|
337
|
+
packageName,
|
|
338
|
+
confirmation: packageName,
|
|
339
|
+
expectedRevision,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
async planPluginUpdate(packageName, targetVersion) {
|
|
343
|
+
return this.sendRequest({ type: PLUGIN_RPC.PLAN_UPDATE, packageName, targetVersion });
|
|
344
|
+
}
|
|
345
|
+
async updatePlugin(packageName, targetVersion, expectedRevision) {
|
|
346
|
+
return this.sendRequest({ type: PLUGIN_RPC.UPDATE, packageName, targetVersion, expectedRevision });
|
|
347
|
+
}
|
|
348
|
+
async validatePluginConfig(pluginName, data) {
|
|
349
|
+
return this.sendRequest({ type: PLUGIN_RPC.VALIDATE_CONFIG, pluginName, data });
|
|
350
|
+
}
|
|
351
|
+
async diagnosePlugin(pluginName) {
|
|
352
|
+
return this.sendRequest({ type: PLUGIN_RPC.DIAGNOSE, pluginName });
|
|
353
|
+
}
|
|
354
|
+
async setPluginEnabled(instanceKey, enabled) {
|
|
355
|
+
return this.sendRequest({ type: PLUGIN_RPC.SET_ENABLED, instanceKey, enabled });
|
|
356
|
+
}
|
|
357
|
+
async listPlugins() {
|
|
358
|
+
return this.getRest('/api/plugins');
|
|
359
|
+
}
|
|
360
|
+
async searchMarketplace(query = {}) {
|
|
361
|
+
const params = new URLSearchParams();
|
|
362
|
+
const normalized = {
|
|
363
|
+
q: query.keyword,
|
|
364
|
+
category: query.category,
|
|
365
|
+
official: query.official,
|
|
366
|
+
page: query.page,
|
|
367
|
+
size: query.pageSize,
|
|
368
|
+
};
|
|
369
|
+
for (const [key, value] of Object.entries(normalized)) {
|
|
370
|
+
if (value !== undefined)
|
|
371
|
+
params.set(key, String(value));
|
|
372
|
+
}
|
|
373
|
+
return this.getRest(`/pub/marketplace/search${params.size ? `?${params}` : ''}`);
|
|
374
|
+
}
|
|
375
|
+
async getMarketplacePlugin(packageName) {
|
|
376
|
+
return this.getRest(`/pub/marketplace/detail/${encodeURIComponent(packageName)}`);
|
|
377
|
+
}
|
|
378
|
+
async getPluginUpdates() {
|
|
379
|
+
return this.getRest('/api/marketplace/updates');
|
|
380
|
+
}
|
|
381
|
+
async testEndpoint(adapter, endpointKey) {
|
|
382
|
+
return this.sendRequest({ type: ENDPOINT_RPC.TEST, adapter, endpointKey });
|
|
354
383
|
}
|
|
355
384
|
async setConfig(pluginName, config) {
|
|
356
385
|
return this.sendRequest({
|
|
357
|
-
type:
|
|
386
|
+
type: CONFIG_RPC.SET,
|
|
358
387
|
pluginName,
|
|
359
388
|
data: config,
|
|
360
389
|
});
|
|
@@ -363,16 +392,20 @@ export class WebSocketManager {
|
|
|
363
392
|
return this.sendRequest({ type: "schema:get", pluginName });
|
|
364
393
|
}
|
|
365
394
|
async getAllConfigs() {
|
|
366
|
-
return this.sendRequest({ type:
|
|
395
|
+
return this.sendRequest({ type: CONFIG_RPC.GET_ALL });
|
|
367
396
|
}
|
|
368
397
|
async getAllSchemas() {
|
|
369
398
|
return this.sendRequest({ type: "schema:get-all" });
|
|
370
399
|
}
|
|
371
|
-
async
|
|
372
|
-
return this.sendRequest({ type:
|
|
400
|
+
async getConfigSource() {
|
|
401
|
+
return this.sendRequest({ type: CONFIG_RPC.GET_SOURCE });
|
|
373
402
|
}
|
|
374
|
-
async
|
|
375
|
-
return this.sendRequest({
|
|
403
|
+
async replaceConfigSource(source, expectedRevision) {
|
|
404
|
+
return this.sendRequest({
|
|
405
|
+
type: CONFIG_RPC.REPLACE_SOURCE,
|
|
406
|
+
source,
|
|
407
|
+
expectedRevision,
|
|
408
|
+
});
|
|
376
409
|
}
|
|
377
410
|
async getEnvList() {
|
|
378
411
|
return this.sendRequest({ type: "env:list" });
|
|
@@ -425,44 +458,24 @@ export class WebSocketManager {
|
|
|
425
458
|
async kvGetEntries(table) {
|
|
426
459
|
return this.sendRequest({ type: "db:kv:entries", table });
|
|
427
460
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
461
|
+
async getRest(path) {
|
|
462
|
+
const token = getToken();
|
|
463
|
+
const headers = { Accept: 'application/json' };
|
|
464
|
+
if (token)
|
|
465
|
+
headers.Authorization = `Bearer ${token}`;
|
|
466
|
+
const response = await this.config.fetch(resolveApiUrl(path), {
|
|
467
|
+
headers,
|
|
468
|
+
signal: AbortSignal.timeout(this.config.requestTimeout),
|
|
469
|
+
});
|
|
470
|
+
const body = await response.json();
|
|
471
|
+
if (!response.ok || body.success === false) {
|
|
472
|
+
throw new ConsoleTransportError(body.error ?? `HTTP ${response.status}`, 'SERVER_ERROR');
|
|
473
|
+
}
|
|
474
|
+
return body.data;
|
|
433
475
|
}
|
|
434
476
|
setState(newState) {
|
|
435
477
|
this.state = newState;
|
|
436
478
|
}
|
|
437
|
-
attachEventHandlers() {
|
|
438
|
-
if (!this.ws)
|
|
439
|
-
return;
|
|
440
|
-
this.ws.onopen = () => this.handleConnectionOpen();
|
|
441
|
-
this.ws.onmessage = (event) => this.handleMessage(event);
|
|
442
|
-
this.ws.onclose = () => this.handleConnectionClose();
|
|
443
|
-
this.ws.onerror = (event) => this.handleConnectionError(new ConnectionError("WebSocket error", event));
|
|
444
|
-
}
|
|
445
|
-
handleConnectionOpen() {
|
|
446
|
-
this.setState(ConnectionState.CONNECTED);
|
|
447
|
-
this.reconnectAttempts = 0;
|
|
448
|
-
this.notifyConnection(true);
|
|
449
|
-
this.callbacks.onConnect?.();
|
|
450
|
-
}
|
|
451
|
-
handleMessage(event) {
|
|
452
|
-
try {
|
|
453
|
-
const message = normalizeConsolePushMessage(JSON.parse(event.data));
|
|
454
|
-
if (message.requestId && this.pendingRequests.has(message.requestId)) {
|
|
455
|
-
this.handleRequestResponse(message);
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
void applyConsoleEvent(message);
|
|
459
|
-
this.handleBroadcast(message);
|
|
460
|
-
this.callbacks.onMessage?.(message);
|
|
461
|
-
}
|
|
462
|
-
catch (error) {
|
|
463
|
-
console.error("[WebSocket] Message parsing error:", error);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
479
|
handleBroadcast(message) {
|
|
467
480
|
const t = message.type;
|
|
468
481
|
if (t === SIDE_EVENT_PUSH.REQUEST_RECEIVE
|
|
@@ -484,37 +497,6 @@ export class WebSocketManager {
|
|
|
484
497
|
return;
|
|
485
498
|
}
|
|
486
499
|
}
|
|
487
|
-
handleRequestResponse(message) {
|
|
488
|
-
const { requestId } = message;
|
|
489
|
-
const pending = this.pendingRequests.get(requestId);
|
|
490
|
-
if (!pending)
|
|
491
|
-
return;
|
|
492
|
-
this.pendingRequests.delete(requestId);
|
|
493
|
-
clearTimeout(pending.timer);
|
|
494
|
-
if (message.error) {
|
|
495
|
-
pending.reject(new WebSocketError(message.error, "SERVER_ERROR"));
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
pending.resolve(message.data);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
handleConnectionClose() {
|
|
502
|
-
this.ws = null;
|
|
503
|
-
this.notifyConnection(false);
|
|
504
|
-
if (this.state === ConnectionState.DISCONNECTED)
|
|
505
|
-
return;
|
|
506
|
-
this.setState(ConnectionState.RECONNECTING);
|
|
507
|
-
this.callbacks.onDisconnect?.();
|
|
508
|
-
this.scheduleReconnect();
|
|
509
|
-
}
|
|
510
|
-
handleConnectionError(error) {
|
|
511
|
-
// Used by the legacy WS path. Do NOT clear the reconnect timer here —
|
|
512
|
-
// callers that still want to retry should set RECONNECTING then call
|
|
513
|
-
// scheduleReconnect(). Terminal failures go through scheduleReconnect's
|
|
514
|
-
// maxAttempts branch which sets ERROR.
|
|
515
|
-
console.error("[Console transport] Connection error:", error);
|
|
516
|
-
this.callbacks.onError?.(error);
|
|
517
|
-
}
|
|
518
500
|
scheduleReconnect() {
|
|
519
501
|
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
520
502
|
this.setState(ConnectionState.ERROR);
|
|
@@ -541,12 +523,12 @@ export class WebSocketManager {
|
|
|
541
523
|
this.reconnectTimer = null;
|
|
542
524
|
}
|
|
543
525
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
this.
|
|
526
|
+
assertActive() {
|
|
527
|
+
if (this.disposed)
|
|
528
|
+
throw new Error('ConsoleTransport has been disposed');
|
|
529
|
+
}
|
|
530
|
+
isCurrentConnection(generation) {
|
|
531
|
+
return !this.disposed && generation === this.connectionGeneration;
|
|
550
532
|
}
|
|
551
533
|
}
|
|
552
534
|
function eventCursorStorageKey() {
|
|
@@ -578,4 +560,4 @@ function writeEventCursor(cursor) {
|
|
|
578
560
|
// HTTP history remains available when browser storage is unavailable.
|
|
579
561
|
}
|
|
580
562
|
}
|
|
581
|
-
//# sourceMappingURL=
|
|
563
|
+
//# sourceMappingURL=console-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-transport.js","sourceRoot":"","sources":["../../client/transport/console-transport.ts"],"names":[],"mappings":"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"}
|