index.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import Protobuf from 'protobufjs'
  2. export default new (class {
  3. private readonly protoRoot: Promise<unknown>;
  4. /**
  5. * 加载proto文件
  6. */
  7. constructor() {
  8. this.protoRoot = new Promise((resolve, reject) => {
  9. Protobuf.load('./proto/mtp.proto', (err: any, root: any) => {
  10. if (err) {
  11. reject(err)
  12. } else {
  13. resolve(root)
  14. }
  15. })
  16. })
  17. }
  18. /**
  19. * 创建proto实例
  20. * @param protoName 需要实例化的proto构造函数
  21. */
  22. // eslint-disable-next-line
  23. build(protoName: string): Promise<any> {
  24. return new Promise((resolve, reject) => {
  25. // eslint-disable-next-line
  26. this.protoRoot.then((root: any) => {
  27. const build = root.lookup(protoName);
  28. resolve(build);
  29. }).catch(() => {
  30. reject('proto文件加载失败');
  31. })
  32. })
  33. }
  34. /**
  35. * proto请求编码
  36. * @param protoName
  37. * @param payload
  38. * @returns
  39. */
  40. async requestEncode<T>(protoName: string, payload: T): Promise<Uint8Array> {
  41. const build = await this.build(protoName);
  42. return build.encode(payload).finish();
  43. }
  44. /**
  45. * proto响应解码
  46. * @param protoName
  47. * @param content
  48. * @returns
  49. */
  50. async responseDecode<T>(protoName: string, content?: Uint8Array): Promise<T> {
  51. const build = await this.build(protoName);
  52. return build.decode(content);
  53. }
  54. })