EventsManager.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. E(this, "events", new Map);
  10. E(this, "specialEvents", new Map)
  11. }
  12. remove(e, t, r, n) {
  13. if (this.specialEvents.has(e) && !n && t === Codes.Success)
  14. return;
  15. this.events.get(e) && (this.emit(e, {
  16. code: t,
  17. data: r
  18. }),
  19. this.events.delete(e),
  20. this.specialEvents.delete(e))
  21. }
  22. async track(e, t) {
  23. const r = e.traceId;
  24. this.emitTraceIdToDecoder(e);
  25. const {sampleRate: n, noReport: o=!1, special: a} = t || {};
  26. if (n && Math.random() > n)
  27. return Promise.resolve();
  28. const s = Actions[e.event] + "Action"
  29. , l = e.tag;
  30. this.events.set(r, !0),
  31. a && this.specialEvents.set(r, !0);
  32. const u = Date.now();
  33. let c = null;
  34. return new Promise((h,f)=>{
  35. if (o)
  36. return this.off(r),
  37. this.events.delete(r),
  38. h(void 0);
  39. this.on(r, ({code: _, data: g, msg: m})=>{
  40. if (_ === Codes.Success)
  41. h(g),
  42. this.off(r),
  43. logger.infoAndReportMeasurement({
  44. metric: s,
  45. tag: l,
  46. extra: e.extra,
  47. startTime: u,
  48. traceId: r
  49. });
  50. else {
  51. if (_ === Codes.ActionMaybeDelay)
  52. return;
  53. if (_ === Codes.DoActionBlocked && e.event === Actions.Rotation) {
  54. logger.debug(s + " response code: " + _);
  55. return
  56. }
  57. const v = util.getErrorByCode(_)
  58. , y = new v(m);
  59. this.off(r),
  60. f(y),
  61. this.emit("actionResponseError", {
  62. error: y,
  63. event: e,
  64. tag: l
  65. }),
  66. logger.infoAndReportMeasurement({
  67. metric: s,
  68. tag: l,
  69. extra: e.extra,
  70. error: y,
  71. startTime: u,
  72. traceId: r
  73. })
  74. }
  75. }
  76. );
  77. const d = e.timeout || 2e3;
  78. c = window.setTimeout(()=>{
  79. if (c && clearTimeout(c),
  80. !this.events.get(r))
  81. return;
  82. const _ = new ActionResponseTimeoutError(`${s} timeout in ${d}ms`);
  83. this.emit("actionResponseTimeout", {
  84. error: _,
  85. event: e,
  86. tag: l
  87. }),
  88. f(_),
  89. this.events.delete(r),
  90. this.off(r),
  91. logger.infoAndReportMeasurement({
  92. metric: s,
  93. tag: l,
  94. extra: e.extra,
  95. error: _,
  96. startTime: u,
  97. traceId: r
  98. })
  99. }
  100. , d)
  101. }
  102. )
  103. }
  104. emitTraceIdToDecoder(e) {
  105. if (e.event === Actions.Rotation || e.event === Actions.Clicking || e.event === Actions.GetOnVehicle || e.event === Actions.GetOffVehicle) {
  106. const t = {
  107. [Actions.Rotation]: "Rotation",
  108. [Actions.GetOnVehicle]: "GetOnVehicle",
  109. [Actions.GetOffVehicle]: "GetOffVehicle",
  110. [Actions.Clicking]: "MoveTo"
  111. };
  112. this.emit("traceId", {
  113. traceId: e.traceId,
  114. timestamp: Date.now(),
  115. event: t[e.event]
  116. })
  117. }
  118. }
  119. }
  120. const eventsManager = new EventsManager();
  121. export { eventsManager };