UNPKG

@dtex/mock-io

Version:

Mock provider for ECMA-419 IO testing

71 lines (55 loc) 1.53 kB
class Serial { constructor(opts) { this.transmit = opts.transmit; this.receive = opts.receive; this.onReadable = opts.onReadable; this.baud = opts.baud; this.format = opts.format || "buffer"; this.RXqueue = []; this.TXqueue = []; } read(bufferOrNumber) { let result; // If we have no data in the queue, return undefined if (this.RXqueue.length === 0) { return result; } if (this.format === "buffer") { let length, result; // Determine how long this read should be if (typeof bufferOrNumber === "number") { length = bufferOrNumber; } else { length = bufferOrNumber.byteLength; } if (length > this.RXqueue.length) { length = this.RXqueue.length; } // Read <length> bytes from the RXqueue result = this.RXqueue.slice(0, length); this.RXqueue = this.RXqueue.slice(length); // Convert to an arrayBuffer and return return new Uint8Array(result).buffer; } else { return this.RXqueue.shift(); } } write(message) { let bufView = new Uint8Array(message); this.TXqueue = this.TXqueue.concat(bufView); } testReceive(message) { let messageArray = new Uint8Array(str2ab(message)); this.RXqueue = this.RXqueue.concat(...messageArray); this.onReadable(message.length); } } function str2ab(str) { let buf = new ArrayBuffer(str.length); let bufView = new Uint8Array(buf); for (let i = 0, strLen = str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } export default Serial;