gl-store-s3.js/node_modules/aws-sdk/lib/event-stream/parse-event.js

74 lines
2.2 KiB
JavaScript

var parseMessage = require('./parse-message').parseMessage;
/**
*
* @param {*} parser
* @param {Buffer} message
* @param {*} shape
* @api private
*/
function parseEvent(parser, message, shape) {
var parsedMessage = parseMessage(message);
// check if message is an event or error
var messageType = parsedMessage.headers[':message-type'];
if (messageType) {
if (messageType.value === 'error') {
throw parseError(parsedMessage);
} else if (messageType.value !== 'event') {
// not sure how to parse non-events/non-errors, ignore for now
return;
}
}
// determine event type
var eventType = parsedMessage.headers[':event-type'];
// check that the event type is modeled
var eventModel = shape.members[eventType.value];
if (!eventModel) {
return;
}
var result = {};
// check if an event payload exists
var eventPayloadMemberName = eventModel.eventPayloadMemberName;
if (eventPayloadMemberName) {
var payloadShape = eventModel.members[eventPayloadMemberName];
// if the shape is binary, return the byte array
if (payloadShape.type === 'binary') {
result[eventPayloadMemberName] = parsedMessage.body;
} else {
result[eventPayloadMemberName] = parser.parse(parsedMessage.body.toString(), payloadShape);
}
}
// read event headers
var eventHeaderNames = eventModel.eventHeaderMemberNames;
for (var i = 0; i < eventHeaderNames.length; i++) {
var name = eventHeaderNames[i];
if (parsedMessage.headers[name]) {
// parse the header!
result[name] = eventModel.members[name].toType(parsedMessage.headers[name].value);
}
}
var output = {};
output[eventType.value] = result;
return output;
}
function parseError(message) {
var errorCode = message.headers[':error-code'];
var errorMessage = message.headers[':error-message'];
var error = new Error(errorMessage.value || errorMessage);
error.code = error.name = errorCode.value || errorCode;
return error;
}
/**
* @api private
*/
module.exports = {
parseEvent: parseEvent
};