parse-message.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. var Int64 = require('./int64').Int64;
  2. var splitMessage = require('./split-message').splitMessage;
  3. var BOOLEAN_TAG = 'boolean';
  4. var BYTE_TAG = 'byte';
  5. var SHORT_TAG = 'short';
  6. var INT_TAG = 'integer';
  7. var LONG_TAG = 'long';
  8. var BINARY_TAG = 'binary';
  9. var STRING_TAG = 'string';
  10. var TIMESTAMP_TAG = 'timestamp';
  11. var UUID_TAG = 'uuid';
  12. /**
  13. * @api private
  14. *
  15. * @param {Buffer} headers
  16. */
  17. function parseHeaders(headers) {
  18. var out = {};
  19. var position = 0;
  20. while (position < headers.length) {
  21. var nameLength = headers.readUInt8(position++);
  22. var name = headers.slice(position, position + nameLength).toString();
  23. position += nameLength;
  24. switch (headers.readUInt8(position++)) {
  25. case 0 /* boolTrue */:
  26. out[name] = {
  27. type: BOOLEAN_TAG,
  28. value: true
  29. };
  30. break;
  31. case 1 /* boolFalse */:
  32. out[name] = {
  33. type: BOOLEAN_TAG,
  34. value: false
  35. };
  36. break;
  37. case 2 /* byte */:
  38. out[name] = {
  39. type: BYTE_TAG,
  40. value: headers.readInt8(position++)
  41. };
  42. break;
  43. case 3 /* short */:
  44. out[name] = {
  45. type: SHORT_TAG,
  46. value: headers.readInt16BE(position)
  47. };
  48. position += 2;
  49. break;
  50. case 4 /* integer */:
  51. out[name] = {
  52. type: INT_TAG,
  53. value: headers.readInt32BE(position)
  54. };
  55. position += 4;
  56. break;
  57. case 5 /* long */:
  58. out[name] = {
  59. type: LONG_TAG,
  60. value: new Int64(headers.slice(position, position + 8))
  61. };
  62. position += 8;
  63. break;
  64. case 6 /* byteArray */:
  65. var binaryLength = headers.readUInt16BE(position);
  66. position += 2;
  67. out[name] = {
  68. type: BINARY_TAG,
  69. value: headers.slice(position, position + binaryLength)
  70. };
  71. position += binaryLength;
  72. break;
  73. case 7 /* string */:
  74. var stringLength = headers.readUInt16BE(position);
  75. position += 2;
  76. out[name] = {
  77. type: STRING_TAG,
  78. value: headers.slice(
  79. position,
  80. position + stringLength
  81. ).toString()
  82. };
  83. position += stringLength;
  84. break;
  85. case 8 /* timestamp */:
  86. out[name] = {
  87. type: TIMESTAMP_TAG,
  88. value: new Date(
  89. new Int64(headers.slice(position, position + 8))
  90. .valueOf()
  91. )
  92. };
  93. position += 8;
  94. break;
  95. case 9 /* uuid */:
  96. var uuidChars = headers.slice(position, position + 16)
  97. .toString('hex');
  98. position += 16;
  99. out[name] = {
  100. type: UUID_TAG,
  101. value: uuidChars.substr(0, 8) + '-' +
  102. uuidChars.substr(8, 4) + '-' +
  103. uuidChars.substr(12, 4) + '-' +
  104. uuidChars.substr(16, 4) + '-' +
  105. uuidChars.substr(20)
  106. };
  107. break;
  108. default:
  109. throw new Error('Unrecognized header type tag');
  110. }
  111. }
  112. return out;
  113. }
  114. function parseMessage(message) {
  115. var parsed = splitMessage(message);
  116. return { headers: parseHeaders(parsed.headers), body: parsed.body };
  117. }
  118. /**
  119. * @api private
  120. */
  121. module.exports = {
  122. parseMessage: parseMessage
  123. };