build(simulator): switch to strict type checking
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16IncomingRequestService.ts
index 50c46f29553109b3618c00b31ad55e32c87b6be9..5fa160c3fa453ace012e645d4039f5efda0d1b25 100644 (file)
@@ -115,49 +115,73 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     // }
     super(OCPPVersion.VERSION_16);
     this.incomingRequestHandlers = new Map<OCPP16IncomingRequestCommand, IncomingRequestHandler>([
-      [OCPP16IncomingRequestCommand.RESET, this.handleRequestReset.bind(this)],
-      [OCPP16IncomingRequestCommand.CLEAR_CACHE, this.handleRequestClearCache.bind(this)],
-      [OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR, this.handleRequestUnlockConnector.bind(this)],
+      [
+        OCPP16IncomingRequestCommand.RESET,
+        this.handleRequestReset.bind(this) as unknown as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.CLEAR_CACHE,
+        this.handleRequestClearCache.bind(this) as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR,
+        this.handleRequestUnlockConnector.bind(this) as unknown as IncomingRequestHandler,
+      ],
       [
         OCPP16IncomingRequestCommand.GET_CONFIGURATION,
-        this.handleRequestGetConfiguration.bind(this),
+        this.handleRequestGetConfiguration.bind(this) as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.CHANGE_CONFIGURATION,
-        this.handleRequestChangeConfiguration.bind(this),
+        this.handleRequestChangeConfiguration.bind(this) as unknown as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.GET_COMPOSITE_SCHEDULE,
-        this.handleRequestGetCompositeSchedule.bind(this),
+        this.handleRequestGetCompositeSchedule.bind(this) as unknown as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE,
-        this.handleRequestSetChargingProfile.bind(this),
+        this.handleRequestSetChargingProfile.bind(this) as unknown as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE,
-        this.handleRequestClearChargingProfile.bind(this),
+        this.handleRequestClearChargingProfile.bind(this) as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY,
-        this.handleRequestChangeAvailability.bind(this),
+        this.handleRequestChangeAvailability.bind(this) as unknown as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION,
-        this.handleRequestRemoteStartTransaction.bind(this),
+        this.handleRequestRemoteStartTransaction.bind(this) as unknown as IncomingRequestHandler,
       ],
       [
         OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION,
-        this.handleRequestRemoteStopTransaction.bind(this),
+        this.handleRequestRemoteStopTransaction.bind(this) as unknown as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
+        this.handleRequestGetDiagnostics.bind(this) as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
+        this.handleRequestTriggerMessage.bind(this) as unknown as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.DATA_TRANSFER,
+        this.handleRequestDataTransfer.bind(this) as unknown as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.UPDATE_FIRMWARE,
+        this.handleRequestUpdateFirmware.bind(this) as unknown as IncomingRequestHandler,
+      ],
+      [
+        OCPP16IncomingRequestCommand.RESERVE_NOW,
+        this.handleRequestReserveNow.bind(this) as unknown as IncomingRequestHandler,
       ],
-      [OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, this.handleRequestGetDiagnostics.bind(this)],
-      [OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, this.handleRequestTriggerMessage.bind(this)],
-      [OCPP16IncomingRequestCommand.DATA_TRANSFER, this.handleRequestDataTransfer.bind(this)],
-      [OCPP16IncomingRequestCommand.UPDATE_FIRMWARE, this.handleRequestUpdateFirmware.bind(this)],
-      [OCPP16IncomingRequestCommand.RESERVE_NOW, this.handleRequestReserveNow.bind(this)],
       [
         OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
-        this.handleRequestCancelReservation.bind(this),
+        this.handleRequestCancelReservation.bind(this) as unknown as IncomingRequestHandler,
       ],
     ]);
     this.jsonSchemas = new Map<OCPP16IncomingRequestCommand, JSONSchemaType<JsonObject>>([
@@ -305,13 +329,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     ) => boolean;
   }
 
