@zhin.js/client 1.0.3 → 1.0.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.
@@ -0,0 +1,166 @@
1
+ /**
2
+ * WebSocket 消息处理器
3
+ * 负责处理不同类型的 WebSocket 消息并分发到对应的处理逻辑
4
+ */
5
+
6
+ import {
7
+ store,
8
+ loadScripts,
9
+ loadScript,
10
+ unloadScript,
11
+ setConnected,
12
+ updateConfig,
13
+ updateSchema,
14
+ updateConfigs,
15
+ updateSchemas,
16
+ setError
17
+ } from '../store'
18
+ import type { WebSocketMessage } from './types'
19
+
20
+ export class MessageHandler {
21
+ /**
22
+ * 处理 WebSocket 消息
23
+ */
24
+ static handle(message: WebSocketMessage): void {
25
+ try {
26
+ switch (message.type) {
27
+ // 脚本管理相关消息
28
+ case 'sync':
29
+ this.handleScriptSync(message)
30
+ break
31
+ case 'add':
32
+ this.handleScriptAdd(message)
33
+ break
34
+ case 'delete':
35
+ this.handleScriptDelete(message)
36
+ break
37
+
38
+ // 配置管理相关消息
39
+ case 'config:updated':
40
+ this.handleConfigUpdated(message)
41
+ break
42
+ case 'config:batch':
43
+ this.handleConfigBatch(message)
44
+ break
45
+ case 'config:error':
46
+ this.handleConfigError(message)
47
+ break
48
+
49
+ // Schema 管理相关消息
50
+ case 'schema:updated':
51
+ this.handleSchemaUpdated(message)
52
+ break
53
+ case 'schema:batch':
54
+ this.handleSchemaBatch(message)
55
+ break
56
+
57
+ // 系统消息
58
+ case 'init-data':
59
+ case 'data-update':
60
+ this.handleSystemMessage(message)
61
+ break
62
+
63
+ default:
64
+ console.warn('[WebSocket] Unknown message type:', message.type)
65
+ }
66
+ } catch (error) {
67
+ console.error('[WebSocket] Message handling error:', error)
68
+ }
69
+ }
70
+
71
+ /**
72
+ * 处理脚本同步消息
73
+ */
74
+ private static handleScriptSync(message: any): void {
75
+ if (message.data?.key === 'entries') {
76
+ const entries = Array.isArray(message.data.value)
77
+ ? message.data.value
78
+ : [message.data.value]
79
+
80
+ store.dispatch({ type: 'script/syncEntries', payload: entries })
81
+ store.dispatch(loadScripts(entries))
82
+ }
83
+ }
84
+
85
+ /**
86
+ * 处理脚本添加消息
87
+ */
88
+ private static handleScriptAdd(message: any): void {
89
+ if (message.data?.key === 'entries') {
90
+ store.dispatch({ type: 'script/addEntry', payload: message.data.value })
91
+ store.dispatch(loadScript(message.data.value))
92
+ }
93
+ }
94
+
95
+ /**
96
+ * 处理脚本删除消息
97
+ */
98
+ private static handleScriptDelete(message: any): void {
99
+ if (message.data?.key === 'entries') {
100
+ store.dispatch({ type: 'script/removeEntry', payload: message.data.value })
101
+ store.dispatch(unloadScript(message.data.value))
102
+ }
103
+ }
104
+
105
+ /**
106
+ * 处理配置更新消息
107
+ */
108
+ private static handleConfigUpdated(message: any): void {
109
+ if (message.pluginName && message.data !== undefined) {
110
+ store.dispatch(updateConfig({
111
+ pluginName: message.pluginName,
112
+ config: message.data
113
+ }))
114
+ }
115
+ }
116
+
117
+ /**
118
+ * 处理批量配置消息
119
+ */
120
+ private static handleConfigBatch(message: any): void {
121
+ if (message.data) {
122
+ store.dispatch(updateConfigs(message.data))
123
+ }
124
+ }
125
+
126
+ /**
127
+ * 处理配置错误消息
128
+ */
129
+ private static handleConfigError(message: any): void {
130
+ if (message.pluginName && message.error) {
131
+ store.dispatch(setError({
132
+ pluginName: message.pluginName,
133
+ error: message.error
134
+ }))
135
+ }
136
+ }
137
+
138
+ /**
139
+ * 处理 Schema 更新消息
140
+ */
141
+ private static handleSchemaUpdated(message: any): void {
142
+ if (message.pluginName && message.data !== undefined) {
143
+ store.dispatch(updateSchema({
144
+ pluginName: message.pluginName,
145
+ schema: message.data
146
+ }))
147
+ }
148
+ }
149
+
150
+ /**
151
+ * 处理批量 Schema 消息
152
+ */
153
+ private static handleSchemaBatch(message: any): void {
154
+ if (message.data) {
155
+ store.dispatch(updateSchemas(message.data))
156
+ }
157
+ }
158
+
159
+ /**
160
+ * 处理系统消息
161
+ */
162
+ private static handleSystemMessage(message: WebSocketMessage): void {
163
+ // 系统消息暂时不需要特殊处理
164
+ // 可以在这里添加系统级别的消息处理逻辑
165
+ }
166
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * WebSocket 相关类型定义
3
+ */
4
+
5
+ // ============================================================================
6
+ // 基础消息类型
7
+ // ============================================================================
8
+
9
+ export interface BaseMessage {
10
+ type: string
11
+ timestamp?: number
12
+ requestId?: number
13
+ error?: string
14
+ }
15
+
16
+ // ============================================================================
17
+ // 脚本管理消息类型
18
+ // ============================================================================
19
+
20
+ export interface ScriptSyncMessage extends BaseMessage {
21
+ type: 'sync'
22
+ data: {
23
+ key: 'entries'
24
+ value: string[]
25
+ }
26
+ }
27
+
28
+ export interface ScriptAddMessage extends BaseMessage {
29
+ type: 'add'
30
+ data: {
31
+ key: 'entries'
32
+ value: string
33
+ }
34
+ }
35
+
36
+ export interface ScriptDeleteMessage extends BaseMessage {
37
+ type: 'delete'
38
+ data: {
39
+ key: 'entries'
40
+ value: string
41
+ }
42
+ }
43
+
44
+ // ============================================================================
45
+ // 配置管理消息类型
46
+ // ============================================================================
47
+
48
+ export interface ConfigGetMessage extends BaseMessage {
49
+ type: 'config:get'
50
+ pluginName: string
51
+ }
52
+
53
+ export interface ConfigSetMessage extends BaseMessage {
54
+ type: 'config:set'
55
+ pluginName: string
56
+ data: any
57
+ }
58
+
59
+ export interface ConfigUpdatedMessage extends BaseMessage {
60
+ type: 'config:updated'
61
+ pluginName: string
62
+ data: any
63
+ }
64
+
65
+ export interface ConfigBatchMessage extends BaseMessage {
66
+ type: 'config:batch'
67
+ data: Record<string, any>
68
+ }
69
+
70
+ export interface ConfigErrorMessage extends BaseMessage {
71
+ type: 'config:error'
72
+ pluginName: string
73
+ error: string
74
+ }
75
+
76
+ export interface SchemaGetMessage extends BaseMessage {
77
+ type: 'schema:get'
78
+ pluginName: string
79
+ }
80
+
81
+ export interface SchemaUpdatedMessage extends BaseMessage {
82
+ type: 'schema:updated'
83
+ pluginName: string
84
+ data: any
85
+ }
86
+
87
+ export interface SchemaBatchMessage extends BaseMessage {
88
+ type: 'schema:batch'
89
+ data: Record<string, any>
90
+ }
91
+
92
+ // ============================================================================
93
+ // 系统消息类型
94
+ // ============================================================================
95
+
96
+ export interface InitDataMessage extends BaseMessage {
97
+ type: 'init-data'
98
+ }
99
+
100
+ export interface DataUpdateMessage extends BaseMessage {
101
+ type: 'data-update'
102
+ }
103
+
104
+ // ============================================================================
105
+ // 联合类型
106
+ // ============================================================================
107
+
108
+ export type WebSocketMessage =
109
+ | ScriptSyncMessage
110
+ | ScriptAddMessage
111
+ | ScriptDeleteMessage
112
+ | ConfigGetMessage
113
+ | ConfigSetMessage
114
+ | ConfigUpdatedMessage
115
+ | ConfigBatchMessage
116
+ | ConfigErrorMessage
117
+ | SchemaGetMessage
118
+ | SchemaUpdatedMessage
119
+ | SchemaBatchMessage
120
+ | InitDataMessage
121
+ | DataUpdateMessage
122
+
123
+ // ============================================================================
124
+ // 配置选项类型
125
+ // ============================================================================
126
+
127
+ export interface WebSocketConfig {
128
+ /** WebSocket 服务器 URL */
129
+ url?: string
130
+ /** 重连间隔时间(毫秒) */
131
+ reconnectInterval?: number
132
+ /** 最大重连尝试次数 */
133
+ maxReconnectAttempts?: number
134
+ /** 请求超时时间(毫秒) */
135
+ requestTimeout?: number
136
+ }
137
+
138
+ export interface WebSocketCallbacks {
139
+ /** 连接建立回调 */
140
+ onConnect?: () => void
141
+ /** 连接断开回调 */
142
+ onDisconnect?: () => void
143
+ /** 连接错误回调 */
144
+ onError?: (error: Event) => void
145
+ /** 消息接收回调 */
146
+ onMessage?: (message: WebSocketMessage) => void
147
+ }
148
+
149
+ // ============================================================================
150
+ // Hook 配置类型
151
+ // ============================================================================
152
+
153
+ export interface UseConfigOptions {
154
+ /** 是否自动加载配置 */
155
+ autoLoad?: boolean
156
+ /** 是否自动加载 Schema */
157
+ autoLoadSchema?: boolean
158
+ }
159
+
160
+ export interface UseWebSocketOptions {
161
+ /** 是否自动连接 */
162
+ autoConnect?: boolean
163
+ }
164
+
165
+ // ============================================================================
166
+ // 连接状态枚举
167
+ // ============================================================================
168
+
169
+ export enum ConnectionState {
170
+ DISCONNECTED = 'disconnected',
171
+ CONNECTING = 'connecting',
172
+ CONNECTED = 'connected',
173
+ RECONNECTING = 'reconnecting',
174
+ ERROR = 'error'
175
+ }
176
+
177
+ // ============================================================================
178
+ // 错误类型
179
+ // ============================================================================
180
+
181
+ export class WebSocketError extends Error {
182
+ constructor(
183
+ message: string,
184
+ public code: string,
185
+ public originalError?: Error
186
+ ) {
187
+ super(message)
188
+ this.name = 'WebSocketError'
189
+ }
190
+ }
191
+
192
+ export class RequestTimeoutError extends WebSocketError {
193
+ constructor(requestId: number) {
194
+ super(`Request ${requestId} timed out`, 'REQUEST_TIMEOUT')
195
+ }
196
+ }
197
+
198
+ export class ConnectionError extends WebSocketError {
199
+ constructor(message: string, originalError?: Error) {
200
+ super(message, 'CONNECTION_ERROR', originalError)
201
+ }
202
+ }
203
+
204
+ export class MessageError extends WebSocketError {
205
+ constructor(message: string, originalError?: Error) {
206
+ super(message, 'MESSAGE_ERROR', originalError)
207
+ }
208
+ }
@@ -1,42 +0,0 @@
1
- import { useCallback } from 'react'
2
- import { useSelector } from '../store'
3
- import { getWebSocketManager } from './index'
4
-
5
- /**
6
- * WebSocket Hook
7
- * 用于在 React 组件中访问 WebSocket 状态和方法
8
- * WebSocket 在模块加载时已自动连接,无需手动初始化
9
- * 状态由 Redux store 管理
10
- */
11
- export function useWebSocket() {
12
- // 从 Redux 读取状态
13
- const entries = useSelector((state: any) => state.script.entries || [])
14
- const loadedScripts = useSelector((state: any) => state.script.loadedScripts || [])
15
-
16
- const connect = useCallback(() => {
17
- getWebSocketManager().connect()
18
- }, [])
19
-
20
- const disconnect = useCallback(() => {
21
- getWebSocketManager().disconnect()
22
- }, [])
23
-
24
- const send = useCallback((message: any) => {
25
- getWebSocketManager().send(message)
26
- }, [])
27
-
28
- const isConnected = useCallback(() => {
29
- return getWebSocketManager().isConnected()
30
- }, [])
31
-
32
- return {
33
- entries,
34
- loadedScripts,
35
- connect,
36
- disconnect,
37
- send,
38
- isConnected
39
- }
40
- }
41
-
42
- export default useWebSocket