123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- var Int64 = require('./int64').Int64;
- var splitMessage = require('./split-message').splitMessage;
- var BOOLEAN_TAG = 'boolean';
- var BYTE_TAG = 'byte';
- var SHORT_TAG = 'short';
- var INT_TAG = 'integer';
- var LONG_TAG = 'long';
- var BINARY_TAG = 'binary';
- var STRING_TAG = 'string';
- var TIMESTAMP_TAG = 'timestamp';
- var UUID_TAG = 'uuid';
- /**
- * @api private
- *
- * @param {Buffer} headers
- */
- function parseHeaders(headers) {
- var out = {};
- var position = 0;
- while (position < headers.length) {
- var nameLength = headers.readUInt8(position++);
- var name = headers.slice(position, position + nameLength).toString();
- position += nameLength;
- switch (headers.readUInt8(position++)) {
- case 0 /* boolTrue */:
- out[name] = {
- type: BOOLEAN_TAG,
- value: true
- };
- break;
- case 1 /* boolFalse */:
- out[name] = {
- type: BOOLEAN_TAG,
- value: false
- };
- break;
- case 2 /* byte */:
- out[name] = {
- type: BYTE_TAG,
- value: headers.readInt8(position++)
- };
- break;
- case 3 /* short */:
- out[name] = {
- type: SHORT_TAG,
- value: headers.readInt16BE(position)
- };
- position += 2;
- break;
- case 4 /* integer */:
- out[name] = {
- type: INT_TAG,
- value: headers.readInt32BE(position)
- };
- position += 4;
- break;
- case 5 /* long */:
- out[name] = {
- type: LONG_TAG,
- value: new Int64(headers.slice(position, position + 8))
- };
- position += 8;
- break;
- case 6 /* byteArray */:
- var binaryLength = headers.readUInt16BE(position);
- position += 2;
- out[name] = {
- type: BINARY_TAG,
- value: headers.slice(position, position + binaryLength)
- };
- position += binaryLength;
- break;
- case 7 /* string */:
- var stringLength = headers.readUInt16BE(position);
- position += 2;
- out[name] = {
- type: STRING_TAG,
- value: headers.slice(
- position,
- position + stringLength
- ).toString()
- };
- position += stringLength;
- break;
- case 8 /* timestamp */:
- out[name] = {
- type: TIMESTAMP_TAG,
- value: new Date(
- new Int64(headers.slice(position, position + 8))
- .valueOf()
- )
- };
- position += 8;
- break;
- case 9 /* uuid */:
- var uuidChars = headers.slice(position, position + 16)
- .toString('hex');
- position += 16;
- out[name] = {
- type: UUID_TAG,
- value: uuidChars.substr(0, 8) + '-' +
- uuidChars.substr(8, 4) + '-' +
- uuidChars.substr(12, 4) + '-' +
- uuidChars.substr(16, 4) + '-' +
- uuidChars.substr(20)
- };
- break;
- default:
- throw new Error('Unrecognized header type tag');
- }
- }
- return out;
- }
- function parseMessage(message) {
- var parsed = splitMessage(message);
- return { headers: parseHeaders(parsed.headers), body: parsed.body };
- }
- /**
- * @api private
- */
- module.exports = {
- parseMessage: parseMessage
- };
|