debug-server-next
Version:
Dev server for hippy-core.
127 lines (126 loc) • 5.36 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppClient = void 0;
const events_1 = require("events");
const enum_1 = require("@/@types/enum");
const middlewares_1 = require("@/middlewares");
const cdp_1 = require("@/utils/cdp");
const log_1 = require("@/utils/log");
const middleware_1 = require("@/utils/middleware");
const filteredLog = new log_1.Logger('filtered', enum_1.WinstonColor.Yellow);
const downwardLog = new log_1.Logger('↓↓↓', enum_1.WinstonColor.Red);
const upwardLog = new log_1.Logger('↑↑↑', enum_1.WinstonColor.Green);
/**
* app client 通道,负责调试协议至 app 端的收发。目前包括三个通道,分别由三个子类实现:
* - tunnel 通道:c++ addon 实现
* - ws 通道:手 Q 采用此通道
* - IWDP 通道:TDF iOS 采用此通道
**/
class AppClient extends events_1.EventEmitter {
constructor(id, { useAllDomain = true, acceptDomains, ignoreDomains = [], middleWareManager, urlParsedContext, platform, }) {
super();
this.isClosed = false;
this.acceptDomains = cdp_1.CDP_DOMAIN_LIST;
this.ignoreDomains = [];
this.useAllDomain = true;
this.msgIdMethodMap = new Map();
this.id = id;
this.useAllDomain = useAllDomain;
this.acceptDomains = acceptDomains;
this.ignoreDomains = ignoreDomains;
this.middleWareManager = middleWareManager;
this.urlParsedContext = urlParsedContext;
this.platform = platform;
}
/**
* 调试协议经过中间件的适配后,上行发送至 app 端
*/
sendToApp(msg) {
if (!this.filter(msg)) {
filteredLog.info(`'${msg.method}' is filtered in app client type: ${this.type}`);
return Promise.reject(1 /* DomainFiltered */);
}
const { method } = msg;
this.msgIdMethodMap.set(msg.id, msg.method);
const middlewareList = this.getMiddlewareList(enum_1.MiddlewareType.Upward, method);
// 上行的具体协议的处理交给中间件去适配,最后分发到 app 端
return this.middlewareMessageHandler(middlewareList, msg);
}
/**
* 下行协议适配 handler
*/
downwardMessageHandler(msg) {
var _a;
try {
if ('id' in msg) {
const method = this.msgIdMethodMap.get(msg.id);
if (method)
msg.method = method;
this.msgIdMethodMap.delete(msg.id);
}
const { method } = msg;
const middlewareList = this.getMiddlewareList(enum_1.MiddlewareType.Downward, method);
return this.middlewareMessageHandler(middlewareList, msg);
}
catch (e) {
downwardLog.error(`app client on message error: %s`, (_a = e) === null || _a === void 0 ? void 0 : _a.stack);
return Promise.reject(e);
}
}
/**
* 通过中间件处理上下行消息
*/
middlewareMessageHandler(middlewareList, msg) {
// 创建中间件上下文,中间件中可以通过调用 sendToApp, sendToDevtools 将调试协议分发到接收端
const middlewareContext = Object.assign(Object.assign({}, this.urlParsedContext), { msg, sendToApp: (msg) => {
if (!msg.id) {
msg.id = middlewares_1.requestId.create();
}
upwardLog.info('%s sendToApp %j', this.type, msg);
return this.sendHandler(msg);
}, sendToDevtools: (msg) => {
downwardLog.info('%s sendToDevtools %s %s', this.type, msg.id || '', msg.method);
return this.emitMessageToDevtools(msg);
} });
return middleware_1.composeMiddlewares(middlewareList)(middlewareContext);
}
/**
* 协议下行发送至 devtools 端
*/
emitMessageToDevtools(msg) {
if (!msg)
return Promise.reject(3 /* EmptyCommand */);
this.emit("message" /* Message */, msg);
return Promise.resolve(msg);
}
/**
* 上行协议 filter,通过才放行
*/
filter(msg) {
if (this.useAllDomain)
return true;
const { method } = msg;
const domain = cdp_1.getDomain(method);
if (this.ignoreDomains.length) {
const isIgnoreDomain = this.ignoreDomains.indexOf(domain) !== -1 || this.ignoreDomains.indexOf(method) !== -1;
return !isIgnoreDomain;
}
const isAcceptDomain = this.acceptDomains.indexOf(domain) !== -1 || this.acceptDomains.indexOf(method) !== -1;
return isAcceptDomain;
}
/**
* 根据调试协议查询注册的中间件列表
*/
getMiddlewareList(type, method) {
let middlewareList = {
[enum_1.MiddlewareType.Upward]: this.middleWareManager.upwardMiddleWareListMap,
[enum_1.MiddlewareType.Downward]: this.middleWareManager.downwardMiddleWareListMap,
}[type][method];
if (!middlewareList)
middlewareList = [];
if (!Array.isArray(middlewareList))
middlewareList = [middlewareList];
return [...middlewareList, type === enum_1.MiddlewareType.Upward ? middlewares_1.defaultUpwardMiddleware : middlewares_1.defaultDownwardMiddleware];
}
}
exports.AppClient = AppClient;