| // 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 read stream of VOM messages backed by a byte |
| * array. |
| * @private |
| */ |
| |
| module.exports = ByteStreamMessageReader; |
| |
| var RawVomReader = require('./raw-vom-reader.js'); |
| var TypeUtil = require('../vdl/type-util.js'); |
| |
| /** |
| * Create a VOM message reader backed by a byte stream. |
| * @param {Uint8Array} bytes The initial byte stream. |
| * @constructor |
| * @memberof module:vanadium.vom |
| */ |
| function ByteStreamMessageReader(bytes) { |
| this.rawReader = new RawVomReader(bytes); |
| var header = this.rawReader._readRawBytes(1); |
| if (header[0] !== 0x80) { |
| throw new Error('Improperly formatted bytes. Must start with 0x80'); |
| } |
| } |
| |
| /** |
| * Get the the type of the next value message. |
| * @private |
| * @param {TypeDecoder} typeDecoder The current type decoder. |
| * @return {Type} The type of the next message or null if the stream has ended. |
| */ |
| ByteStreamMessageReader.prototype.nextMessageType = function(typeDecoder) { |
| while (true) { |
| var typeId; |
| try { |
| typeId = this.rawReader.readInt(); |
| } catch (error) { |
| // Hopefully EOF. |
| // TODO(bprosnitz) Make this a more accurate check. |
| return null; |
| } |
| if (typeId < 0) { |
| // Type message. |
| var len = this.rawReader.readUint(); |
| var body = this.rawReader._readRawBytes(len); |
| typeDecoder.defineType(-typeId, body); |
| } else { |
| // Value message. |
| var type = typeDecoder.lookupType(typeId); |
| if (TypeUtil.shouldSendLength(type)) { |
| // length |
| this.rawReader.readUint(); |
| } |
| return type; |
| } |
| } |
| }; |
| |
| ByteStreamMessageReader.prototype.clear = function() { |
| this.rawReader = null; |
| }; |
| |
| ByteStreamMessageReader.prototype.addBytes = function(bytes) { |
| // TODO(bjornick): Implement a real stream reader. |
| if (this.rawReader && this.rawReader.hasData()) { |
| throw new Error('Can\'t addBytes if all the previous bytes ' + |
| 'haven\'t been read'); |
| } |
| this.rawReader = new RawVomReader(bytes); |
| }; |