in src/recordlayer.js [195:236]
async flush() {
// If there's nothing to flush, bail out early.
// Don't throw `_sendError` if we're not sending anything, because `flush()`
// can be called when we're trying to transition into an error state.
const buf = this._pendingRecordBuf;
let type = this._pendingRecordType;
if (! type) {
if (buf !== null) {
throw new TLSError(ALERT_DESCRIPTION.INTERNAL_ERROR);
}
return;
}
if (this._sendError !== null) {
throw this._sendError;
}
// If we're encrypting, turn the existing buffer contents into a `TLSInnerPlaintext` by
// appending the type. We don't do any zero-padding, although the spec allows it.
let inflation = 0, innerPlaintext = null;
if (this._sendEncryptState !== null) {
buf.writeUint8(type);
innerPlaintext = buf.slice(RECORD_HEADER_SIZE);
inflation = AEAD_SIZE_INFLATION;
type = RECORD_TYPE.APPLICATION_DATA;
}
// Write the common header for either `TLSPlaintext` or `TLSCiphertext` record.
const length = buf.tell() - RECORD_HEADER_SIZE + inflation;
buf.seek(0);
buf.writeUint8(type);
buf.writeUint16(VERSION_TLS_1_2);
buf.writeUint16(length);
// Followed by different payload depending on encryption status.
if (this._sendEncryptState !== null) {
const additionalData = buf.slice(0, RECORD_HEADER_SIZE);
const ciphertext = await this._sendEncryptState.encrypt(innerPlaintext, additionalData);
buf.writeBytes(ciphertext);
} else {
buf.incr(length);
}
this._pendingRecordBuf = null;
this._pendingRecordType = 0;
await this.sendCallback(buf.flush());
}