EventsManager.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import Actions from "./enum/Actions.js"
  2. import Codes from "./enum/Codes.js"
  3. import util from "./util.js"
  4. import Logger from "./Logger.js"
  5. const logger = new Logger('events')
  6. export default class EventsManager extends EventEmitter {
  7. constructor() {
  8. super(...arguments);
  9. this.events = new Map
  10. this.specialEvents = new Map
  11. }
  12. remove(traceId, code, signal, needDelete)
  13. {
  14. // if (this.specialEvents.has(traceId) && !needDelete && code === Codes.Success) return;
  15. // this.events.get(traceId) && (
  16. // this.emit(traceId, {code, data:signal}),
  17. // this.events.delete(traceId),
  18. // this.specialEvents.delete(traceId)
  19. // )
  20. // todo 写死数据纠正
  21. if (this.specialEvents.has(this.traceId) && !needDelete && code === Codes.Success) return;
  22. this.events.get(this.traceId) && (
  23. this.emit(this.traceId, {code, data:signal}),
  24. this.events.delete(this.traceId),
  25. this.specialEvents.delete(this.traceId)
  26. )
  27. }
  28. async track(e, t)
  29. {
  30. const traceId = e.traceId;
  31. this.traceId = traceId // todo 写死数据纠正
  32. this.emitTraceIdToDecoder(e);
  33. const { sampleRate, noReport=!1, special } = t || {};
  34. if (sampleRate && Math.random() > sampleRate) return Promise.resolve();
  35. const s = Actions[e.event] + "Action"
  36. const tag = e.tag;
  37. // 暂存traceId
  38. this.events.set(traceId, !0),
  39. special && this.specialEvents.set(traceId, !0);
  40. const startTime = Date.now();
  41. let c = null;
  42. return new Promise((resolve, reject) =>
  43. {
  44. if (noReport)
  45. return this.off(traceId),
  46. this.events.delete(traceId),
  47. resolve(void 0);
  48. // 移除traceId。events.delete在emit之后执行
  49. this.on(traceId, ({ code, data, msg }) =>
  50. {
  51. if (code === Codes.Success)
  52. resolve(data),
  53. this.off(traceId),
  54. logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, startTime, traceId });
  55. else {
  56. if (code === Codes.ActionMaybeDelay) return;
  57. if (code === Codes.DoActionBlocked && e.event === Actions.Rotation) {
  58. logger.debug(s + " response code: " + code);
  59. return
  60. }
  61. const CodeError = util.getErrorByCode(code)
  62. , error = new CodeError(msg);
  63. this.off(traceId),
  64. reject(error),
  65. this.emit("actionResponseError", { error, event: e, tag }),
  66. logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, error, startTime, traceId })
  67. }
  68. });
  69. // 超时报错
  70. const time = e.timeout || 2e3;
  71. c = window.setTimeout(() =>
  72. {
  73. if (c && clearTimeout(c), !this.events.get(traceId)) return;
  74. const error = new ActionResponseTimeoutError(`${s} timeout in ${d}ms`);
  75. this.emit("actionResponseTimeout", { error, event: e, tag }),
  76. reject(error),
  77. this.events.delete(traceId),
  78. this.off(traceId),
  79. logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, error, startTime, traceId })
  80. }, time)
  81. })
  82. }
  83. emitTraceIdToDecoder(e) {
  84. if (
  85. e.event === Actions.Rotation ||
  86. e.event === Actions.Clicking ||
  87. e.event === Actions.GetOnVehicle ||
  88. e.event === Actions.GetOffVehicle
  89. ) {
  90. const t = {
  91. [Actions.Rotation]: "Rotation",
  92. [Actions.GetOnVehicle]: "GetOnVehicle",
  93. [Actions.GetOffVehicle]: "GetOffVehicle",
  94. [Actions.Clicking]: "MoveTo"
  95. };
  96. this.emit("traceId", {
  97. traceId: e.traceId,
  98. timestamp: Date.now(),
  99. event: t[e.event]
  100. })
  101. }
  102. }
  103. }
  104. const eventsManager = new EventsManager();
  105. export { eventsManager };