UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

163 lines (158 loc) 7.74 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var cocos_network_decorators_cocosLoginDecorator = require('./decorators/cocos-login-decorator.js'); var cocos_network_defaults = require('./defaults.js'); var cocos_network_engine = require('./engine.js'); var cocos_network_interceptors_request_aegisStartTimeInterceptor = require('./interceptors/request/aegis-start-time-interceptor.js'); var cocos_network_interceptors_request_cocosFangshuaInterceptor = require('./interceptors/request/cocos-fangshua-interceptor.js'); var cocos_network_interceptors_request_cocosHostInterceptor = require('./interceptors/request/cocos-host-interceptor.js'); var cocos_network_interceptors_request_cocosLoginInfoParamInterceptor = require('./interceptors/request/cocos-login-info-param-interceptor.js'); var cocos_network_interceptors_response_aegisReportInterceptor = require('./interceptors/response/aegis-report-interceptor.js'); var cocos_network_interceptors_response_getDataInterceptor = require('./interceptors/response/get-data-interceptor.js'); var cocos_network_interceptors_response_normalizeResponseRetInterceptor = require('./interceptors/response/normalize-response-ret-interceptor.js'); var cocos_env_env = require('../env/env.js'); var cocos_manager_manager = require('../manager/manager.js'); var cocos_login_login = require('../login/login.js'); require('../../e-bus/init.js'); require('../../e-bus/e-bus.js'); require('@babel/runtime/helpers/classCallCheck'); require('@babel/runtime/helpers/createClass'); require('./config.js'); require('@babel/runtime/helpers/slicedToArray'); require('./request/cocos-request.js'); require('@babel/runtime/helpers/typeof'); require('../../base64/decode.js'); require('../../base64/config.js'); require('../config.js'); require('../../url/helper.js'); /** * 一键初始化 Cocos 微信小游戏网络层 * * 等价于 pmd-npm `business/src/network-v2/application/cocos/index-mp.ts` * 的 initNetworkManager,但适配到本包自带的 NetworkManager 和 wx.request。 * * 调用一次后,所有通过 pmd-api-cocos 的 NetworkManager 发出的请求 * 都会: * - 自动拼 baseUrl + host * - 无登录态时带 code → 触发后台换登录态 * - 有登录态时 body.login_info + cookie 透传 * - 响应 header logininfo 自动入库 * - ret=100000 自动清态重试一次 * * 使用示例(见 README): * ```ts * import { initCocosNetwork } from '@tencent/pmd-api-cocos/network'; * * initCocosNetwork({ * network: { * svrdomain: { * test: 'atest.igame.qq.com', * prod: 'igame.qq.com', * }, * }, * loginPath: '/v2/login/code', * appid: 'wx14f5bb5ae9a067f8', * // storage / getLoginCode 可不传,默认走 sys.localStorage + wx.login * onLoginInfo: (info) => { * // 可选:同步到 AuthService / 刷新 UI 等 * }, * }); * * // 控制台可执行(微信小游戏 / 开发者工具): * wx.__pmdSetEnv__('prod') // → 切到正式环境并自动重启 * wx.__pmdSetEnv__('test') // → 切回测试环境 * wx.__pmdGetEnv__() // → 查看当前环境 * // (非微信环境会回退挂到 globalThis 上) * ``` */ function initCocosNetwork(options) { var _a, _b, _c; var storage = (_a = options.storage) !== null && _a !== void 0 ? _a : cocos_network_defaults.defaultStorage; var getLoginCode = (_b = options.getLoginCode) !== null && _b !== void 0 ? _b : cocos_network_defaults.defaultGetLoginCode; // 1) 先建好环境切换器,由它统一管理 baseUrl / loginUrl // env storage 不复用登录态 storage(避免业务自定义 storage 的 JSON 处理影响), // 走 env 模块自己的默认实现:wx.getStorageSync → localStorage → 内存。 var envSwitcher = cocos_env_env.createEnvSwitcher({ svrdomain: options.network.svrdomain, storageKey: options.envStorageKey, autoRestart: options.envAutoRestart, globalSetEnvName: options.globalSetEnvName, globalGetEnvName: options.globalGetEnvName }); var baseUrl = envSwitcher.getBaseUrl(); var loginUrl = (_c = options.loginUrl) !== null && _c !== void 0 ? _c : "".concat(baseUrl).concat(options.loginPath); console.log("[pmd-api-cocos] env=".concat(envSwitcher.getEnv(), ", baseUrl=").concat(baseUrl)); var loginMpMethod = function loginMpMethod() { return cocos_login_login.loginMp({ url: loginUrl, appid: options.appid, onLoginInfo: options.onLoginInfo, storage: storage, storageKey: options.storageKey }); }; // 构建请求拦截器链 // 注意:顺序敏感 // - AegisStartTime 必须在最前(保证 startTime 最早被打下) // - CocosHost / CocosLoginInfoParam / CocosFangshua 顺序不能变 var requestInterceptors = []; // aegis 打点拦截器(仅当业务注入 aegisReport 时才加,避免无效开销) if (options.aegisReport) { requestInterceptors.push(new cocos_network_interceptors_request_aegisStartTimeInterceptor.AegisStartTimeInterceptor()); } requestInterceptors.push(new cocos_network_interceptors_request_cocosHostInterceptor.CocosHostInterceptor({ baseUrl: baseUrl }), new cocos_network_interceptors_request_cocosLoginInfoParamInterceptor.CocosLoginInfoParamInterceptor({ appid: options.appid, platform: options.platform, ltype: options.ltype, storage: storage, storageKey: options.storageKey, getLoginCode: getLoginCode, loginMp: loginMpMethod, isTestEnv: function isTestEnv() { return envSwitcher.isTestEnv(); } })); // 防刷拦截器放在请求拦截器链的最后 if (options.fangshua) { requestInterceptors.push(new cocos_network_interceptors_request_cocosFangshuaInterceptor.CocosFangshuaInterceptor({ storage: storage, storageKey: options.storageKey, getTs: options.fangshua.getTs, getEncryptData: options.fangshua.getEncryptData, crypto: options.fangshua.crypto, isTestEnv: function isTestEnv() { return envSwitcher.isTestEnv(); } })); } // 构建响应拦截器链 // - NormalizeResponseRetInterceptor:归一化 ret / msg,必须第一 // - AegisReportInterceptor:上报所有响应 data / header(依赖 Normalize 把 r 解好) // - GetDataInterceptor:必须最后(会改写 param.data,决定 abort 标志) var responseInterceptors = [new cocos_network_interceptors_response_normalizeResponseRetInterceptor.NormalizeResponseRetInterceptor({ loginMp: loginMpMethod, onAccessDenied: options.onAccessDenied })]; if (options.aegisReport) { responseInterceptors.push(new cocos_network_interceptors_response_aegisReportInterceptor.AegisReportInterceptor({ report: options.aegisReport.report, truncateSize: options.aegisReport.truncateSize })); } responseInterceptors.push(new cocos_network_interceptors_response_getDataInterceptor.GetDataInterceptor()); var engine = new cocos_network_engine.NetworkEngine({ requestInterceptors: requestInterceptors, responseInterceptors: responseInterceptors }); // 监听 ebus 'event-on-cocos-login' 事件后自动重发上一次因登录态失效而挂起的请求 engine.options.decorator = cocos_network_decorators_cocosLoginDecorator.cocosLoginDecorator; // 把 engine.request 注入给 pmd-api-cocos 的 NetworkManager, // 后续业务调 `QueryUserInfoClient.QueryUserInfo(...)` 时就会走这条链 cocos_manager_manager.NetworkManager.instance.setRequestImpl(engine.request); // 把 envSwitcher 挂到 engine 上,方便业务侧(如有需要)拿到 engine.envSwitcher = envSwitcher; return engine; } exports.initCocosNetwork = initCocosNetwork;