UNPKG

@u4/adbkit

Version:

A Typescript client for the Android Debug Bridge.

95 lines 3.01 kB
import { Buffer } from 'node:buffer'; class Packet { static checksum(data) { let sum = 0; if (data) { for (let i = 0, len = data.length; i < len; i++) { const char = data[i]; sum += char; } } return sum; } static magic(command) { // We need the full uint32 range, which ">>> 0" thankfully allows us to use return (command ^ 0xffffffff) >>> 0; } static assemble(command, arg0, arg1, data) { if (data) { const len = data.length; const chunk = Buffer.alloc(24 + len); chunk.writeUInt32LE(command, 0); chunk.writeUInt32LE(arg0, 4); chunk.writeUInt32LE(arg1, 8); chunk.writeUInt32LE(len, 12); chunk.writeUInt32LE(Packet.checksum(data), 16); chunk.writeUInt32LE(Packet.magic(command), 20); data.copy(chunk, 24); return chunk; } else { const chunk = Buffer.alloc(24); chunk.writeUInt32LE(command, 0); chunk.writeUInt32LE(arg0, 4); chunk.writeUInt32LE(arg1, 8); chunk.writeUInt32LE(0, 12); chunk.writeUInt32LE(0, 16); chunk.writeUInt32LE(Packet.magic(command), 20); return chunk; } } static swap32(n) { const buffer = Buffer.alloc(4); buffer.writeUInt32LE(n, 0); return buffer.readUInt32BE(0); } constructor(command, arg0, arg1, length, check, magic, data) { this.command = command; this.arg0 = arg0; this.arg1 = arg1; this.length = length; this.check = check; this.magic = magic; this.data = data; } verifyChecksum() { // see https://github.com/DeviceFarmer/adbkit/issues/42 return this.check === 0 || this.check === Packet.checksum(this.data); } verifyMagic() { return this.magic === Packet.magic(this.command); } getType() { switch (this.command) { case Packet.A_SYNC: return 'SYNC'; case Packet.A_CNXN: return 'CNXN'; case Packet.A_OPEN: return 'OPEN'; case Packet.A_OKAY: return 'OKAY'; case Packet.A_CLSE: return 'CLSE'; case Packet.A_WRTE: return 'WRTE'; case Packet.A_AUTH: return 'AUTH'; default: throw new Error('Unknown command {@command}'); } } toString() { const type = this.getType(); return `${type} arg0=${this.arg0} arg1=${this.arg1} length=${this.length}`; } } Packet.A_SYNC = 0x434e5953; Packet.A_CNXN = 0x4e584e43; Packet.A_OPEN = 0x4e45504f; Packet.A_OKAY = 0x59414b4f; Packet.A_CLSE = 0x45534c43; Packet.A_WRTE = 0x45545257; Packet.A_AUTH = 0x48545541; export default Packet; //# sourceMappingURL=packet.js.map