import Protobuf from 'protobufjs' export default new (class { private readonly protoRoot: Promise; /** * 加载proto文件 */ constructor() { this.protoRoot = new Promise((resolve, reject) => { Protobuf.load('./proto/mtp.proto', (err: any, root: any) => { if (err) { reject(err) } else { resolve(root) } }) }) } /** * 创建proto实例 * @param protoName 需要实例化的proto构造函数 */ // eslint-disable-next-line build(protoName: string): Promise { return new Promise((resolve, reject) => { // eslint-disable-next-line this.protoRoot.then((root: any) => { const build = root.lookup(protoName); resolve(build); }).catch(() => { reject('proto文件加载失败'); }) }) } /** * proto请求编码 * @param protoName * @param payload * @returns */ async requestEncode(protoName: string, payload: T): Promise { const build = await this.build(protoName); return build.encode(payload).finish(); } /** * proto响应解码 * @param protoName * @param content * @returns */ async responseDecode(protoName: string, content?: Uint8Array): Promise { const build = await this.build(protoName); return build.decode(content); } })