@microsoft/dev-tunnels-ssh
Version:
SSH library for Dev Tunnels
92 lines • 3.17 kB
JavaScript
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
exports.SshMessage = void 0;
const buffer_1 = require("buffer");
const sshData_1 = require("../io/sshData");
class SshMessage {
get messageType() {
return 0;
}
toBuffer() {
const writer = new sshData_1.SshDataWriter(buffer_1.Buffer.alloc(16));
this.write(writer);
return writer.toBuffer();
}
read(reader) {
this.rawBytes = reader.buffer;
const number = reader.readByte();
if (number !== this.messageType) {
throw new Error(`Message type ${number} is not valid.`);
}
this.onRead(reader);
}
write(writer) {
if (this.rawBytes) {
// Piped messages are rewritten without re-serialization. This preserves any
// unparsed extended message data. It assumes no properties of the message
// have been modified without also updating the serialized bytes.
writer.write(this.rawBytes);
}
else {
writer.writeByte(this.messageType);
this.onWrite(writer);
}
}
/**
* Rewrites the message to its buffer to ensure the buffer has the correct values.
* This should be called after modifying properties of a message that was (potentially)
* received, before re-sending it.
*/
rewrite() {
if (this.rawBytes) {
const writer = new sshData_1.SshDataWriter(buffer_1.Buffer.alloc(16));
writer.writeByte(this.messageType);
this.onWrite(writer);
this.rawBytes = writer.toBuffer();
}
}
onRead(reader) {
throw new Error('Not supported.');
}
onWrite(writer) {
throw new Error('Not supported.');
}
validateField(value, name) {
if (typeof value === 'undefined') {
throw new Error(`${this.constructor.name} ${name} is required.`);
}
return value;
}
toString() {
return this.constructor.name;
}
static create(config, messageType, messageContext, data) {
let messageClass = config.messages.get(messageType);
if (!messageClass && messageContext) {
const contextMessageTypes = config.contextualMessages.get(messageContext);
if (contextMessageTypes) {
messageClass = contextMessageTypes.get(messageType);
}
}
if (messageClass) {
const message = new messageClass();
message.read(new sshData_1.SshDataReader(data));
return message;
}
else {
return null;
}
}
convertTo(otherMessage, copy = false) {
const reader = new sshData_1.SshDataReader(copy ? buffer_1.Buffer.from(this.rawBytes) : this.rawBytes);
otherMessage.read(reader);
return otherMessage;
}
}
exports.SshMessage = SshMessage;
/* @internal */
SshMessage.index = new Map();
//# sourceMappingURL=sshMessage.js.map
;