telemetryManager.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { Engine, Observable } from "babylonjs";
  2. /**
  3. * The data structure of a telemetry event.
  4. */
  5. export interface TelemetryData {
  6. event: string;
  7. session: string;
  8. date: Date;
  9. now: number;
  10. viewerId?: string;
  11. detail: any;
  12. }
  13. /**
  14. * Receives Telemetry events and raises events to the API
  15. */
  16. export class TelemetryManager {
  17. public onEventBroadcastedObservable: Observable<TelemetryData> = new Observable();
  18. private _currentSessionId: string;
  19. private _event: (event: string, viewerId?: string, details?: any) => void = this._eventEnabled;
  20. /**
  21. * Receives a telemetry event
  22. * @param event The name of the Telemetry event
  23. * @param details An additional value, or an object containing a list of property/value pairs
  24. */
  25. public get broadcast() {
  26. return this._event;
  27. }
  28. /**
  29. * Log a Telemetry event for errors raised on the WebGL context.
  30. * @param engine The Babylon engine with the WebGL context.
  31. */
  32. public flushWebGLErrors(engine: Engine, viewerId?: string) {
  33. if (!engine) {
  34. return;
  35. }
  36. let logErrors = true;
  37. while (logErrors) {
  38. let error = engine.getError();
  39. if (error === 0) {
  40. logErrors = false;
  41. } else {
  42. this.broadcast("WebGL Error", viewerId, { error: error });
  43. }
  44. }
  45. }
  46. /**
  47. * Enable or disable telemetry events
  48. * @param enabled Boolan, true if events are enabled
  49. */
  50. public set enable(enabled: boolean) {
  51. if (enabled) {
  52. this._event = this._eventEnabled;
  53. } else {
  54. this._event = this._eventDisabled;
  55. }
  56. }
  57. /**
  58. * Called on event when disabled, typically do nothing here
  59. */
  60. private _eventDisabled(): void {
  61. // nothing to do
  62. }
  63. /**
  64. * Called on event when enabled
  65. * @param event - The name of the Telemetry event
  66. * @param details An additional value, or an object containing a list of property/value pairs
  67. */
  68. private _eventEnabled(event: string, viewerId?: string, details?: any): void {
  69. let telemetryData: TelemetryData = {
  70. viewerId,
  71. event: event,
  72. session: this.session,
  73. date: new Date(),
  74. now: window.performance ? window.performance.now() : Date.now(),
  75. detail: null
  76. };
  77. if (typeof details === "object") {
  78. for (var attr in details) {
  79. if (details.hasOwnProperty(attr)) {
  80. telemetryData[attr] = details[attr];
  81. }
  82. }
  83. } else if (details) {
  84. telemetryData.detail = details;
  85. }
  86. this.onEventBroadcastedObservable.notifyObservers(telemetryData);
  87. }
  88. /**
  89. * Returns the current session ID or creates one if it doesn't exixt
  90. * @return The current session ID
  91. */
  92. public get session(): string {
  93. if (!this._currentSessionId) {
  94. //String + Timestamp + Random Integer
  95. this._currentSessionId = "SESSION_" + Date.now() + Math.floor(Math.random() * 0x10000);
  96. }
  97. return this._currentSessionId;
  98. }
  99. /**
  100. * Disposes the telemetry manager
  101. */
  102. public dispose() {
  103. this.onEventBroadcastedObservable.clear();
  104. delete this.onEventBroadcastedObservable;
  105. }
  106. }
  107. export const telemetryManager = new TelemetryManager();