0.2.0 • Published 7 years ago

jsonbeat v0.2.0

Weekly downloads
-
License
MIT
Repository
-
Last release
7 years ago

jsonbeat

A step of JSON transforming flow

Install

npm install --save jsonbeat

Example

Define the transformer

var jsonbeat = require('jsonbeat');

var billSchema = {
	name: 'Summary',
	inputSchema: {
		"type": "object",
		"properties": {
			"title": { "type": "string" },
			"fromTime": { "type": "string" },
			"toTime": { "type": "string" },
			"customerId": { "type": "string" },
			"items": {
				"type": "array",
				"items": {
					"type": "object",
					"properties": {
						"label": { "type": "string" },
						"price": { "type": "number" },
						"amount": { "type": "number" }
					},
					"required": ["label", "price", "amount"]
				}
			}
		}
	},
	transform: function(data) {
		var summary = data.items.reduce(function(sum, item) {
			sum.count += item.amount;
			sum.total += item.amount * item.price;
			return sum;
		}, { count: 0, total: 0 });
		return {
			title: data.title + ' [' + data.customerId + ']',
			customerId: data.customerId,
			count: summary.count,
			total: summary.total
		}
	},
	outputSchema: {
		"type": "object",
		"properties": {
			"title": { "type": "string" },
			"customerId": { "type": "string" },
			"count": { "type": "number", "minimum": 0 },
			"total": { "type": "number" }
		}
	}
};

var billSchemaCallback = Object.assign({}, billSchema, {
	transform: function(data, callback) {
		var summary = data.items.reduce(function(sum, item) {
			sum.count += item.amount;
			sum.total += item.amount * item.price;
			return sum;
		}, { count: 0, total: 0 });
		var ret = {
			title: data.title + ' [' + data.customerId + ']',
			customerId: data.customerId,
			count: summary.count,
			total: summary.total
		}
		callback && callback(null, ret);
	}
});

var billSchemaPromise = Object.assign({}, billSchema, {
	transform: function(data) {
		return new Promise(function(resolve, reject) {
			var summary = data.items.reduce(function(sum, item) {
				sum.count += item.amount;
				sum.total += item.amount * item.price;
				return sum;
			}, { count: 0, total: 0 });
			setTimeout(function() {
				resolve({
					title: data.title + ' [' + data.customerId + ']',
					customerId: data.customerId,
					count: summary.count,
					total: summary.total
				});
			}, 100);
		})
	}
});

var transformer1 = new jsonbeat(billSchema);
transformer1.outlet.on('result', function(result) {
	console.log('Summary (transformer1): %s', JSON.stringify(result));
});

var transformer2 = new jsonbeat(billSchemaCallback);
transformer2.outlet.on('result', function(result) {
	console.log('Summary (transformer2): %s', JSON.stringify(result));
});

var transformer3 = new jsonbeat(billSchemaPromise);
transformer3.outlet.on('result', function(result) {
	console.log('Summary (transformer3): %s', JSON.stringify(result));
});

Use the transformer

// use pushSync() if transform function is synchronous
var result = transformer1.pushSync({
	title: 'JsonBeat Billing',
	customerId: 'hello.com',
	items: [
		{ label: 'Item#1', price: 15, amount: 2 },
		{ label: 'Item#2', price: 17, amount: 3 }
	]
});
console.log('pushSync() output: %s', JSON.stringify(result, null, 2));

// use push() + promise if transform function is asynchronous
transformer2.push({
	title: 'JsonBeat Billing',
	customerId: 'hello.com',
	items: [
		{ label: 'Item#1', price: 15, amount: 2 },
		{ label: 'Item#2', price: 17, amount: 3 }
	]
}).then(function(summary) {
	console.log('push() output: %s', JSON.stringify(summary, null, 2));
}).catch(function(err) {
	console.log('push() error: %s', JSON.stringify(err, null, 2));
});

// use push() + callback if transform function is asynchronous
transformer3.push({
	title: 'JsonBeat Billing',
	customerId: 'hello.com',
	items: [
		{ label: 'Item#1', price: 15, amount: 2 },
		{ label: 'Item#2', price: 17, amount: 3 }
	]
}, {}, function(err, summary) {
	if (err) {
		console.log('push() error: %s', JSON.stringify(err, null, 2));
	}
	console.log('push() output: %s', JSON.stringify(summary, null, 2));
});
0.2.0

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago