1 // Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
3 import { parentPort
} from
'node:worker_threads'
5 import { ThreadWorker
} from
'poolifier'
7 import { BaseError
} from
'../exception/index.js'
8 import type { ChargingStationInfo
, ChargingStationWorkerData
} from
'../types/index.js'
9 import { Configuration
} from
'../utils/index.js'
10 import { type WorkerDataError
, type WorkerMessage
, WorkerMessageEvents
} from
'../worker/index.js'
11 import { ChargingStation
} from
'./ChargingStation.js'
13 export let chargingStationWorker
: object
14 if (Configuration
.workerPoolInUse()) {
15 chargingStationWorker
= new ThreadWorker
<
16 ChargingStationWorkerData
,
17 ChargingStationInfo
| undefined
18 >((data
?: ChargingStationWorkerData
): ChargingStationInfo
| undefined => {
19 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
20 const { index
, templateFile
, options
} = data
!
21 return new ChargingStation(index
, templateFile
, options
).stationInfo
24 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
25 class ChargingStationWorker
<Data
extends ChargingStationWorkerData
> {
27 parentPort
?.on('message', (message
: WorkerMessage
<Data
>) => {
28 const { uuid
, event
, data
} = message
29 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
32 case WorkerMessageEvents
.addWorkerElement
:
34 const chargingStation
= new ChargingStation(
39 parentPort
?.postMessage({
41 event
: WorkerMessageEvents
.addedWorkerElement
,
42 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
43 data
: chargingStation
.stationInfo
!
44 } satisfies WorkerMessage
<ChargingStationInfo
>)
46 parentPort
?.postMessage({
48 event
: WorkerMessageEvents
.workerElementError
,
51 name
: (error
as Error).name
,
52 message
: (error
as Error).message
,
53 stack
: (error
as Error).stack
55 } satisfies WorkerMessage
<WorkerDataError
>)
60 `Unknown worker message event: '${event}' received with data: '${JSON.stringify(
71 chargingStationWorker
= new ChargingStationWorker
<ChargingStationWorkerData
>()