+ [messageType, messageId] = request;
+ // Check the type of message
+ switch (messageType) {
+ // Incoming Message
+ case MessageType.CALL_MESSAGE:
+ [, , commandName, commandPayload] = request as IncomingRequest;
+ if (this.getEnableStatistics()) {
+ this.performanceStatistics.addRequestStatistic(commandName, messageType);
+ }
+ logger.debug(
+ `${this.logPrefix()} << Command '${commandName}' received request payload: ${JSON.stringify(
+ request
+ )}`
+ );
+ // Process the message
+ await this.ocppIncomingRequestService.incomingRequestHandler(
+ messageId,
+ commandName,
+ commandPayload
+ );
+ break;
+ // Outcome Message
+ case MessageType.CALL_RESULT_MESSAGE:
+ [, , commandPayload] = request as Response;
+ // Respond
+ cachedRequest = this.requests.get(messageId);
+ if (Utils.isIterable(cachedRequest)) {
+ [responseCallback, , requestCommandName, requestPayload] = cachedRequest;
+ } else {
+ throw new OCPPError(
+ ErrorType.PROTOCOL_ERROR,
+ `Cached request for message id ${messageId} response is not iterable`,
+ null,
+ cachedRequest as unknown as JsonType
+ );
+ }
+ logger.debug(
+ `${this.logPrefix()} << Command '${
+ requestCommandName ?? ''
+ }' received response payload: ${JSON.stringify(request)}`
+ );
+ if (!responseCallback) {
+ // Error
+ throw new OCPPError(
+ ErrorType.INTERNAL_ERROR,
+ `Response for unknown message id ${messageId}`,
+ null,
+ commandPayload
+ );
+ }
+ responseCallback(commandPayload, requestPayload);
+ break;
+ // Error Message
+ case MessageType.CALL_ERROR_MESSAGE:
+ [, , errorType, errorMessage, errorDetails] = request as ErrorResponse;
+ cachedRequest = this.requests.get(messageId);
+ if (Utils.isIterable(cachedRequest)) {
+ [, rejectCallback, requestCommandName] = cachedRequest;
+ } else {
+ throw new OCPPError(
+ ErrorType.PROTOCOL_ERROR,
+ `Cached request for message id ${messageId} error response is not iterable`,
+ null,
+ cachedRequest as unknown as JsonType
+ );
+ }
+ logger.debug(
+ `${this.logPrefix()} << Command '${
+ requestCommandName ?? ''
+ }' received error payload: ${JSON.stringify(request)}`
+ );
+ if (!rejectCallback) {
+ // Error
+ throw new OCPPError(
+ ErrorType.INTERNAL_ERROR,
+ `Error response for unknown message id ${messageId}`,
+ null,
+ { errorType, errorMessage, errorDetails }
+ );
+ }
+ rejectCallback(
+ new OCPPError(errorType, errorMessage, requestCommandName, errorDetails)
+ );
+ break;
+ // Error
+ default:
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ errMsg = `${this.logPrefix()} Wrong message type ${messageType}`;
+ logger.error(errMsg);
+ throw new OCPPError(ErrorType.PROTOCOL_ERROR, errMsg);
+ }