// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @fileoverview Represents a write stream of VOM messages backed by a byte
 * array.
 * @private
 */

module.exports = ByteStreamMessageWriter;

var RawVomWriter = require('./raw-vom-writer.js');

/**
 * Create a VOM message writer that writes to a byte array.
 * @constructor
 * @memberof module:vanadium.vom
 */
function ByteStreamMessageWriter() {
  this.rawWriter = new RawVomWriter();
  this.rawWriter._writeRawBytes(new Uint8Array([0x80]));
}

/**
 * Write a value message.
 * @private
 * @param {number} typeId The type ID of the message.
 * @param {boolean} sendLength true if the message length should be sent in the
 * header, false otherwise.
 * @param {Uint8Array} message The body of the message.
 */
ByteStreamMessageWriter.prototype.writeValueMessage = function(
  typeId, sendLength, message) {
  if (typeId <= 0) {
    throw new Error('Type ids should be positive integers.');
  }
  this.rawWriter.writeInt(typeId);
  if (sendLength) {
    this.rawWriter.writeUint(message.length);
  }
  this.rawWriter._writeRawBytes(message);
};

/**
 * Write a type message.
 * @private
 * @param {number} typeId The type ID to define.
 * @param {Uint8Array} message The body of the type description message.
 */
ByteStreamMessageWriter.prototype.writeTypeMessage = function(typeId, message) {
  if (typeId <= 0) {
    throw new Error('Type ids should be positive integers.');
  }
  this.rawWriter.writeInt(-typeId);
  this.rawWriter.writeUint(message.length);
  this.rawWriter._writeRawBytes(message);
};

/**
 * Get the written bytes.
 * @return {Uint8Array} The bytes that were written.
 */
ByteStreamMessageWriter.prototype.consumeBytes = function() {
  var bytes = this.rawWriter.getBytes();
  this.rawWriter = new RawVomWriter();
  return bytes;
};
