t-comm
Version:
专业、稳定、纯粹的工具库
163 lines (158 loc) • 7.74 kB
JavaScript
'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;