server.listen(function() { var port = server.address().port; var url = "http://localhost:" + port + "/blah/foo" var task = Plan.createTask(definition); var plan = new Plan(); var hadError = false; plan.addTask(task); plan.on('error', function(err) { hadError = true; }); plan.on('end', function() { assert.ok(hadError); server.close(done); }); plan.start({ callbackUrl: url, callbackData: {foo: true} }); });
server.listen(function() { var port = server.address().port; var url = "http://localhost:" + port + "/blah/foo" var task = Plan.createTask(definition); var plan = new Plan(); plan.addTask(task); plan.on('error', done); plan.on('end', function() { assert.strictEqual(task.exports.url, url); assert.ok(hitServer); server.close(); done(); }); plan.start({ callbackUrl: url, callbackData: data }); });
Jobs.prototype.create = function(context, template, doneCallback){ var self = this; var job = { id: makeUuid(), progress: 0, state: 'processing', error: null, message: null, startDate: new Date(), endDate: null, info: {} }; context.callbackData = job; self.table[job.id] = job; assert.ok(template.id); var plan = new Plan(template.id); var taskInstances = {}; var templateScopeOptions = template.options || {}; var taskName, taskConfig, nonlocalOptions, taskScopeOptions; var optionsToUse, taskDefinition, task; for (taskName in template.tasks) { taskConfig = template.tasks[taskName]; nonlocalOptions = templateScopeOptions[taskConfig.task] || {}; taskScopeOptions = taskConfig.options || {}; optionsToUse = extend(extend({}, nonlocalOptions), taskScopeOptions); taskDefinition = self.tasks[taskConfig.task]; if (! taskDefinition) { job.state = 'complete'; job.error = 'InvalidTask'; job.message = "invalid task name: " + taskConfig.task; doneCallback(); return job; } task = Plan.createTask(taskDefinition, taskName, optionsToUse); task.exports.task = taskConfig.task; taskInstances[taskName] = task; job.info[taskName] = task.exports; plan.addTask(task); } var targetTask, i, depName, depTask; for (taskName in template.tasks) { taskConfig = template.tasks[taskName]; targetTask = taskInstances[taskName]; if (! taskConfig.dependencies) continue; for (i = 0; i < taskConfig.dependencies.length; ++i) { depName = taskConfig.dependencies[i]; depTask = taskInstances[depName]; if (! depTask) { job.state = 'complete'; job.error = 'InvalidTemplate'; job.message = "invalid dependency name: " + depName; doneCallback(); return job; } plan.addDependency(targetTask, depTask); } } plan.on('progress', function(amountDone, amountTotal){ job.progress = amountDone / amountTotal; emitUpdate(); }); plan.on('error', function(err, task){ console.error("Task", task.name, "error", err.stack, "\n"); job.error = 'ProcessingError'; job.message = "Error processing job."; }); plan.on('end', function(){ onDone(); }); plan.start(context); self.emit('new', job); return job; function onDone(){ job.progress = 1; job.state = 'complete'; job.endDate = new Date(); emitUpdate(); emitComplete(); doneCallback(); } function emitUpdate(){ self.emit("update." + job.id, job); } function emitComplete(){ self.emit('complete'); self.emit("complete." + job.id); } return emitComplete; };
self.state.addJob(job, function(err) { if (err) { console.error("unable to add job:", err.stack); job.state = 'complete'; job.error = 'InternalError'; job.message = "Internal error creating job."; doneCallback(); return job; } assert.ok(template.id); var plan = new Plan(template.id); var taskInstances = {}; var templateScopeOptions = template.options || {}; var taskName, taskConfig, nonlocalOptions, taskScopeOptions; var optionsToUse, taskDefinition, task; for (taskName in template.tasks) { taskConfig = template.tasks[taskName]; nonlocalOptions = templateScopeOptions[taskConfig.task] || {}; taskScopeOptions = taskConfig.options || {}; optionsToUse = extend(extend({}, nonlocalOptions), taskScopeOptions); taskDefinition = self.tasks[taskConfig.task]; if (! taskDefinition) { job.state = 'complete'; job.error = 'InvalidTask'; job.message = "invalid task name: " + taskConfig.task; doneCallback(); return job; } task = Plan.createTask(taskDefinition, taskName, optionsToUse); task.exports.task = taskConfig.task; taskInstances[taskName] = task; job.info[taskName] = task.exports; plan.addTask(task); } var targetTask, i, depName, depTask; for (taskName in template.tasks) { taskConfig = template.tasks[taskName]; targetTask = taskInstances[taskName]; if (! taskConfig.dependencies) continue; for (i = 0; i < taskConfig.dependencies.length; ++i) { depName = taskConfig.dependencies[i]; depTask = taskInstances[depName]; if (! depTask) { job.state = 'complete'; job.error = 'InvalidTemplate'; job.message = "invalid dependency name: " + depName; doneCallback(); return job; } plan.addDependency(targetTask, depTask); } } plan.on('progress', function(amountDone, amountTotal){ job.progress = amountDone / amountTotal; self.state.onUpdate(job); }); plan.on('error', function(err, task){ console.error("Task", task.name, "error", err.stack, "\n"); job.error = 'ProcessingError'; job.message = "Error processing job."; }); plan.on('end', onDone); plan.start(context); });