Commit | Line | Data |
---|---|---|
edd13439 | 1 | // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved. |
c8eeb62b | 2 | |
a679a162 | 3 | import { AsyncResource } from 'node:async_hooks'; |
6b57eb9a | 4 | import { parentPort } from 'node:worker_threads'; |
8114d10e JB |
5 | |
6 | import { ThreadWorker } from 'poolifier'; | |
7 | ||
4c3c0d59 | 8 | import { ChargingStation } from './ChargingStation'; |
a6080904 | 9 | import { BaseError } from '../exception'; |
268a74bb | 10 | import type { ChargingStationWorkerData } from '../types'; |
a4e5c2e2 | 11 | import { Configuration } from '../utils'; |
d769e04a | 12 | import { type WorkerData, type WorkerMessage, WorkerMessageEvents } from '../worker'; |
7dde0b73 | 13 | |
11353865 JB |
14 | const moduleName = 'ChargingStationWorker'; |
15 | ||
e8a92d57 | 16 | /** |
361c98f5 | 17 | * Creates and starts a charging station instance |
e8a92d57 | 18 | * |
d769e04a | 19 | * @param data - data sent to worker |
e8a92d57 | 20 | */ |
a37fc6dc JB |
21 | const startChargingStation = (data?: ChargingStationWorkerData): void => { |
22 | new ChargingStation(data!.index, data!.templateFile).start(); | |
e8a92d57 JB |
23 | }; |
24 | ||
d769e04a | 25 | class ChargingStationWorker<Data extends WorkerData> extends AsyncResource { |
6b57eb9a | 26 | constructor() { |
11353865 | 27 | super(moduleName); |
6b57eb9a | 28 | // Add message listener to create and start charging station from the main thread |
d769e04a | 29 | parentPort?.on('message', (message: WorkerMessage<Data>) => { |
f93dda6a JB |
30 | switch (message.event) { |
31 | case WorkerMessageEvents.startWorkerElement: | |
32 | try { | |
33 | this.runInAsyncScope( | |
d769e04a | 34 | startChargingStation.bind(this) as (data?: Data) => void, |
f93dda6a JB |
35 | this, |
36 | message.data, | |
37 | ); | |
38 | parentPort?.postMessage({ | |
39 | event: WorkerMessageEvents.startedWorkerElement, | |
40 | }); | |
41 | } catch (error) { | |
42 | parentPort?.postMessage({ | |
43 | event: WorkerMessageEvents.startWorkerElementError, | |
44 | data: { | |
45 | message: (error as Error).message, | |
46 | stack: (error as Error).stack, | |
47 | }, | |
48 | }); | |
49 | } | |
50 | break; | |
51 | default: | |
a6080904 | 52 | throw new BaseError( |
f93dda6a JB |
53 | `Unknown worker event: '${message.event}' received with data: '${JSON.stringify( |
54 | message.data, | |
4ed03b6e | 55 | undefined, |
f93dda6a JB |
56 | 2, |
57 | )}'`, | |
2bb7a73e | 58 | ); |
6b57eb9a JB |
59 | } |
60 | }); | |
61 | } | |
6b57eb9a JB |
62 | } |
63 | ||
d769e04a JB |
64 | export let chargingStationWorker: |
65 | | ChargingStationWorker<ChargingStationWorkerData> | |
66 | | ThreadWorker<ChargingStationWorkerData>; | |
aa7d6d95 | 67 | if (Configuration.workerPoolInUse()) { |
bcbb76a6 | 68 | chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation); |
74bbc59b | 69 | } else { |
d769e04a | 70 | chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>(); |
3d2ff9e4 | 71 | } |