{"version":3,"file":"network.cjs","names":[],"sources":["../src/macros/env.ts","../src/std/network/mina_network.ts","../src/std/network/web_network.ts","../src/std/network/mod.ts"],"sourcesContent":["/**\n * @internal\n * 小游戏环境宏模块。\n */\n\n/**\n * 小游戏环境宏。\n *\n * 可通过打包工具在 build 时修改，如 esbuild webpack vite 等。\n */\ndeclare const __MINIGAME_STD_MINA__: boolean;\n\n/**\n * 如果在小游戏环境中返回 true，否则返回 false。\n */\nexport const IS_MINA = __MINIGAME_STD_MINA__;\n","/**\n * @internal\n * 小游戏平台的网络状态实现。\n */\n\nimport { asyncResultify } from '../utils/mod.ts';\nimport type { NetworkType } from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 返回值可能为 `wifi` | `none` | `unknown` | `2g` | `3g` | `4g`\n */\nexport async function getNetworkType(): Promise<NetworkType> {\n    return (await asyncResultify(wx.getNetworkType)())\n        .mapOr('unknown', x => x.networkType);\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    const networkListener = (res: WechatMinigame.OnNetworkStatusChangeListenerResult): void => {\n        const { isConnected, networkType } = res;\n        const type = isConnected ? networkType : 'none';\n\n        listener(type);\n    };\n\n    wx.onNetworkStatusChange(networkListener);\n\n    return () => {\n        wx.offNetworkStatusChange(networkListener as unknown as WechatMinigame.OffNetworkStatusChangeCallback);\n    };\n}","/**\n * @internal\n * Web 平台的网络状态实现。\n */\n\nimport type { NetworkType } from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 根据浏览器支持情况不同，返回值可能为 `wifi` | `none` | `unknown` | `slow-2g` | `2g` | `3g` | `4g`\n */\nexport function getNetworkType(): NetworkType {\n    if (!navigator.onLine) {\n        return 'none';\n    }\n\n    const nav = (navigator as Navigator);\n\n    // 进一步判断\n    if (nav.connection) {\n        return nav.connection.type === 'wifi'\n            ? 'wifi'\n            : nav.connection.effectiveType;\n    }\n\n    return 'unknown';\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    let prevType = getNetworkType();\n\n    const networkListener = (): void => {\n        const currentType = getNetworkType();\n        if (currentType !== prevType) {\n            prevType = currentType;\n            listener(currentType);\n        }\n    };\n\n    const nav = (navigator as Navigator);\n\n    if (nav.connection) {\n        nav.connection.addEventListener('change', networkListener);\n\n        return () => {\n            nav.connection?.removeEventListener('change', networkListener);\n        };\n    }\n\n    // fallback：不支持 Network Information API 时，监听 online/offline 事件\n    addEventListener('online', networkListener);\n    addEventListener('offline', networkListener);\n\n    return () => {\n        removeEventListener('online', networkListener);\n        removeEventListener('offline', networkListener);\n    };\n}\n\n// #region Internal Types\n\n/**\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation)\n */\ninterface NetworkInformation extends EventTarget {\n    type: 'bluetooth' | 'cellular' | 'ethernet' | 'none' | 'wifi' | 'wimax' | 'other' | 'unknown';\n    effectiveType: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\n/**\n * [Global augmentation](https://jsr.io/docs/about-slow-types#global-augmentation)\n *\n * 等待 TypeScript 支持。\n *\n * 扩展 Navigator。\n */\ninterface Navigator {\n    connection?: NetworkInformation;\n}\n\n// #endregion","/**\n * 网络状态模块，提供获取网络类型和监听网络状态变化的功能。\n * @module network\n */\nimport { IS_MINA } from '../../macros/env.ts';\nimport { addNetworkChangeListener as minaAddNetworkChangeListener, getNetworkType as minaGetNetworkType } from './mina_network.ts';\nimport type { NetworkType } from './network_define.ts';\nimport { addNetworkChangeListener as webAddNetworkChangeListener, getNetworkType as webGetNetworkType } from './web_network.ts';\n\nexport * from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 根据浏览器支持情况不同，返回值可能为 `wifi` | `none` | `unknown` | `slow-2g` | `2g` | `3g` | `4g`\n * @since 1.0.9\n * @example\n * ```ts\n * const networkType = await getNetworkType();\n * console.log('当前网络类型:', networkType);\n * if (networkType === 'none') {\n *     console.log('当前无网络连接');\n * }\n * ```\n */\nexport function getNetworkType(): Promise<NetworkType> {\n    return IS_MINA\n        ? minaGetNetworkType()\n        : Promise.resolve(webGetNetworkType());\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.9\n * @example\n * ```ts\n * const removeListener = addNetworkChangeListener((type) => {\n *     console.log('网络状态变化:', type);\n *     if (type === 'none') {\n *         console.log('网络已断开');\n *     }\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    return (IS_MINA ? minaAddNetworkChangeListener : webAddNetworkChangeListener)(listener);\n}"],"mappings":";;;;;;AAeA,MAAa,UAAU;;;;;;;;;;;ACHvB,eAAsB,mBAAuC;CACzD,QAAQ,OAAA,GAAA,qBAAA,eAAA,CAAqB,GAAG,cAAc,CAAC,CAAC,EAAA,CAC3C,MAAM,YAAW,MAAK,EAAE,WAAW;AAC5C;;;;;;AAOA,SAAgB,2BAAyB,UAAmD;CACxF,MAAM,mBAAmB,QAAkE;EACvF,MAAM,EAAE,aAAa,gBAAgB;EAGrC,SAFa,cAAc,cAAc,MAE5B;CACjB;CAEA,GAAG,sBAAsB,eAAe;CAExC,aAAa;EACT,GAAG,uBAAuB,eAA2E;CACzG;AACJ;;;;;;;ACxBA,SAAgB,mBAA8B;CAC1C,IAAI,CAAC,UAAU,QACX,OAAO;CAGX,MAAM,MAAO;CAGb,IAAI,IAAI,YACJ,OAAO,IAAI,WAAW,SAAS,SACzB,SACA,IAAI,WAAW;CAGzB,OAAO;AACX;;;;;;AAOA,SAAgB,2BAAyB,UAAmD;CACxF,IAAI,WAAW,iBAAe;CAE9B,MAAM,wBAA8B;EAChC,MAAM,cAAc,iBAAe;EACnC,IAAI,gBAAgB,UAAU;GAC1B,WAAW;GACX,SAAS,WAAW;EACxB;CACJ;CAEA,MAAM,MAAO;CAEb,IAAI,IAAI,YAAY;EAChB,IAAI,WAAW,iBAAiB,UAAU,eAAe;EAEzD,aAAa;GACT,IAAI,YAAY,oBAAoB,UAAU,eAAe;EACjE;CACJ;CAGA,iBAAiB,UAAU,eAAe;CAC1C,iBAAiB,WAAW,eAAe;CAE3C,aAAa;EACT,oBAAoB,UAAU,eAAe;EAC7C,oBAAoB,WAAW,eAAe;CAClD;AACJ;;;;;;;;;;;;;;;;;;;;ACtCA,SAAgB,iBAAuC;CACnD,OAAO,UACD,iBAAmB,IACnB,QAAQ,QAAQ,iBAAkB,CAAC;AAC7C;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,yBAAyB,UAAmD;CACxF,QAAQ,UAAU,6BAA+B,2BAAA,CAA6B,QAAQ;AAC1F"}