UNPKG

@node-pigpio/core

Version:
80 lines (79 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.requestFactory = void 0; const responseSize = 16; const fromBuffer = (data) => { if (data.length < responseSize) { return undefined; } const cmd = data.readUInt32LE(0); const p1 = data.readUInt32LE(4); const p2 = data.readUInt32LE(8); const res = data.readInt32LE(12); const extensionData = data.slice(16); const extension = extensionData.length > 0 ? extensionData : undefined; return { cmd, p1, p2, res, extension, }; }; const toBuffer = (req) => { var _a, _b; const extensionSize = (_b = (_a = req.extension) === null || _a === void 0 ? void 0 : _a.byteLength) !== null && _b !== void 0 ? _b : 0; const size = 4 * 4 + extensionSize; const buffer = Buffer.alloc(size); buffer.writeUInt32LE(req.cmd, 0); buffer.writeUInt32LE(req.p1, 4); buffer.writeUInt32LE(req.p2, 8); buffer.writeUInt32LE(extensionSize, 12); if (req.extension) { buffer.set(new Uint8Array(req.extension), 16); } return buffer; }; async function execRequest(sock, request, timeout) { sock.write(toBuffer(request)); if (timeout != null) { setTimeout(() => sock.emit('error', new Error(`timeout of ${timeout} exceeded`)), timeout); } let data = Buffer.alloc(0); let eventOff; return new Promise((resolve, reject) => { const dataListener = (chunk) => { var _a, _b; data = Buffer.concat([data, chunk]); const response = fromBuffer(data); if (response) { if (request.cmd !== response.cmd || request.p1 !== response.p1 || request.p2 !== response.p2) { reject(new Error('Invalid Response')); } // Check extension received if (!request.responseExtension || response.res === ((_b = (_a = response.extension) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0)) { resolve(response); } } }; const errorListener = (error) => { reject(error); }; eventOff = () => { sock.off('data', dataListener); sock.off('error', errorListener); }; sock.on('data', dataListener); sock.on('error', errorListener); }).finally(() => { eventOff(); }); throw new Error('Invalid Response2'); } function requestFactory(sock, request, timeout) { return () => execRequest(sock, request, timeout); } exports.requestFactory = requestFactory;