if (this.chargingStation.isWebSocketConnectionOpened()) {
// Yes: Send Message
const beginId = PerformanceStatistics.beginMeasure(commandName);
+ // FIXME: Handle sending error
this.chargingStation.wsConnection.send(messageToSend);
PerformanceStatistics.endMeasure(commandName, beginId);
} else if (!skipBufferingOnError) {
// Buffer it
this.chargingStation.addToMessageQueue(messageToSend);
+ const ocppError = new OCPPError(ErrorType.GENERIC_ERROR, `WebSocket closed for buffered message id '${messageId}' with content '${messageToSend}'`, commandParams?.details ?? {});
+ if (messageType === MessageType.CALL_MESSAGE) {
+ // Reject it but keep the request in the cache
+ return reject(ocppError);
+ }
+ return rejectCallback(ocppError, false);
+ } else {
// Reject it
- return rejectCallback(new OCPPError(commandParams?.code ?? ErrorType.GENERIC_ERROR, commandParams?.message ?? `WebSocket closed for message id '${messageId}' with content '${messageToSend}', message buffered`, commandParams?.details ?? {}));
+ return rejectCallback(new OCPPError(ErrorType.GENERIC_ERROR, `WebSocket closed for non buffered message id '${messageId}' with content '${messageToSend}'`, commandParams?.details ?? {}), false);
}
// Response?
- if (messageType === MessageType.CALL_RESULT_MESSAGE) {
+ if (messageType !== MessageType.CALL_MESSAGE) {
// Yes: send Ok
- resolve(commandName);
- } else if (messageType === MessageType.CALL_ERROR_MESSAGE) {
+ resolve(commandParams);
+ } else {
// Send timeout
- setTimeout(() => rejectCallback(new OCPPError(commandParams?.code ?? ErrorType.GENERIC_ERROR, commandParams?.message ?? `Timeout for message id '${messageId}' with content '${messageToSend}'`, commandParams?.details ?? {})), Constants.OCPP_ERROR_TIMEOUT);
+ setTimeout(() => rejectCallback(new OCPPError(ErrorType.GENERIC_ERROR, `Timeout for message id '${messageId}' with content '${messageToSend}'`, commandParams?.details ?? {}), false), Constants.OCPP_SOCKET_TIMEOUT);
}
/**
}
// Send the response
await self.ocppResponseService.handleResponse(commandName as RequestCommand, payload, requestPayload);
+ self.chargingStation.requests.delete(messageId);
resolve(payload);
}
/**
- * Function that will receive the request's rejection
+ * Function that will receive the request's error response
*
* @param error
+ * @param requestStatistic
*/
- function rejectCallback(error: OCPPError): void {
- if (self.chargingStation.getEnableStatistics()) {
+ function rejectCallback(error: OCPPError, requestStatistic = true): void {
+ if (requestStatistic && self.chargingStation.getEnableStatistics()) {
self.chargingStation.performanceStatistics.addRequestStatistic(commandName, MessageType.CALL_ERROR_MESSAGE);
}
- logger.debug(`${self.chargingStation.logPrefix()} Error: %j occurred when calling command %s with parameters: %j`, error, commandName, commandParams);
- // Build Exception
- // eslint-disable-next-line no-empty-function
- self.chargingStation.requests.set(messageId, [() => { /* This is intentiomal */ }, () => { /* This is intentiomal */ }, {}]);
- // Send error
+ logger.error(`${self.chargingStation.logPrefix()} Error %j occurred when calling command %s with parameters %j`, error, commandName, commandParams);
+ self.chargingStation.requests.delete(messageId);
reject(error);
}
});
throw error;
}
- private buildMessageToSend(messageId: string, commandParams: any, messageType: MessageType, commandName: RequestCommand | IncomingRequestCommand,
- responseCallback: (payload: Record<string, unknown> | string, requestPayload: Record<string, unknown>) => Promise<void>, rejectCallback: (error: OCPPError) => void): string {
+ private buildMessageToSend(messageId: string, commandParams: Record<string, unknown>, messageType: MessageType, commandName: RequestCommand | IncomingRequestCommand,
+ responseCallback: (payload: Record<string, unknown> | string, requestPayload: Record<string, unknown>) => Promise<void>,
+ rejectCallback: (error: OCPPError, requestStatistic?: boolean) => void): string {
let messageToSend: string;
// Type of message
switch (messageType) {
// Request
case MessageType.CALL_MESSAGE:
// Build request
- this.chargingStation.requests.set(messageId, [responseCallback, rejectCallback, commandParams as Record<string, unknown>]);
+ this.chargingStation.requests.set(messageId, [responseCallback, rejectCallback, commandName, commandParams]);
messageToSend = JSON.stringify([messageType, messageId, commandName, commandParams]);
break;
// Response