@zhin.js/client 1.0.4 → 1.0.5
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/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/router/index.d.ts +25 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +49 -0
- package/dist/router/index.js.map +1 -0
- package/dist/store/index.d.ts +19 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +67 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/reducers/config.d.ts +54 -0
- package/dist/store/reducers/config.d.ts.map +1 -0
- package/dist/store/reducers/config.js +78 -0
- package/dist/store/reducers/config.js.map +1 -0
- package/dist/store/reducers/index.d.ts +13 -0
- package/dist/store/reducers/index.d.ts.map +1 -0
- package/dist/store/reducers/index.js +11 -0
- package/dist/store/reducers/index.js.map +1 -0
- package/dist/store/reducers/route.d.ts +37 -0
- package/dist/store/reducers/route.d.ts.map +1 -0
- package/dist/store/reducers/route.js +85 -0
- package/dist/store/reducers/route.js.map +1 -0
- package/dist/store/reducers/script.d.ts +17 -0
- package/dist/store/reducers/script.d.ts.map +1 -0
- package/dist/store/reducers/script.js +74 -0
- package/dist/store/reducers/script.js.map +1 -0
- package/dist/store/reducers/ui.d.ts +14 -0
- package/dist/store/reducers/ui.d.ts.map +1 -0
- package/dist/store/reducers/ui.js +23 -0
- package/dist/store/reducers/ui.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/websocket/hooks.d.ts +55 -0
- package/dist/websocket/hooks.d.ts.map +1 -0
- package/dist/websocket/hooks.js +225 -0
- package/dist/websocket/hooks.js.map +1 -0
- package/dist/websocket/index.d.ts +13 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +31 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/instance.d.ts +18 -0
- package/dist/websocket/instance.d.ts.map +1 -0
- package/dist/websocket/instance.js +39 -0
- package/dist/websocket/instance.js.map +1 -0
- package/dist/websocket/manager.d.ts +110 -0
- package/dist/websocket/manager.d.ts.map +1 -0
- package/dist/websocket/manager.js +341 -0
- package/dist/websocket/manager.js.map +1 -0
- package/dist/websocket/messageHandler.d.ts +48 -0
- package/dist/websocket/messageHandler.d.ts.map +1 -0
- package/dist/websocket/messageHandler.js +140 -0
- package/dist/websocket/messageHandler.js.map +1 -0
- package/dist/websocket/types.d.ts +125 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/dist/websocket/types.js +43 -0
- package/dist/websocket/types.js.map +1 -0
- package/package.json +8 -18
- package/app/index.html +0 -13
- package/app/postcss.config.js +0 -5
- package/app/src/components/PluginConfigForm/BasicFieldRenderers.tsx +0 -253
- package/app/src/components/PluginConfigForm/CollectionFieldRenderers.tsx +0 -261
- package/app/src/components/PluginConfigForm/CompositeFieldRenderers.tsx +0 -105
- package/app/src/components/PluginConfigForm/FieldRenderer.tsx +0 -110
- package/app/src/components/PluginConfigForm/NestedFieldRenderer.tsx +0 -95
- package/app/src/components/PluginConfigForm/index.tsx +0 -237
- package/app/src/components/PluginConfigForm/types.ts +0 -46
- package/app/src/components/ThemeToggle.tsx +0 -21
- package/app/src/hooks/useTheme.ts +0 -17
- package/app/src/layouts/dashboard.tsx +0 -259
- package/app/src/main.tsx +0 -121
- package/app/src/pages/dashboard-bots.tsx +0 -198
- package/app/src/pages/dashboard-home.tsx +0 -301
- package/app/src/pages/dashboard-logs.tsx +0 -298
- package/app/src/pages/dashboard-plugin-detail.tsx +0 -360
- package/app/src/pages/dashboard-plugins.tsx +0 -166
- package/app/src/style.css +0 -1105
- package/app/src/theme/index.ts +0 -92
- package/app/tailwind.config.js +0 -70
- package/app/tsconfig.json +0 -16
- /package/{src → client}/index.ts +0 -0
- /package/{src → client}/router/index.tsx +0 -0
- /package/{src → client}/store/index.ts +0 -0
- /package/{src → client}/store/reducers/config.ts +0 -0
- /package/{src → client}/store/reducers/index.ts +0 -0
- /package/{src → client}/store/reducers/route.ts +0 -0
- /package/{src → client}/store/reducers/script.ts +0 -0
- /package/{src → client}/store/reducers/ui.ts +0 -0
- /package/{src → client}/types.ts +0 -0
- /package/{src → client}/websocket/hooks.ts +0 -0
- /package/{src → client}/websocket/index.ts +0 -0
- /package/{src → client}/websocket/instance.ts +0 -0
- /package/{src → client}/websocket/manager.ts +0 -0
- /package/{src → client}/websocket/messageHandler.ts +0 -0
- /package/{src → client}/websocket/types.ts +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PayloadAction } from "@reduxjs/toolkit";
|
|
2
|
+
export interface UIState {
|
|
3
|
+
sidebarOpen: boolean;
|
|
4
|
+
activeMenu: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const uiSlice: import("@reduxjs/toolkit").Slice<UIState, {
|
|
7
|
+
toggleSidebar: (state: import("@reduxjs/toolkit").WritableDraft<UIState>) => void;
|
|
8
|
+
setSidebarOpen: (state: import("@reduxjs/toolkit").WritableDraft<UIState>, action: PayloadAction<boolean>) => void;
|
|
9
|
+
setActiveMenu: (state: import("@reduxjs/toolkit").WritableDraft<UIState>, action: PayloadAction<string>) => void;
|
|
10
|
+
}, "ui", "ui", import("@reduxjs/toolkit").SliceSelectors<UIState>>;
|
|
11
|
+
export declare const toggleSidebar: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"ui/toggleSidebar">, setSidebarOpen: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "ui/setSidebarOpen">, setActiveMenu: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "ui/setActiveMenu">;
|
|
12
|
+
declare const _default: import("@reduxjs/toolkit").Reducer<UIState>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../client/store/reducers/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE7D,MAAM,WAAW,OAAO;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACrB;AAOD,eAAO,MAAM,OAAO;;uFAOoB,aAAa,CAAC,OAAO,CAAC;sFAGvB,aAAa,CAAC,MAAM,CAAC;kEAI1D,CAAA;AAEF,eAAO,MAAQ,aAAa,8EAAE,cAAc,qFAAE,aAAa,iFAAoB,CAAA;;AAC/E,wBAA8B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createSlice } from "@reduxjs/toolkit";
|
|
2
|
+
const initialState = {
|
|
3
|
+
sidebarOpen: true,
|
|
4
|
+
activeMenu: 'home'
|
|
5
|
+
};
|
|
6
|
+
export const uiSlice = createSlice({
|
|
7
|
+
name: 'ui',
|
|
8
|
+
initialState,
|
|
9
|
+
reducers: {
|
|
10
|
+
toggleSidebar: (state) => {
|
|
11
|
+
state.sidebarOpen = !state.sidebarOpen;
|
|
12
|
+
},
|
|
13
|
+
setSidebarOpen: (state, action) => {
|
|
14
|
+
state.sidebarOpen = action.payload;
|
|
15
|
+
},
|
|
16
|
+
setActiveMenu: (state, action) => {
|
|
17
|
+
state.activeMenu = action.payload;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
export const { toggleSidebar, setSidebarOpen, setActiveMenu } = uiSlice.actions;
|
|
22
|
+
export default uiSlice.reducer;
|
|
23
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../client/store/reducers/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,kBAAkB,CAAA;AAO7D,MAAM,YAAY,GAAY;IAC1B,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;CACrB,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC;IAC/B,IAAI,EAAE,IAAI;IACV,YAAY;IACZ,QAAQ,EAAE;QACN,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,KAAK,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,CAAA;QAC1C,CAAC;QACD,cAAc,EAAE,CAAC,KAAK,EAAE,MAA8B,EAAE,EAAE;YACtD,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAA;QACtC,CAAC;QACD,aAAa,EAAE,CAAC,KAAK,EAAE,MAA6B,EAAE,EAAE;YACpD,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAA;QACrC,CAAC;KACJ;CACJ,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,OAAO,CAAA;AAC/E,eAAe,OAAO,CAAC,OAAO,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface MessageSegment {
|
|
2
|
+
type: 'text' | 'image' | 'at' | 'face' | 'video' | 'audio' | 'file' | 'reply';
|
|
3
|
+
data: Record<string, any>;
|
|
4
|
+
}
|
|
5
|
+
export type MessageElement = MessageSegment;
|
|
6
|
+
export type SendContent = MessageSegment | MessageSegment[] | string;
|
|
7
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../client/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC1B;AAGD,MAAM,MAAM,cAAc,GAAG,cAAc,CAAA;AAG3C,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,EAAE,GAAG,MAAM,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../client/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket React Hooks
|
|
3
|
+
* 提供在 React 组件中使用 WebSocket 功能的便捷接口
|
|
4
|
+
*/
|
|
5
|
+
import type { UseConfigOptions, UseWebSocketOptions, ConnectionState } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket 连接状态和基础功能 Hook
|
|
8
|
+
*/
|
|
9
|
+
export declare function useWebSocket(options?: UseWebSocketOptions): {
|
|
10
|
+
connected: boolean;
|
|
11
|
+
entries: any;
|
|
12
|
+
loadedScripts: any;
|
|
13
|
+
connect: () => void;
|
|
14
|
+
disconnect: () => void;
|
|
15
|
+
send: (message: any) => void;
|
|
16
|
+
sendRequest: <T = any>(message: any) => Promise<T>;
|
|
17
|
+
isConnected: () => boolean;
|
|
18
|
+
getState: () => "disconnected" | "connected";
|
|
19
|
+
manager: import("./manager").WebSocketManager;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 插件配置管理 Hook
|
|
23
|
+
*/
|
|
24
|
+
export declare function useConfig(pluginName: string, options?: UseConfigOptions): {
|
|
25
|
+
config: any;
|
|
26
|
+
schema: any;
|
|
27
|
+
loading: boolean;
|
|
28
|
+
error: string | null;
|
|
29
|
+
connected: boolean;
|
|
30
|
+
getConfig: () => Promise<any>;
|
|
31
|
+
setConfig: (newConfig: any) => Promise<void>;
|
|
32
|
+
getSchema: () => Promise<any>;
|
|
33
|
+
reload: () => Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* 所有配置管理 Hook
|
|
37
|
+
*/
|
|
38
|
+
export declare function useAllConfigs(): {
|
|
39
|
+
configs: Record<string, any>;
|
|
40
|
+
schemas: Record<string, any>;
|
|
41
|
+
connected: boolean;
|
|
42
|
+
refreshAll: () => Promise<{
|
|
43
|
+
configs: any;
|
|
44
|
+
schemas: any;
|
|
45
|
+
}>;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* WebSocket 连接状态监听 Hook
|
|
49
|
+
*/
|
|
50
|
+
export declare function useWebSocketState(): ConnectionState;
|
|
51
|
+
/**
|
|
52
|
+
* WebSocket 消息监听 Hook
|
|
53
|
+
*/
|
|
54
|
+
export declare function useWebSocketMessages<T = any>(filter?: (message: any) => boolean, handler?: (message: T) => void): T[];
|
|
55
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../client/websocket/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAMrF;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB;;;;;;oBAoBzB,GAAG;kBAIC,CAAC,iBAAiB,GAAG,KAAG,OAAO,CAAC,CAAC,CAAC;;;;EAuC1E;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;;;;;;;2BA+B1B,GAAG;;;EAmEpD;AAMD;;GAEG;AACH,wBAAgB,aAAa;;;;;;;;EA2B5B;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,oBAiBhC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,GAAG,EAC1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,EAClC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,OAW/B"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket React Hooks
|
|
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 } from '../store';
|
|
7
|
+
import { getWebSocketManager } from './instance';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// WebSocket 连接 Hook
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket 连接状态和基础功能 Hook
|
|
13
|
+
*/
|
|
14
|
+
export function useWebSocket(options = {}) {
|
|
15
|
+
const { autoConnect = true } = options;
|
|
16
|
+
const wsManager = getWebSocketManager();
|
|
17
|
+
// 从 Redux 获取状态
|
|
18
|
+
const connected = useSelector(selectConfigConnected);
|
|
19
|
+
const entries = useSelector((state) => state.script?.entries || []);
|
|
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';
|
|
43
|
+
}, [wsManager]);
|
|
44
|
+
// 自动连接
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (autoConnect && !connected) {
|
|
47
|
+
connect();
|
|
48
|
+
}
|
|
49
|
+
}, [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
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// 配置管理 Hook
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* 插件配置管理 Hook
|
|
71
|
+
*/
|
|
72
|
+
export function useConfig(pluginName, options = {}) {
|
|
73
|
+
const { autoLoad = true, autoLoadSchema = true } = options;
|
|
74
|
+
const dispatch = useDispatch();
|
|
75
|
+
const wsManager = getWebSocketManager();
|
|
76
|
+
// 状态选择器
|
|
77
|
+
const config = useSelector((state) => selectConfig(state, pluginName));
|
|
78
|
+
const schema = useSelector((state) => selectSchema(state, pluginName));
|
|
79
|
+
const loading = useSelector((state) => selectConfigLoading(state, pluginName));
|
|
80
|
+
const error = useSelector((state) => selectConfigError(state, pluginName));
|
|
81
|
+
const connected = useSelector(selectConfigConnected);
|
|
82
|
+
// 配置操作
|
|
83
|
+
const getConfig = useCallback(async () => {
|
|
84
|
+
dispatch(setLoading({ pluginName, loading: true }));
|
|
85
|
+
dispatch(setError({ pluginName, error: null }));
|
|
86
|
+
try {
|
|
87
|
+
const result = await wsManager.getConfig(pluginName);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.log('getConfig', error);
|
|
92
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
93
|
+
dispatch(setError({ pluginName, error: errorMessage }));
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
dispatch(setLoading({ pluginName, loading: false }));
|
|
98
|
+
}
|
|
99
|
+
}, [pluginName, wsManager, dispatch]);
|
|
100
|
+
const setConfig = useCallback(async (newConfig) => {
|
|
101
|
+
dispatch(setLoading({ pluginName, loading: true }));
|
|
102
|
+
dispatch(setError({ pluginName, error: null }));
|
|
103
|
+
try {
|
|
104
|
+
await wsManager.setConfig(pluginName, newConfig);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.log('setConfig', error);
|
|
108
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
109
|
+
dispatch(setError({ pluginName, error: errorMessage }));
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
dispatch(setLoading({ pluginName, loading: false }));
|
|
114
|
+
}
|
|
115
|
+
}, [pluginName, wsManager, dispatch]);
|
|
116
|
+
const getSchema = useCallback(async () => {
|
|
117
|
+
try {
|
|
118
|
+
return await wsManager.getSchema(pluginName);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(`Failed to get schema for plugin ${pluginName}:`, error);
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}, [pluginName, wsManager]);
|
|
125
|
+
// 重新加载配置和 Schema
|
|
126
|
+
const reload = useCallback(async () => {
|
|
127
|
+
const promises = [];
|
|
128
|
+
if (autoLoad) {
|
|
129
|
+
promises.push(getConfig());
|
|
130
|
+
}
|
|
131
|
+
if (autoLoadSchema) {
|
|
132
|
+
promises.push(getSchema());
|
|
133
|
+
}
|
|
134
|
+
await Promise.all(promises);
|
|
135
|
+
}, [autoLoad, autoLoadSchema, getConfig, getSchema]);
|
|
136
|
+
// 自动加载
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (connected && autoLoad && !config && !loading) {
|
|
139
|
+
getConfig().catch(console.error);
|
|
140
|
+
}
|
|
141
|
+
}, [connected, autoLoad, config, loading, getConfig]);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (connected && autoLoadSchema && !schema) {
|
|
144
|
+
getSchema().catch(console.error);
|
|
145
|
+
}
|
|
146
|
+
}, [connected, autoLoadSchema, schema, getSchema]);
|
|
147
|
+
return useMemo(() => ({
|
|
148
|
+
// 状态
|
|
149
|
+
config,
|
|
150
|
+
schema,
|
|
151
|
+
loading,
|
|
152
|
+
error,
|
|
153
|
+
connected,
|
|
154
|
+
// 方法
|
|
155
|
+
getConfig,
|
|
156
|
+
setConfig,
|
|
157
|
+
getSchema,
|
|
158
|
+
reload
|
|
159
|
+
}), [config, schema, loading, error, connected, getConfig, setConfig, getSchema, reload]);
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// 批量配置管理 Hook
|
|
163
|
+
// ============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* 所有配置管理 Hook
|
|
166
|
+
*/
|
|
167
|
+
export function useAllConfigs() {
|
|
168
|
+
const wsManager = getWebSocketManager();
|
|
169
|
+
const allConfigs = useSelector(selectAllConfigs);
|
|
170
|
+
const allSchemas = useSelector(selectAllSchemas);
|
|
171
|
+
const connected = useSelector(selectConfigConnected);
|
|
172
|
+
const refreshAll = useCallback(async () => {
|
|
173
|
+
try {
|
|
174
|
+
const [configs, schemas] = await Promise.all([
|
|
175
|
+
wsManager.getAllConfigs(),
|
|
176
|
+
wsManager.getAllSchemas()
|
|
177
|
+
]);
|
|
178
|
+
return { configs, schemas };
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error('Failed to refresh all configs:', error);
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}, [wsManager]);
|
|
185
|
+
return useMemo(() => ({
|
|
186
|
+
configs: allConfigs,
|
|
187
|
+
schemas: allSchemas,
|
|
188
|
+
connected,
|
|
189
|
+
refreshAll
|
|
190
|
+
}), [allConfigs, allSchemas, connected, refreshAll]);
|
|
191
|
+
}
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// 高级 Hook
|
|
194
|
+
// ============================================================================
|
|
195
|
+
/**
|
|
196
|
+
* WebSocket 连接状态监听 Hook
|
|
197
|
+
*/
|
|
198
|
+
export function useWebSocketState() {
|
|
199
|
+
const wsManager = getWebSocketManager();
|
|
200
|
+
const [state, setState] = useState(wsManager.getState());
|
|
201
|
+
useEffect(() => {
|
|
202
|
+
const checkState = () => {
|
|
203
|
+
const newState = wsManager.getState();
|
|
204
|
+
if (newState !== state) {
|
|
205
|
+
setState(newState);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const interval = setInterval(checkState, 1000);
|
|
209
|
+
return () => clearInterval(interval);
|
|
210
|
+
}, [wsManager, state]);
|
|
211
|
+
return state;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* WebSocket 消息监听 Hook
|
|
215
|
+
*/
|
|
216
|
+
export function useWebSocketMessages(filter, handler) {
|
|
217
|
+
const [messages, setMessages] = useState([]);
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
const wsManager = getWebSocketManager();
|
|
220
|
+
// 这里需要扩展 WebSocketManager 来支持消息监听
|
|
221
|
+
// 暂时留空,后续可以扩展
|
|
222
|
+
}, [filter, handler]);
|
|
223
|
+
return messages;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../client/websocket/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket 客户端模块
|
|
3
|
+
* 提供统一的 WebSocket 连接管理、消息处理和 React Hook 接口
|
|
4
|
+
*/
|
|
5
|
+
export * from './types';
|
|
6
|
+
export { WebSocketManager } from './manager';
|
|
7
|
+
export { MessageHandler } from './messageHandler';
|
|
8
|
+
export { getWebSocketManager, destroyWebSocketManager, resetWebSocketManager } from './instance';
|
|
9
|
+
export { useWebSocket, useConfig, useAllConfigs, useWebSocketState, useWebSocketMessages } from './hooks';
|
|
10
|
+
import { getWebSocketManager } from './instance';
|
|
11
|
+
export { useConfig as useConfigLegacy } from './hooks';
|
|
12
|
+
export default getWebSocketManager;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/websocket/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,cAAc,SAAS,CAAA;AAKvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKjD,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,YAAY,CAAA;AAKnB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAOhB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,SAAS,CAAA;AAGtD,eAAe,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket 客户端模块
|
|
3
|
+
* 提供统一的 WebSocket 连接管理、消息处理和 React Hook 接口
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// 类型定义
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export * from './types';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// 核心类
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export { WebSocketManager } from './manager';
|
|
13
|
+
export { MessageHandler } from './messageHandler';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// 实例管理
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export { getWebSocketManager, destroyWebSocketManager, resetWebSocketManager } from './instance';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// React Hooks
|
|
20
|
+
// ============================================================================
|
|
21
|
+
export { useWebSocket, useConfig, useAllConfigs, useWebSocketState, useWebSocketMessages } from './hooks';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// 向后兼容的导出(保持与旧代码的兼容性)
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// 为了保持与现有代码的兼容性,重新导出一些常用的接口
|
|
26
|
+
import { getWebSocketManager } from './instance';
|
|
27
|
+
// 兼容旧的 useConfig 导出
|
|
28
|
+
export { useConfig as useConfigLegacy } from './hooks';
|
|
29
|
+
// 兼容旧的 WebSocketManager 默认导出
|
|
30
|
+
export default getWebSocketManager;
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/websocket/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAC/E,cAAc,SAAS,CAAA;AAEvB,+EAA+E;AAC/E,MAAM;AACN,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAC/E,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,YAAY,CAAA;AAEnB,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAC/E,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAEhB,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,4BAA4B;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,oBAAoB;AACpB,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,SAAS,CAAA;AAEtD,6BAA6B;AAC7B,eAAe,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket 实例管理
|
|
3
|
+
* 提供全局 WebSocket 管理器单例
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocketManager } from './manager';
|
|
6
|
+
/**
|
|
7
|
+
* 获取全局 WebSocket 管理器实例
|
|
8
|
+
*/
|
|
9
|
+
export declare function getWebSocketManager(): WebSocketManager;
|
|
10
|
+
/**
|
|
11
|
+
* 销毁全局 WebSocket 管理器
|
|
12
|
+
*/
|
|
13
|
+
export declare function destroyWebSocketManager(): void;
|
|
14
|
+
/**
|
|
15
|
+
* 重置 WebSocket 管理器(主要用于测试)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resetWebSocketManager(): void;
|
|
18
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../client/websocket/instance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAQ5C;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAWtD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket 实例管理
|
|
3
|
+
* 提供全局 WebSocket 管理器单例
|
|
4
|
+
*/
|
|
5
|
+
import { WebSocketManager } from './manager';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// 全局实例
|
|
8
|
+
// ============================================================================
|
|
9
|
+
let globalWebSocketManager = null;
|
|
10
|
+
/**
|
|
11
|
+
* 获取全局 WebSocket 管理器实例
|
|
12
|
+
*/
|
|
13
|
+
export function getWebSocketManager() {
|
|
14
|
+
if (!globalWebSocketManager) {
|
|
15
|
+
globalWebSocketManager = new WebSocketManager();
|
|
16
|
+
// 浏览器环境下自动连接
|
|
17
|
+
if (typeof window !== 'undefined') {
|
|
18
|
+
globalWebSocketManager.connect();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return globalWebSocketManager;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 销毁全局 WebSocket 管理器
|
|
25
|
+
*/
|
|
26
|
+
export function destroyWebSocketManager() {
|
|
27
|
+
if (globalWebSocketManager) {
|
|
28
|
+
globalWebSocketManager.disconnect();
|
|
29
|
+
globalWebSocketManager = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 重置 WebSocket 管理器(主要用于测试)
|
|
34
|
+
*/
|
|
35
|
+
export function resetWebSocketManager() {
|
|
36
|
+
destroyWebSocketManager();
|
|
37
|
+
// 下次调用 getWebSocketManager() 时会创建新实例
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../client/websocket/instance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,IAAI,sBAAsB,GAA4B,IAAI,CAAA;AAE1D;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,IAAI,gBAAgB,EAAE,CAAA;QAE/C,aAAa;QACb,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,sBAAsB,CAAC,OAAO,EAAE,CAAA;QAClC,CAAC;IACH,CAAC;IAED,OAAO,sBAAsB,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,sBAAsB,EAAE,CAAC;QAC3B,sBAAsB,CAAC,UAAU,EAAE,CAAA;QACnC,sBAAsB,GAAG,IAAI,CAAA;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,uBAAuB,EAAE,CAAA;IACzB,qCAAqC;AACvC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket 核心管理器
|
|
3
|
+
* 负责 WebSocket 连接管理、消息发送、重连逻辑等核心功能
|
|
4
|
+
*/
|
|
5
|
+
import type { WebSocketConfig, WebSocketCallbacks } from './types';
|
|
6
|
+
import { ConnectionState } from './types';
|
|
7
|
+
export declare class WebSocketManager {
|
|
8
|
+
private ws;
|
|
9
|
+
private config;
|
|
10
|
+
private callbacks;
|
|
11
|
+
private state;
|
|
12
|
+
private reconnectAttempts;
|
|
13
|
+
private reconnectTimer;
|
|
14
|
+
private requestId;
|
|
15
|
+
private pendingRequests;
|
|
16
|
+
constructor(config?: WebSocketConfig, callbacks?: WebSocketCallbacks);
|
|
17
|
+
/**
|
|
18
|
+
* 建立 WebSocket 连接
|
|
19
|
+
*/
|
|
20
|
+
connect(): void;
|
|
21
|
+
/**
|
|
22
|
+
* 断开 WebSocket 连接
|
|
23
|
+
*/
|
|
24
|
+
disconnect(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 发送普通消息
|
|
27
|
+
*/
|
|
28
|
+
send(message: any): void;
|
|
29
|
+
/**
|
|
30
|
+
* 发送请求并等待响应
|
|
31
|
+
*/
|
|
32
|
+
sendRequest<T = any>(message: any): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* 检查连接状态
|
|
35
|
+
*/
|
|
36
|
+
isConnected(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 获取当前状态
|
|
39
|
+
*/
|
|
40
|
+
getState(): ConnectionState;
|
|
41
|
+
/**
|
|
42
|
+
* 获取插件配置
|
|
43
|
+
*/
|
|
44
|
+
getConfig(pluginName: string): Promise<any>;
|
|
45
|
+
/**
|
|
46
|
+
* 设置插件配置
|
|
47
|
+
*/
|
|
48
|
+
setConfig(pluginName: string, config: any): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* 获取插件 Schema
|
|
51
|
+
*/
|
|
52
|
+
getSchema(pluginName: string): Promise<any>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取所有配置
|
|
55
|
+
*/
|
|
56
|
+
getAllConfigs(): Promise<Record<string, any>>;
|
|
57
|
+
/**
|
|
58
|
+
* 获取所有 Schema
|
|
59
|
+
*/
|
|
60
|
+
getAllSchemas(): Promise<Record<string, any>>;
|
|
61
|
+
/**
|
|
62
|
+
* 构建 WebSocket URL
|
|
63
|
+
*/
|
|
64
|
+
private buildWebSocketUrl;
|
|
65
|
+
/**
|
|
66
|
+
* 设置连接状态
|
|
67
|
+
*/
|
|
68
|
+
private setState;
|
|
69
|
+
/**
|
|
70
|
+
* 绑定事件处理器
|
|
71
|
+
*/
|
|
72
|
+
private attachEventHandlers;
|
|
73
|
+
/**
|
|
74
|
+
* 处理连接打开
|
|
75
|
+
*/
|
|
76
|
+
private handleConnectionOpen;
|
|
77
|
+
/**
|
|
78
|
+
* 处理消息接收
|
|
79
|
+
*/
|
|
80
|
+
private handleMessage;
|
|
81
|
+
/**
|
|
82
|
+
* 处理请求响应
|
|
83
|
+
*/
|
|
84
|
+
private handleRequestResponse;
|
|
85
|
+
/**
|
|
86
|
+
* 处理连接关闭
|
|
87
|
+
*/
|
|
88
|
+
private handleConnectionClose;
|
|
89
|
+
/**
|
|
90
|
+
* 处理连接错误
|
|
91
|
+
*/
|
|
92
|
+
private handleConnectionError;
|
|
93
|
+
/**
|
|
94
|
+
* 安排重连
|
|
95
|
+
*/
|
|
96
|
+
private scheduleReconnect;
|
|
97
|
+
/**
|
|
98
|
+
* 清除重连计时器
|
|
99
|
+
*/
|
|
100
|
+
private clearReconnectTimer;
|
|
101
|
+
/**
|
|
102
|
+
* 清除所有待处理请求
|
|
103
|
+
*/
|
|
104
|
+
private clearPendingRequests;
|
|
105
|
+
/**
|
|
106
|
+
* 初始化数据
|
|
107
|
+
*/
|
|
108
|
+
private initializeData;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../client/websocket/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,eAAe,EAKhB,MAAM,SAAS,CAAA;AAEhB,qBAAa,gBAAgB;IAK3B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,KAAK,CAAgD;IAG7D,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,cAAc,CAA8B;IAGpD,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,eAAe,CAInB;gBAMQ,MAAM,GAAE,eAAoB,EAAE,SAAS,GAAE,kBAAuB;IAc5E;;OAEG;IACH,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,UAAU,IAAI,IAAI;IAalB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAYxB;;OAEG;IACG,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IA4BpD;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,QAAQ,IAAI,eAAe;IAQ3B;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAOjD;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAOjD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAMnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAUnD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;YACW,cAAc;CAsB7B"}
|