index.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { Package50 } from '@/services/websocket/package'
  2. import { FunCode } from '@/constants/funcode'
  3. import { encodeProto, decodeProto } from '@/services/websocket/package/package50/proto'
  4. import Worker from 'worker-loader!./main'
  5. import Service from '../service'
  6. interface RequestParams {
  7. data: unknown;
  8. requestCode: keyof typeof FunCode;
  9. responseCode: keyof typeof FunCode;
  10. }
  11. export default new (class {
  12. private readonly worker = new Worker()
  13. private responseQueue = new Map()
  14. private isTokenValid = false
  15. constructor() {
  16. Service.onReady(() => {
  17. this.worker.postMessage({
  18. type: 'init',
  19. data: {
  20. url: Service.getServiceConfig('tradeUrl')
  21. }
  22. })
  23. })
  24. // 接收工作线程消息
  25. this.worker.onmessage = (e) => {
  26. const message = e.data
  27. if (typeof message === 'object') {
  28. switch (message.type) {
  29. case 'reconnecting': {
  30. this.stopCheckToken()
  31. break
  32. }
  33. case 'reconnected': {
  34. this.checkToken()
  35. break
  36. }
  37. case 'response': {
  38. console.log(message.data)
  39. const { responseCode, content, error } = message.data
  40. const queue = this.responseQueue.get(responseCode)
  41. if (queue) {
  42. const { resolve, reject } = queue
  43. error ? reject(error) : resolve(content)
  44. }
  45. break
  46. }
  47. case 'push': {
  48. console.log(message.data)
  49. break
  50. }
  51. }
  52. }
  53. }
  54. }
  55. request<T>({ data, requestCode, responseCode }: RequestParams) {
  56. return new Promise<T>((resolve, reject) => {
  57. const requestId = FunCode[requestCode]
  58. const responseId = FunCode[responseCode]
  59. encodeProto(requestCode, data).then(async (uint8Array) => {
  60. const run = () => {
  61. const content = new Package50(requestId, uint8Array)
  62. const queueId = new Date().getTime()
  63. content.serialNumber = queueId
  64. this.responseQueue.set(queueId, { resolve, reject })
  65. this.worker.postMessage({
  66. type: 'send',
  67. data: {
  68. messageId: responseId,
  69. content // worker 不支持包含函数对象,content.data() 函数会丢失
  70. }
  71. })
  72. }
  73. if (this.isTokenValid || ['TokenCheckReq', 'LoginReq'].includes(requestCode)) {
  74. run()
  75. } else {
  76. this.checkToken().then(() => run()).catch(reject)
  77. }
  78. }).catch(() => {
  79. reject('构建失败')
  80. })
  81. })
  82. }
  83. checkToken() {
  84. return new Promise<void>((resolve, reject) => {
  85. this.request({
  86. data: {
  87. LoginID: '',
  88. Token: ''
  89. },
  90. requestCode: 'TokenCheckReq',
  91. responseCode: 'TokenCheckRsp'
  92. }).then(() => {
  93. this.isTokenValid = true
  94. resolve()
  95. }).catch((error) => {
  96. this.isTokenValid = false
  97. reject(error)
  98. })
  99. })
  100. }
  101. stopCheckToken() {
  102. this.isTokenValid = false
  103. }
  104. })