-  public async incomingRequestHandler(
+  public async incomingRequestHandler<ReqType extends JsonType, ResType extends JsonType>(
     chargingStation: ChargingStation,
     messageId: string,
     commandName: OCPP16IncomingRequestCommand,
-    commandPayload: JsonType,
+    commandPayload: ReqType,
   ): Promise<void> {
-    let response: JsonType;
+    let response: ResType;
     if (
       chargingStation.getOcppStrictCompliance() === true &&
       chargingStation.inPendingState() === true &&
@@ -341,10 +365,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         try {
           this.validatePayload(chargingStation, commandName, commandPayload);
           // Call the method to build the response
-          response = await this.incomingRequestHandlers.get(commandName)(
+          response = (await this.incomingRequestHandlers.get(commandName)!(
             chargingStation,
             commandPayload,
-          );
+          )) as ResType;
         } catch (error) {
           // Log
           logger.error(
@@ -397,7 +421,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       return this.validateIncomingRequestPayload(
         chargingStation,
         commandName,
-        this.jsonSchemas.get(commandName),
+        this.jsonSchemas.get(commandName)!,
         commandPayload,
       );
     }
@@ -416,7 +440,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     this.runInAsyncScope(
       chargingStation.reset.bind(chargingStation) as (
         this: ChargingStation,
-        ...args: any[]
+        ...args: unknown[]
       ) => Promise<void>,
       chargingStation,
       `${commandPayload.type}Reset` as OCPP16StopTransactionReason,
@@ -425,7 +449,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       `${chargingStation.logPrefix()} ${
         commandPayload.type
       } reset command received, simulating it. The station will be
-        back online in ${formatDurationMilliSeconds(chargingStation.stationInfo.resetTime)}`,
+        back online in ${formatDurationMilliSeconds(chargingStation.stationInfo.resetTime!)}`,
     );
     return OCPP16Constants.OCPP_RESPONSE_ACCEPTED;
   }
@@ -473,7 +497,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     const configurationKey: OCPPConfigurationKey[] = [];
     const unknownKey: string[] = [];
     if (isUndefined(commandPayload.key) === true) {
-      for (const configuration of chargingStation.ocppConfiguration.configurationKey) {
+      for (const configuration of chargingStation.ocppConfiguration!.configurationKey!) {
         if (isUndefined(configuration.visible) === true) {
           configuration.visible = true;
         }
@@ -487,7 +511,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         });
       }
     } else if (isNotEmptyArray(commandPayload.key) === true) {
-      for (const key of commandPayload.key) {
+      for (const key of commandPayload.key!) {
         const keyFound = ChargingStationConfigurationUtils.getConfigurationKey(
           chargingStation,
           key,
@@ -525,9 +549,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       commandPayload.key,
       true,
     );
-    if (!keyToChange) {
-      return OCPP16Constants.OCPP_CONFIGURATION_RESPONSE_NOT_SUPPORTED;
-    } else if (keyToChange?.readonly === true) {
+    if (keyToChange?.readonly === true) {
       return OCPP16Constants.OCPP_CONFIGURATION_RESPONSE_REJECTED;
     } else if (keyToChange?.readonly === false) {
       let valueChanged = false;
@@ -541,7 +563,11 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         valueChanged = true;
       }
       let triggerHeartbeatRestart = false;
-      if (keyToChange.key === OCPP16StandardParametersKey.HeartBeatInterval && valueChanged) {
+      if (
+        (keyToChange.key as OCPP16StandardParametersKey) ===
+          OCPP16StandardParametersKey.HeartBeatInterval &&
+        valueChanged
+      ) {
         ChargingStationConfigurationUtils.setConfigurationKeyValue(
           chargingStation,
           OCPP16StandardParametersKey.HeartbeatInterval,
@@ -549,7 +575,11 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         );
         triggerHeartbeatRestart = true;
       }
-      if (keyToChange.key === OCPP16StandardParametersKey.HeartbeatInterval && valueChanged) {
+      if (
+        (keyToChange.key as OCPP16StandardParametersKey) ===
+          OCPP16StandardParametersKey.HeartbeatInterval &&
+        valueChanged
+      ) {
         ChargingStationConfigurationUtils.setConfigurationKeyValue(
           chargingStation,
           OCPP16StandardParametersKey.HeartBeatInterval,
@@ -560,7 +590,11 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       if (triggerHeartbeatRestart) {
         chargingStation.restartHeartbeat();
       }
-      if (keyToChange.key === OCPP16StandardParametersKey.WebSocketPingInterval && valueChanged) {
+      if (
+        (keyToChange.key as OCPP16StandardParametersKey) ===
+          OCPP16StandardParametersKey.WebSocketPingInterval &&
+        valueChanged
+      ) {
         chargingStation.restartWebSocketPing();
       }
       if (keyToChange.reboot) {
@@ -568,6 +602,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       }
       return OCPP16Constants.OCPP_CONFIGURATION_RESPONSE_ACCEPTED;
     }
+    return OCPP16Constants.OCPP_CONFIGURATION_RESPONSE_NOT_SUPPORTED;
   }
 
   private handleRequestSetChargingProfile(
@@ -632,7 +667,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       OCPP16ServiceUtils.checkFeatureProfile(
         chargingStation,
         OCPP16SupportedFeatureProfiles.SmartCharging,
-        OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE,
+        OCPP16IncomingRequestCommand.GET_COMPOSITE_SCHEDULE,
       ) === false
     ) {
       return OCPP16Constants.OCPP_RESPONSE_REJECTED;
@@ -651,13 +686,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     }
     const startDate = new Date();
     const endDate = new Date(startDate.getTime() + commandPayload.duration * 1000);
-    let compositeSchedule: OCPP16ChargingSchedule;
-    for (const chargingProfile of chargingStation.getConnectorStatus(commandPayload.connectorId)
-      .chargingProfiles) {
+    let compositeSchedule: OCPP16ChargingSchedule | undefined;
+    for (const chargingProfile of chargingStation.getConnectorStatus(commandPayload.connectorId)!
+      .chargingProfiles!) {
       // FIXME: build the composite schedule including the local power limit, the stack level, the charging rate unit, etc.
       if (
-        chargingProfile.chargingSchedule?.startSchedule >= startDate &&
-        chargingProfile.chargingSchedule?.startSchedule <= endDate
+        chargingProfile.chargingSchedule.startSchedule! >= startDate &&
+        chargingProfile.chargingSchedule.startSchedule! <= endDate
       ) {
         compositeSchedule = chargingProfile.chargingSchedule;
         break;
@@ -684,7 +719,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     ) {
       return OCPP16Constants.OCPP_CLEAR_CHARGING_PROFILE_RESPONSE_UNKNOWN;
     }
-    if (chargingStation.hasConnector(commandPayload.connectorId) === false) {
+    if (chargingStation.hasConnector(commandPayload.connectorId!) === false) {
       logger.error(
         `${chargingStation.logPrefix()} Trying to clear a charging profile(s) to
           a non existing connector id ${commandPayload.connectorId}`,
@@ -694,10 +729,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     if (
       !isNullOrUndefined(commandPayload.connectorId) &&
       isNotEmptyArray(
-        chargingStation.getConnectorStatus(commandPayload.connectorId)?.chargingProfiles,
+        chargingStation.getConnectorStatus(commandPayload.connectorId!)?.chargingProfiles,
       )
     ) {
-      chargingStation.getConnectorStatus(commandPayload.connectorId).chargingProfiles = [];
+      chargingStation.getConnectorStatus(commandPayload.connectorId!)!.chargingProfiles = [];
       logger.debug(
         `${chargingStation.logPrefix()} Charging profile(s) cleared on connector id ${
           commandPayload.connectorId
@@ -753,7 +788,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         }
       } else {
         for (const connectorId of chargingStation.connectors.keys()) {
-          clearChargingProfiles(chargingStation.getConnectorStatus(connectorId));
+          clearChargingProfiles(chargingStation.getConnectorStatus(connectorId)!);
         }
       }
       if (clearedCP) {
@@ -803,7 +838,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         }
       } else {
         for (const id of chargingStation.connectors.keys()) {
-          await changeAvailability(id, chargingStation.getConnectorStatus(id));
+          await changeAvailability(id, chargingStation.getConnectorStatus(id)!);
         }
       }
       return response;
@@ -814,10 +849,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           commandPayload.type === OCPP16AvailabilityType.Inoperative))
     ) {
       if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
-        chargingStation.getConnectorStatus(connectorId).availability = commandPayload.type;
+        chargingStation.getConnectorStatus(connectorId)!.availability = commandPayload.type;
         return OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_SCHEDULED;
       }
