@zhin.js/client 1.0.16 → 1.0.18
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/client/app.ts +228 -0
- package/client/index.ts +42 -14
- package/client/websocket/hooks.ts +218 -510
- package/client/websocket/index.ts +6 -43
- package/client/websocket/instance.ts +10 -32
- package/client/websocket/manager.ts +173 -390
- package/client/websocket/types.ts +58 -222
- package/dist/app.d.ts +95 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +147 -0
- package/dist/app.js.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -14
- package/dist/index.js.map +1 -1
- package/dist/websocket/hooks.d.ts +35 -58
- package/dist/websocket/hooks.d.ts.map +1 -1
- package/dist/websocket/hooks.js +134 -410
- package/dist/websocket/hooks.js.map +1 -1
- package/dist/websocket/index.d.ts +5 -10
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +5 -25
- package/dist/websocket/index.js.map +1 -1
- package/dist/websocket/instance.d.ts +1 -14
- package/dist/websocket/instance.d.ts.map +1 -1
- package/dist/websocket/instance.js +2 -20
- package/dist/websocket/instance.js.map +1 -1
- package/dist/websocket/manager.d.ts +23 -93
- package/dist/websocket/manager.d.ts.map +1 -1
- package/dist/websocket/manager.js +87 -227
- package/dist/websocket/manager.js.map +1 -1
- package/dist/websocket/types.d.ts +35 -122
- package/dist/websocket/types.d.ts.map +1 -1
- package/dist/websocket/types.js +4 -13
- package/dist/websocket/types.js.map +1 -1
- package/package.json +12 -11
- package/client/router/index.tsx +0 -54
- package/client/store/index.ts +0 -132
- package/client/store/reducers/config.ts +0 -135
- package/client/store/reducers/index.ts +0 -19
- package/client/store/reducers/route.ts +0 -126
- package/client/store/reducers/script.ts +0 -109
- package/client/store/reducers/ui.ts +0 -31
- package/client/websocket/messageHandler.ts +0 -208
- package/dist/router/index.d.ts +0 -25
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -48
- package/dist/router/index.js.map +0 -1
- package/dist/store/index.d.ts +0 -19
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -67
- package/dist/store/index.js.map +0 -1
- package/dist/store/reducers/config.d.ts +0 -54
- package/dist/store/reducers/config.d.ts.map +0 -1
- package/dist/store/reducers/config.js +0 -78
- package/dist/store/reducers/config.js.map +0 -1
- package/dist/store/reducers/index.d.ts +0 -13
- package/dist/store/reducers/index.d.ts.map +0 -1
- package/dist/store/reducers/index.js +0 -11
- package/dist/store/reducers/index.js.map +0 -1
- package/dist/store/reducers/route.d.ts +0 -30
- package/dist/store/reducers/route.d.ts.map +0 -1
- package/dist/store/reducers/route.js +0 -85
- package/dist/store/reducers/route.js.map +0 -1
- package/dist/store/reducers/script.d.ts +0 -13
- package/dist/store/reducers/script.d.ts.map +0 -1
- package/dist/store/reducers/script.js +0 -78
- package/dist/store/reducers/script.js.map +0 -1
- package/dist/store/reducers/ui.d.ts +0 -8
- package/dist/store/reducers/ui.d.ts.map +0 -1
- package/dist/store/reducers/ui.js +0 -23
- package/dist/store/reducers/ui.js.map +0 -1
- package/dist/websocket/messageHandler.d.ts +0 -58
- package/dist/websocket/messageHandler.d.ts.map +0 -1
- package/dist/websocket/messageHandler.js +0 -174
- package/dist/websocket/messageHandler.js.map +0 -1
package/dist/websocket/hooks.js
CHANGED
|
@@ -1,523 +1,247 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* 提供在 React 组件中使用 WebSocket 功能的便捷接口
|
|
4
|
-
*/
|
|
5
|
-
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
6
|
-
import { useSelector, useDispatch, selectConfig, selectSchema, selectConfigLoading, selectConfigError, selectConfigConnected, selectAllConfigs, selectAllSchemas, setLoading, setError, updateConfig, updateSchema } from '../store';
|
|
7
|
-
import { getWebSocketManager } from './instance';
|
|
8
|
-
// ============================================================================
|
|
9
|
-
// WebSocket 连接 Hook
|
|
10
|
-
// ============================================================================
|
|
11
|
-
/**
|
|
12
|
-
* WebSocket 连接状态和基础功能 Hook
|
|
13
|
-
*/
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { getWebSocketManager } from "./instance";
|
|
14
3
|
export function useWebSocket(options = {}) {
|
|
15
4
|
const { autoConnect = true } = options;
|
|
16
5
|
const wsManager = getWebSocketManager();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const loadedScripts = useSelector((state) => state.script?.loadedScripts || []);
|
|
21
|
-
// 连接控制
|
|
22
|
-
const connect = useCallback(() => {
|
|
23
|
-
wsManager.connect();
|
|
24
|
-
}, [wsManager]);
|
|
25
|
-
const disconnect = useCallback(() => {
|
|
26
|
-
wsManager.disconnect();
|
|
27
|
-
}, [wsManager]);
|
|
28
|
-
// 消息发送
|
|
29
|
-
const send = useCallback((message) => {
|
|
30
|
-
wsManager.send(message);
|
|
31
|
-
}, [wsManager]);
|
|
32
|
-
const sendRequest = useCallback(async (message) => {
|
|
33
|
-
// 临时使用旧方法,后续完善
|
|
34
|
-
return wsManager.sendRequest(message);
|
|
35
|
-
}, [wsManager]);
|
|
36
|
-
// 状态查询
|
|
37
|
-
const isConnected = useCallback(() => {
|
|
38
|
-
return wsManager.isConnected();
|
|
39
|
-
}, [wsManager]);
|
|
40
|
-
const getState = useCallback(() => {
|
|
41
|
-
// 临时返回连接状态,后续完善
|
|
42
|
-
return wsManager.isConnected() ? 'connected' : 'disconnected';
|
|
6
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
return wsManager.onConnectionChange(setConnected);
|
|
43
9
|
}, [wsManager]);
|
|
44
|
-
|
|
10
|
+
const connect = useCallback(() => wsManager.connect(), [wsManager]);
|
|
11
|
+
const disconnect = useCallback(() => wsManager.disconnect(), [wsManager]);
|
|
12
|
+
const send = useCallback((message) => wsManager.send(message), [wsManager]);
|
|
13
|
+
const sendRequest = useCallback((message) => wsManager.sendRequest(message), [wsManager]);
|
|
45
14
|
useEffect(() => {
|
|
46
|
-
if (autoConnect && !connected)
|
|
15
|
+
if (autoConnect && !connected)
|
|
47
16
|
connect();
|
|
48
|
-
}
|
|
49
17
|
}, [autoConnect, connected, connect]);
|
|
50
|
-
return {
|
|
51
|
-
// 状态
|
|
52
|
-
connected,
|
|
53
|
-
entries,
|
|
54
|
-
loadedScripts,
|
|
55
|
-
// 方法
|
|
56
|
-
connect,
|
|
57
|
-
disconnect,
|
|
58
|
-
send,
|
|
59
|
-
sendRequest,
|
|
60
|
-
isConnected,
|
|
61
|
-
getState,
|
|
62
|
-
// WebSocket 实例(高级用法)
|
|
63
|
-
manager: wsManager
|
|
64
|
-
};
|
|
18
|
+
return { connected, connect, disconnect, send, sendRequest, manager: wsManager };
|
|
65
19
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
// ============================================================================
|
|
69
|
-
/**
|
|
70
|
-
* 插件配置管理 Hook
|
|
71
|
-
*/
|
|
72
|
-
export function useConfig(pluginName, options = {}) {
|
|
73
|
-
const { autoLoad = true, autoLoadSchema = true } = options;
|
|
74
|
-
const dispatch = useDispatch();
|
|
20
|
+
export function useConfig(pluginName, options) {
|
|
21
|
+
const { autoLoad = true, autoLoadSchema = true } = options ?? {};
|
|
75
22
|
const wsManager = getWebSocketManager();
|
|
76
|
-
|
|
77
|
-
const config =
|
|
78
|
-
const schema =
|
|
79
|
-
const loading =
|
|
80
|
-
const error =
|
|
81
|
-
|
|
82
|
-
// 配置操作
|
|
23
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
24
|
+
const [config, setConfigState] = useState(null);
|
|
25
|
+
const [schema, setSchemaState] = useState(null);
|
|
26
|
+
const [loading, setLoading] = useState(false);
|
|
27
|
+
const [error, setError] = useState(null);
|
|
28
|
+
useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
|
|
83
29
|
const getConfig = useCallback(async () => {
|
|
84
|
-
|
|
85
|
-
|
|
30
|
+
setLoading(true);
|
|
31
|
+
setError(null);
|
|
86
32
|
try {
|
|
87
33
|
const result = await wsManager.getConfig(pluginName);
|
|
88
|
-
|
|
34
|
+
setConfigState(result);
|
|
89
35
|
return result;
|
|
90
36
|
}
|
|
91
|
-
catch (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
dispatch(setError({ pluginName, error: errorMessage }));
|
|
95
|
-
throw error;
|
|
37
|
+
catch (e) {
|
|
38
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
39
|
+
throw e;
|
|
96
40
|
}
|
|
97
41
|
finally {
|
|
98
|
-
|
|
42
|
+
setLoading(false);
|
|
99
43
|
}
|
|
100
|
-
}, [pluginName, wsManager
|
|
44
|
+
}, [pluginName, wsManager]);
|
|
101
45
|
const setConfig = useCallback(async (newConfig) => {
|
|
102
|
-
|
|
103
|
-
|
|
46
|
+
setLoading(true);
|
|
47
|
+
setError(null);
|
|
104
48
|
try {
|
|
105
|
-
|
|
106
|
-
return { reloaded: result?.reloaded, message: result?.message };
|
|
49
|
+
return await wsManager.setConfig(pluginName, newConfig);
|
|
107
50
|
}
|
|
108
|
-
catch (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
dispatch(setError({ pluginName, error: errorMessage }));
|
|
112
|
-
throw error;
|
|
51
|
+
catch (e) {
|
|
52
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
53
|
+
throw e;
|
|
113
54
|
}
|
|
114
55
|
finally {
|
|
115
|
-
|
|
56
|
+
setLoading(false);
|
|
116
57
|
}
|
|
117
|
-
}, [pluginName, wsManager
|
|
58
|
+
}, [pluginName, wsManager]);
|
|
118
59
|
const getSchema = useCallback(async () => {
|
|
119
60
|
try {
|
|
120
61
|
const result = await wsManager.getSchema(pluginName);
|
|
121
|
-
if (result)
|
|
122
|
-
|
|
123
|
-
}
|
|
62
|
+
if (result)
|
|
63
|
+
setSchemaState(result);
|
|
124
64
|
return result;
|
|
125
65
|
}
|
|
126
|
-
catch (
|
|
127
|
-
|
|
128
|
-
throw error;
|
|
66
|
+
catch (e) {
|
|
67
|
+
throw e;
|
|
129
68
|
}
|
|
130
|
-
}, [pluginName, wsManager
|
|
131
|
-
// 重新加载配置和 Schema
|
|
132
|
-
const reload = useCallback(async () => {
|
|
133
|
-
const promises = [];
|
|
134
|
-
if (autoLoad) {
|
|
135
|
-
promises.push(getConfig());
|
|
136
|
-
}
|
|
137
|
-
if (autoLoadSchema) {
|
|
138
|
-
promises.push(getSchema());
|
|
139
|
-
}
|
|
140
|
-
await Promise.all(promises);
|
|
141
|
-
}, [autoLoad, autoLoadSchema, getConfig, getSchema]);
|
|
142
|
-
// 自动加载
|
|
69
|
+
}, [pluginName, wsManager]);
|
|
143
70
|
useEffect(() => {
|
|
144
|
-
if (connected && autoLoad && !config && !loading)
|
|
145
|
-
getConfig().catch(
|
|
146
|
-
}
|
|
71
|
+
if (connected && autoLoad && !config && !loading)
|
|
72
|
+
getConfig().catch(() => { });
|
|
147
73
|
}, [connected, autoLoad, config, loading, getConfig]);
|
|
148
74
|
useEffect(() => {
|
|
149
|
-
if (connected && autoLoadSchema && !schema)
|
|
150
|
-
getSchema().catch(
|
|
151
|
-
}
|
|
75
|
+
if (connected && autoLoadSchema && !schema)
|
|
76
|
+
getSchema().catch(() => { });
|
|
152
77
|
}, [connected, autoLoadSchema, schema, getSchema]);
|
|
153
|
-
return useMemo(() => ({
|
|
154
|
-
// 状态
|
|
155
|
-
config,
|
|
156
|
-
schema,
|
|
157
|
-
loading,
|
|
158
|
-
error,
|
|
159
|
-
connected,
|
|
160
|
-
// 方法
|
|
161
|
-
getConfig,
|
|
162
|
-
setConfig,
|
|
163
|
-
getSchema,
|
|
164
|
-
reload
|
|
165
|
-
}), [config, schema, loading, error, connected, getConfig, setConfig, getSchema, reload]);
|
|
78
|
+
return useMemo(() => ({ config, schema, loading, error, connected, getConfig, setConfig, getSchema }), [config, schema, loading, error, connected, getConfig, setConfig, getSchema]);
|
|
166
79
|
}
|
|
167
|
-
// ============================================================================
|
|
168
|
-
// 批量配置管理 Hook
|
|
169
|
-
// ============================================================================
|
|
170
|
-
/**
|
|
171
|
-
* 所有配置管理 Hook
|
|
172
|
-
*/
|
|
173
|
-
export function useAllConfigs() {
|
|
174
|
-
const wsManager = getWebSocketManager();
|
|
175
|
-
const allConfigs = useSelector(selectAllConfigs);
|
|
176
|
-
const allSchemas = useSelector(selectAllSchemas);
|
|
177
|
-
const connected = useSelector(selectConfigConnected);
|
|
178
|
-
const refreshAll = useCallback(async () => {
|
|
179
|
-
try {
|
|
180
|
-
const [configs, schemas] = await Promise.all([
|
|
181
|
-
wsManager.getAllConfigs(),
|
|
182
|
-
wsManager.getAllSchemas()
|
|
183
|
-
]);
|
|
184
|
-
return { configs, schemas };
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
console.error('Failed to refresh all configs:', error);
|
|
188
|
-
throw error;
|
|
189
|
-
}
|
|
190
|
-
}, [wsManager]);
|
|
191
|
-
return useMemo(() => ({
|
|
192
|
-
configs: allConfigs,
|
|
193
|
-
schemas: allSchemas,
|
|
194
|
-
connected,
|
|
195
|
-
refreshAll
|
|
196
|
-
}), [allConfigs, allSchemas, connected, refreshAll]);
|
|
197
|
-
}
|
|
198
|
-
// ============================================================================
|
|
199
|
-
// 配置文件 YAML 读写 Hook
|
|
200
|
-
// ============================================================================
|
|
201
80
|
export function useConfigYaml() {
|
|
202
81
|
const wsManager = getWebSocketManager();
|
|
203
|
-
const connected =
|
|
204
|
-
const [yaml, setYaml] = useState(
|
|
82
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
83
|
+
const [yaml, setYaml] = useState("");
|
|
205
84
|
const [pluginKeys, setPluginKeys] = useState([]);
|
|
206
|
-
const [loading,
|
|
207
|
-
const [error,
|
|
85
|
+
const [loading, setLoading] = useState(false);
|
|
86
|
+
const [error, setError] = useState(null);
|
|
87
|
+
useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
|
|
208
88
|
const load = useCallback(async () => {
|
|
209
|
-
|
|
210
|
-
|
|
89
|
+
setLoading(true);
|
|
90
|
+
setError(null);
|
|
211
91
|
try {
|
|
212
92
|
const result = await wsManager.getConfigYaml();
|
|
213
93
|
setYaml(result.yaml);
|
|
214
94
|
setPluginKeys(result.pluginKeys);
|
|
215
95
|
return result;
|
|
216
96
|
}
|
|
217
|
-
catch (
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
throw err;
|
|
97
|
+
catch (e) {
|
|
98
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
99
|
+
throw e;
|
|
221
100
|
}
|
|
222
101
|
finally {
|
|
223
|
-
|
|
102
|
+
setLoading(false);
|
|
224
103
|
}
|
|
225
104
|
}, [wsManager]);
|
|
226
105
|
const save = useCallback(async (content) => {
|
|
227
|
-
|
|
228
|
-
|
|
106
|
+
setLoading(true);
|
|
107
|
+
setError(null);
|
|
229
108
|
try {
|
|
230
109
|
const result = await wsManager.saveConfigYaml(content);
|
|
231
110
|
setYaml(content);
|
|
232
111
|
return result;
|
|
233
112
|
}
|
|
234
|
-
catch (
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
throw err;
|
|
113
|
+
catch (e) {
|
|
114
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
115
|
+
throw e;
|
|
238
116
|
}
|
|
239
117
|
finally {
|
|
240
|
-
|
|
118
|
+
setLoading(false);
|
|
241
119
|
}
|
|
242
120
|
}, [wsManager]);
|
|
243
121
|
useEffect(() => {
|
|
244
|
-
if (connected && !yaml && !loading)
|
|
122
|
+
if (connected && !yaml && !loading)
|
|
245
123
|
load().catch(() => { });
|
|
246
|
-
}
|
|
247
124
|
}, [connected, yaml, loading, load]);
|
|
248
|
-
return useMemo(() => ({
|
|
249
|
-
yaml, pluginKeys, loading, error, load, save
|
|
250
|
-
}), [yaml, pluginKeys, loading, error, load, save]);
|
|
251
|
-
}
|
|
252
|
-
// ============================================================================
|
|
253
|
-
// 环境变量文件管理 Hook
|
|
254
|
-
// ============================================================================
|
|
255
|
-
export function useEnvFiles() {
|
|
256
|
-
const wsManager = getWebSocketManager();
|
|
257
|
-
const connected = useSelector(selectConfigConnected);
|
|
258
|
-
const [files, setFiles] = useState([]);
|
|
259
|
-
const [loading, setLoadingState] = useState(false);
|
|
260
|
-
const [error, setErrorState] = useState(null);
|
|
261
|
-
const listFiles = useCallback(async () => {
|
|
262
|
-
setLoadingState(true);
|
|
263
|
-
setErrorState(null);
|
|
264
|
-
try {
|
|
265
|
-
const result = await wsManager.getEnvList();
|
|
266
|
-
setFiles(result.files);
|
|
267
|
-
return result.files;
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
271
|
-
setErrorState(msg);
|
|
272
|
-
throw err;
|
|
273
|
-
}
|
|
274
|
-
finally {
|
|
275
|
-
setLoadingState(false);
|
|
276
|
-
}
|
|
277
|
-
}, [wsManager]);
|
|
278
|
-
const getFile = useCallback(async (filename) => {
|
|
279
|
-
try {
|
|
280
|
-
const result = await wsManager.getEnvFile(filename);
|
|
281
|
-
return result.content;
|
|
282
|
-
}
|
|
283
|
-
catch (err) {
|
|
284
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
285
|
-
setErrorState(msg);
|
|
286
|
-
throw err;
|
|
287
|
-
}
|
|
288
|
-
}, [wsManager]);
|
|
289
|
-
const saveFile = useCallback(async (filename, content) => {
|
|
290
|
-
setLoadingState(true);
|
|
291
|
-
setErrorState(null);
|
|
292
|
-
try {
|
|
293
|
-
return await wsManager.saveEnvFile(filename, content);
|
|
294
|
-
}
|
|
295
|
-
catch (err) {
|
|
296
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
297
|
-
setErrorState(msg);
|
|
298
|
-
throw err;
|
|
299
|
-
}
|
|
300
|
-
finally {
|
|
301
|
-
setLoadingState(false);
|
|
302
|
-
}
|
|
303
|
-
}, [wsManager]);
|
|
304
|
-
useEffect(() => {
|
|
305
|
-
if (connected && files.length === 0 && !loading) {
|
|
306
|
-
listFiles().catch(() => { });
|
|
307
|
-
}
|
|
308
|
-
}, [connected, files.length, loading, listFiles]);
|
|
309
|
-
return useMemo(() => ({
|
|
310
|
-
files, loading, error, listFiles, getFile, saveFile
|
|
311
|
-
}), [files, loading, error, listFiles, getFile, saveFile]);
|
|
125
|
+
return useMemo(() => ({ yaml, pluginKeys, loading, error, load, save }), [yaml, pluginKeys, loading, error, load, save]);
|
|
312
126
|
}
|
|
313
|
-
// ============================================================================
|
|
314
|
-
// 文件管理 Hook
|
|
315
|
-
// ============================================================================
|
|
316
127
|
export function useFiles() {
|
|
317
128
|
const wsManager = getWebSocketManager();
|
|
318
|
-
const connected =
|
|
129
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
319
130
|
const [tree, setTree] = useState([]);
|
|
320
|
-
const [loading,
|
|
321
|
-
const [error,
|
|
131
|
+
const [loading, setLoading] = useState(false);
|
|
132
|
+
const [error, setError] = useState(null);
|
|
133
|
+
useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
|
|
322
134
|
const loadTree = useCallback(async () => {
|
|
323
|
-
|
|
324
|
-
|
|
135
|
+
setLoading(true);
|
|
136
|
+
setError(null);
|
|
325
137
|
try {
|
|
326
138
|
const result = await wsManager.getFileTree();
|
|
327
139
|
setTree(result.tree);
|
|
328
140
|
return result.tree;
|
|
329
141
|
}
|
|
330
|
-
catch (
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
throw err;
|
|
142
|
+
catch (e) {
|
|
143
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
144
|
+
throw e;
|
|
334
145
|
}
|
|
335
146
|
finally {
|
|
336
|
-
|
|
147
|
+
setLoading(false);
|
|
337
148
|
}
|
|
338
149
|
}, [wsManager]);
|
|
339
|
-
const readFile = useCallback(async (filePath) =>
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
150
|
+
const readFile = useCallback(async (filePath) => (await wsManager.readFile(filePath)).content, [wsManager]);
|
|
151
|
+
const saveFile = useCallback(async (filePath, content) => wsManager.saveFile(filePath, content), [wsManager]);
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
if (connected && tree.length === 0 && !loading)
|
|
154
|
+
loadTree().catch(() => { });
|
|
155
|
+
}, [connected, tree.length, loading, loadTree]);
|
|
156
|
+
return useMemo(() => ({ tree, loading, error, loadTree, readFile, saveFile }), [tree, loading, error, loadTree, readFile, saveFile]);
|
|
157
|
+
}
|
|
158
|
+
export function useEnvFiles() {
|
|
159
|
+
const wsManager = getWebSocketManager();
|
|
160
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
161
|
+
const [files, setFiles] = useState([]);
|
|
162
|
+
const [loading, setLoading] = useState(false);
|
|
163
|
+
const [error, setError] = useState(null);
|
|
164
|
+
useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
|
|
165
|
+
const listFiles = useCallback(async () => {
|
|
166
|
+
setLoading(true);
|
|
167
|
+
setError(null);
|
|
353
168
|
try {
|
|
354
|
-
|
|
169
|
+
const result = await wsManager.getEnvList();
|
|
170
|
+
setFiles(result.files);
|
|
171
|
+
return result.files;
|
|
355
172
|
}
|
|
356
|
-
catch (
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
throw err;
|
|
173
|
+
catch (e) {
|
|
174
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
175
|
+
throw e;
|
|
360
176
|
}
|
|
361
177
|
finally {
|
|
362
|
-
|
|
178
|
+
setLoading(false);
|
|
363
179
|
}
|
|
364
180
|
}, [wsManager]);
|
|
181
|
+
const getFile = useCallback(async (filename) => {
|
|
182
|
+
const result = await wsManager.getEnvFile(filename);
|
|
183
|
+
return result.content;
|
|
184
|
+
}, [wsManager]);
|
|
185
|
+
const saveFile = useCallback(async (filename, content) => wsManager.saveEnvFile(filename, content), [wsManager]);
|
|
365
186
|
useEffect(() => {
|
|
366
|
-
if (connected &&
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
}, [
|
|
370
|
-
return useMemo(() => ({
|
|
371
|
-
tree, loading, error, loadTree, readFile, saveFile
|
|
372
|
-
}), [tree, loading, error, loadTree, readFile, saveFile]);
|
|
187
|
+
if (connected && files.length === 0 && !loading)
|
|
188
|
+
listFiles().catch(() => { });
|
|
189
|
+
}, [connected, files.length, loading, listFiles]);
|
|
190
|
+
return useMemo(() => ({ files, loading, error, listFiles, getFile, saveFile }), [files, loading, error, listFiles, getFile, saveFile]);
|
|
373
191
|
}
|
|
374
|
-
// ============================================================================
|
|
375
|
-
// 数据库管理 Hook
|
|
376
|
-
// ============================================================================
|
|
377
192
|
export function useDatabase() {
|
|
378
193
|
const wsManager = getWebSocketManager();
|
|
379
|
-
const connected =
|
|
194
|
+
const [connected, setConnected] = useState(wsManager.isConnected());
|
|
380
195
|
const [info, setInfo] = useState(null);
|
|
381
196
|
const [tables, setTables] = useState([]);
|
|
382
|
-
const [loading,
|
|
383
|
-
const [error,
|
|
197
|
+
const [loading, setLoading] = useState(false);
|
|
198
|
+
const [error, setError] = useState(null);
|
|
199
|
+
useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
|
|
384
200
|
const loadInfo = useCallback(async () => {
|
|
385
|
-
|
|
386
|
-
setErrorState(null);
|
|
201
|
+
setLoading(true);
|
|
387
202
|
try {
|
|
388
203
|
const result = await wsManager.getDbInfo();
|
|
389
204
|
setInfo(result);
|
|
390
205
|
return result;
|
|
391
206
|
}
|
|
392
|
-
catch (
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
throw err;
|
|
207
|
+
catch (e) {
|
|
208
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
209
|
+
throw e;
|
|
396
210
|
}
|
|
397
211
|
finally {
|
|
398
|
-
|
|
212
|
+
setLoading(false);
|
|
399
213
|
}
|
|
400
214
|
}, [wsManager]);
|
|
401
215
|
const loadTables = useCallback(async () => {
|
|
402
|
-
|
|
403
|
-
setErrorState(null);
|
|
216
|
+
setLoading(true);
|
|
404
217
|
try {
|
|
405
218
|
const result = await wsManager.getDbTables();
|
|
406
219
|
setTables(result.tables);
|
|
407
220
|
return result.tables;
|
|
408
221
|
}
|
|
409
|
-
catch (
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
throw err;
|
|
222
|
+
catch (e) {
|
|
223
|
+
setError(e instanceof Error ? e.message : "Unknown error");
|
|
224
|
+
throw e;
|
|
413
225
|
}
|
|
414
226
|
finally {
|
|
415
|
-
|
|
416
|
-
}
|
|
417
|
-
}, [wsManager]);
|
|
418
|
-
const select = useCallback(async (table, page, pageSize, where) =>
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
}, [wsManager]);
|
|
428
|
-
const insert = useCallback(async (table, row) => {
|
|
429
|
-
try {
|
|
430
|
-
return await wsManager.dbInsert(table, row);
|
|
431
|
-
}
|
|
432
|
-
catch (err) {
|
|
433
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
434
|
-
setErrorState(msg);
|
|
435
|
-
throw err;
|
|
436
|
-
}
|
|
437
|
-
}, [wsManager]);
|
|
438
|
-
const update = useCallback(async (table, row, where) => {
|
|
439
|
-
try {
|
|
440
|
-
return await wsManager.dbUpdate(table, row, where);
|
|
441
|
-
}
|
|
442
|
-
catch (err) {
|
|
443
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
444
|
-
setErrorState(msg);
|
|
445
|
-
throw err;
|
|
446
|
-
}
|
|
447
|
-
}, [wsManager]);
|
|
448
|
-
const remove = useCallback(async (table, where) => {
|
|
449
|
-
try {
|
|
450
|
-
return await wsManager.dbDelete(table, where);
|
|
451
|
-
}
|
|
452
|
-
catch (err) {
|
|
453
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
454
|
-
setErrorState(msg);
|
|
455
|
-
throw err;
|
|
456
|
-
}
|
|
457
|
-
}, [wsManager]);
|
|
458
|
-
const dropTable = useCallback(async (table) => {
|
|
459
|
-
try {
|
|
460
|
-
const result = await wsManager.dbDropTable(table);
|
|
461
|
-
await loadTables();
|
|
462
|
-
return result;
|
|
463
|
-
}
|
|
464
|
-
catch (err) {
|
|
465
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
466
|
-
setErrorState(msg);
|
|
467
|
-
throw err;
|
|
468
|
-
}
|
|
469
|
-
}, [wsManager, loadTables]);
|
|
470
|
-
const kvGet = useCallback(async (table, key) => {
|
|
471
|
-
try {
|
|
472
|
-
return await wsManager.kvGet(table, key);
|
|
473
|
-
}
|
|
474
|
-
catch (err) {
|
|
475
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
476
|
-
setErrorState(msg);
|
|
477
|
-
throw err;
|
|
478
|
-
}
|
|
479
|
-
}, [wsManager]);
|
|
480
|
-
const kvSet = useCallback(async (table, key, value, ttl) => {
|
|
481
|
-
try {
|
|
482
|
-
return await wsManager.kvSet(table, key, value, ttl);
|
|
483
|
-
}
|
|
484
|
-
catch (err) {
|
|
485
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
486
|
-
setErrorState(msg);
|
|
487
|
-
throw err;
|
|
488
|
-
}
|
|
489
|
-
}, [wsManager]);
|
|
490
|
-
const kvDelete = useCallback(async (table, key) => {
|
|
491
|
-
try {
|
|
492
|
-
return await wsManager.kvDelete(table, key);
|
|
493
|
-
}
|
|
494
|
-
catch (err) {
|
|
495
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
496
|
-
setErrorState(msg);
|
|
497
|
-
throw err;
|
|
498
|
-
}
|
|
499
|
-
}, [wsManager]);
|
|
500
|
-
const kvEntries = useCallback(async (table) => {
|
|
501
|
-
try {
|
|
502
|
-
return await wsManager.kvGetEntries(table);
|
|
503
|
-
}
|
|
504
|
-
catch (err) {
|
|
505
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
506
|
-
setErrorState(msg);
|
|
507
|
-
throw err;
|
|
508
|
-
}
|
|
509
|
-
}, [wsManager]);
|
|
227
|
+
setLoading(false);
|
|
228
|
+
}
|
|
229
|
+
}, [wsManager]);
|
|
230
|
+
const select = useCallback(async (table, page, pageSize, where) => wsManager.dbSelect(table, page, pageSize, where), [wsManager]);
|
|
231
|
+
const insert = useCallback(async (table, row) => wsManager.dbInsert(table, row), [wsManager]);
|
|
232
|
+
const update = useCallback(async (table, row, where) => wsManager.dbUpdate(table, row, where), [wsManager]);
|
|
233
|
+
const remove = useCallback(async (table, where) => wsManager.dbDelete(table, where), [wsManager]);
|
|
234
|
+
const dropTable = useCallback(async (table) => { const r = await wsManager.dbDropTable(table); await loadTables(); return r; }, [wsManager, loadTables]);
|
|
235
|
+
const kvGet = useCallback(async (table, key) => wsManager.kvGet(table, key), [wsManager]);
|
|
236
|
+
const kvSet = useCallback(async (table, key, value, ttl) => wsManager.kvSet(table, key, value, ttl), [wsManager]);
|
|
237
|
+
const kvDelete = useCallback(async (table, key) => wsManager.kvDelete(table, key), [wsManager]);
|
|
238
|
+
const kvEntries = useCallback(async (table) => wsManager.kvGetEntries(table), [wsManager]);
|
|
510
239
|
useEffect(() => {
|
|
511
240
|
if (connected && !info && !loading) {
|
|
512
241
|
loadInfo().catch(() => { });
|
|
513
242
|
loadTables().catch(() => { });
|
|
514
243
|
}
|
|
515
244
|
}, [connected, info, loading, loadInfo, loadTables]);
|
|
516
|
-
return useMemo(() => ({
|
|
517
|
-
info, tables, loading, error,
|
|
518
|
-
loadInfo, loadTables, dropTable,
|
|
519
|
-
select, insert, update, remove,
|
|
520
|
-
kvGet, kvSet, kvDelete, kvEntries,
|
|
521
|
-
}), [info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries]);
|
|
245
|
+
return useMemo(() => ({ info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries }), [info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries]);
|
|
522
246
|
}
|
|
523
247
|
//# sourceMappingURL=hooks.js.map
|