commit d72d80d7db9652ccc896d37abe824a37d5111d4c Author: Luk Lu Date: Mon Jan 25 10:07:04 2021 +0800 first init diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..e001ecd --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,16 @@ +/* +对 VSCode Prettier 有效;建议一直要有本配置文件,否则不同版本的 Prettier 的默认配置会不同,例如 TrailingComma +对 VSCode Prettier Standard 无效,似乎是集成了不能修改的配置。 +*/ +module.exports = { + printWidth: 160, // default 80 + tabWidth: 2, // default 2 + useTabs: false, + semi: false, // default true + singleQuote: true, // default false + trailingComma: 'es5', // none (default in v 1.*), es5 (default in v2.0.0), all + bracketSpacing: true, // default true + jsxBracketSameLine: false, // default false + arrowParens: 'always', // avoid (default in v1.9.0), always (default since v2.0.0) + quoteProps: 'as-needed', // as-needed (default), consistent, preserve +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..94b86dd --- /dev/null +++ b/index.js @@ -0,0 +1,82 @@ +const my = { + socket : undefined, + reconnecting: undefined, + listeners: {} +} + +module.exports={ + initSocket(url, reconnect=false){ + if (!my.socket || my.socket.readyState!==my.socket.OPEN && typeof(url)==='string') { + console.log('WebSocket connecting...') + my.socket = uni.connectSocket({ + url: url.replace(/^http/, 'ws'), + complete: ()=>{} + }) + my.socket.onOpen((res)=>{ + console.log('WebSocket onOpen: ', res) + clearInterval(my.reconnecting) + delete my.reconnecting + + if (reconnect && uni.getStorageSync('_passtoken')) { + console.log('Reporting owner for reconnecting socket') + my.socket.send({data: JSON.stringify({skevent:'SOCKET_OWNER', _passtoken: uni.getStorageSync('_passtoken')})}) + } + + }) + my.socket.onClose((res)=>{ + console.log('Websocket onClose: ', res) + if (!my.reconnecting) + my.reconnecting = setInterval(()=>{ + console.log(new Date().toJSON(), 'WebSocket reconnecting...') + this.initSocket(url, true) + }, 5000) // 每5秒尝试重连 + }) + my.socket.onError((err)=>{ + console.log('Websocket onError: ', err) + }) + my.socket.onMessage(({data})=>{ // 在这里统一分发消息(用户端通常不需要返回结果给服务器,因此不用 rpc 模式,而用 event 模式。 + try { + let dataObj = JSON.parse(data) + console.log('WebSocket onMessage for skevent: ', dataObj.skevent) + let listeners = my.listeners[dataObj.skevent] || [] + for (let listener of listeners) { + listener(dataObj) + } + }catch(exception){ + console.log(new Date().toJSON(), 'unknown message', data) + return + } + + }) + } + return my.socket + }, + closeSocket(){ + if (my.socket) my.socket.close() + setTimeout(()=>{ + clearInterval(my.reconnecting) + delete my.reconnecting + }, 2000) + }, + addListener(skevent, listener){ + if (Array.isArray(my.listeners[skevent]) && typeof(listener)==='function') { + my.listeners[skevent].push(listener) + }else { + my.listeners[skevent]=[listener] + } + return this + }, + countListener(skevent){ + if (Array.isArray(my.listeners[skevent])) { + return my.listeners[skevent].length + } + return 0 + }, + sendObject(dataObj){ + if (my.socket && my.socket.readyState===my.socket.OPEN){ + my.socket.send({ + data: typeof(dataObj)!=='string' ? JSON.stringify(dataObj) : dataObj + }) + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f990bb2 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "unip.socket", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://git.faronear.org/npm/unip.socket.git" + }, + "author": "", + "license": "ISC" +}