From f7869514b1450a852ff707ba1a3beaecccea9ba7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 16 Apr 2020 11:13:54 +0200 Subject: [PATCH] Finalize Constants conversion to ES6 module definition. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/ChargingStation.js | 49 +++--- src/charging-station/Worker.js | 4 + src/index.js | 4 - src/utils/Constants.js | 214 ++++++++++++------------ 4 files changed, 132 insertions(+), 139 deletions(-) diff --git a/src/charging-station/ChargingStation.js b/src/charging-station/ChargingStation.js index 4ebb52af..f6ed3062 100644 --- a/src/charging-station/ChargingStation.js +++ b/src/charging-station/ChargingStation.js @@ -1,14 +1,7 @@ const Configuration = require('../utils/Configuration'); const logger = require('../utils/Logger'); const WebSocket = require('ws'); -const { - OCPP_JSON_CALL_MESSAGE, - OCPP_JSON_CALL_RESULT_MESSAGE, - OCPP_JSON_CALL_ERROR_MESSAGE, - OCPP_ERROR_INTERNAL_ERROR, - OCPP_SOCKET_TIMEOUT, - OCPP_ERROR_NOT_IMPLEMENTED, -} = require('../utils/Constants'); +const Constants = require('../utils/Constants'); const Utils = require('../utils/Utils'); const OCPPError = require('./OcppError'); const {v4: uuid} = require('uuid'); @@ -147,7 +140,7 @@ class ChargingStation { } else { // At first start, send Bootnotification try { - this.sendMessage(uuid(), this._bootNotificationMessage, OCPP_JSON_CALL_MESSAGE, 'BootNotification'); + this.sendMessage(uuid(), this._bootNotificationMessage, Constants.OCPP_JSON_CALL_MESSAGE, 'BootNotification'); } catch (error) { logger.error(this._basicFormatLog() + ' Send boot notification error: ' + error); } @@ -194,13 +187,13 @@ class ChargingStation { // Check the Type of message switch (messageType) { // Incoming Message - case OCPP_JSON_CALL_MESSAGE: + case Constants.OCPP_JSON_CALL_MESSAGE: // Process the call this._statistics.addMessage(commandName); await this.handleRequest(messageId, commandName, commandPayload); break; // Outcome Message - case OCPP_JSON_CALL_RESULT_MESSAGE: + case Constants.OCPP_JSON_CALL_RESULT_MESSAGE: // Respond // eslint-disable-next-line no-case-declarations let responseCallback; let requestPayload; @@ -218,7 +211,7 @@ class ChargingStation { responseCallback(commandName, requestPayload); break; // Error Message - case OCPP_JSON_CALL_ERROR_MESSAGE: + case Constants.OCPP_JSON_CALL_ERROR_MESSAGE: if (!this._requests[messageId]) { // Error throw new Error(`Error for unknown message id ${messageId}`); @@ -270,19 +263,19 @@ class ChargingStation { } } - send(command, messageType = OCPP_JSON_CALL_MESSAGE) { + send(command, messageType = Constants.OCPP_JSON_CALL_MESSAGE) { // Send Message return this.sendMessage(uuid(), command, messageType); } sendError(messageId, err) { // Check exception: only OCPP error are accepted - const error = (err instanceof OCPPError ? err : new OCPPError(OCPP_ERROR_INTERNAL_ERROR, err.message)); + const error = (err instanceof OCPPError ? err : new OCPPError(Constants.OCPP_ERROR_INTERNAL_ERROR, err.message)); // Send error - return this.sendMessage(messageId, error, OCPP_JSON_CALL_ERROR_MESSAGE); + return this.sendMessage(messageId, error, Constants.OCPP_JSON_CALL_ERROR_MESSAGE); } - sendMessage(messageId, command, messageType = OCPP_JSON_CALL_RESULT_MESSAGE, commandName = '') { + sendMessage(messageId, command, messageType = Constants.OCPP_JSON_CALL_RESULT_MESSAGE, commandName = '') { // Send a message through wsConnection const self = this; // Create a promise @@ -291,19 +284,19 @@ class ChargingStation { // Type of message switch (messageType) { // Request - case OCPP_JSON_CALL_MESSAGE: + case Constants.OCPP_JSON_CALL_MESSAGE: this._statistics.addMessage(commandName); // Build request this._requests[messageId] = [responseCallback, rejectCallback, command]; messageToSend = JSON.stringify([messageType, messageId, commandName, command]); break; // Response - case OCPP_JSON_CALL_RESULT_MESSAGE: + case Constants.OCPP_JSON_CALL_RESULT_MESSAGE: // Build response messageToSend = JSON.stringify([messageType, messageId, command]); break; // Error Message - case OCPP_JSON_CALL_ERROR_MESSAGE: + case Constants.OCPP_JSON_CALL_ERROR_MESSAGE: // Build Message // eslint-disable-next-line no-case-declarations const { @@ -324,13 +317,13 @@ class ChargingStation { this._messageQueue.push(messageToSend); } // Request? - if (messageType !== OCPP_JSON_CALL_MESSAGE) { + if (messageType !== Constants.OCPP_JSON_CALL_MESSAGE) { // Yes: send Ok resolve(); } else if (this._wsConnection.readyState === WebSocket.OPEN) { // Send timeout in case connection is open otherwise wait for ever // FIXME: Handle message on timeout - setTimeout(() => rejectCallback(`Timeout for message ${messageId}`), OCPP_SOCKET_TIMEOUT); + setTimeout(() => rejectCallback(`Timeout for message ${messageId}`), Constants.OCPP_SOCKET_TIMEOUT); } // Function that will receive the request's response @@ -450,7 +443,7 @@ class ChargingStation { errorCode, status, }; - await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StatusNotification'); + await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StatusNotification'); } catch (error) { logger.error(this._basicFormatLog() + ' Send status error: ' + error); } @@ -465,7 +458,7 @@ class ChargingStation { const payload = { currentTime: new Date().toISOString(), }; - self.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'Heartbeat'); + self.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'Heartbeat'); } catch (error) { logger.error(self._basicFormatLog() + ' Send heartbeat error: ' + error); } @@ -491,11 +484,11 @@ class ChargingStation { } } else { // Throw Exception - await this.sendError(messageId, new OCPPError(OCPP_ERROR_NOT_IMPLEMENTED, 'Not implemented', {})); + await this.sendError(messageId, new OCPPError(Constants.OCPP_ERROR_NOT_IMPLEMENTED, 'Not implemented', {})); throw new Error(`${commandName} is not implemented ${JSON.stringify(commandPayload, null, ' ')}`); } // Send Response - await this.sendMessage(messageId, result, OCPP_JSON_CALL_RESULT_MESSAGE); + await this.sendMessage(messageId, result, Constants.OCPP_JSON_CALL_RESULT_MESSAGE); } async handleGetConfiguration() { @@ -546,7 +539,7 @@ class ChargingStation { meterStart: 0, timestamp: new Date().toISOString(), }; - return await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StartTransaction'); + return await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StartTransaction'); } catch (error) { logger.error(this._basicFormatLog() + ' Send start transaction error: ' + error); this._resetTransactionOnConnector(connectorID); @@ -561,7 +554,7 @@ class ChargingStation { meterStop: 0, timestamp: new Date().toISOString(), }; - await this.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'StopTransaction'); + await this.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'StopTransaction'); logger.info(this._basicFormatLog() + ' Transaction ' + this._connectors[connectorID].transactionId + ' STOPPED on ' + this._stationInfo.name + '#' + connectorID); this.sendStatusNotification(connectorID, 'Available'); } catch (error) { @@ -628,7 +621,7 @@ class ChargingStation { transactionId: self._connectors[connectorID].transactionId, meterValue: [sampledValueLcl], }; - await self.sendMessage(uuid(), payload, OCPP_JSON_CALL_MESSAGE, 'MeterValues'); + await self.sendMessage(uuid(), payload, Constants.OCPP_JSON_CALL_MESSAGE, 'MeterValues'); } catch (error) { logger.error(self._basicFormatLog() + ' Send meter values error: ' + error); } diff --git a/src/charging-station/Worker.js b/src/charging-station/Worker.js index 4b7c68ed..5de059d0 100644 --- a/src/charging-station/Worker.js +++ b/src/charging-station/Worker.js @@ -1,4 +1,5 @@ const Configuration = require('../utils/Configuration'); +const EventEmitter = require('events'); const {Worker} = require('worker_threads'); const Pool = require('worker-threads-pool'); @@ -59,6 +60,9 @@ class Wrk { */ start() { if (Configuration.useWorkerPool()) { + if (Configuration.getWorkerPoolSize() > 10) { + EventEmitter.defaultMaxListeners = Configuration.getWorkerPoolSize() + 1; + } return this._startWorkerWithPool(); } return this._startWorker(); diff --git a/src/index.js b/src/index.js index 3591d11c..a1a5c61b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,4 @@ const Configuration = require('./utils/Configuration'); -const EventEmitter = require('events'); const Utils = require('./utils/Utils'); const Wrk = require('./charging-station/Worker'); const fs = require('fs'); @@ -9,9 +8,6 @@ class Bootstrap { static async start() { try { logger.info('%s Configuration: %j', Utils.basicFormatLog(), Configuration.getConfig()); - if (Configuration.useWorkerPool && Configuration.getWorkerPoolSize() > 10) { - EventEmitter.defaultMaxListeners = Configuration.getWorkerPoolSize() + 1; - } // Start each ChargingStation object in a worker thread if (Configuration.getChargingStationTemplateURLs()) { Configuration.getChargingStationTemplateURLs().forEach((stationURL) => { diff --git a/src/utils/Constants.js b/src/utils/Constants.js index 58e9f728..a7ffe4f4 100644 --- a/src/utils/Constants.js +++ b/src/utils/Constants.js @@ -1,137 +1,137 @@ class Constants { - REST_RESPONSE_SUCCESS = {status = 'Success'}, + static REST_RESPONSE_SUCCESS = {status: 'Success'}; - CONN_STATUS_AVAILABLE = 'Available', - CONN_STATUS_OCCUPIED = 'Occupied', + static CONN_STATUS_AVAILABLE = 'Available'; + static CONN_STATUS_OCCUPIED = 'Occupied'; - STATS_GROUP_BY_CONSUMPTION = 'C', - STATS_GROUP_BY_USAGE = 'U', + static STATS_GROUP_BY_CONSUMPTION = 'C'; + static STATS_GROUP_BY_USAGE = 'U'; // Statuses - ENTITY_SITE = 'Site', - ENTITY_SITES = 'Sites', - ENTITY_SITE_AREA = 'SiteArea', - ENTITY_SITE_AREAS = 'SiteAreas', - ENTITY_COMPANY = 'Company', - ENTITY_COMPANIES = 'Companies', - ENTITY_CHARGING_STATION = 'ChargingStation', - ENTITY_CHARGING_STATIONS = 'ChargingStations', - ENTITY_TENANT = 'Tenant', - ENTITY_TENANTS = 'Tenants', - ENTITY_TRANSACTION = 'Transaction', - ENTITY_TRANSACTIONS = 'Transactions', - ENTITY_TRANSACTION_METER_VALUES = 'MeterValues', - ENTITY_TRANSACTION_STOP = 'Stop', - ENTITY_USER = 'User', - ENTITY_USERS = 'Users', - ENTITY_VEHICLE_MANUFACTURER = 'VehicleManufacturer', - ENTITY_VEHICLE_MANUFACTURERS = 'VehicleManufacturers', - ENTITY_VEHICLES = 'Vehicles', - ENTITY_VEHICLE = 'Vehicle', - ENTITY_LOGGINGS = 'Loggings', - ENTITY_LOGGING = 'Logging', - ENTITY_PRICING = 'Pricing', - - NOTIF_TYPE_CHARGING_STATION_CONFIGURATION = 'Configuration', - - ACTION_READ = 'Read', - ACTION_CREATE = 'Create', - ACTION_UPDATE = 'Update', - ACTION_DELETE = 'Delete', - - NO_LIMIT = 0, - - CENTRAL_SERVER = 'Central Server', - - WITH_CONNECTORS = true, - WITHOUT_CONNECTORS = false, - - WITH_CHARGING_STATIONS = true, - WITHOUT_CHARGING_STATIONS = false, - WITH_SITE = true, - WITHOUT_SITE = false, - - VEHICLE_TYPE_CAR = 'C', + static ENTITY_SITE = 'Site'; + static ENTITY_SITES = 'Sites'; + static ENTITY_SITE_AREA = 'SiteArea'; + static ENTITY_SITE_AREAS = 'SiteAreas'; + static ENTITY_COMPANY = 'Company'; + static ENTITY_COMPANIES = 'Companies'; + static ENTITY_CHARGING_STATION = 'ChargingStation'; + static ENTITY_CHARGING_STATIONS = 'ChargingStations'; + static ENTITY_TENANT = 'Tenant'; + static ENTITY_TENANTS = 'Tenants'; + static ENTITY_TRANSACTION = 'Transaction'; + static ENTITY_TRANSACTIONS = 'Transactions'; + static ENTITY_TRANSACTION_METER_VALUES = 'MeterValues'; + static ENTITY_TRANSACTION_STOP = 'Stop'; + static ENTITY_USER = 'User'; + static ENTITY_USERS = 'Users'; + static ENTITY_VEHICLE_MANUFACTURER = 'VehicleManufacturer'; + static ENTITY_VEHICLE_MANUFACTURERS = 'VehicleManufacturers'; + static ENTITY_VEHICLES = 'Vehicles'; + static ENTITY_VEHICLE = 'Vehicle'; + static ENTITY_LOGGINGS = 'Loggings'; + static ENTITY_LOGGING = 'Logging'; + static ENTITY_PRICING = 'Pricing'; + + static NOTIF_TYPE_CHARGING_STATION_CONFIGURATION = 'Configuration'; + + static ACTION_READ = 'Read'; + static ACTION_CREATE = 'Create'; + static ACTION_UPDATE = 'Update'; + static ACTION_DELETE = 'Delete'; + + static NO_LIMIT = 0; + + static CENTRAL_SERVER = 'Central Server'; + + static WITH_CONNECTORS = true; + static WITHOUT_CONNECTORS = false; + + static WITH_CHARGING_STATIONS = true; + static WITHOUT_CHARGING_STATIONS = false; + static WITH_SITE = true; + static WITHOUT_SITE = false; + + static VEHICLE_TYPE_CAR = 'C'; // Statuses - USER_STATUS_PENDING = 'P', - USER_STATUS_ACTIVE = 'A', - USER_STATUS_DELETED = 'D', - USER_STATUS_INACTIVE = 'I', - USER_STATUS_BLOCKED = 'B', - USER_STATUS_LOCKED = 'L', + static USER_STATUS_PENDING = 'P'; + static USER_STATUS_ACTIVE = 'A'; + static USER_STATUS_DELETED = 'D'; + static USER_STATUS_INACTIVE = 'I'; + static USER_STATUS_BLOCKED = 'B'; + static USER_STATUS_LOCKED = 'L'; // Roles - ROLE_SUPER_ADMIN = 'S', - ROLE_ADMIN = 'A', - ROLE_BASIC = 'B', - ROLE_DEMO = 'D', - ACTION_LOGOUT = 'Logout', - ACTION_LIST = 'List', - ACTION_RESET = 'Reset', - ACTION_AUTHORIZE = 'Authorize', - ACTION_CLEAR_CACHE = 'ClearCache', - ACTION_STOP_TRANSACTION = 'StopTransaction', - ACTION_START_TRANSACTION = 'StartTransaction', - ACTION_REFUND_TRANSACTION = 'RefundTransaction', - ACTION_UNLOCK_CONNECTOR = 'UnlockConnector', - ACTION_GET_CONFIGURATION = 'GetConfiguration', + static ROLE_SUPER_ADMIN = 'S'; + static ROLE_ADMIN = 'A'; + static ROLE_BASIC = 'B'; + static ROLE_DEMO = 'D'; + static ACTION_LOGOUT = 'Logout'; + static ACTION_LIST = 'List'; + static ACTION_RESET = 'Reset'; + static ACTION_AUTHORIZE = 'Authorize'; + static ACTION_CLEAR_CACHE = 'ClearCache'; + static ACTION_STOP_TRANSACTION = 'StopTransaction'; + static ACTION_START_TRANSACTION = 'StartTransaction'; + static ACTION_REFUND_TRANSACTION = 'RefundTransaction'; + static ACTION_UNLOCK_CONNECTOR = 'UnlockConnector'; + static ACTION_GET_CONFIGURATION = 'GetConfiguration'; // Password constants - PWD_MIN_LENGTH = 15, - PWD_MAX_LENGTH = 20, - PWD_UPPERCASE_MIN_COUNT = 1, - PWD_LOWERCASE_MIN_COUNT = 1, - PWD_NUMBER_MIN_COUNT = 1, - PWD_SPECIAL_MIN_COUNT = 1, + static PWD_MIN_LENGTH = 15; + static PWD_MAX_LENGTH = 20; + static PWD_UPPERCASE_MIN_COUNT = 1; + static PWD_LOWERCASE_MIN_COUNT = 1; + static PWD_NUMBER_MIN_COUNT = 1; + static PWD_SPECIAL_MIN_COUNT = 1; - PWD_UPPERCASE_RE = /([A-Z])/g, - PWD_LOWERCASE_RE = /([a-z])/g, - PWD_NUMBER_RE = /([\d])/g, - PWD_SPECIAL_CHAR_RE = /([!#$%^&*.?-])/g, + static PWD_UPPERCASE_RE = /([A-Z])/g; + static PWD_LOWERCASE_RE = /([a-z])/g; + static PWD_NUMBER_RE = /([\d])/g; + static PWD_SPECIAL_CHAR_RE = /([!#$%^&*.?-])/g; - DEFAULT_LOCALE = 'en_US', + static DEFAULT_LOCALE = 'en_US'; - ANONYMIZED_VALUE = '####', + static ANONYMIZED_VALUE = '####'; - DEFAULT_DB_LIMIT = 100, + static DEFAULT_DB_LIMIT = 100; - METER_VALUE_CTX_SAMPLE_PERIODIC = 'Sample.Periodic', - METER_VALUE_CTX_SAMPLE_CLOCK = 'Sample.Clock', + static METER_VALUE_CTX_SAMPLE_PERIODIC = 'Sample.Periodic'; + static METER_VALUE_CTX_SAMPLE_CLOCK = 'Sample.Clock'; - WS_UNSUPPORTED_DATA = 1007, + static WS_UNSUPPORTED_DATA = 1007; - OCPP_SOCKET_TIMEOUT = 60000, // 60 sec - OCPP_JSON_CALL_MESSAGE = 2, // Client-to-Server - OCPP_JSON_CALL_RESULT_MESSAGE = 3, // Server-to-Client - OCPP_JSON_CALL_ERROR_MESSAGE = 4, // Server-to-Client + static OCPP_SOCKET_TIMEOUT = 60000; // 60 sec + static OCPP_JSON_CALL_MESSAGE = 2; // Client-to-Server + static OCPP_JSON_CALL_RESULT_MESSAGE = 3; // Server-to-Client + static OCPP_JSON_CALL_ERROR_MESSAGE = 4; // Server-to-Client // Requested Action is not known by receiver - OCPP_ERROR_NOT_IMPLEMENTED = 'NotImplemented', + static OCPP_ERROR_NOT_IMPLEMENTED = 'NotImplemented'; // Requested Action is recognized but not supported by the receiver - OCPP_ERROR_NOT_SUPPORTED = 'NotSupported', + static OCPP_ERROR_NOT_SUPPORTED = 'NotSupported'; // An internal error occurred and the receiver was not able to process the requested Action successfully - OCPP_ERROR_INTERNAL_ERROR = 'InternalError', + static OCPP_ERROR_INTERNAL_ERROR = 'InternalError'; // Payload for Action is incomplete - OCPP_ERROR_PROTOCOL_ERROR = 'ProtocolError', + static OCPP_ERROR_PROTOCOL_ERROR = 'ProtocolError'; // During the processing of Action a security issue occurred preventing receiver from completing the Action successfully - OCPP_ERROR_SECURITY_ERROR = 'SecurityError', + static OCPP_ERROR_SECURITY_ERROR = 'SecurityError'; // Payload for Action is syntactically incorrect or not conform the PDU structure for Action - OCPP_ERROR_FORMATION_VIOLATION = 'FormationViolation', + static OCPP_ERROR_FORMATION_VIOLATION = 'FormationViolation'; // Payload is syntactically correct but at least one field contains an invalid value - OCPP_ERROR_PROPERTY_RAINT_VIOLATION = 'PropertyraintViolation', + static OCPP_ERROR_PROPERTY_RAINT_VIOLATION = 'PropertyraintViolation'; // Payload for Action is syntactically correct but at least one of the fields violates occurence raints - OCPP_ERROR_OCCURENCE_RAINT_VIOLATION = 'OccurenceraintViolation', + static OCPP_ERROR_OCCURENCE_RAINT_VIOLATION = 'OccurenceraintViolation'; // Payload for Action is syntactically correct but at least one of the fields violates data type raints (e.g. “somestring” = 12) - OCPP_ERROR_TYPERAINT_VIOLATION = 'TyperaintViolation', + static OCPP_ERROR_TYPERAINT_VIOLATION = 'TyperaintViolation'; // Any other error not covered by the previous ones - OCPP_ERROR_GENERIC_ERROR = 'GenericError', - - OCPP_PROTOCOL_JSON = 'json', - OCPP_PROTOCOL_SOAP = 'soap', - OCPP_VERSION_12 = '1.2', - OCPP_VERSION_15 = '1.5', - OCPP_VERSION_16 = '1.6', - OCPP_VERSION_20 = '2.0', -}; + static OCPP_ERROR_GENERIC_ERROR = 'GenericError'; + + static OCPP_PROTOCOL_JSON = 'json'; + static OCPP_PROTOCOL_SOAP = 'soap'; + static OCPP_VERSION_12 = '1.2'; + static OCPP_VERSION_15 = '1.5'; + static OCPP_VERSION_16 = '1.6'; + static OCPP_VERSION_20 = '2.0'; +} module.exports = Constants; -- 2.34.1