From 24fd6adee1d8c461d0076396a4728c7841380454 Mon Sep 17 00:00:00 2001 From: Adam Brady Date: Sun, 24 Jan 2016 00:55:06 +1100 Subject: [PATCH] Start using promises internally for service methods --- package.json | 1 + src/service.js | 31 ++++++++++++++++++++++--------- test-src/service.js | 23 +++++++++++++++++++++-- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 3aea77c..5aaa3c0 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "homepage": "https://github.com/hudson-taylor/hudson-taylor", "dependencies": { "async": "~1.4.0", + "bluebird": "^3.1.1", "body-parser": "~1.14.1", "express": "~4.13.2", "ht-schema": "~3.1.4" diff --git a/src/service.js b/src/service.js index 02d651a..a9bffc7 100644 --- a/src/service.js +++ b/src/service.js @@ -1,8 +1,9 @@ "use strict"; -const async = require("async"); -const s = require("ht-schema"); +const async = require("async"); +const s = require("ht-schema"); +const bluebird = require("bluebird"); const utils = require("./utils"); @@ -59,11 +60,7 @@ let Service = function Service(Transports, config) { let _tmp = this._methods[context.method]; if(!_tmp) return cb({ error: "unknown-method", method: context.method }); - let finish = (err, response) => { - - if(err) { - return cb(err); - } + let finish = (response) => { let _afterMiddleware = this._middleware.after.filter((m) => { if(m.method && m.method !== context.method) return false; @@ -95,12 +92,28 @@ let Service = function Service(Transports, config) { error: err.message }); } - return _tmp.fn(data, finish); + return go(); }); } else { - _tmp.fn(data, finish); + go(); } + function go() { + + // Handle both callbacks and promises here. + let callbackHandler = function(err, response) { + if(err) return cb(err); + return finish(response); + } + + let response = _tmp.fn(data, callbackHandler); + + if(response && typeof response.then === 'function') { + callbackHandler = null; + return response.then(finish).catch(cb); + } + + } }); diff --git a/test-src/service.js b/test-src/service.js index 55ceda2..a64a8d8 100644 --- a/test-src/service.js +++ b/test-src/service.js @@ -1,8 +1,9 @@ "use strict"; -const assert = require('assert'); -const s = require('ht-schema'); +const assert = require('assert'); +const s = require('ht-schema'); +const bluebird = require('bluebird'); const Service = require('../lib/service'); @@ -123,6 +124,24 @@ describe("Service", function() { }); + it("should allow returning promise from function", function(done) { + + let service = new Service(); + + service.on("test", function() { + return new bluebird.Promise(function(resolve, reject) { + return resolve(_data); + }); + }); + + service.call("test", null, function(err, response) { + assert.ifError(err); + assert.deepEqual(response, _data); + done(); + }); + + }); + }); describe("listen", function() {