-      chargingStation.getConnectorStatus(connectorId).availability = commandPayload.type;
+      chargingStation.getConnectorStatus(connectorId)!.availability = commandPayload.type;
       await OCPP16ServiceUtils.sendAndSetConnectorStatus(
         chargingStation,
         connectorId,
@@ -834,10 +869,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
   ): Promise<GenericResponse> {
     const { connectorId: transactionConnectorId, idTag, chargingProfile } = commandPayload;
     const reserved =
-      chargingStation.getConnectorStatus(transactionConnectorId).status ===
+      chargingStation.getConnectorStatus(transactionConnectorId)!.status ===
       OCPP16ChargePointStatus.Reserved;
     const reservedOnConnectorZero =
-      chargingStation.getConnectorStatus(0).status === OCPP16ChargePointStatus.Reserved;
+      chargingStation.getConnectorStatus(0)!.status === OCPP16ChargePointStatus.Reserved;
     if (
       (reserved &&
         !chargingStation.validateIncomingRequestWithReservation(transactionConnectorId, idTag)) ||
@@ -871,7 +906,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       transactionConnectorId,
       OCPP16ChargePointStatus.Preparing,
     );
-    const connectorStatus = chargingStation.getConnectorStatus(transactionConnectorId);
+    const connectorStatus = chargingStation.getConnectorStatus(transactionConnectorId)!;
     // Check if authorized
     if (
       chargingStation.getAuthorizeRemoteTxRequests() &&
@@ -882,7 +917,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         this.setRemoteStartTransactionChargingProfile(
           chargingStation,
           transactionConnectorId,
-          chargingProfile,
+          chargingProfile!,
         ) === true
       ) {
         connectorStatus.transactionRemoteStarted = true;
@@ -894,7 +929,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           const reservation = chargingStation.getReservationBy(
             ReservationFilterKey.CONNECTOR_ID,
             reservedOnConnectorZero ? 0 : transactionConnectorId,
-          );
+          )!;
           startTransactionPayload.reservationId = reservation.id;
           await chargingStation.removeReservation(
             reservation,
@@ -929,7 +964,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       this.setRemoteStartTransactionChargingProfile(
         chargingStation,
         transactionConnectorId,
-        chargingProfile,
+        chargingProfile!,
       ) === true
     ) {
       connectorStatus.transactionRemoteStarted = true;
@@ -1003,9 +1038,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         } charging profile(s) at remote start transaction`,
       );
       return false;
-    } else if (!cp) {
-      return true;
     }
+    return true;
   }
 
   private async handleRequestRemoteStopTransaction(
@@ -1082,13 +1116,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       );
       return OCPP16Constants.OCPP_RESPONSE_EMPTY;
     }
-    const retrieveDate = convertToDate(commandPayload.retrieveDate);
+    const retrieveDate = convertToDate(commandPayload.retrieveDate)!;
     const now = Date.now();
     if (retrieveDate?.getTime() <= now) {
       this.runInAsyncScope(
         this.updateFirmwareSimulation.bind(this) as (
           this: OCPP16IncomingRequestService,
-          ...args: any[]
+          ...args: unknown[]
         ) => Promise<void>,
         this,
         chargingStation,
@@ -1099,7 +1133,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           this.runInAsyncScope(
             this.updateFirmwareSimulation.bind(this) as (
               this: OCPP16IncomingRequestService,
-              ...args: any[]
+              ...args: unknown[]
             ) => Promise<void>,
             this,
             chargingStation,
@@ -1276,7 +1310,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     }
     const uri = new URL(commandPayload.location);
     if (uri.protocol.startsWith('ftp:')) {
-      let ftpClient: Client;
+      let ftpClient: Client | undefined;
       try {
         const logFiles = readdirSync(resolve(dirname(fileURLToPath(import.meta.url)), '../'))
           .filter((file) => file.endsWith('.log'))
@@ -1290,7 +1324,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           ...(isNotEmptyString(uri.username) && { user: uri.username }),
           ...(isNotEmptyString(uri.password) && { password: uri.password }),
         });
-        let uploadResponse: FTPResponse;
+        let uploadResponse: FTPResponse | undefined;
         if (accessResponse.code === 220) {
           ftpClient.trackProgress((info) => {
             logger.info(
@@ -1354,12 +1388,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         if (ftpClient) {
           ftpClient.close();
         }
-        return this.handleIncomingRequestError(
+        return this.handleIncomingRequestError<GetDiagnosticsResponse>(
           chargingStation,
           OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
           error as Error,
           { errorResponse: OCPP16Constants.OCPP_RESPONSE_EMPTY },
-        );
+        )!;
       }
     } else {
       logger.error(
@@ -1398,7 +1432,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       !OCPP16ServiceUtils.isConnectorIdValid(
         chargingStation,
         OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
-        commandPayload.connectorId,
+        commandPayload.connectorId!,
       )
     ) {
       return OCPP16Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_REJECTED;
@@ -1444,7 +1478,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
                   {
                     connectorId: commandPayload.connectorId,
                     errorCode: OCPP16ChargePointErrorCode.NO_ERROR,
-                    status: chargingStation.getConnectorStatus(commandPayload.connectorId)?.status,
+                    status: chargingStation.getConnectorStatus(commandPayload.connectorId!)?.status,
                   },
                   {
                     triggerMessage: true,
@@ -1503,12 +1537,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           return OCPP16Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_NOT_IMPLEMENTED;
       }
     } catch (error) {
-      return this.handleIncomingRequestError(
+      return this.handleIncomingRequestError<OCPP16TriggerMessageResponse>(
         chargingStation,
         OCPP16IncomingRequestCommand.TRIGGER_MESSAGE,
         error as Error,
         { errorResponse: OCPP16Constants.OCPP_TRIGGER_MESSAGE_RESPONSE_REJECTED },
-      );
+      )!;
     }
   }
 
@@ -1522,12 +1556,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       }
       return OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_UNKNOWN_VENDOR_ID;
     } catch (error) {
-      return this.handleIncomingRequestError(
+      return this.handleIncomingRequestError<OCPP16DataTransferResponse>(
         chargingStation,
         OCPP16IncomingRequestCommand.DATA_TRANSFER,
         error as Error,
         { errorResponse: OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED },
-      );
+      )!;
     }
   }
 
@@ -1556,7 +1590,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       if (!(await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, connectorId, idTag))) {
         return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED;
       }
-      switch (chargingStation.getConnectorStatus(connectorId).status) {
+      switch (chargingStation.getConnectorStatus(connectorId)!.status) {
         case OCPP16ChargePointStatus.Faulted:
           response = OCPP16Constants.OCPP_RESERVATION_RESPONSE_FAULTED;
           break;
@@ -1590,13 +1624,13 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       }
       return response;
     } catch (error) {
-      chargingStation.getConnectorStatus(connectorId).status = OCPP16ChargePointStatus.Available;
-      return this.handleIncomingRequestError(
+      chargingStation.getConnectorStatus(connectorId)!.status = OCPP16ChargePointStatus.Available;
+      return this.handleIncomingRequestError<OCPP16ReserveNowResponse>(
         chargingStation,
         OCPP16IncomingRequestCommand.RESERVE_NOW,
         error as Error,
         { errorResponse: OCPP16Constants.OCPP_RESERVATION_RESPONSE_FAULTED },
-      );
+      )!;
     }
   }
 
@@ -1624,17 +1658,17 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         return OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED;
       }
       await chargingStation.removeReservation(
-        reservation,
+        reservation!,
         ReservationTerminationReason.RESERVATION_CANCELED,
       );
       return OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_ACCEPTED;
     } catch (error) {
-      return this.handleIncomingRequestError(
+      return this.handleIncomingRequestError<GenericResponse>(
         chargingStation,
         OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
         error as Error,
         { errorResponse: OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED },
-      );
+      )!;
     }
   }
 }