UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

96 lines 12.3 kB
export class TelnetNegotiator { constructor(terminal, termType) { this.terminal = terminal; this.termType = termType; } setTermType(type) { this.termType = type; } pushStr(str, arr) { for (let i = 0; i < str.length; i++) { arr.push(str.charCodeAt(i)); } } negotiate(data) { const arrUint8 = new Uint8Array(data); const arr = [...arrUint8.values()]; const sendQueue = []; let stringToDisplay = ''; let chr; let code; let value; while (arr.length > 0) { chr = arr.shift(); switch (chr) { case 255: // IAC code = arr.shift(); value = arr.shift(); switch (code) { case 253: // DO if (value === 24) { // Terminal type sendQueue.push(255, 251, value); } else if (value === 31) { // NAWS (Negotiate About Window Size) // client answers WILL NAWS sendQueue.push(255, 251, 31); // client sends IAC SB NAWS 0 terminalSize.cols 0 terminalSize.rows IAC SE sendQueue.push(255, 250, 31, 0, this.terminal.cols, 0, this.terminal.rows, 255, 240); } else { // Refuse other DO requests with a WONT sendQueue.push(255, 252, value); } break; case 251: // WILL if (value === 1) { // Affirm echo with DO sendQueue.push(255, 253, value); } else { // Reject other WILL offers with a DONT sendQueue.push(255, 254, value); } break; case 250: // SB (subnegotiation) if (value === 24) { // TERM-TYPE subnegotiation if (arr[0] === 1 && arr[1] === 255 && arr[2] === 240) { arr.shift(); arr.shift(); arr.shift(); sendQueue.push(255, 250, 24, 0); this.pushStr(this.termType, sendQueue); sendQueue.push(255, 240); } else { console.warn('Invalid subnegotiation received' + arr); } } else { console.warn('Ignoring SB ' + value); } break; case 254: // DONT case 252: // WONT default: break; } break; case 242: // Data Mark (Synch) code = arr.shift(); value = arr.shift(); break; default: // everything else stringToDisplay += String.fromCharCode(chr); break; } } return { dataToSend: sendQueue.length ? new Uint8Array(sendQueue) : '', isOutput: !!stringToDisplay.length }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsbmV0LW5lZ290aWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9yZW1vdGUtYWNjZXNzL3Rlcm1pbmFsLXZpZXdlci90ZWxuZXQtbmVnb3RpYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1UsUUFBa0IsRUFDbEIsUUFBZ0I7UUFEaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFRO0lBQ3ZCLENBQUM7SUFFSixXQUFXLENBQUMsSUFBSTtRQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQUk7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFbkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLEtBQWEsQ0FBQztRQUVsQixPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixRQUFRLEdBQUcs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LEtBQUssRUFBRSxDQUFDO29CQUNuQixLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNwQixNQUFNO2dCQUNSLFNBQVMsa0JBQWtCO29CQUN6QixlQUFlLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUMsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLFVBQVUsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3RCxRQUFRLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNO1NBQ25DLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcblxuZXhwb3J0IGNsYXNzIFRlbG5ldE5lZ290aWF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlcm1pbmFsOiBUZXJtaW5hbCxcbiAgICBwcml2YXRlIHRlcm1UeXBlOiBzdHJpbmdcbiAgKSB7fVxuXG4gIHNldFRlcm1UeXBlKHR5cGUpIHtcbiAgICB0aGlzLnRlcm1UeXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1c2hTdHIoc3RyLCBhcnIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfVxuXG4gIG5lZ290aWF0ZShkYXRhKSB7XG4gICAgY29uc3QgYXJyVWludDggPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICBjb25zdCBhcnIgPSBbLi4uYXJyVWludDgudmFsdWVzKCldO1xuXG4gICAgY29uc3Qgc2VuZFF1ZXVlID0gW107XG4gICAgbGV0IHN0cmluZ1RvRGlzcGxheSA9ICcnO1xuICAgIGxldCBjaHI6IG51bWJlcjtcbiAgICBsZXQgY29kZTogbnVtYmVyO1xuICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuXG4gICAgd2hpbGUgKGFyci5sZW5ndGggPiAwKSB7XG4gICAgICBjaHIgPSBhcnIuc2hpZnQoKTtcbiAgICAgIHN3aXRjaCAoY2hyKSB7XG4gICAgICAgIGNhc2UgMjU1OiAvLyBJQUNcbiAgICAgICAgICBjb2RlID0gYXJyLnNoaWZ0KCk7XG4gICAgICAgICAgdmFsdWUgPSBhcnIuc2hpZnQoKTtcbiAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMjUzOiAvLyBET1xuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDI0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGVybWluYWwgdHlwZVxuICAgICAgICAgICAgICAgIHNlbmRRdWV1ZS5wdXNoKDI1NSwgMjUxLCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDMxKSB7XG4gICAgICAgICAgICAgICAgLy8gTkFXUyAoTmVnb3RpYXRlIEFib3V0IFdpbmRvdyBTaXplKVxuICAgICAgICAgICAgICAgIC8vIGNsaWVudCBhbnN3ZXJzIFdJTEwgTkFXU1xuICAgICAgICAgICAgICAgIHNlbmRRdWV1ZS5wdXNoKDI1NSwgMjUxLCAzMSk7XG4gICAgICAgICAgICAgICAgLy8gY2xpZW50IHNlbmRzIElBQyBTQiBOQVdTIDAgdGVybWluYWxTaXplLmNvbHMgMCB0ZXJtaW5hbFNpemUucm93cyBJQUMgU0VcbiAgICAgICAgICAgICAgICBzZW5kUXVldWUucHVzaChcbiAgICAgICAgICAgICAgICAgIDI1NSxcbiAgICAgICAgICAgICAgICAgIDI1MCxcbiAgICAgICAgICAgICAgICAgIDMxLFxuICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgIHRoaXMudGVybWluYWwuY29scyxcbiAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICB0aGlzLnRlcm1pbmFsLnJvd3MsXG4gICAgICAgICAgICAgICAgICAyNTUsXG4gICAgICAgICAgICAgICAgICAyNDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlZnVzZSBvdGhlciBETyByZXF1ZXN0cyB3aXRoIGEgV09OVFxuICAgICAgICAgICAgICAgIHNlbmRRdWV1ZS5wdXNoKDI1NSwgMjUyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI1MTogLy8gV0lMTFxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBBZmZpcm0gZWNobyB3aXRoIERPXG4gICAgICAgICAgICAgICAgc2VuZFF1ZXVlLnB1c2goMjU1LCAyNTMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZWplY3Qgb3RoZXIgV0lMTCBvZmZlcnMgd2l0aCBhIERPTlRcbiAgICAgICAgICAgICAgICBzZW5kUXVldWUucHVzaCgyNTUsIDI1NCwgdmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyNTA6IC8vIFNCIChzdWJuZWdvdGlhdGlvbilcbiAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAyNCkge1xuICAgICAgICAgICAgICAgIC8vIFRFUk0tVFlQRSBzdWJuZWdvdGlhdGlvblxuICAgICAgICAgICAgICAgIGlmIChhcnJbMF0gPT09IDEgJiYgYXJyWzFdID09PSAyNTUgJiYgYXJyWzJdID09PSAyNDApIHtcbiAgICAgICAgICAgICAgICAgIGFyci5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYXJyLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBhcnIuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHNlbmRRdWV1ZS5wdXNoKDI1NSwgMjUwLCAyNCwgMCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnB1c2hTdHIodGhpcy50ZXJtVHlwZSwgc2VuZFF1ZXVlKTtcbiAgICAgICAgICAgICAgICAgIHNlbmRRdWV1ZS5wdXNoKDI1NSwgMjQwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHN1Ym5lZ290aWF0aW9uIHJlY2VpdmVkJyArIGFycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSWdub3JpbmcgU0IgJyArIHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjU0OiAvLyBET05UXG4gICAgICAgICAgICBjYXNlIDI1MjogLy8gV09OVFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI0MjogLy8gRGF0YSBNYXJrIChTeW5jaClcbiAgICAgICAgICBjb2RlID0gYXJyLnNoaWZ0KCk7XG4gICAgICAgICAgdmFsdWUgPSBhcnIuc2hpZnQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgc3RyaW5nVG9EaXNwbGF5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YVRvU2VuZDogc2VuZFF1ZXVlLmxlbmd0aCA/IG5ldyBVaW50OEFycmF5KHNlbmRRdWV1ZSkgOiAnJyxcbiAgICAgIGlzT3V0cHV0OiAhIXN0cmluZ1RvRGlzcGxheS5sZW5ndGhcbiAgICB9O1xuICB9XG59XG4iXX0=