@node-pigpio/core
Version:
pigpiod client for node.js
80 lines (79 loc) • 2.73 kB
JavaScript
;
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;