@evpower/ocpp-ts
Version:
OCPP 1.6: Open Charge Point Protocol
160 lines • 13.1 kB
JavaScript
;
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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