-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.js
101 lines (82 loc) · 2.82 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
var Promise = require('bluebird');
var methodNamesToPromisify = 'get post put delete patch'.split(' ');
var nodeRestClient = require('node-rest-client');
/**
* The Promisifier promisifying the node-rest-client
* @param originalMethod Original method to be promisified
* @returns {promisified} The promisified version of the method
* @constructor
*/
function EventEmitterPromisifier(originalMethod) {
return function promisified() {
var args = [].slice.call(arguments);
var self = this;
return new Promise(function (resolve, reject) {
// add the callback to the arguments
args.push(
function (data, response) {
// resolve the Promise providing data and response as
// an object
resolve({
data: data,
response: response
});
}
);
// call the method
var emitter = originalMethod.apply(self,
args
);
// listen to specific events leading to rejects
emitter
.on('error', function (err) {
reject(err);
})
.on('requestTimeout', function (req) {
req.abort();
reject(new Promise.TimeoutError());
})
.on('responseTimeout', function () {
reject(new Promise.TimeoutError());
});
});
};
};
var registerPromiseMethod = function (name, url, method) {
// create method in method registry with preconfigured REST invocation
// method
var self = this;
var PromisifiedMethod = function (url, method) {
var httpMethod = self[method.toLowerCase()];
return function (args) {
var completeURL = url;
if (!args) {
args = {};
}
// eslint-disable-next-line new-cap
return EventEmitterPromisifier(httpMethod)(completeURL, args);
};
};
this.methods[name] = new PromisifiedMethod(url, method);
};
/**
* A simple wrapper around `new Client(options)`, returning a promisified
* client object.
*
* @param options Options for `node-rest-client.Client`
* @returns {*} the promisified client
*/
var client = function (options) {
var restClient = new nodeRestClient.Client(options);
var promisifiedClient = Promise.promisifyAll(restClient, {
filter: function (name) {
return methodNamesToPromisify.indexOf(name) > -1;
},
promisifier: EventEmitterPromisifier,
suffix: 'Promise'
});
promisifiedClient.registerMethodPromise =
registerPromiseMethod.bind(promisifiedClient);
return promisifiedClient;
};
exports.Client = client;