telemetryManager.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 gl = (<any>engine)._gl;
  39. if (gl && gl.getError) {
  40. let error = gl.getError();
  41. if (error === gl.NO_ERROR) {
  42. logErrors = false;
  43. } else {
  44. this.broadcast("WebGL Error", viewerId, { error: error });
  45. }
  46. } else {
  47. logErrors = false;
  48. }
  49. }
  50. }
  51. /**
  52. * Enable or disable telemetry events
  53. * @param enabled Boolan, true if events are enabled
  54. */
  55. public set enable(enabled: boolean) {
  56. if (enabled) {
  57. this._event = this._eventEnabled;
  58. } else {
  59. this._event = this._eventDisabled;
  60. }
  61. }
  62. /**
  63. * Called on event when disabled, typically do nothing here
  64. */
  65. private _eventDisabled(): void {
  66. // nothing to do
  67. }
  68. /**
  69. * Called on event when enabled
  70. * @param event - The name of the Telemetry event
  71. * @param details An additional value, or an object containing a list of property/value pairs
  72. */
  73. private _eventEnabled(event: string, viewerId?: string, details?: any): void {
  74. let telemetryData: TelemetryData = {
  75. viewerId,
  76. event: event,
  77. session: this.session,
  78. date: new Date(),
  79. now: window.performance ? window.performance.now() : Date.now(),
  80. detail: null
  81. };
  82. if (typeof details === "object") {
  83. for (var attr in details) {
  84. if (details.hasOwnProperty(attr)) {
  85. telemetryData[attr] = details[attr];
  86. }
  87. }
  88. } else if (details) {
  89. telemetryData.detail = details;
  90. }
  91. this.onEventBroadcastedObservable.notifyObservers(telemetryData);
  92. }
  93. /**
  94. * Returns the current session ID or creates one if it doesn't exixt
  95. * @return The current session ID
  96. */
  97. public get session(): string {
  98. if (!this._currentSessionId) {
  99. //String + Timestamp + Random Integer
  100. this._currentSessionId = "SESSION_" + Date.now() + Math.floor(Math.random() * 0x10000);
  101. }
  102. return this._currentSessionId;
  103. }
  104. /**
  105. * Disposes the telemetry manager
  106. */
  107. public dispose() {
  108. this.onEventBroadcastedObservable.clear();
  109. delete this.onEventBroadcastedObservable;
  110. }
  111. }
  112. export const telemetryManager = new TelemetryManager();