refactor: convert remote stop transaction to two stages request
[e-mobility-charging-stations-simulator.git] / src / performance / PerformanceStatistics.ts
index 2d557eaac73dee8621a4db3ec322df8edabb65c4..88bb29d04d97d9aa315df258dc0923334d803d1e 100644 (file)
@@ -1,4 +1,4 @@
-// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+// Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
 
 import { type PerformanceEntry, PerformanceObserver, performance } from 'node:perf_hooks'
 import type { URL } from 'node:url'
@@ -6,6 +6,7 @@ import { parentPort } from 'node:worker_threads'
 
 import { secondsToMilliseconds } from 'date-fns'
 
+import { BaseError } from '../exception/index.js'
 import {
   ConfigurationSection,
   type IncomingRequestCommand,
@@ -41,8 +42,8 @@ export class PerformanceStatistics {
   PerformanceStatistics
   >()
 
-  private readonly objId: string
-  private readonly objName: string
+  private readonly objId: string | undefined
+  private readonly objName: string | undefined
   private performanceObserver!: PerformanceObserver
   private readonly statistics: Statistics
   private displayInterval?: NodeJS.Timeout
@@ -52,8 +53,8 @@ export class PerformanceStatistics {
     this.objName = objName
     this.initializePerformanceObserver()
     this.statistics = {
-      id: this.objId ?? 'Object id not specified',
-      name: this.objName ?? 'Object name not specified',
+      id: this.objId,
+      name: this.objName,
       uri: uri.toString(),
       createdAt: new Date(),
       statisticsData: new Map()
@@ -61,10 +62,26 @@ export class PerformanceStatistics {
   }
 
   public static getInstance (
-    objId: string,
-    objName: string,
-    uri: URL
+    objId: string | undefined,
+    objName: string | undefined,
+    uri: URL | undefined
   ): PerformanceStatistics | undefined {
+    const logPfx = logPrefix(' Performance statistics')
+    if (objId == null) {
+      const errMsg = 'Cannot get performance statistics instance without specifying object id'
+      logger.error(`${logPfx} ${errMsg}`)
+      throw new BaseError(errMsg)
+    }
+    if (objName == null) {
+      const errMsg = 'Cannot get performance statistics instance without specifying object name'
+      logger.error(`${logPfx} ${errMsg}`)
+      throw new BaseError(errMsg)
+    }
+    if (uri == null) {
+      const errMsg = 'Cannot get performance statistics instance without specifying object uri'
+      logger.error(`${logPfx} ${errMsg}`)
+      throw new BaseError(errMsg)
+    }
     if (!PerformanceStatistics.instances.has(objId)) {
       PerformanceStatistics.instances.set(objId, new PerformanceStatistics(objId, objName, uri))
     }
@@ -82,7 +99,7 @@ export class PerformanceStatistics {
       performance.measure(name, markId)
     } catch (error) {
       if (error instanceof Error && error.message.includes('performance mark has not been set')) {
-        /** Ignore */
+        /* Ignore */
       } else {
         throw error
       }
@@ -164,7 +181,7 @@ export class PerformanceStatistics {
     this.stopLogStatisticsInterval()
     performance.clearMarks()
     performance.clearMeasures()
-    this.performanceObserver?.disconnect()
+    this.performanceObserver.disconnect()
   }
 
   public restart (): void {
@@ -173,7 +190,7 @@ export class PerformanceStatistics {
   }
 
   private initializePerformanceObserver (): void {
-    this.performanceObserver = new PerformanceObserver((performanceObserverList) => {
+    this.performanceObserver = new PerformanceObserver(performanceObserverList => {
       const lastPerformanceEntry = performanceObserverList.getEntries()[0]
       // logger.debug(
       //   `${this.logPrefix()} '${lastPerformanceEntry.name}' performance entry: %j`,
@@ -185,7 +202,7 @@ export class PerformanceStatistics {
   }
 
   private logStatistics (): void {
-    logger.info(`${this.logPrefix()}`, {
+    logger.info(this.logPrefix(), {
       ...this.statistics,
       statisticsData: JSONStringifyWithMapSupport(this.statistics.statisticsData)
     })