an-function
Version:
js中常用的util方法;比如处理日期的函数,a连接下载,解析url,防抖,节流,基于webWork的定时器,websocket连接等等
1 lines • 11.1 kB
JavaScript
"use strict";function _toPropertyKey(e){var t=function(e){if("object"!=_typeof(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=_typeof(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==_typeof(t)?t:t+""}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function aDownLoad(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=window.document.createElement("a");n.style.display="none",n.setAttribute("downLoad",t),n.setAttribute("href",e),document.body.appendChild(n),n.click(),document.body.removeChild(n)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.aDownLoad=aDownLoad,exports.aDownLoad2=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=new Blob([e]);aDownLoad(URL.createObjectURL(n),t)},exports.anWebSocket=exports.anTimeout=exports.anInterval=void 0,exports.chinaDate=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"-";null==e&&(e=new Date),"string"==typeof e&&(e=e.replace(/-/g,"/")),t=t||"/";var n=new Date(e),o=n.getFullYear(),i=("00"+(n.getMonth()+1)).slice(-2),r=("00"+n.getDate()).slice(-2),s=("00"+n.getHours()).slice(-2),a=("00"+n.getMinutes()).slice(-2),c=("00"+n.getSeconds()).slice(-2),l=new Date(o+"/"+i+"/"+r+" 00:00:00").getTime(),u=new Date(o+"/"+i+"/"+r+" 23:59:59").getTime();return{fengefu:t,newDate:n,nian:o,yue:i,ri:r,shi:s,fen:a,miao:c,date:o+t+i+t+r+" "+s+":"+a+":"+c,date0:o+t+i+t+r+" 00:00:00",date59:o+t+i+t+r+" 23:59:59",nyr:o+t+i+t+r,sfm:s+":"+a+":"+c,number:n.getTime(),get0:l,get59:u}},exports.deepClone=function deepClone(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakMap,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("function"==typeof structuredClone)return structuredClone(e);if(t.has(e))return t.get(e);if(null===e||"object"!==_typeof(e))return e;if(e instanceof Date)return new Date(e);if(e instanceof RegExp)return new RegExp(e);var o=Array.isArray(e)?[]:{};for(var i in t.set(e,o),e)(n||Object.prototype.hasOwnProperty.call(e,i))&&(o[i]=deepClone(e[i],t,n));return o},exports.fileToBase64=function(e){return new Promise((function(t,n){try{var o=new FileReader;o.onloadend=function(){t(o.result)},o.readAsDataURL(e)}catch(e){n()}}))},exports.getLengthArray=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=[],n=1;n<=e;n++)t.push(n);return t},exports.getUrlParams=function(){if(0===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.href).length)return{};for(var e=decodeURIComponent(e),t=e.startsWith("?")?e.split("?")[1]:e.split("?")[0],n={},o=t.length>0?t.split("&"):[],i=0;i<o.length;i++){var r=o[i].split("=");n[r[0]]=r[1]}return n},exports.objKeysHasValue=void 0,exports.objKeysHasValue=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return"some"===(arguments.length>2&&void 0!==arguments[2]?arguments[2]:"some")?t.some((function(t,n){return![null,"",void 0].includes(e[t])})):t.every((function(t,n){return![null,"",void 0].includes(e[t])}))};var worker,listeners,idCounter,anInterval=exports.anInterval=(listeners=new Map,idCounter=0,{on:function(e,t){var n,o;worker||(n=new Blob(["\n const intervals = new Map();\n onmessage = function(event) {\n const { command, id, time } = event.data;\n \n if (command === 'clear') {\n clearTimeout(intervals.get(id));\n intervals.delete(id);\n return;\n }\n\n if (intervals.has(id)) {\n clearTimeout(intervals.get(id));\n }\n \n function anIntervalF() {\n console.log('id',id);\n postMessage({ id });\n intervals.set(id, setTimeout(anIntervalF, time));\n }\n // 使用 setTimeout 延迟第一次执行\n intervals.set(id, setTimeout(anIntervalF, time));\n }\n "],{type:"text/javascript"}),o=URL.createObjectURL(n),(worker=new Worker(o)).addEventListener("message",(function(e){var t=e.data.id;listeners.has(t)&&listeners.get(t).forEach((function(e){return e()}))})));var i="timer_"+idCounter++;return listeners.has(i)||listeners.set(i,[]),listeners.get(i).push(e),worker.postMessage({id:i,time:t}),i},off:function(e){var t;listeners.has(e)&&(listeners.delete(e),null===(t=worker)||void 0===t||t.postMessage({command:"clear",id:e}))}}),anTimeout=exports.anTimeout=function(){var e,t=new Map,n=0;return{on:function(o,i){var r,s;e||(r=new Blob(["\n const intervals = new Map();\n onmessage = function(event) {\n const { command, id, time } = event.data;\n \n if (command === 'clear') {\n clearTimeout(intervals.get(id));\n intervals.delete(id);\n return;\n }\n\n if (intervals.has(id)) {\n clearTimeout(intervals.get(id));\n }\n \n function anIntervalF() {\n console.log('id',id);\n postMessage({ id });\n }\n // 使用 setTimeout 延迟第一次执行\n intervals.set(id, setTimeout(anIntervalF, time));\n }\n "],{type:"text/javascript"}),s=URL.createObjectURL(r),(e=new Worker(s)).addEventListener("message",(function(e){var n=e.data.id;t.has(n)&&t.get(n).forEach((function(e){return e()}))})));var a="timer_"+n++;return t.has(a)||t.set(a,[]),t.get(a).push(o),e.postMessage({id:a,time:i}),a},off:function(n){var o;t.has(n)&&(t.delete(n),null===(o=e)||void 0===o||o.postMessage({command:"clear",id:n}))}}}();exports.anWebSocket=function(){return e=function anWebSocket(e){var t=this,n=e.url,o=e.sendMessage,i=e.webSocketBack,r=e.pingTimeout,s=void 0===r?5e3:r,a=e.pongTimeout,c=void 0===a?4e3:a,l=e.reconnectTimeout,u=void 0===l?4e3:l,d=e.pingMsg,h=void 0===d?"heartbeat":d,f=e.repeatLimit,p=void 0===f?3:f,v=e.showLog,g=void 0!==v&&v;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,anWebSocket),this.log=function(){},this.error=function(){},this.warn=function(){},!0===g&&(this.log=function(){var e;(e=console).log.apply(e,arguments)},this.error=function(){var e;(e=console).error.apply(e,arguments)},this.warn=function(){var e;(e=console).warn.apply(e,arguments)}),!n)throw new Error("WebSocket URL is required");this.opts={url:n,sendMessage:o,webSocketBack:i,pingTimeout:s,pongTimeout:c,reconnectTimeout:u,pingMsg:h,repeatLimit:p},this.ws=null,this.repeat=0,this.lockReconnect=!1,this.forbidReconnect=!1,this.pingTimeoutId=null,this.pongTimeoutId=null,this.activeConnections=0,this.onclose=function(){return t.log("Connection closed")},this.onerror=function(e){return t.error("Error:",e)},this.onopen=function(){return t.handleOpen()},this.onmessage=function(e){return t.handleMessage(e)},this.onreconnect=function(){return t.log("Reconnecting (".concat(t.repeat).concat(t.opts.repeatLimit?"/"+t.opts.repeatLimit:"",")"))},this.createWebSocket()},t=[{key:"createWebSocket",value:function(){try{this.forbidReconnect||this.ws&&this.ws.readyState!==WebSocket.CLOSED||(this.ws&&(this.close(!1),this.ws=null),this.ws=new WebSocket(this.opts.url),this.initEventHandle(),this.activeConnections++)}catch(e){this.error("创建ws连接失败:",e),this.forbidReconnect||(this.log("创建ws连接失败,即将断线重连"),this.reconnect())}}},{key:"initEventHandle",value:function(){var e=this;this.ws.onclose=function(t){e.onclose(t),e.forbidReconnect||(e.log("关闭了,即将断线重连"),e.reconnect()),e.activeConnections--},this.ws.onerror=function(t){e.onerror(t),e.forbidReconnect||(e.log("onerror,即将断线重连"),e.reconnect()),e.activeConnections--},this.ws.onopen=function(){e.repeat=0,e.onopen(),e.heartCheck()},this.ws.onmessage=function(t){e.onmessage(t),e.heartCheck()}}},{key:"send",value:function(e){try{if(!this.isConnected())return this.warn("连接失败"),!1;var t;try{t="string"==typeof e?e:JSON.stringify(e)}catch(e){return this.error("消息序列化失败:",e),!1}return this.ws.send(t),!0}catch(e){return this.error("发送失败:",e),this.forbidReconnect||this.reconnect(),!1}}},{key:"heartStart",value:function(){var e=this;this.forbidReconnect||(this.log("".concat(this.opts.pingTimeout,"毫秒后发送心跳")),this.pingTimeoutId=anInterval.on((function(){e.log("当前连接状态是否正常",e.isConnected()),e.isConnected()&&(e.log("客户端-发送心跳"),e.ws.send(e.opts.pingMsg),e.pongTimeoutId=anInterval.on((function(){e.error("心跳超时,关闭连接(心跳发出后直到现在都未收到服务器的回复)"),e.ws.close(!1)}),e.opts.pongTimeout))}),this.opts.pingTimeout))}},{key:"close",value:function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&(this.forbidReconnect=!0),this.heartReset(),this.ws){var e=this.ws;e.onclose=null,e.onerror=null,e.onopen=null,e.onmessage=null,[WebSocket.OPEN,WebSocket.CONNECTING].includes(e.readyState)&&e.close(1e3,"Normal closure"),this.ws=null,this.activeConnections--}}},{key:"reconnect",value:function(){var e=this;if(this.forbidReconnect||this.shouldStopReconnect()||this.lockReconnect)return this.log("停止重连"),void this.heartReset();this.lockReconnect=!0,anTimeout.on((function(){e.forbidReconnect||(e.log("重新连接..."),e.repeat++,e.createWebSocket(),e.lockReconnect=!1)}),this.opts.reconnectTimeout)}},{key:"heartReset",value:function(){anInterval.off(this.pingTimeoutId),anInterval.off(this.pongTimeoutId),this.pingTimeoutId=null,this.pongTimeoutId=null}},{key:"heartCheck",value:function(){this.log("心跳检测"),this.heartReset(),this.heartStart()}},{key:"destroy",value:function(){this.close(!0)}},{key:"shouldStopReconnect",value:function(){return this.opts.repeatLimit>0&&this.repeat>=this.opts.repeatLimit||this.lockReconnect||this.forbidReconnect}},{key:"handleOpen",value:function(){this.log("连接成功"),this.opts.sendMessage&&this.isConnected()&&this.ws.send("string"==typeof this.opts.sendMessage?this.opts.sendMessage:JSON.stringify(this.opts.sendMessage))}},{key:"handleMessage",value:function(e){"function"==typeof this.opts.webSocketBack&&this.opts.webSocketBack(e)}},{key:"setEventHandlers",value:function(e){var t=this;["onopen","onclose","onerror","onmessage","onreconnect"].forEach((function(n){e[n]&&(t[n]=e[n])}))}},{key:"getState",value:function(){var e,t;return null!==(e=null===(t=this.ws)||void 0===t?void 0:t.readyState)&&void 0!==e?e:WebSocket.CLOSED}},{key:"isConnected",value:function(){var e;return(null===(e=this.ws)||void 0===e?void 0:e.readyState)===WebSocket.OPEN}},{key:"getActiveConnections",value:function(){return this.activeConnections}}],t&&function(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t}();