isatdatapro-microservices
Version:
A library for creating microservices to access Inmarsat's IsatData Pro satellite IoT system
69 lines (66 loc) • 1.94 kB
JavaScript
/**
* Common Message Format module
* @module messageCodecs/commonMessageFormat
*/
;
/**
* Returns the interpreted value of the field based on dataType
* @param {object} field A payload field { name, value, dataType }
* @returns {boolean|number|Buffer|Array|string} dependent on data type
*/
function parseFieldValue(field) {
if (!field.dataType) return field.stringValue;
switch (field.dataType) {
case 'boolean':
return (field.stringValue.toLowerCase() === 'true');
case 'signedint':
case 'unsignedint':
return Number(field.stringValue);
case 'data':
return Buffer.from(field.stringValue, 'base64');
case 'array':
let items = [];
for (let e=0; e < field.arrayElements.length; e++) {
const element = field.arrayElements[e];
let subItems = [];
for (let f=0; f < element.fields.length; f++) {
const field = element.fields[f];
subItems[f] = {
name: field.name,
value: parseFieldValue(field),
};
}
items[e] = subItems;
}
return items;
case 'enum':
//TODO: lookup from message definition file?
case 'string':
default:
return field.stringValue;
}
}
/**
* Parses a JSON payload, replacing string values with proper type
* @param {Object} message A ReturnMessage
* @returns {Object} parsed message
*/
function parse(message) {
if (!message.payloadJson) {
throw new Error(`Message ${message.messageId} has no JSON payload to parse`);
}
let parsedMessage = {
receiveTimeUtc: message.receiveTimeUtc,
codecServiceId: message.codecServiceId,
codecMessageId: message.payloadJson.codecMessageId,
name: message.payloadJson.name,
};
message.payloadJson.fields.forEach(field => {
parsedMessage[field.name] = parseFieldValue(field);
});
return parsedMessage;
}
module.exports = {
parseFieldValue,
parse,
};