From 92230c9a97dc9ce9df3313d11d26999c04bb6b26 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 15 七月 2025 13:12:48 +0800
Subject: [PATCH] 项目初始化

---
 src/plugins/socketclient.ts |  147 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 147 insertions(+), 0 deletions(-)

diff --git a/src/plugins/socketclient.ts b/src/plugins/socketclient.ts
new file mode 100644
index 0000000..820040e
--- /dev/null
+++ b/src/plugins/socketclient.ts
@@ -0,0 +1,147 @@
+import { getToken } from '@/utils/auth'
+import { generateUUID } from '@/utils/geek';
+let _client: UniApp.SocketTask;
+let _callback: { [key: string]: (data: any) => void } = {}
+const enableJSON = true // 寮�鍚疛SON瑙f瀽娑堟伅锛岄渶瑕佸紑鍚疛SON瑙f瀽娑堟伅鎵嶈兘寮�鍚痷uid鍜宔vent
+const enableJSONEncoding = true // 寮�鍚疛SON娑堟伅缂栫爜
+const enableUUID = true // 闇�瑕佹帴鏀朵俊鎭腑鍖呭惈uuid瀛楁锛寀uid浼樺厛绾ч珮浜巈vent
+const enableEvent = true // 闇�瑕佹帴鏀朵俊鎭腑鍖呭惈event瀛楁
+
+
+export interface SocketConnectConfig extends UniApp.ConnectSocketOption {
+    headers: {
+        isToken: boolean
+    }
+}
+
+export default {
+    /**
+     * 杩炴帴websocket
+     * 鏈�绠�鍗曠殑鐢ㄦ硶灏辨槸浼犲叆{url:"ws://demo"}
+     * 褰撹繛鎺ユ垚鍔熷悗瑙﹀彂鍥炶皟鍑芥暟
+     */
+    connect(config: SocketConnectConfig) {
+        return new Promise((resolve, reject) => {
+            const isToken = (config.headers || {}).isToken === false
+            config.header = config.header || { 'content-type': 'application/json' }
+            if (getToken() && !isToken) {
+                config.header['Authorization'] = 'Bearer ' + getToken()
+            }
+            if(_client !== undefined){
+                _client.close({})
+            }
+            _client = uni.connectSocket({
+                url: config.url,
+                header: config.header,
+                method: config.method || 'GET',
+                fail: reject
+            });
+            _client.onError(reject)
+            _client.onOpen(resolve)
+            _client.onMessage(res => {
+                if(enableJSON){
+                    let data = JSON.parse((res || {}).data)
+                    if (enableUUID && (data || {}).uuid !== undefined) {
+                        _callback[data.uuid](data)
+                    } else if (enableEvent && (data || {}).event !== undefined) {
+                        _callback[data.event](data)
+                    }
+                }
+            })
+        })
+    },
+    /**
+     * 鍙戦�佷俊鎭�
+     * @param msg 娑堟伅锛屼細琚鐞嗘垚json瀛楃涓�
+     * @param uuid 鍞竴鏍囪瘑,鍙互浼犲叆uuid锛屼篃鍙互浼犲叆true鑷姩鐢熸垚uuid锛宖lase琛ㄧず璇ユ秷鎭笉闇�瑕佸崟鐙鐞�
+     * @returns
+     */
+    send(msg: any, uuid: string | boolean = false) {
+        return new Promise((resolve, reject) => {
+            if(enableJSONEncoding){
+                msg = JSON.stringify(msg)
+            }
+            if (enableUUID && uuid != undefined && uuid != "" && uuid != false) {
+                if (uuid === true) {
+                    msg.uuid = generateUUID()
+                    _callback[msg.uuid] = resolve
+                } else {
+                    _callback[uuid] = resolve
+                }
+            }
+            _client.send({
+                data: JSON.stringify(msg),
+                fail: reject
+            })
+        })
+    },
+    /**
+     * 鍏抽棴杩炴帴
+     * @returns 鍏抽棴杩炴帴鐨凱romise锛屽洖璋冨嚱鏁板彧浼氳繍琛屼竴娆�
+     */
+    close() {
+        return new Promise((resolve, reject) => {
+            let onclose = _client.onClose
+            _client.onClose(res => {
+                resolve(res)
+                _client.onClose = onclose
+            })
+            _client.close({
+                fail: reject
+            })
+
+        })
+    },
+    /**
+     * 鐩戝惉浜嬩欢
+     * @param event 瑕佺洃鍚殑浜嬩欢
+     * @returns 鍦ㄥ洖璋冨嚱鏁颁腑澶勭悊浜嬩欢
+     */
+    subscribe(event: string) {
+        return new Promise((resolve) => {
+            _callback[event] = resolve
+        })
+    },
+    /**
+     * 鍙栨秷鐩戝惉浜嬩欢
+     * @param event 瑕佸彇娑堢洃鍚殑浜嬩欢
+     */
+    unsubscribe(event: string) {
+        delete _callback[event]
+    },
+    /**
+     * 瀹氫箟榛樿鐩戝惉浜嬩欢
+     * @param callback 榛樿鐩戝惉浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onMessage(callback: (data: any) => void) {
+        _client.onMessage(res => {
+            if(enableJSON){
+                let data = JSON.parse((res || {}).data)
+                if (enableUUID && (data || {}).uuid !== undefined) {
+                    _callback[data.uuid](res)
+                    delete _callback[data.uuid]
+                } else if (enableEvent && (data || {}).event !== undefined) {
+                    _callback[data.event](res)
+                } else {
+                    callback(data)
+                }
+            }else{
+                callback(res.data)
+            }
+        })
+    },
+    /**
+     * 瀹氫箟寮傚父浜嬩欢
+     * @param callback 榛樿寮傚父浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onError(callback: (data: any) => void) {
+        _client.onError(callback)
+    },
+    /**
+     * 瀹氫箟鍏抽棴浜嬩欢
+     * @param callback 榛樿鍏抽棴浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onClose(callback: () => void) {
+        _client.onError(callback)
+    }
+};
\ No newline at end of file

--
Gitblit v1.9.3