@u4/adbkit
Version:
A Typescript client for the Android Debug Bridge.
108 lines • 4.2 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MagicError = exports.ChecksumError = void 0;
const events_1 = __importDefault(require("events"));
const packet_1 = __importDefault(require("./packet"));
class ChecksumError extends Error {
constructor(packet) {
super();
this.packet = packet;
Object.setPrototypeOf(this, ChecksumError.prototype);
this.name = 'ChecksumError';
this.message = 'Checksum mismatch';
Error.captureStackTrace(this, PacketReader.ChecksumError);
}
}
exports.ChecksumError = ChecksumError;
class MagicError extends Error {
constructor(packet) {
super();
this.packet = packet;
Object.setPrototypeOf(this, MagicError.prototype);
this.name = 'MagicError';
this.message = 'Magic value mismatch';
Error.captureStackTrace(this, PacketReader.MagicError);
}
}
exports.MagicError = MagicError;
class PacketReader extends events_1.default {
constructor(stream) {
super();
this.stream = stream;
this.inBody = false;
this.on = (event, listener) => super.on(event, listener);
this.off = (event, listener) => super.off(event, listener);
this.once = (event, listener) => super.once(event, listener);
this.emit = (event, ...args) => super.emit(event, ...args);
this.stream.on('readable', this._tryRead.bind(this));
this.stream.on('error', (err) => { this.emit('error', err); });
this.stream.on('end', () => { this.emit('end'); });
setImmediate(this._tryRead.bind(this));
}
_tryRead() {
while (this._appendChunk()) {
while (this.buffer) {
if (this.inBody) {
if (!this.packet) {
throw Error('invalid stat packet is missing');
}
if (!(this.buffer.length >= this.packet.length)) {
break;
}
this.packet.data = this._consume(this.packet.length);
if (!this.packet.verifyChecksum()) {
this.emit('error', new PacketReader.ChecksumError(this.packet));
return;
}
this.emit('packet', this.packet);
this.inBody = false;
}
else {
if (!(this.buffer.length >= 24)) {
break;
}
const header = this._consume(24);
this.packet = new packet_1.default(header.readUInt32LE(0), header.readUInt32LE(4), header.readUInt32LE(8), header.readUInt32LE(12), header.readUInt32LE(16), header.readUInt32LE(20), Buffer.alloc(0));
if (!this.packet.verifyMagic()) {
this.emit('error', new PacketReader.MagicError(this.packet));
return;
}
if (this.packet.length === 0) {
this.emit('packet', this.packet);
}
else {
this.inBody = true;
}
}
}
}
}
_appendChunk() {
const chunk = this.stream.read();
if (chunk) {
if (this.buffer) {
return (this.buffer = Buffer.concat([this.buffer, chunk], this.buffer.length + chunk.length));
}
else {
return (this.buffer = chunk);
}
}
else {
return null;
}
}
_consume(length) {
if (!this.buffer)
return Buffer.from([]);
const chunk = this.buffer.slice(0, length);
this.buffer = length === this.buffer.length ? undefined : this.buffer.slice(length);
return chunk;
}
}
PacketReader.ChecksumError = ChecksumError;
PacketReader.MagicError = MagicError;
exports.default = PacketReader;
//# sourceMappingURL=packetreader.js.map