// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
-import { AsyncResource } from 'node:async_hooks';
-import { parentPort } from 'node:worker_threads';
+import { parentPort } from 'node:worker_threads'
-import { ThreadWorker } from 'poolifier';
+import { ThreadWorker } from 'poolifier'
-import { ChargingStation } from './ChargingStation';
-import type { ChargingStationWorkerData } from '../types';
-import { Configuration } from '../utils';
-import { WorkerConstants, type WorkerMessage, WorkerMessageEvents } from '../worker';
-
-const moduleName = 'ChargingStationWorker';
+import { ChargingStation } from './ChargingStation.js'
+import { BaseError } from '../exception/index.js'
+import type { ChargingStationWorkerData } from '../types/index.js'
+import { Configuration } from '../utils/index.js'
+import { type WorkerMessage, WorkerMessageEvents } from '../worker/index.js'
/**
* Creates and starts a charging station instance
*
- * @param data - workerData
+ * @param data - data sent to worker
*/
const startChargingStation = (data?: ChargingStationWorkerData): void => {
- new ChargingStation(data!.index, data!.templateFile).start();
-};
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ new ChargingStation(data!.index, data!.templateFile).start()
+}
-class ChargingStationWorker extends AsyncResource {
- constructor() {
- super(moduleName);
+// eslint-disable-next-line @typescript-eslint/no-extraneous-class
+class ChargingStationWorker<Data extends ChargingStationWorkerData> {
+ constructor () {
// Add message listener to create and start charging station from the main thread
- parentPort?.on('message', (message: WorkerMessage<ChargingStationWorkerData>) => {
- if (message.event === WorkerMessageEvents.startWorkerElement) {
- try {
- this.runInAsyncScope(
- startChargingStation.bind(this) as (data?: ChargingStationWorkerData) => void,
- this,
- message.data,
- );
- parentPort?.postMessage({
- event: WorkerMessageEvents.startedWorkerElement,
- });
- } catch (error) {
- parentPort?.postMessage({
- event: WorkerMessageEvents.startWorkerElementError,
- data: {
- message: (error as Error).message,
- stack: (error as Error).stack,
- },
- });
- }
+ parentPort?.on('message', (message: WorkerMessage<Data>) => {
+ switch (message.event) {
+ case WorkerMessageEvents.startWorkerElement:
+ try {
+ startChargingStation(message.data)
+ parentPort?.postMessage({
+ event: WorkerMessageEvents.startedWorkerElement
+ })
+ } catch (error) {
+ parentPort?.postMessage({
+ event: WorkerMessageEvents.startWorkerElementError,
+ data: {
+ name: (error as Error).name,
+ message: (error as Error).message,
+ stack: (error as Error).stack
+ }
+ })
+ }
+ break
+ default:
+ throw new BaseError(
+ `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
+ message.data,
+ undefined,
+ 2
+ )}'`
+ )
}
- });
+ })
}
}
-export let chargingStationWorker: ChargingStationWorker | ThreadWorker<ChargingStationWorkerData>;
+export let chargingStationWorker:
+| ChargingStationWorker<ChargingStationWorkerData>
+| ThreadWorker<ChargingStationWorkerData>
if (Configuration.workerPoolInUse()) {
- chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation, {
- maxInactiveTime: WorkerConstants.POOL_MAX_INACTIVE_TIME,
- });
+ chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation)
} else {
- chargingStationWorker = new ChargingStationWorker();
+ chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>()
}