elasticio-sailor-nodejs 2.7.1-dev3 → 2.7.1-dev4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +150 -150
- package/.github/CODEOWNERS +8 -8
- package/.nsprc +18 -18
- package/CHANGELOG.md +144 -144
- package/README.md +247 -247
- package/lib/amqp.js +584 -584
- package/lib/component_reader.js +109 -109
- package/lib/emitter.js +198 -198
- package/lib/encryptor.js +114 -114
- package/lib/executor.js +74 -74
- package/lib/hooksData.js +68 -68
- package/lib/ipc.js +13 -13
- package/lib/logging.js +97 -97
- package/lib/sailor.js +670 -665
- package/lib/service.js +294 -294
- package/lib/settings.js +126 -126
- package/package.json +53 -53
- package/postpublish.js +24 -24
- package/run.js +139 -139
- package/runService.js +19 -19
package/lib/service.js
CHANGED
|
@@ -1,294 +1,294 @@
|
|
|
1
|
-
const Q = require('q');
|
|
2
|
-
const _ = require('lodash');
|
|
3
|
-
const assert = require('assert');
|
|
4
|
-
const request = require('requestretry');
|
|
5
|
-
const util = require('util');
|
|
6
|
-
const ComponentReader = require('./component_reader').ComponentReader;
|
|
7
|
-
const EventEmitter = require('events').EventEmitter;
|
|
8
|
-
const debug = require('debug')('sailor');
|
|
9
|
-
const RestApiClient = require('elasticio-rest-node');
|
|
10
|
-
const log = require('./logging');
|
|
11
|
-
const { ComponentLogger } = log;
|
|
12
|
-
|
|
13
|
-
exports.processService = processService;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @class ServiceExec
|
|
17
|
-
* Represents execution context for service method
|
|
18
|
-
* Similar to TaskExec class for normal executions
|
|
19
|
-
* TODO if it would be possible -- unify it with TaskExec
|
|
20
|
-
*/
|
|
21
|
-
class ServiceExec extends EventEmitter {
|
|
22
|
-
constructor({ logger, services }) {
|
|
23
|
-
super();
|
|
24
|
-
this.logger = logger;
|
|
25
|
-
this._services = services;
|
|
26
|
-
assert(this._services.apiClient, 'ServiceExec should be created with api client');
|
|
27
|
-
assert(this._services.config, 'ServiceExec should be created with config');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
getApiClient() {
|
|
31
|
-
return this._services.apiClient;
|
|
32
|
-
}
|
|
33
|
-
getConfig() {
|
|
34
|
-
return this._services.config;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function processService(serviceMethod, env) {
|
|
39
|
-
|
|
40
|
-
var ALLOWED_METHODS = {
|
|
41
|
-
verifyCredentials: verifyCredentials,
|
|
42
|
-
getMetaModel: getMetaModel,
|
|
43
|
-
selectModel: selectModel
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
var POST_RESULT_URL = env.ELASTICIO_POST_RESULT_URL;
|
|
47
|
-
var CFG = env.ELASTICIO_CFG;
|
|
48
|
-
var ACTION_OR_TRIGGER = env.ELASTICIO_ACTION_OR_TRIGGER;
|
|
49
|
-
var GET_MODEL_METHOD = env.ELASTICIO_GET_MODEL_METHOD;
|
|
50
|
-
var COMPONENT_PATH = env.ELASTICIO_COMPONENT_PATH;
|
|
51
|
-
var API_URI = env.ELASTICIO_API_URI;
|
|
52
|
-
var API_USERNAME = env.ELASTICIO_API_USERNAME;
|
|
53
|
-
var API_KEY = env.ELASTICIO_API_KEY;
|
|
54
|
-
|
|
55
|
-
var compReader = new ComponentReader();
|
|
56
|
-
let apiClient;
|
|
57
|
-
|
|
58
|
-
return Q.fcall(init)
|
|
59
|
-
.spread(execService)
|
|
60
|
-
.then(onSuccess)
|
|
61
|
-
.catch(onError);
|
|
62
|
-
|
|
63
|
-
function init() {
|
|
64
|
-
debug('About to init');
|
|
65
|
-
|
|
66
|
-
if (!POST_RESULT_URL) {
|
|
67
|
-
var err = new Error('ELASTICIO_POST_RESULT_URL is not provided');
|
|
68
|
-
err.sendable = false;
|
|
69
|
-
throw err;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
assert(ALLOWED_METHODS[serviceMethod], util.format('Unknown service method "%s"', serviceMethod));
|
|
73
|
-
assert(CFG, 'ELASTICIO_CFG is not provided');
|
|
74
|
-
assert(API_URI, 'ELASTICIO_API_URI is not provided');
|
|
75
|
-
assert(API_USERNAME, 'ELASTICIO_API_USERNAME is not provided');
|
|
76
|
-
assert(API_KEY, 'ELASTICIO_API_KEY is not provided');
|
|
77
|
-
|
|
78
|
-
if (serviceMethod === 'getMetaModel' || serviceMethod === 'selectModel') {
|
|
79
|
-
assert(ACTION_OR_TRIGGER, 'ELASTICIO_ACTION_OR_TRIGGER is not provided');
|
|
80
|
-
}
|
|
81
|
-
if (serviceMethod === 'selectModel') {
|
|
82
|
-
assert(GET_MODEL_METHOD, 'ELASTICIO_GET_MODEL_METHOD is not provided');
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
var cfg;
|
|
86
|
-
try {
|
|
87
|
-
cfg = JSON.parse(CFG);
|
|
88
|
-
} catch (e) {
|
|
89
|
-
throw new Error('Unable to parse CFG');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
debug('Config: %j', cfg);
|
|
93
|
-
|
|
94
|
-
var params = {
|
|
95
|
-
triggerOrAction: ACTION_OR_TRIGGER,
|
|
96
|
-
getModelMethod: GET_MODEL_METHOD
|
|
97
|
-
};
|
|
98
|
-
//eslint-disable-next-line new-cap
|
|
99
|
-
apiClient = RestApiClient(API_USERNAME, API_KEY, {
|
|
100
|
-
retryCount: parseInt(env.ELASTICIO_API_REQUEST_RETRY_ATTEMPTS),
|
|
101
|
-
retryDelay: parseInt(env.ELASTICIO_API_REQUEST_RETRY_DELAY)
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
return [cfg, params];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function execService(cfg, params) {
|
|
108
|
-
debug('Init is complete. About to start execution.');
|
|
109
|
-
|
|
110
|
-
return compReader.init(COMPONENT_PATH).then(callMethod);
|
|
111
|
-
|
|
112
|
-
function callMethod() {
|
|
113
|
-
return ALLOWED_METHODS[serviceMethod](cfg, params);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function onSuccess(data) {
|
|
118
|
-
return sendResponse({ status: 'success', data: data });
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function onError(err) {
|
|
122
|
-
if (err.sendable === false) {
|
|
123
|
-
throw new Error(err.message);
|
|
124
|
-
}
|
|
125
|
-
var errorData = {
|
|
126
|
-
message: err.message
|
|
127
|
-
};
|
|
128
|
-
log.error(err, err.stack);
|
|
129
|
-
return sendResponse({ status: 'error', data: errorData });
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function sendResponse(responseBody) {
|
|
133
|
-
var opts = {
|
|
134
|
-
url: POST_RESULT_URL,
|
|
135
|
-
json: true,
|
|
136
|
-
forever: true,
|
|
137
|
-
headers: {
|
|
138
|
-
Connection: 'Keep-Alive'
|
|
139
|
-
},
|
|
140
|
-
rejectUnauthorized: false,
|
|
141
|
-
body: responseBody,
|
|
142
|
-
simple: false,
|
|
143
|
-
maxAttempts: parseInt(env.ELASTICIO_API_REQUEST_RETRY_ATTEMPTS),
|
|
144
|
-
retryDelay: parseInt(env.ELASTICIO_API_REQUEST_RETRY_DELAY),
|
|
145
|
-
retryStrategy: request.RetryStrategies.HTTPOrNetworkError,
|
|
146
|
-
fullResponse: true
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
debug('About to send response back to the API');
|
|
150
|
-
|
|
151
|
-
return request.post(opts)
|
|
152
|
-
.then(checkStatusCode)
|
|
153
|
-
.then(() => responseBody);
|
|
154
|
-
|
|
155
|
-
function checkStatusCode(response) {
|
|
156
|
-
//eslint-disable-next-line eqeqeq
|
|
157
|
-
if (response.statusCode != '200') {
|
|
158
|
-
|
|
159
|
-
debug('Unable to reach API :(');
|
|
160
|
-
|
|
161
|
-
var error = new Error(util.format(
|
|
162
|
-
'Failed to POST data to %s (%s, %s)',
|
|
163
|
-
POST_RESULT_URL, response.statusCode, response.body
|
|
164
|
-
));
|
|
165
|
-
error.sendable = false;
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function verifyCredentials(cfg, params) {
|
|
172
|
-
function doVerification(verify) {
|
|
173
|
-
return new Promise((resolve, reject) => {
|
|
174
|
-
function legacyCallback(e, result) {
|
|
175
|
-
if (e) {
|
|
176
|
-
return reject(e);
|
|
177
|
-
}
|
|
178
|
-
resolve(result);
|
|
179
|
-
}
|
|
180
|
-
const callScope = new ServiceExec({
|
|
181
|
-
logger: new ComponentLogger(),
|
|
182
|
-
services: {
|
|
183
|
-
apiClient,
|
|
184
|
-
config: env
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
const result = verify.call(callScope, cfg, legacyCallback);
|
|
189
|
-
|
|
190
|
-
if (result) {
|
|
191
|
-
resolve(result);
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* In will allow developers to return Promise.resolve(ANYTHING) in verifyCredentials.
|
|
198
|
-
*/
|
|
199
|
-
function toVerifyCredentialsResponse(result) {
|
|
200
|
-
if (!_.has(result, 'verified')) {
|
|
201
|
-
return {
|
|
202
|
-
verified: true
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return result;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function error(e) {
|
|
210
|
-
return {
|
|
211
|
-
verified: false,
|
|
212
|
-
reason: e.message
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return compReader.loadVerifyCredentials()
|
|
217
|
-
.then(doVerification)
|
|
218
|
-
.then(toVerifyCredentialsResponse)
|
|
219
|
-
.catch(error);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function getMetaModel(cfg, params) {
|
|
223
|
-
return callModuleMethod(params.triggerOrAction, 'getMetaModel', cfg);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
function selectModel(cfg, params) {
|
|
227
|
-
return callModuleMethod(params.triggerOrAction, params.getModelMethod, cfg);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function callModuleMethod(triggerOrAction, method, cfg) {
|
|
231
|
-
const callScope = new ServiceExec({
|
|
232
|
-
logger: new ComponentLogger(),
|
|
233
|
-
services: {
|
|
234
|
-
apiClient,
|
|
235
|
-
config: env
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
callScope.on('updateKeys', keys =>
|
|
239
|
-
addPromise(apiClient.accounts.update(cfg._account, { keys: keys })));
|
|
240
|
-
|
|
241
|
-
var finished = Q.defer();
|
|
242
|
-
var subPromises = [];
|
|
243
|
-
|
|
244
|
-
compReader.loadTriggerOrAction(triggerOrAction)
|
|
245
|
-
.then(validateMethod)
|
|
246
|
-
.then(executeMethod)
|
|
247
|
-
.then(onExecutionSuccess)
|
|
248
|
-
.catch(onExecutionFail);
|
|
249
|
-
|
|
250
|
-
function validateMethod(module) {
|
|
251
|
-
var errorMsg = `Method "${method}" is not found in "${triggerOrAction}" action or trigger`;
|
|
252
|
-
assert(_.isFunction(module[method]), errorMsg);
|
|
253
|
-
return module;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function executeMethod(module) {
|
|
257
|
-
return new Promise((resolve, reject) => {
|
|
258
|
-
function legacyCallback(e, result) {
|
|
259
|
-
if (e) {
|
|
260
|
-
return reject(e);
|
|
261
|
-
}
|
|
262
|
-
resolve(result);
|
|
263
|
-
}
|
|
264
|
-
const result = module[method].bind(callScope)(cfg, legacyCallback);
|
|
265
|
-
|
|
266
|
-
if (result) {
|
|
267
|
-
resolve(result);
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
function onExecutionSuccess(data) {
|
|
273
|
-
Q.allSettled(subPromises).then(function resolve(res) {
|
|
274
|
-
_(res)
|
|
275
|
-
.filter({
|
|
276
|
-
state: 'rejected'
|
|
277
|
-
})
|
|
278
|
-
.map(result => result.reason)
|
|
279
|
-
.each(log.error.bind(log));
|
|
280
|
-
finished.resolve(data);
|
|
281
|
-
}).catch(err => log.error(err));
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function onExecutionFail(err) {
|
|
285
|
-
finished.reject(err);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
function addPromise(p) {
|
|
289
|
-
subPromises.push(p);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
return finished.promise;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
1
|
+
const Q = require('q');
|
|
2
|
+
const _ = require('lodash');
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
const request = require('requestretry');
|
|
5
|
+
const util = require('util');
|
|
6
|
+
const ComponentReader = require('./component_reader').ComponentReader;
|
|
7
|
+
const EventEmitter = require('events').EventEmitter;
|
|
8
|
+
const debug = require('debug')('sailor');
|
|
9
|
+
const RestApiClient = require('elasticio-rest-node');
|
|
10
|
+
const log = require('./logging');
|
|
11
|
+
const { ComponentLogger } = log;
|
|
12
|
+
|
|
13
|
+
exports.processService = processService;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @class ServiceExec
|
|
17
|
+
* Represents execution context for service method
|
|
18
|
+
* Similar to TaskExec class for normal executions
|
|
19
|
+
* TODO if it would be possible -- unify it with TaskExec
|
|
20
|
+
*/
|
|
21
|
+
class ServiceExec extends EventEmitter {
|
|
22
|
+
constructor({ logger, services }) {
|
|
23
|
+
super();
|
|
24
|
+
this.logger = logger;
|
|
25
|
+
this._services = services;
|
|
26
|
+
assert(this._services.apiClient, 'ServiceExec should be created with api client');
|
|
27
|
+
assert(this._services.config, 'ServiceExec should be created with config');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getApiClient() {
|
|
31
|
+
return this._services.apiClient;
|
|
32
|
+
}
|
|
33
|
+
getConfig() {
|
|
34
|
+
return this._services.config;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function processService(serviceMethod, env) {
|
|
39
|
+
|
|
40
|
+
var ALLOWED_METHODS = {
|
|
41
|
+
verifyCredentials: verifyCredentials,
|
|
42
|
+
getMetaModel: getMetaModel,
|
|
43
|
+
selectModel: selectModel
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
var POST_RESULT_URL = env.ELASTICIO_POST_RESULT_URL;
|
|
47
|
+
var CFG = env.ELASTICIO_CFG;
|
|
48
|
+
var ACTION_OR_TRIGGER = env.ELASTICIO_ACTION_OR_TRIGGER;
|
|
49
|
+
var GET_MODEL_METHOD = env.ELASTICIO_GET_MODEL_METHOD;
|
|
50
|
+
var COMPONENT_PATH = env.ELASTICIO_COMPONENT_PATH;
|
|
51
|
+
var API_URI = env.ELASTICIO_API_URI;
|
|
52
|
+
var API_USERNAME = env.ELASTICIO_API_USERNAME;
|
|
53
|
+
var API_KEY = env.ELASTICIO_API_KEY;
|
|
54
|
+
|
|
55
|
+
var compReader = new ComponentReader();
|
|
56
|
+
let apiClient;
|
|
57
|
+
|
|
58
|
+
return Q.fcall(init)
|
|
59
|
+
.spread(execService)
|
|
60
|
+
.then(onSuccess)
|
|
61
|
+
.catch(onError);
|
|
62
|
+
|
|
63
|
+
function init() {
|
|
64
|
+
debug('About to init');
|
|
65
|
+
|
|
66
|
+
if (!POST_RESULT_URL) {
|
|
67
|
+
var err = new Error('ELASTICIO_POST_RESULT_URL is not provided');
|
|
68
|
+
err.sendable = false;
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
assert(ALLOWED_METHODS[serviceMethod], util.format('Unknown service method "%s"', serviceMethod));
|
|
73
|
+
assert(CFG, 'ELASTICIO_CFG is not provided');
|
|
74
|
+
assert(API_URI, 'ELASTICIO_API_URI is not provided');
|
|
75
|
+
assert(API_USERNAME, 'ELASTICIO_API_USERNAME is not provided');
|
|
76
|
+
assert(API_KEY, 'ELASTICIO_API_KEY is not provided');
|
|
77
|
+
|
|
78
|
+
if (serviceMethod === 'getMetaModel' || serviceMethod === 'selectModel') {
|
|
79
|
+
assert(ACTION_OR_TRIGGER, 'ELASTICIO_ACTION_OR_TRIGGER is not provided');
|
|
80
|
+
}
|
|
81
|
+
if (serviceMethod === 'selectModel') {
|
|
82
|
+
assert(GET_MODEL_METHOD, 'ELASTICIO_GET_MODEL_METHOD is not provided');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
var cfg;
|
|
86
|
+
try {
|
|
87
|
+
cfg = JSON.parse(CFG);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
throw new Error('Unable to parse CFG');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
debug('Config: %j', cfg);
|
|
93
|
+
|
|
94
|
+
var params = {
|
|
95
|
+
triggerOrAction: ACTION_OR_TRIGGER,
|
|
96
|
+
getModelMethod: GET_MODEL_METHOD
|
|
97
|
+
};
|
|
98
|
+
//eslint-disable-next-line new-cap
|
|
99
|
+
apiClient = RestApiClient(API_USERNAME, API_KEY, {
|
|
100
|
+
retryCount: parseInt(env.ELASTICIO_API_REQUEST_RETRY_ATTEMPTS),
|
|
101
|
+
retryDelay: parseInt(env.ELASTICIO_API_REQUEST_RETRY_DELAY)
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return [cfg, params];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function execService(cfg, params) {
|
|
108
|
+
debug('Init is complete. About to start execution.');
|
|
109
|
+
|
|
110
|
+
return compReader.init(COMPONENT_PATH).then(callMethod);
|
|
111
|
+
|
|
112
|
+
function callMethod() {
|
|
113
|
+
return ALLOWED_METHODS[serviceMethod](cfg, params);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function onSuccess(data) {
|
|
118
|
+
return sendResponse({ status: 'success', data: data });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function onError(err) {
|
|
122
|
+
if (err.sendable === false) {
|
|
123
|
+
throw new Error(err.message);
|
|
124
|
+
}
|
|
125
|
+
var errorData = {
|
|
126
|
+
message: err.message
|
|
127
|
+
};
|
|
128
|
+
log.error(err, err.stack);
|
|
129
|
+
return sendResponse({ status: 'error', data: errorData });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function sendResponse(responseBody) {
|
|
133
|
+
var opts = {
|
|
134
|
+
url: POST_RESULT_URL,
|
|
135
|
+
json: true,
|
|
136
|
+
forever: true,
|
|
137
|
+
headers: {
|
|
138
|
+
Connection: 'Keep-Alive'
|
|
139
|
+
},
|
|
140
|
+
rejectUnauthorized: false,
|
|
141
|
+
body: responseBody,
|
|
142
|
+
simple: false,
|
|
143
|
+
maxAttempts: parseInt(env.ELASTICIO_API_REQUEST_RETRY_ATTEMPTS),
|
|
144
|
+
retryDelay: parseInt(env.ELASTICIO_API_REQUEST_RETRY_DELAY),
|
|
145
|
+
retryStrategy: request.RetryStrategies.HTTPOrNetworkError,
|
|
146
|
+
fullResponse: true
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
debug('About to send response back to the API');
|
|
150
|
+
|
|
151
|
+
return request.post(opts)
|
|
152
|
+
.then(checkStatusCode)
|
|
153
|
+
.then(() => responseBody);
|
|
154
|
+
|
|
155
|
+
function checkStatusCode(response) {
|
|
156
|
+
//eslint-disable-next-line eqeqeq
|
|
157
|
+
if (response.statusCode != '200') {
|
|
158
|
+
|
|
159
|
+
debug('Unable to reach API :(');
|
|
160
|
+
|
|
161
|
+
var error = new Error(util.format(
|
|
162
|
+
'Failed to POST data to %s (%s, %s)',
|
|
163
|
+
POST_RESULT_URL, response.statusCode, response.body
|
|
164
|
+
));
|
|
165
|
+
error.sendable = false;
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function verifyCredentials(cfg, params) {
|
|
172
|
+
function doVerification(verify) {
|
|
173
|
+
return new Promise((resolve, reject) => {
|
|
174
|
+
function legacyCallback(e, result) {
|
|
175
|
+
if (e) {
|
|
176
|
+
return reject(e);
|
|
177
|
+
}
|
|
178
|
+
resolve(result);
|
|
179
|
+
}
|
|
180
|
+
const callScope = new ServiceExec({
|
|
181
|
+
logger: new ComponentLogger(),
|
|
182
|
+
services: {
|
|
183
|
+
apiClient,
|
|
184
|
+
config: env
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const result = verify.call(callScope, cfg, legacyCallback);
|
|
189
|
+
|
|
190
|
+
if (result) {
|
|
191
|
+
resolve(result);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* In will allow developers to return Promise.resolve(ANYTHING) in verifyCredentials.
|
|
198
|
+
*/
|
|
199
|
+
function toVerifyCredentialsResponse(result) {
|
|
200
|
+
if (!_.has(result, 'verified')) {
|
|
201
|
+
return {
|
|
202
|
+
verified: true
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function error(e) {
|
|
210
|
+
return {
|
|
211
|
+
verified: false,
|
|
212
|
+
reason: e.message
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return compReader.loadVerifyCredentials()
|
|
217
|
+
.then(doVerification)
|
|
218
|
+
.then(toVerifyCredentialsResponse)
|
|
219
|
+
.catch(error);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function getMetaModel(cfg, params) {
|
|
223
|
+
return callModuleMethod(params.triggerOrAction, 'getMetaModel', cfg);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function selectModel(cfg, params) {
|
|
227
|
+
return callModuleMethod(params.triggerOrAction, params.getModelMethod, cfg);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function callModuleMethod(triggerOrAction, method, cfg) {
|
|
231
|
+
const callScope = new ServiceExec({
|
|
232
|
+
logger: new ComponentLogger(),
|
|
233
|
+
services: {
|
|
234
|
+
apiClient,
|
|
235
|
+
config: env
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
callScope.on('updateKeys', keys =>
|
|
239
|
+
addPromise(apiClient.accounts.update(cfg._account, { keys: keys })));
|
|
240
|
+
|
|
241
|
+
var finished = Q.defer();
|
|
242
|
+
var subPromises = [];
|
|
243
|
+
|
|
244
|
+
compReader.loadTriggerOrAction(triggerOrAction)
|
|
245
|
+
.then(validateMethod)
|
|
246
|
+
.then(executeMethod)
|
|
247
|
+
.then(onExecutionSuccess)
|
|
248
|
+
.catch(onExecutionFail);
|
|
249
|
+
|
|
250
|
+
function validateMethod(module) {
|
|
251
|
+
var errorMsg = `Method "${method}" is not found in "${triggerOrAction}" action or trigger`;
|
|
252
|
+
assert(_.isFunction(module[method]), errorMsg);
|
|
253
|
+
return module;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function executeMethod(module) {
|
|
257
|
+
return new Promise((resolve, reject) => {
|
|
258
|
+
function legacyCallback(e, result) {
|
|
259
|
+
if (e) {
|
|
260
|
+
return reject(e);
|
|
261
|
+
}
|
|
262
|
+
resolve(result);
|
|
263
|
+
}
|
|
264
|
+
const result = module[method].bind(callScope)(cfg, legacyCallback);
|
|
265
|
+
|
|
266
|
+
if (result) {
|
|
267
|
+
resolve(result);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function onExecutionSuccess(data) {
|
|
273
|
+
Q.allSettled(subPromises).then(function resolve(res) {
|
|
274
|
+
_(res)
|
|
275
|
+
.filter({
|
|
276
|
+
state: 'rejected'
|
|
277
|
+
})
|
|
278
|
+
.map(result => result.reason)
|
|
279
|
+
.each(log.error.bind(log));
|
|
280
|
+
finished.resolve(data);
|
|
281
|
+
}).catch(err => log.error(err));
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function onExecutionFail(err) {
|
|
285
|
+
finished.reject(err);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function addPromise(p) {
|
|
289
|
+
subPromises.push(p);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return finished.promise;
|
|
293
|
+
}
|
|
294
|
+
}
|