react 0.5.0 → 0.6.1
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/.travis.yml +4 -0
- package/Jakefile.js +39 -0
- package/README.md +18 -26
- package/browser-test/dist.html +89 -0
- package/browser-test/index.html +85 -0
- package/browser-test/min.html +89 -0
- package/dist/react.js +3093 -0
- package/dist/react.min.js +1 -0
- package/doc/advanced.md +7 -2
- package/doc/simple.dot +25 -0
- package/doc/simple.png +0 -0
- package/examples/{default1.js → longer-example.js} +0 -0
- package/examples/{default-simple.js → simple.js} +0 -0
- package/examples/{ast1.js → using-ast-directly.js} +4 -0
- package/examples/{default-events1.js → using-events1.js} +1 -1
- package/examples/{default-log-events.js → using-log-events.js} +0 -0
- package/lib/base-task.js +116 -110
- package/lib/cb-task.js +71 -67
- package/lib/core.js +118 -107
- package/lib/dsl.js +120 -115
- package/lib/error.js +44 -36
- package/lib/event-collector.js +69 -53
- package/lib/event-manager.js +69 -55
- package/lib/eventemitter.js +20 -0
- package/lib/finalcb-first-task.js +56 -53
- package/lib/finalcb-task.js +55 -51
- package/lib/id.js +18 -6
- package/lib/input-parser.js +49 -41
- package/lib/log-events.js +79 -73
- package/lib/parse.js +34 -25
- package/lib/promise-resolve.js +42 -27
- package/lib/promise-task.js +78 -74
- package/lib/react.js +59 -0
- package/lib/ret-task.js +59 -55
- package/lib/sprintf.js +18 -0
- package/lib/status.js +11 -2
- package/lib/task.js +216 -213
- package/lib/track-tasks.js +72 -58
- package/lib/validate.js +136 -136
- package/lib/vcon.js +78 -69
- package/lib/when-task.js +69 -65
- package/package.json +10 -9
- package/src/dist.build.requirejs +20 -0
- package/test/ast.mocha.js +136 -0
- package/test/cb-task.mocha.js +220 -0
- package/test/core-deferred.mocha.js +143 -0
- package/test/core-when.mocha.js +96 -0
- package/test/core.mocha.js +589 -0
- package/test/dsl.mocha.js +350 -0
- package/test/event-manager.mocha.js +119 -0
- package/test/exec-options.mocha.js +48 -0
- package/test/finalcb-task.mocha.js +58 -0
- package/test/input-parser.mocha.js +86 -0
- package/test/mocha.opts +2 -0
- package/test/module-use.mocha.js +147 -0
- package/test/promise-auto-resolve.mocha.js +68 -0
- package/test/ret-task.mocha.js +220 -0
- package/test/task.mocha.js +42 -0
- package/test/validate-cb-task.mocha.js +100 -0
- package/test/validate-ret-task.mocha.js +110 -0
- package/test/validate.mocha.js +324 -0
- package/test/vcon.mocha.js +193 -0
- package/vendor/chai/chai.js +2038 -0
- package/vendor/jquery/jquery-1.7.1.js +9266 -0
- package/vendor/jquery/jquery-1.7.1.min.js +4 -0
- package/vendor/mocha/mocha.css +135 -0
- package/vendor/mocha/mocha.js +3589 -0
- package/vendor/node/util.js +531 -0
- package/vendor/requirejs/require.js +2053 -0
- package/vendor/requirejs/require.min.js +33 -0
- package/doc/default-simple.dot +0 -19
- package/doc/default-simple.dot.png +0 -0
- package/react.js +0 -40
- package/test/ast.test.js +0 -69
- package/test/cb-task.test.js +0 -197
- package/test/core-deferred.test.js +0 -134
- package/test/core-promised.test.js +0 -132
- package/test/core-when.test.js +0 -84
- package/test/core.test.js +0 -568
- package/test/dsl.test.js +0 -330
- package/test/event-manager.test.js +0 -102
- package/test/exec-options.test.js +0 -33
- package/test/finalcb-task.test.js +0 -38
- package/test/input-parser.test.js +0 -66
- package/test/module-use.test.js +0 -134
- package/test/promise-auto-resolve.test.js +0 -52
- package/test/ret-task.test.js +0 -199
- package/test/task.test.js +0 -21
- package/test/validate-cb-task.test.js +0 -74
- package/test/validate-ret-task.test.js +0 -83
- package/test/validate.test.js +0 -295
- package/test/vcon.test.js +0 -173
package/lib/error.js
CHANGED
|
@@ -1,47 +1,55 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function ensureStackTraceLimitSet(stackTraceLimit) {
|
|
6
|
-
if (!Error.stackTraceLimit || Error.stackTraceLimit < stackTraceLimit) {
|
|
7
|
-
Error.stackTraceLimit = stackTraceLimit;
|
|
8
|
-
}
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
function
|
|
12
|
-
if (!fn) return 'undefined';
|
|
13
|
-
return (fn && fn.name) ? fn.name : fn;
|
|
14
|
-
}
|
|
8
|
+
define(['util'], function (util) {
|
|
15
9
|
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var errString = '\n\n';
|
|
21
|
-
if (task && task.f && task.a) {
|
|
22
|
-
errString += ('Error occurs in Task function: ' + fName(task.f) + '(' + task.a.join(',') + ')\n\n');
|
|
10
|
+
function ensureStackTraceLimitSet(stackTraceLimit) {
|
|
11
|
+
if (!Error.stackTraceLimit || Error.stackTraceLimit < stackTraceLimit) {
|
|
12
|
+
Error.stackTraceLimit = stackTraceLimit;
|
|
13
|
+
}
|
|
23
14
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
|
|
16
|
+
function fName(fn) {
|
|
17
|
+
if (!fn) return 'undefined';
|
|
18
|
+
return (fn && fn.name) ? fn.name : fn;
|
|
28
19
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
|
|
21
|
+
function formatErrorMeta(err) {
|
|
22
|
+
if (!err.meta) return;
|
|
23
|
+
var vcon = err.meta.vcon;
|
|
24
|
+
var task = err.meta.task;
|
|
25
|
+
var errString = '\n\n';
|
|
26
|
+
if (task && task.f && task.a) {
|
|
27
|
+
errString += ('Error occurs in Task function: ' + fName(task.f) + '(' + task.a.join(',') + ')\n\n');
|
|
28
|
+
}
|
|
29
|
+
if (vcon) {
|
|
30
|
+
errString += 'Variable Context: \n';
|
|
31
|
+
errString += util.inspect(vcon);
|
|
32
|
+
errString += '\n\n';
|
|
33
|
+
}
|
|
34
|
+
if (task && task.f) {
|
|
35
|
+
errString += 'Task Source:\n\n';
|
|
36
|
+
errString += task.f.toString(); //TODO need to pretty print function, gets collapsed
|
|
37
|
+
errString += '\n\n';
|
|
38
|
+
}
|
|
39
|
+
return errString;
|
|
33
40
|
}
|
|
34
|
-
return errString;
|
|
35
|
-
}
|
|
36
41
|
|
|
37
|
-
function augmentError(err, meta) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
42
|
+
function augmentError(err, meta) {
|
|
43
|
+
if (typeof(err) === 'string') { err = new Error(err); } //props will be lost on non-objects
|
|
44
|
+
var origMsg = err.toString();
|
|
45
|
+
err.meta = meta;
|
|
46
|
+
err.toString = function () { return origMsg + formatErrorMeta(err); };
|
|
47
|
+
return err;
|
|
48
|
+
}
|
|
44
49
|
|
|
50
|
+
return {
|
|
51
|
+
ensureStackTraceLimitSet: ensureStackTraceLimitSet,
|
|
52
|
+
augmentError: augmentError
|
|
53
|
+
};
|
|
45
54
|
|
|
46
|
-
|
|
47
|
-
exports.augmentError = augmentError;
|
|
55
|
+
});
|
package/lib/event-collector.js
CHANGED
|
@@ -1,65 +1,81 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
var FLOW_EVENTS_RE = /^flow\./;
|
|
8
|
+
define([], function () {
|
|
8
9
|
|
|
9
|
-
/**
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
create an instance of the event collector
|
|
12
|
+
*/
|
|
13
|
+
function instantiate(react) {
|
|
14
|
+
react.trackTasks(); // enable task tracking
|
|
11
15
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
var AST_EVENTS_RE = /^ast\./;
|
|
17
|
+
var TASK_EVENTS_RE = /^task\./;
|
|
18
|
+
var FLOW_EVENTS_RE = /^flow\./;
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
collector.capture(flowFn, 'task.*'); // capture task events on a flow
|
|
19
|
-
collector.capture(flowFn, 'flow.*'); // add capture flow events on a flow
|
|
20
|
+
/**
|
|
21
|
+
Accumulator to make it easy to capture events
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
@example
|
|
24
|
+
var react = require('react');
|
|
25
|
+
var collector = react.createEventCollector();
|
|
26
|
+
collector.capture(); // capture all flow and task events for all react flows
|
|
27
|
+
collector.capture('flow.*'); // capture all flow events for all react flows
|
|
28
|
+
collector.capture(flowFn, 'task.*'); // capture task events on a flow
|
|
29
|
+
collector.capture(flowFn, 'flow.*'); // add capture flow events on a flow
|
|
30
|
+
var events = collector.list(); // retrieve the list of events
|
|
31
|
+
collector.clear(); // clear the list of events;
|
|
32
|
+
*/
|
|
33
|
+
function EventCollector() {
|
|
34
|
+
this.events = [];
|
|
35
|
+
}
|
|
27
36
|
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
EventCollector.prototype.capture = function (flowFn, eventId) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
/**
|
|
38
|
+
register listener to capture events for a specific flow
|
|
39
|
+
@param flowFn the react flow function or can pass global react
|
|
40
|
+
@param eventId event id or wildcarded id
|
|
41
|
+
*/
|
|
42
|
+
EventCollector.prototype.capture = function (flowFn, eventId) {
|
|
43
|
+
/*jshint validthis: true */
|
|
44
|
+
if (!eventId && typeof(flowFn) === 'string') { // only eventId provided
|
|
45
|
+
eventId = flowFn;
|
|
46
|
+
flowFn = react; // global react
|
|
47
|
+
} else if (!flowFn) flowFn = react; // global react
|
|
48
|
+
if (!eventId) eventId = '*'; // default to all
|
|
49
|
+
var emitter = flowFn.events;
|
|
50
|
+
var self = this;
|
|
51
|
+
function accumEvents(obj) {
|
|
52
|
+
var eventObject = {
|
|
53
|
+
event: this.event,
|
|
54
|
+
time: Date.now()
|
|
55
|
+
};
|
|
56
|
+
if (FLOW_EVENTS_RE.test(this.event)) {
|
|
57
|
+
eventObject.env = obj;
|
|
58
|
+
} else if (TASK_EVENTS_RE.test(this.event)) {
|
|
59
|
+
eventObject.task = obj;
|
|
60
|
+
} else if (AST_EVENTS_RE.test(this.event)) {
|
|
61
|
+
eventObject.ast = obj;
|
|
62
|
+
}
|
|
63
|
+
self.events.push(eventObject);
|
|
64
|
+
}
|
|
65
|
+
emitter.on(eventId, accumEvents);
|
|
46
66
|
};
|
|
47
|
-
if (FLOW_EVENTS_RE.test(this.event)) {
|
|
48
|
-
eventObject.env = obj;
|
|
49
|
-
} else if (TASK_EVENTS_RE.test(this.event)) {
|
|
50
|
-
eventObject.task = obj;
|
|
51
|
-
}
|
|
52
|
-
self.events.push(eventObject);
|
|
53
|
-
}
|
|
54
|
-
emitter.on(eventId, accumEvents);
|
|
55
|
-
};
|
|
56
67
|
|
|
57
|
-
EventCollector.prototype.list = function () {
|
|
58
|
-
|
|
59
|
-
};
|
|
68
|
+
EventCollector.prototype.list = function () {
|
|
69
|
+
return this.events;
|
|
70
|
+
};
|
|
60
71
|
|
|
61
|
-
EventCollector.prototype.clear = function () {
|
|
62
|
-
|
|
63
|
-
};
|
|
72
|
+
EventCollector.prototype.clear = function () {
|
|
73
|
+
this.events = []; // clear
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
return new EventCollector();
|
|
77
|
+
}
|
|
64
78
|
|
|
65
|
-
|
|
79
|
+
return instantiate; // return the factory for creating EventCollector
|
|
80
|
+
|
|
81
|
+
});
|
package/lib/event-manager.js
CHANGED
|
@@ -1,71 +1,85 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true process:false*/
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
define(['./eventemitter'], function (EventEmitter) {
|
|
9
|
+
/*jshint regexp:false */
|
|
4
10
|
|
|
5
|
-
var EVENT_EMITTER2_CONFIG = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
11
|
+
var EVENT_EMITTER2_CONFIG = {
|
|
12
|
+
wildcard: true, // should the event emitter use wildcards.
|
|
13
|
+
delimiter: '.', // the delimiter used to segment namespaces, defaults to `.`.
|
|
14
|
+
maxListeners: 30 // the max number of listeners that can be assigned to an event, defaults to 10.
|
|
15
|
+
};
|
|
10
16
|
|
|
11
|
-
var
|
|
12
|
-
// Flow monitoring events and their params
|
|
13
|
-
FLOW_BEGIN: 'flow.begin', // env
|
|
14
|
-
TASK_BEGIN: 'task.begin', // task
|
|
15
|
-
TASK_COMPLETE: 'task.complete', // task
|
|
16
|
-
TASK_ERRORED: 'task.errored', // task
|
|
17
|
-
FLOW_COMPLETE: 'flow.complete', // env
|
|
18
|
-
FLOW_ERRORED: 'flow.errored', // env
|
|
17
|
+
var PASS_EVENTS_PROCESS_RE = /^ast.defined$/; // events to pass up to global process
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
EXEC_FLOW_ERRORED: 'exec.flow.errored' // env
|
|
30
|
-
};
|
|
19
|
+
var TYPES = {
|
|
20
|
+
// Flow monitoring events and their params
|
|
21
|
+
AST_DEFINED: 'ast.defined', // ast
|
|
22
|
+
FLOW_BEGIN: 'flow.begin', // env
|
|
23
|
+
TASK_BEGIN: 'task.begin', // task
|
|
24
|
+
TASK_COMPLETE: 'task.complete', // task
|
|
25
|
+
TASK_ERRORED: 'task.errored', // task
|
|
26
|
+
FLOW_COMPLETE: 'flow.complete', // env
|
|
27
|
+
FLOW_ERRORED: 'flow.errored', // env
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
// Internal Hooks
|
|
30
|
+
EXEC_FLOW_START: 'exec.flow.start', // env
|
|
31
|
+
EXEC_INPUT_PREPROCESS: 'exec.input.preprocess', // parsedInput
|
|
32
|
+
EXEC_TASKS_PRECREATE: 'exec.tasks.precreate', // env
|
|
33
|
+
EXEC_OUTTASK_CREATE: 'exec.outTask.create', // outTaskOptions
|
|
34
|
+
EXEC_TASK_START: 'exec.task.start', // task
|
|
35
|
+
EXEC_TASK_COMPLETE: 'exec.task.complete', // task
|
|
36
|
+
EXEC_TASK_ERRORED: 'exec.task.errored', // task
|
|
37
|
+
EXEC_FLOW_COMPLETE: 'exec.flow.complete', // env
|
|
38
|
+
EXEC_FLOW_ERRORED: 'exec.flow.errored' // env
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
Event manager which emits events up to its parent if exists.
|
|
43
|
+
Allows a hierarchy of emitters, which communicate up the
|
|
44
|
+
chain.
|
|
36
45
|
*/
|
|
37
|
-
function EventManager() {
|
|
38
|
-
}
|
|
46
|
+
function EventManager() {
|
|
47
|
+
}
|
|
39
48
|
|
|
40
|
-
EventManager.create = function () { return new EventManager(); };
|
|
49
|
+
EventManager.create = function () { return new EventManager(); };
|
|
41
50
|
|
|
42
|
-
EventManager.TYPES = TYPES;
|
|
43
|
-
EventManager.prototype.TYPES = TYPES;
|
|
51
|
+
EventManager.TYPES = TYPES;
|
|
52
|
+
EventManager.prototype.TYPES = TYPES;
|
|
44
53
|
|
|
45
|
-
EventManager.prototype.isEnabled = function () { // if has listener or an ancestor has listener
|
|
46
|
-
|
|
47
|
-
};
|
|
54
|
+
EventManager.prototype.isEnabled = function () { // if has listener or an ancestor has listener
|
|
55
|
+
return !!(this.emitter || (this.parent && this.parent.isEnabled()));
|
|
56
|
+
};
|
|
48
57
|
|
|
49
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
58
|
+
/**
|
|
59
|
+
Add listener. Wildcard events are allowed like 'foo.*'
|
|
60
|
+
Use '*' to listen to any event
|
|
52
61
|
*/
|
|
53
|
-
EventManager.prototype.on = function (event, listener) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
};
|
|
62
|
+
EventManager.prototype.on = function (event, listener) {
|
|
63
|
+
if (!this.emitter) this.emitter = new EventEmitter(EVENT_EMITTER2_CONFIG);
|
|
64
|
+
if (event === '*') this.emitter.onAny(listener);
|
|
65
|
+
else this.emitter.on(event, listener);
|
|
66
|
+
};
|
|
58
67
|
|
|
59
|
-
EventManager.prototype.emit = function (event, arg1, arg2, argN) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
68
|
+
EventManager.prototype.emit = function (event, arg1, arg2, argN) {
|
|
69
|
+
if (event === undefined) throw new Error('event is undefined');
|
|
70
|
+
if (this.emitter) this.emitter.emit.apply(this.emitter, arguments);
|
|
71
|
+
if (this.parent && this.parent.isEnabled()) this.parent.emit.apply(this.parent, arguments);
|
|
72
|
+
if (PASS_EVENTS_PROCESS_RE.test(event) && typeof(process) !== 'undefined' && process.emit) {
|
|
73
|
+
process.emit.apply(process, arguments); // pass some to process
|
|
74
|
+
}
|
|
75
|
+
};
|
|
64
76
|
|
|
65
|
-
EventManager.prototype.removeListener = function (event, listener) {
|
|
66
|
-
|
|
67
|
-
};
|
|
77
|
+
EventManager.prototype.removeListener = function (event, listener) {
|
|
78
|
+
if (this.emitter) this.emitter.removeListener.apply(this.emitter, arguments);
|
|
79
|
+
};
|
|
68
80
|
|
|
69
81
|
|
|
70
|
-
|
|
71
|
-
|
|
82
|
+
EventManager.global = EventManager.create(); // create one top level emitter
|
|
83
|
+
return EventManager;
|
|
84
|
+
|
|
85
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/*global define:true EventEmitter2:true */
|
|
3
|
+
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
define(['eventemitter2'], function (EventEmitterMod) {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
Abstract the details of getting an EventEmitter
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// EventEmitter doesn't return itself in browser so need to get the global
|
|
15
|
+
// EventEmitter api changed, so accomodate which ever version is available
|
|
16
|
+
var EventEmitter = (EventEmitterMod) ?
|
|
17
|
+
((EventEmitterMod.EventEmitter2) ? EventEmitterMod.EventEmitter2 : EventEmitterMod) : EventEmitter2;
|
|
18
|
+
return EventEmitter;
|
|
19
|
+
|
|
20
|
+
});
|
|
@@ -1,65 +1,68 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
/*global define:true */
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
var
|
|
4
|
+
if (typeof define !== 'function') {
|
|
5
|
+
var define = require('amdefine')(module);
|
|
6
|
+
}
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var EventManager = require('./event-manager.js');
|
|
8
|
+
define(['./sprintf', 'util', './status', './vcon', './event-manager'],
|
|
9
|
+
function (sprintf, util, STATUS, VContext, EventManager) {
|
|
9
10
|
|
|
10
|
-
var OUTTASK_A_REQ = 'ast.outTask.a should be an array of string param names';
|
|
11
|
+
var OUTTASK_A_REQ = 'ast.outTask.a should be an array of string param names';
|
|
11
12
|
|
|
12
|
-
function FinalCbFirstSuccTask(outTaskOptions) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
function FinalCbFirstSuccTask(outTaskOptions) {
|
|
14
|
+
var taskDef = outTaskOptions.taskDef;
|
|
15
|
+
if (typeof(outTaskOptions.cbFunc) !== 'function') throw new Error('callback is not a function');
|
|
16
|
+
var self = this;
|
|
17
|
+
for (var k in taskDef) {
|
|
18
|
+
if (true) self[k] = taskDef[k]; // if to make jshint happy
|
|
19
|
+
}
|
|
20
|
+
this.f = outTaskOptions.cbFunc;
|
|
21
|
+
this.tasks = outTaskOptions.tasks;
|
|
22
|
+
this.vCon = outTaskOptions.vCon;
|
|
23
|
+
this.retValue = outTaskOptions.retValue;
|
|
24
|
+
this.env = outTaskOptions.env;
|
|
18
25
|
}
|
|
19
|
-
this.f = outTaskOptions.cbFunc;
|
|
20
|
-
this.tasks = outTaskOptions.tasks;
|
|
21
|
-
this.vCon = outTaskOptions.vCon;
|
|
22
|
-
this.retValue = outTaskOptions.retValue;
|
|
23
|
-
this.env = outTaskOptions.env;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function format_error(errmsg, obj) {
|
|
27
|
-
return sprintf('%s - %s', errmsg, util.inspect(obj));
|
|
28
|
-
}
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (! (Array.isArray(taskDef.a) &&
|
|
33
|
-
taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
|
|
34
|
-
errors.push(format_error(OUTTASK_A_REQ, taskDef));
|
|
27
|
+
function format_error(errmsg, obj) {
|
|
28
|
+
return sprintf('%s - %s', errmsg, util.inspect(obj));
|
|
35
29
|
}
|
|
36
|
-
return errors;
|
|
37
|
-
};
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
FinalCbFirstSuccTask.validate = function (taskDef) {
|
|
32
|
+
var errors = [];
|
|
33
|
+
if (! (Array.isArray(taskDef.a) &&
|
|
34
|
+
taskDef.a.every(function (x) { return (typeof(x) === 'string'); }))) {
|
|
35
|
+
errors.push(format_error(OUTTASK_A_REQ, taskDef));
|
|
36
|
+
}
|
|
37
|
+
return errors;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
is ready to exit when any task comes back with non-null defined value
|
|
41
42
|
*/
|
|
42
|
-
FinalCbFirstSuccTask.prototype.isReady = function () {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
};
|
|
43
|
+
FinalCbFirstSuccTask.prototype.isReady = function () {
|
|
44
|
+
var lastres = this.vCon.getLastResults();
|
|
45
|
+
if (!lastres) return false; // no results yet
|
|
46
|
+
return (lastres.some(function (v) { return (v !== undefined && v !== null); }));
|
|
47
|
+
};
|
|
47
48
|
|
|
48
|
-
FinalCbFirstSuccTask.prototype.exec = function (err) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
};
|
|
49
|
+
FinalCbFirstSuccTask.prototype.exec = function (err) {
|
|
50
|
+
if (!this.f) return; //must have already been called
|
|
51
|
+
if (err) {
|
|
52
|
+
this.env.error = err;
|
|
53
|
+
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_FLOW_ERRORED, this.env);
|
|
54
|
+
this.f.call(null, err); //call the final callback with the first error hit
|
|
55
|
+
} else { // no error, call with args
|
|
56
|
+
var vCon = this.vCon;
|
|
57
|
+
var finalArgs = this.a.map(function (k) { return vCon.getVar(k); });
|
|
58
|
+
finalArgs.unshift(null); //unshift err=null to front
|
|
59
|
+
this.env.results = finalArgs;
|
|
60
|
+
this.env.flowEmitter.emit(EventManager.TYPES.EXEC_FLOW_COMPLETE, this.env);
|
|
61
|
+
this.f.apply(null, finalArgs);
|
|
62
|
+
}
|
|
63
|
+
this.f = null; // prevent multiple calls
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
return FinalCbFirstSuccTask;
|
|
64
67
|
|
|
65
|
-
|
|
68
|
+
});
|