UNPKG

@tarojs/taro-h5

Version:
84 lines (81 loc) 3.37 kB
import { __awaiter } from 'tslib'; import { temporarilyNotSupport } from '../../utils/index.js'; import { MethodHandler, CallbackManager } from '../../utils/handler.js'; function getConnection() { // @ts-ignore return navigator.connection || navigator.mozConnection || navigator.webkitConnection || navigator.msConnection; } const getNetworkType = (options = {}) => { const connection = getConnection(); const { success, fail, complete } = options; const handle = new MethodHandler({ name: 'getNetworkType', success, fail, complete }); let networkType = 'unknown'; // 浏览器不支持获取网络状态 if (!connection) { return handle.success({ networkType }); } // Supports only the navigator.connection.type value which doesn't match the latest spec. // https://www.davidbcalhoun.com/2010/using-navigator-connection-android/ if (!isNaN(Number(connection.type))) { switch (connection.type) { // @ts-ignore case connection.WIFI: networkType = 'wifi'; break; // @ts-ignore case connection.CELL_3G: networkType = '3g'; break; // @ts-ignore case connection.CELL_2G: networkType = '2g'; break; default: // ETHERNET, UNKNOWN networkType = 'unknown'; } } else if (connection.type) { // @ts-ignore networkType = connection.type; // Only supports the type value. // @ts-ignore } else if (connection.effectiveType) { // @ts-ignore networkType = connection.effectiveType; } return handle.success({ networkType }); }; const networkStatusManager = new CallbackManager(); const networkStatusListener = () => __awaiter(void 0, void 0, void 0, function* () { const { networkType } = yield getNetworkType(); const isConnected = networkType !== 'none'; const obj = { isConnected, networkType }; networkStatusManager.trigger(obj); }); /** * 在最近的八次网络请求中, 出现下列三个现象之一则判定弱网。 * - 出现三次以上连接超时 * - 出现三次 rtt 超过 400 * - 出现三次以上的丢包 * > 弱网事件通知规则是: 弱网状态变化时立即通知, 状态不变时 30s 内最多通知一次。 */ const onNetworkWeakChange = /* @__PURE__ */ temporarilyNotSupport('onNetworkWeakChange'); const onNetworkStatusChange = callback => { networkStatusManager.add(callback); const connection = getConnection(); if (connection && networkStatusManager.count() === 1) { connection.addEventListener('change', networkStatusListener); } }; const offNetworkWeakChange = /* @__PURE__ */ temporarilyNotSupport('offNetworkWeakChange'); const offNetworkStatusChange = callback => { networkStatusManager.remove(callback); const connection = getConnection(); if (connection && networkStatusManager.count() === 0) { connection.removeEventListener('change', networkStatusListener); } }; const getLocalIPAddress = /* @__PURE__ */ temporarilyNotSupport('getLocalIPAddress'); export { getLocalIPAddress, getNetworkType, offNetworkStatusChange, offNetworkWeakChange, onNetworkStatusChange, onNetworkWeakChange }; //# sourceMappingURL=network.js.map