UNPKG

@evpower/ocpp-ts

Version:

OCPP 1.6: Open Charge Point Protocol

160 lines 13.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Protocol = void 0; const uuid_1 = require("uuid"); const schemas_1 = __importDefault(require("./schemas")); const OcppError_1 = require("./OcppError"); const SchemaValidator_1 = require("./SchemaValidator"); const CALL_MESSAGE = 2; // Client-to-Server const CALLRESULT_MESSAGE = 3; // Server-to-Client const CALLERROR_MESSAGE = 4; // Server-to-Client class Protocol { constructor(eventEmitter, socket, timeout) { this.pendingCalls = {}; this.timeout = 30000; this.eventEmitter = eventEmitter; this.socket = socket; this.socket.on('message', (message) => { this.onMessage(message.toString()); }); Protocol.schemaHolder = schemas_1.default; Object.keys(Protocol.schemaHolder).forEach((key) => { Protocol.validators[key] = new SchemaValidator_1.SchemaValidator(Protocol.schemaHolder[key]); }); this.timeout = timeout; } onMessage(message) { try { const [messageType, ...rest] = JSON.parse(message); if (!Array.isArray(rest)) { throw new Error('ProtocolError'); } if (messageType === CALL_MESSAGE && rest.length === 3) { const [messageId, action, payload] = rest; this.onCall(messageId, action, payload); } else if (messageType === CALLRESULT_MESSAGE && rest.length === 2) { const [messageId, payload] = rest; this.onCallResult(messageId, payload); } else if (messageType === CALLERROR_MESSAGE && rest.length === 4) { const [messageId, errorCode, errorDescription, errorDetails] = rest; this.onCallError(messageId, errorCode, errorDescription, errorDetails); } else { throw new Error('ProtocolError'); } } catch (err) { if (err instanceof SyntaxError || err instanceof Error) { console.error(err.message); } } } callRequest(request, payload) { return new Promise((resolve, reject) => { try { const messageId = (0, uuid_1.v4)(); const result = JSON.stringify([CALL_MESSAGE, messageId, request, payload]); this.socket.send(result); this.pendingCalls[messageId] = { resolve, reject, }; setTimeout(() => { // timeout error this.onCallError(messageId, OcppError_1.ERROR_INTERNALERROR, `No response from the client for: ${this.timeout}ms, for ${request}`, {}); }, this.timeout); } catch (e) { console.error(e); reject(e); } }); } callError(messageId, error) { try { const result = JSON.stringify([CALLERROR_MESSAGE, messageId, error.code, error.message, error.details || {}]); this.socket.send(result); } catch (e) { console.error(e); } } onCallError(messageId, errorCode, errorDescription, errorDetails) { if (this.pendingCalls[messageId]) { const { reject } = this.pendingCalls[messageId]; if (reject) { reject(new OcppError_1.OcppError(errorCode, errorDescription, errorDetails)); } delete this.pendingCalls[messageId]; } } onCallResult(messageId, payload) { if (this.pendingCalls[messageId]) { const { resolve } = this.pendingCalls[messageId]; if (resolve) { resolve(payload); } delete this.pendingCalls[messageId]; } } async onCall(messageId, request, payload) { try { // @ts-ignore const validator = Protocol.validators[request]; validator.validate(payload); const response = await new Promise((resolve, reject) => { setTimeout(() => { // timeout error reject(new OcppError_1.OcppError(OcppError_1.ERROR_INTERNALERROR, 'No response from the handler')); }, this.timeout); const hasListener = this.eventEmitter.emit(request, payload, (result) => { resolve(result); }); if (!hasListener) { reject(new OcppError_1.OcppError(OcppError_1.ERROR_NOTIMPLEMENTED, `Listener for action "${request}" not set`)); } }); this.callResult(messageId, request, response); } catch (e) { if (e instanceof OcppError_1.OcppError) { this.callError(messageId, e); } else { this.callError(messageId, new OcppError_1.OcppError(OcppError_1.ERROR_INTERNALERROR, 'An internal error occurred and the receiver was not able to process the requested Action')); } } } callResult(messageId, action, responsePayload) { try { const result = JSON.stringify([ CALLRESULT_MESSAGE, messageId, responsePayload ]); this.socket.send(result); } catch (e) { if (e instanceof SyntaxError) { this.callError(messageId, new OcppError_1.OcppError(OcppError_1.ERROR_INTERNALERROR, 'Response payload is invalid')); console.error(e.message); } } } } exports.Protocol = Protocol; Protocol.schemaHolder = {}; Protocol.validators = {}; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW1wbC9Qcm90b2NvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSwrQkFBb0M7QUFFcEMsd0RBQWdDO0FBQ2hDLDJDQUlxQjtBQUNyQix1REFBb0Q7QUFFcEQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0FBQ2pELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0FBRWhELE1BQWEsUUFBUTtJQVNuQixZQUFZLFlBQTBCLEVBQUUsTUFBaUIsRUFBRSxPQUFlO1FBTjFFLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBS2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV0QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLFlBQVksR0FBRyxpQkFBTyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pELFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxpQ0FBZSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lB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