UNPKG

@u4/adbkit

Version:

A Typescript client for the Android Debug Bridge.

108 lines 4.2 kB
"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