@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
96 lines • 12.3 kB
JavaScript
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=