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