parse-event.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. var parseMessage = require('./parse-message').parseMessage;
  2. /**
  3. *
  4. * @param {*} parser
  5. * @param {Buffer} message
  6. * @param {*} shape
  7. * @api private
  8. */
  9. function parseEvent(parser, message, shape) {
  10. var parsedMessage = parseMessage(message);
  11. // check if message is an event or error
  12. var messageType = parsedMessage.headers[':message-type'];
  13. if (messageType) {
  14. if (messageType.value === 'error') {
  15. throw parseError(parsedMessage);
  16. } else if (messageType.value !== 'event') {
  17. // not sure how to parse non-events/non-errors, ignore for now
  18. return;
  19. }
  20. }
  21. // determine event type
  22. var eventType = parsedMessage.headers[':event-type'];
  23. // check that the event type is modeled
  24. var eventModel = shape.members[eventType.value];
  25. if (!eventModel) {
  26. return;
  27. }
  28. var result = {};
  29. // check if an event payload exists
  30. var eventPayloadMemberName = eventModel.eventPayloadMemberName;
  31. if (eventPayloadMemberName) {
  32. var payloadShape = eventModel.members[eventPayloadMemberName];
  33. // if the shape is binary, return the byte array
  34. if (payloadShape.type === 'binary') {
  35. result[eventPayloadMemberName] = parsedMessage.body;
  36. } else {
  37. result[eventPayloadMemberName] = parser.parse(parsedMessage.body.toString(), payloadShape);
  38. }
  39. }
  40. // read event headers
  41. var eventHeaderNames = eventModel.eventHeaderMemberNames;
  42. for (var i = 0; i < eventHeaderNames.length; i++) {
  43. var name = eventHeaderNames[i];
  44. if (parsedMessage.headers[name]) {
  45. // parse the header!
  46. result[name] = eventModel.members[name].toType(parsedMessage.headers[name].value);
  47. }
  48. }
  49. var output = {};
  50. output[eventType.value] = result;
  51. return output;
  52. }
  53. function parseError(message) {
  54. var errorCode = message.headers[':error-code'];
  55. var errorMessage = message.headers[':error-message'];
  56. var error = new Error(errorMessage.value || errorMessage);
  57. error.code = error.name = errorCode.value || errorCode;
  58. return error;
  59. }
  60. /**
  61. * @api private
  62. */
  63. module.exports = {
  64. parseEvent: parseEvent
  65. };