t-comm
Version:
专业、稳定、纯粹的工具库
159 lines (156 loc) • 6.79 kB
JavaScript
import { createEnvSwitcher } from '../env/env.mjs';
import { loginMp } from '../login/login.mjs';
import { NetworkManager } from '../manager/manager.mjs';
import { cocosLoginDecorator } from './decorators/cocos-login-decorator.mjs';
import { defaultStorage, defaultGetLoginCode } from './defaults.mjs';
import { NetworkEngine } from './engine.mjs';
import { AegisStartTimeInterceptor } from './interceptors/request/aegis-start-time-interceptor.mjs';
import { CocosFangshuaInterceptor } from './interceptors/request/cocos-fangshua-interceptor.mjs';
import { CocosHostInterceptor } from './interceptors/request/cocos-host-interceptor.mjs';
import { CocosLoginInfoParamInterceptor } from './interceptors/request/cocos-login-info-param-interceptor.mjs';
import { AegisReportInterceptor } from './interceptors/response/aegis-report-interceptor.mjs';
import { GetDataInterceptor } from './interceptors/response/get-data-interceptor.mjs';
import { NormalizeResponseRetInterceptor } from './interceptors/response/normalize-response-ret-interceptor.mjs';
import '../../e-bus/init.mjs';
import '../../e-bus/e-bus.mjs';
import '@babel/runtime/helpers/classCallCheck';
import '@babel/runtime/helpers/createClass';
import '../../url/helper.mjs';
import '@babel/runtime/helpers/slicedToArray';
import './config.mjs';
import './request/cocos-request.mjs';
import '@babel/runtime/helpers/typeof';
import '../../base64/decode.mjs';
import '../../base64/config.mjs';
import '../config.mjs';
/**
* 一键初始化 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 : defaultStorage;
var getLoginCode = (_b = options.getLoginCode) !== null && _b !== void 0 ? _b : defaultGetLoginCode;
// 1) 先建好环境切换器,由它统一管理 baseUrl / loginUrl
// env storage 不复用登录态 storage(避免业务自定义 storage 的 JSON 处理影响),
// 走 env 模块自己的默认实现:wx.getStorageSync → localStorage → 内存。
var envSwitcher = 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 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 AegisStartTimeInterceptor());
}
requestInterceptors.push(new CocosHostInterceptor({
baseUrl: baseUrl
}), new 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 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 NormalizeResponseRetInterceptor({
loginMp: loginMpMethod,
onAccessDenied: options.onAccessDenied
})];
if (options.aegisReport) {
responseInterceptors.push(new AegisReportInterceptor({
report: options.aegisReport.report,
truncateSize: options.aegisReport.truncateSize
}));
}
responseInterceptors.push(new GetDataInterceptor());
var engine = new NetworkEngine({
requestInterceptors: requestInterceptors,
responseInterceptors: responseInterceptors
});
// 监听 ebus 'event-on-cocos-login' 事件后自动重发上一次因登录态失效而挂起的请求
engine.options.decorator = cocosLoginDecorator;
// 把 engine.request 注入给 pmd-api-cocos 的 NetworkManager,
// 后续业务调 `QueryUserInfoClient.QueryUserInfo(...)` 时就会走这条链
NetworkManager.instance.setRequestImpl(engine.request);
// 把 envSwitcher 挂到 engine 上,方便业务侧(如有需要)拿到
engine.envSwitcher = envSwitcher;
return engine;
}
export { initCocosNetwork };