EventsManager.js 4.0 KB

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