diff --git a/ui/commands/ssh.js b/ui/commands/ssh.js index 51e2370..9679be2 100644 --- a/ui/commands/ssh.js +++ b/ui/commands/ssh.js @@ -200,7 +200,7 @@ class SSH { * */ async sendData(data) { - return this.sender.send(CLIENT_DATA_STDIN, data); + return this.sender.sendData(CLIENT_DATA_STDIN, data); } /** diff --git a/ui/commands/telnet.js b/ui/commands/telnet.js index a2885ed..98f5c71 100644 --- a/ui/commands/telnet.js +++ b/ui/commands/telnet.js @@ -153,7 +153,7 @@ class Telnet { * */ sendData(data) { - return this.sender.send(0x00, data); + return this.sender.sendData(0x00, data); } /** diff --git a/ui/stream/stream.js b/ui/stream/stream.js index b4ff460..79f908c 100644 --- a/ui/stream/stream.js +++ b/ui/stream/stream.js @@ -19,6 +19,7 @@ import Exception from "./exception.js"; import * as header from "./header.js"; import * as reader from "./reader.js"; import * as sender from "./sender.js"; +import * as common from "./common.js"; export class Sender { /** @@ -65,6 +66,43 @@ export class Sender { return this.sender.send(d); } + /** + * Sends data to remote, if the data is too long, it will be separated into + * different stream requests + * + * @param {number} marker binary marker + * @param {Uint8Array} data data to be sent + * + * @throws {Exception} When the sender already been closed + * + */ + async sendData(marker, data) { + if (this.closed) { + throw new Exception( + "Sender already been closed. No data can be send", + false + ); + } + + let dataSeg = common.separateBuffer(data, header.STREAM_MAX_LENGTH), + reqHeader = new header.Header(header.STREAM); + + reqHeader.set(this.id); + + for (let i in dataSeg) { + let stHeader = new header.Stream(0, 0), + d = new Uint8Array(dataSeg[i].length + 3); + + stHeader.set(marker, dataSeg[i].length); + + d[0] = reqHeader.value(); + d.set(stHeader.buffer(), 1); + d.set(dataSeg[i], 3); + + await this.sender.send(d); + } + } + /** * Send stream signals *