vulpes
Version:
Job management framework
1,259 lines (946 loc) • 57.9 kB
Markdown
## Modules
<dl>
<dt><a href="#module_Vulpes">Vulpes</a></dt>
<dd></dd>
</dl>
## Classes
<dl>
<dt><a href="#Scheduler">Scheduler</a> ⇐ <code>EventEmitter</code></dt>
<dd><p>Scheduler for scheduled tasks</p>
</dd>
</dl>
## Functions
<dl>
<dt><a href="#generateEmptyJob">generateEmptyJob()</a> ⇒ <code><a href="#Job">Job</a></code></dt>
<dd><p>Generate an empty job</p>
</dd>
<dt><a href="#jobSatisfiesPredicates">jobSatisfiesPredicates(service, job)</a> ⇒ <code><a href="#PredicatesTestResult">PredicatesTestResult</a></code></dt>
<dd><p>Test if a job satisfies all of its predicates</p>
</dd>
<dt><a href="#sortJobs">sortJobs(jobs, [sortSteps])</a> ⇒ <code><a href="#Job">Array.<Job></a></code></dt>
<dd><p>Sort jobs by some criteria</p>
</dd>
<dt><a href="#sortJobsByPriority">sortJobsByPriority(jobs)</a> ⇒ <code><a href="#Job">Array.<Job></a></code></dt>
<dd><p>Sort jobs by priority</p>
</dd>
<dt><a href="#updateStatsForJob">updateStatsForJob(jobStats, job)</a></dt>
<dd><p>Updates the properties in <code>jobStats</code> according to the state
of the <code>job</code></p>
</dd>
</dl>
## Typedefs
<dl>
<dt><a href="#NewJobAttachmentOptions">NewJobAttachmentOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#JobAttachment">JobAttachment</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#AutoArchiveHelperOptions">AutoArchiveHelperOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#NewJob">NewJob</a> : <code>Object</code></dt>
<dd><p>New job data</p>
</dd>
<dt><a href="#Job">Job</a> : <code>Object</code></dt>
<dd><p>A job</p>
</dd>
<dt><a href="#PredicatesTestResult">PredicatesTestResult</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#JobSortingStep">JobSortingStep</a> : <code>Object</code></dt>
<dd><p>Job sorting step configuration</p>
</dd>
<dt><a href="#NewScheduledTask">NewScheduledTask</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#ScheduledTask">ScheduledTask</a> : <code><a href="#NewScheduledTask">NewScheduledTask</a></code></dt>
<dd></dd>
<dt><a href="#UpdateTaskPropertiesOptions">UpdateTaskPropertiesOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#ServiceOptions">ServiceOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#GetJobChildrenOptions">GetJobChildrenOptions</a> : <code>Object</code></dt>
<dd><p>Options for fetching job children</p>
</dd>
<dt><a href="#GetJobParentsOptions">GetJobParentsOptions</a> : <code>Object</code></dt>
<dd><p>Options for fetching job parents</p>
</dd>
<dt><a href="#GetJobTreeOptions">GetJobTreeOptions</a> : <code>Object</code></dt>
<dd><p>Options for fetching a job tree</p>
</dd>
<dt><a href="#QueryJobsOptions">QueryJobsOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#StartJobOptions">StartJobOptions</a> : <code>Object</code></dt>
<dd><p>Start job options</p>
</dd>
<dt><a href="#UpdateJobOptions">UpdateJobOptions</a> : <code>Object</code></dt>
<dd><p>Update job options</p>
</dd>
<dt><a href="#MemoryStorageOptions">MemoryStorageOptions</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#ResultType">ResultType</a> : <code>String</code></dt>
<dd><p>Job result type</p>
</dd>
<dt><a href="#Status">Status</a> : <code>String</code></dt>
<dd><p>Job status</p>
</dd>
<dt><a href="#Priority">Priority</a> : <code>String</code></dt>
<dd><p>Job priority</p>
</dd>
<dt><a href="#JobImportTemplateItem">JobImportTemplateItem</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#JobImportTemplate">JobImportTemplate</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#TrackerJobStats">TrackerJobStats</a> : <code>Object</code></dt>
<dd></dd>
<dt><a href="#RegisteredWorker">RegisteredWorker</a> : <code>Object</code></dt>
<dd></dd>
</dl>
<a name="module_Vulpes"></a>
## Vulpes
* [Vulpes](#module_Vulpes)
* _static_
* [.AutoArchiveHelper](#module_Vulpes.AutoArchiveHelper) ⇐ <code>Helper</code>
* [new AutoArchiveHelper([options])](#new_module_Vulpes.AutoArchiveHelper_new)
* [.service](#Helper+service) : <code>Service</code>
* [.attach(service)](#Helper+attach)
* [.initialise()](#Helper+initialise) ⇒ <code>Promise</code>
* [.shutdown()](#Helper+shutdown)
* [.FileStorage](#module_Vulpes.FileStorage) ⇐ <code>Storage</code>
* [new FileStorage(filename)](#new_module_Vulpes.FileStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
* [.RedisStorage](#module_Vulpes.RedisStorage) ⇐ <code>Storage</code>
* [new RedisStorage([redisOptions])](#new_module_Vulpes.RedisStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
* [.Storage](#module_Vulpes.Storage)
* [.waitForStream(stream)](#module_Vulpes.waitForStream) ⇒ <code>Promise</code>
* [.convertTemplateToJobArray(tmpObj)](#module_Vulpes.convertTemplateToJobArray) ⇒ [<code>Array.<NewJob></code>](#NewJob)
* _inner_
* [~ArtifactManager](#module_Vulpes.ArtifactManager) ⇐ <code>EventEmitter</code>
* [new ArtifactManager([storagePath])](#new_module_Vulpes.ArtifactManager_new)
* [.addJobAttachment(jobID, param1)](#module_Vulpes.ArtifactManager+addJobAttachment) ⇒ <code>Promise.<String></code>
* [.initialise(service)](#module_Vulpes.ArtifactManager+initialise) ⇒ <code>Promise</code>
* [.getArtifactReadStream(artifactID)](#module_Vulpes.ArtifactManager+getArtifactReadStream) ⇒ <code>Promise.<ReadableStream></code>
* [.getArtifactWriteStream(artifactID)](#module_Vulpes.ArtifactManager+getArtifactWriteStream) ⇒ <code>Promise.<WritableStream></code>
* [.getJobAttachments(jobID)](#module_Vulpes.ArtifactManager+getJobAttachments) ⇒ [<code>Array.<JobAttachment></code>](#JobAttachment)
* [.removeArtifact(artifactID)](#module_Vulpes.ArtifactManager+removeArtifact) ⇒ <code>Promise</code>
* [.removeJobAttachment(jobID, artifactID)](#module_Vulpes.ArtifactManager+removeJobAttachment) ⇒ <code>Promise</code>
* [.shutdown()](#module_Vulpes.ArtifactManager+shutdown) ⇒ <code>Promise</code>
* [~Helper](#module_Vulpes.Helper)
* [~TimeoutHelper](#module_Vulpes.TimeoutHelper) ⇐ <code>Helper</code>
* [.service](#Helper+service) : <code>Service</code>
* [.attach(service)](#Helper+attach)
* [.initialise()](#Helper+initialise) ⇒ <code>Promise</code>
* [.shutdown()](#Helper+shutdown)
* [~Service](#module_Vulpes.Service) ⇐ <code>EventEmitter</code>
* [new Service([param0])](#new_module_Vulpes.Service_new)
* [~MemoryStorage](#module_Vulpes.MemoryStorage) ⇐ <code>Storage</code>
* [new MemoryStorage([opts])](#new_module_Vulpes.MemoryStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
<a name="module_Vulpes.AutoArchiveHelper"></a>
### Vulpes.AutoArchiveHelper ⇐ <code>Helper</code>
Auto archive helper
**Kind**: static class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>Helper</code>
* [.AutoArchiveHelper](#module_Vulpes.AutoArchiveHelper) ⇐ <code>Helper</code>
* [new AutoArchiveHelper([options])](#new_module_Vulpes.AutoArchiveHelper_new)
* [.service](#Helper+service) : <code>Service</code>
* [.attach(service)](#Helper+attach)
* [.initialise()](#Helper+initialise) ⇒ <code>Promise</code>
* [.shutdown()](#Helper+shutdown)
<a name="new_module_Vulpes.AutoArchiveHelper_new"></a>
#### new AutoArchiveHelper([options])
Constructor for the auto archive helper
| Param | Type | Description |
| --- | --- | --- |
| [options] | [<code>AutoArchiveHelperOptions</code>](#AutoArchiveHelperOptions) | Config options |
<a name="Helper+service"></a>
#### autoArchiveHelper.service : <code>Service</code>
The attached service
**Kind**: instance property of [<code>AutoArchiveHelper</code>](#module_Vulpes.AutoArchiveHelper)
**Overrides**: [<code>service</code>](#Helper+service)
**Read only**: true
<a name="Helper+attach"></a>
#### autoArchiveHelper.attach(service)
Attach to a service
This will be called by a Service instance
**Kind**: instance method of [<code>AutoArchiveHelper</code>](#module_Vulpes.AutoArchiveHelper)
**Overrides**: [<code>attach</code>](#Helper+attach)
**Throws**:
- <code>Error</code> Throws if already attached to a service
| Param | Type | Description |
| --- | --- | --- |
| service | <code>Service</code> | The service to attach to |
<a name="Helper+initialise"></a>
#### autoArchiveHelper.initialise() ⇒ <code>Promise</code>
Initialise the helper (only called if the helper is added BEFORE
service initialisation)
**Kind**: instance method of [<code>AutoArchiveHelper</code>](#module_Vulpes.AutoArchiveHelper)
**Overrides**: [<code>initialise</code>](#Helper+initialise)
<a name="Helper+shutdown"></a>
#### autoArchiveHelper.shutdown()
Shutdown the helper
This will be called by a Service instance
**Kind**: instance method of [<code>AutoArchiveHelper</code>](#module_Vulpes.AutoArchiveHelper)
**Overrides**: [<code>shutdown</code>](#Helper+shutdown)
<a name="module_Vulpes.FileStorage"></a>
### Vulpes.FileStorage ⇐ <code>Storage</code>
File storage adapter
Stores and streams jobs in a local file (very inefficiently)
**Kind**: static class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>Storage</code>
* [.FileStorage](#module_Vulpes.FileStorage) ⇐ <code>Storage</code>
* [new FileStorage(filename)](#new_module_Vulpes.FileStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
<a name="new_module_Vulpes.FileStorage_new"></a>
#### new FileStorage(filename)
Constructor for a new FileStorage instance
| Param | Type | Description |
| --- | --- | --- |
| filename | <code>String</code> | The file to store/stream jobs to and from |
<a name="Storage+getItem"></a>
#### fileStorage.getItem(key) ⇒ <code>Promise.<(\*\|null)></code>
Get an item by its key
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>getItem</code>](#Storage+getItem)
**Returns**: <code>Promise.<(\*\|null)></code> - A promise that resolves with the item, or
null if the item doesn't exist
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to fetch |
<a name="Storage+initialise"></a>
#### fileStorage.initialise() ⇒ <code>Promise</code>
Initialise the storage
This usually entails reading the store from the storage so that it is
immediately available
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>initialise</code>](#Storage+initialise)
**Returns**: <code>Promise</code> - A promise that resolves once initialisation has
completed
<a name="Storage+removeItem"></a>
#### fileStorage.removeItem(key) ⇒ <code>Promise</code>
Remove an item from storage
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>removeItem</code>](#Storage+removeItem)
**Returns**: <code>Promise</code> - A promise that resolves once the key has been removed
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to remove |
<a name="Storage+setItem"></a>
#### fileStorage.setItem(key, value) ⇒ <code>Promise</code>
Set an item
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>setItem</code>](#Storage+setItem)
**Returns**: <code>Promise</code> - A promise that resolves once the value has been
stored
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to set the value for |
| value | <code>\*</code> | The value to set |
<a name="Storage+shutdown"></a>
#### fileStorage.shutdown() ⇒ <code>Promise</code>
Shutdown the storage instance
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>shutdown</code>](#Storage+shutdown)
**Returns**: <code>Promise</code> - A promise that resolves once the shutdown procedure is complete
<a name="Storage+streamItems"></a>
#### fileStorage.streamItems() ⇒ <code>Promise.<ReadableStream></code>
Stream all items
**Kind**: instance method of [<code>FileStorage</code>](#module_Vulpes.FileStorage)
**Overrides**: [<code>streamItems</code>](#Storage+streamItems)
**Returns**: <code>Promise.<ReadableStream></code> - A promise that resolves with the readable stream
<a name="module_Vulpes.RedisStorage"></a>
### Vulpes.RedisStorage ⇐ <code>Storage</code>
Redis storage adapter
Stores items in a Redis database
**Kind**: static class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>Storage</code>
**See**: https://www.npmjs.com/package/ioredis
* [.RedisStorage](#module_Vulpes.RedisStorage) ⇐ <code>Storage</code>
* [new RedisStorage([redisOptions])](#new_module_Vulpes.RedisStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
<a name="new_module_Vulpes.RedisStorage_new"></a>
#### new RedisStorage([redisOptions])
Create a new Redis storage instance
| Param | Type | Description |
| --- | --- | --- |
| [redisOptions] | <code>Object</code> | The options for ioredis |
<a name="Storage+getItem"></a>
#### redisStorage.getItem(key) ⇒ <code>Promise.<(\*\|null)></code>
Get an item by its key
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>getItem</code>](#Storage+getItem)
**Returns**: <code>Promise.<(\*\|null)></code> - A promise that resolves with the item, or
null if the item doesn't exist
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to fetch |
<a name="Storage+initialise"></a>
#### redisStorage.initialise() ⇒ <code>Promise</code>
Initialise the storage
This usually entails reading the store from the storage so that it is
immediately available
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>initialise</code>](#Storage+initialise)
**Returns**: <code>Promise</code> - A promise that resolves once initialisation has
completed
<a name="Storage+removeItem"></a>
#### redisStorage.removeItem(key) ⇒ <code>Promise</code>
Remove an item from storage
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>removeItem</code>](#Storage+removeItem)
**Returns**: <code>Promise</code> - A promise that resolves once the key has been removed
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to remove |
<a name="Storage+setItem"></a>
#### redisStorage.setItem(key, value) ⇒ <code>Promise</code>
Set an item
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>setItem</code>](#Storage+setItem)
**Returns**: <code>Promise</code> - A promise that resolves once the value has been
stored
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to set the value for |
| value | <code>\*</code> | The value to set |
<a name="Storage+shutdown"></a>
#### redisStorage.shutdown() ⇒ <code>Promise</code>
Shutdown the storage instance
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>shutdown</code>](#Storage+shutdown)
**Returns**: <code>Promise</code> - A promise that resolves once the shutdown procedure is complete
<a name="Storage+streamItems"></a>
#### redisStorage.streamItems() ⇒ <code>Promise.<ReadableStream></code>
Stream all items
**Kind**: instance method of [<code>RedisStorage</code>](#module_Vulpes.RedisStorage)
**Overrides**: [<code>streamItems</code>](#Storage+streamItems)
**Returns**: <code>Promise.<ReadableStream></code> - A promise that resolves with the readable stream
<a name="module_Vulpes.Storage"></a>
### Vulpes.Storage
Storage base class
Provides a storage mechanism for the job handling framework,
allowing jobs to persist between restarts. This is an
interface and does not actually perform any operations.
**Kind**: static class of [<code>Vulpes</code>](#module_Vulpes)
<a name="module_Vulpes.waitForStream"></a>
### Vulpes.waitForStream(stream) ⇒ <code>Promise</code>
Wait for a stream to end
**Kind**: static method of [<code>Vulpes</code>](#module_Vulpes)
| Param | Type | Description |
| --- | --- | --- |
| stream | <code>ReadableStream</code> | The stream to wait for |
<a name="module_Vulpes.convertTemplateToJobArray"></a>
### Vulpes.convertTemplateToJobArray(tmpObj) ⇒ [<code>Array.<NewJob></code>](#NewJob)
Convert a template to an array of jobs to import
**Kind**: static method of [<code>Vulpes</code>](#module_Vulpes)
**Returns**: [<code>Array.<NewJob></code>](#NewJob) - An array of new jobs to pass to `Service#addJobs`
| Param | Type | Description |
| --- | --- | --- |
| tmpObj | [<code>JobImportTemplate</code>](#JobImportTemplate) | The template to convert |
<a name="module_Vulpes.ArtifactManager"></a>
### Vulpes~ArtifactManager ⇐ <code>EventEmitter</code>
Artifact Manager
**Kind**: inner class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>EventEmitter</code>
* [~ArtifactManager](#module_Vulpes.ArtifactManager) ⇐ <code>EventEmitter</code>
* [new ArtifactManager([storagePath])](#new_module_Vulpes.ArtifactManager_new)
* [.addJobAttachment(jobID, param1)](#module_Vulpes.ArtifactManager+addJobAttachment) ⇒ <code>Promise.<String></code>
* [.initialise(service)](#module_Vulpes.ArtifactManager+initialise) ⇒ <code>Promise</code>
* [.getArtifactReadStream(artifactID)](#module_Vulpes.ArtifactManager+getArtifactReadStream) ⇒ <code>Promise.<ReadableStream></code>
* [.getArtifactWriteStream(artifactID)](#module_Vulpes.ArtifactManager+getArtifactWriteStream) ⇒ <code>Promise.<WritableStream></code>
* [.getJobAttachments(jobID)](#module_Vulpes.ArtifactManager+getJobAttachments) ⇒ [<code>Array.<JobAttachment></code>](#JobAttachment)
* [.removeArtifact(artifactID)](#module_Vulpes.ArtifactManager+removeArtifact) ⇒ <code>Promise</code>
* [.removeJobAttachment(jobID, artifactID)](#module_Vulpes.ArtifactManager+removeJobAttachment) ⇒ <code>Promise</code>
* [.shutdown()](#module_Vulpes.ArtifactManager+shutdown) ⇒ <code>Promise</code>
<a name="new_module_Vulpes.ArtifactManager_new"></a>
#### new ArtifactManager([storagePath])
Constructor for the artifact manager
| Param | Type | Description |
| --- | --- | --- |
| [storagePath] | <code>String</code> | The path to store artifacts in. Defaults to `~/.vulpes/artifacts` if not specified. |
<a name="module_Vulpes.ArtifactManager+addJobAttachment"></a>
#### artifactManager.addJobAttachment(jobID, param1) ⇒ <code>Promise.<String></code>
Add a new job attachment
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
**Returns**: <code>Promise.<String></code> - A promise that resolves with the attachment ID
| Param | Type | Description |
| --- | --- | --- |
| jobID | <code>String</code> | The job ID to add the attachment to |
| param1 | [<code>NewJobAttachmentOptions</code>](#NewJobAttachmentOptions) | Options for the new attachment |
<a name="module_Vulpes.ArtifactManager+initialise"></a>
#### artifactManager.initialise(service) ⇒ <code>Promise</code>
Initialise the manager (called by Service)
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
**Emits**: [<code>migrationComplete</code>](#ArtifactManager+event_migrationComplete)
| Param | Type | Description |
| --- | --- | --- |
| service | <code>Service</code> | The service instance we're attached to |
<a name="module_Vulpes.ArtifactManager+getArtifactReadStream"></a>
#### artifactManager.getArtifactReadStream(artifactID) ⇒ <code>Promise.<ReadableStream></code>
Get a readable stream of an artifact
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
| Param | Type | Description |
| --- | --- | --- |
| artifactID | <code>String</code> | The artifact's ID |
<a name="module_Vulpes.ArtifactManager+getArtifactWriteStream"></a>
#### artifactManager.getArtifactWriteStream(artifactID) ⇒ <code>Promise.<WritableStream></code>
Get a writeable stream for an artifact
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
| Param | Type | Description |
| --- | --- | --- |
| artifactID | <code>String</code> | The artifact's ID |
<a name="module_Vulpes.ArtifactManager+getJobAttachments"></a>
#### artifactManager.getJobAttachments(jobID) ⇒ [<code>Array.<JobAttachment></code>](#JobAttachment)
Get all job attachments
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
| Param | Type | Description |
| --- | --- | --- |
| jobID | <code>String</code> | The ID of the job to fetch artifacts for |
<a name="module_Vulpes.ArtifactManager+removeArtifact"></a>
#### artifactManager.removeArtifact(artifactID) ⇒ <code>Promise</code>
Remove an artifact (does not affect jobs)
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
| Param | Type | Description |
| --- | --- | --- |
| artifactID | <code>String</code> | The ID of the artifact to remove |
<a name="module_Vulpes.ArtifactManager+removeJobAttachment"></a>
#### artifactManager.removeJobAttachment(jobID, artifactID) ⇒ <code>Promise</code>
Remove an attachment from a job, also removing
the associated artifact
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
| Param | Type | Description |
| --- | --- | --- |
| jobID | <code>String</code> | The ID of the job containing the artifact |
| artifactID | <code>String</code> | The ID of the artifact to remove from the job |
<a name="module_Vulpes.ArtifactManager+shutdown"></a>
#### artifactManager.shutdown() ⇒ <code>Promise</code>
Shutdown the artifact manager
**Kind**: instance method of [<code>ArtifactManager</code>](#module_Vulpes.ArtifactManager)
<a name="module_Vulpes.Helper"></a>
### Vulpes~Helper
Helper base class
Helpers provide an easy interface with which to
attach to services to perform ancillary tasks.
**Kind**: inner class of [<code>Vulpes</code>](#module_Vulpes)
<a name="module_Vulpes.TimeoutHelper"></a>
### Vulpes~TimeoutHelper ⇐ <code>Helper</code>
Helper for timing-out jobs
**Kind**: inner class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>Helper</code>
* [~TimeoutHelper](#module_Vulpes.TimeoutHelper) ⇐ <code>Helper</code>
* [.service](#Helper+service) : <code>Service</code>
* [.attach(service)](#Helper+attach)
* [.initialise()](#Helper+initialise) ⇒ <code>Promise</code>
* [.shutdown()](#Helper+shutdown)
<a name="Helper+service"></a>
#### timeoutHelper.service : <code>Service</code>
The attached service
**Kind**: instance property of [<code>TimeoutHelper</code>](#module_Vulpes.TimeoutHelper)
**Overrides**: [<code>service</code>](#Helper+service)
**Read only**: true
<a name="Helper+attach"></a>
#### timeoutHelper.attach(service)
Attach to a service
This will be called by a Service instance
**Kind**: instance method of [<code>TimeoutHelper</code>](#module_Vulpes.TimeoutHelper)
**Overrides**: [<code>attach</code>](#Helper+attach)
**Throws**:
- <code>Error</code> Throws if already attached to a service
| Param | Type | Description |
| --- | --- | --- |
| service | <code>Service</code> | The service to attach to |
<a name="Helper+initialise"></a>
#### timeoutHelper.initialise() ⇒ <code>Promise</code>
Initialise the helper (only called if the helper is added BEFORE
service initialisation)
**Kind**: instance method of [<code>TimeoutHelper</code>](#module_Vulpes.TimeoutHelper)
**Overrides**: [<code>initialise</code>](#Helper+initialise)
<a name="Helper+shutdown"></a>
#### timeoutHelper.shutdown()
Shutdown the helper
This will be called by a Service instance
**Kind**: instance method of [<code>TimeoutHelper</code>](#module_Vulpes.TimeoutHelper)
**Overrides**: [<code>shutdown</code>](#Helper+shutdown)
<a name="module_Vulpes.Service"></a>
### Vulpes~Service ⇐ <code>EventEmitter</code>
Service for managing jobs
**Kind**: inner class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>EventEmitter</code>
<a name="new_module_Vulpes.Service_new"></a>
#### new Service([param0])
Contrsuctor for the Service class
| Param | Type | Description |
| --- | --- | --- |
| [param0] | [<code>ServiceOptions</code>](#ServiceOptions) | Options for the new service |
<a name="module_Vulpes.MemoryStorage"></a>
### Vulpes~MemoryStorage ⇐ <code>Storage</code>
Memory storage adapter
Stores jobs in memory. Once application is closed all jobs are
purged - do not use this storage if you desire persistence.
**Kind**: inner class of [<code>Vulpes</code>](#module_Vulpes)
**Extends**: <code>Storage</code>
* [~MemoryStorage](#module_Vulpes.MemoryStorage) ⇐ <code>Storage</code>
* [new MemoryStorage([opts])](#new_module_Vulpes.MemoryStorage_new)
* [.getItem(key)](#Storage+getItem) ⇒ <code>Promise.<(\*\|null)></code>
* [.initialise()](#Storage+initialise) ⇒ <code>Promise</code>
* [.removeItem(key)](#Storage+removeItem) ⇒ <code>Promise</code>
* [.setItem(key, value)](#Storage+setItem) ⇒ <code>Promise</code>
* [.shutdown()](#Storage+shutdown) ⇒ <code>Promise</code>
* [.streamItems()](#Storage+streamItems) ⇒ <code>Promise.<ReadableStream></code>
<a name="new_module_Vulpes.MemoryStorage_new"></a>
#### new MemoryStorage([opts])
Constructor for the storage instance
| Param | Type | Description |
| --- | --- | --- |
| [opts] | [<code>MemoryStorageOptions</code>](#MemoryStorageOptions) | Optional configuration for the memory storage instance |
<a name="Storage+getItem"></a>
#### memoryStorage.getItem(key) ⇒ <code>Promise.<(\*\|null)></code>
Get an item by its key
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>getItem</code>](#Storage+getItem)
**Returns**: <code>Promise.<(\*\|null)></code> - A promise that resolves with the item, or
null if the item doesn't exist
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to fetch |
<a name="Storage+initialise"></a>
#### memoryStorage.initialise() ⇒ <code>Promise</code>
Initialise the storage
This usually entails reading the store from the storage so that it is
immediately available
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>initialise</code>](#Storage+initialise)
**Returns**: <code>Promise</code> - A promise that resolves once initialisation has
completed
<a name="Storage+removeItem"></a>
#### memoryStorage.removeItem(key) ⇒ <code>Promise</code>
Remove an item from storage
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>removeItem</code>](#Storage+removeItem)
**Returns**: <code>Promise</code> - A promise that resolves once the key has been removed
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to remove |
<a name="Storage+setItem"></a>
#### memoryStorage.setItem(key, value) ⇒ <code>Promise</code>
Set an item
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>setItem</code>](#Storage+setItem)
**Returns**: <code>Promise</code> - A promise that resolves once the value has been
stored
| Param | Type | Description |
| --- | --- | --- |
| key | <code>String</code> | The key to set the value for |
| value | <code>\*</code> | The value to set |
<a name="Storage+shutdown"></a>
#### memoryStorage.shutdown() ⇒ <code>Promise</code>
Shutdown the storage instance
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>shutdown</code>](#Storage+shutdown)
**Returns**: <code>Promise</code> - A promise that resolves once the shutdown procedure is complete
<a name="Storage+streamItems"></a>
#### memoryStorage.streamItems() ⇒ <code>Promise.<ReadableStream></code>
Stream all items
**Kind**: instance method of [<code>MemoryStorage</code>](#module_Vulpes.MemoryStorage)
**Overrides**: [<code>streamItems</code>](#Storage+streamItems)
**Returns**: <code>Promise.<ReadableStream></code> - A promise that resolves with the readable stream
<a name="Scheduler"></a>
## Scheduler ⇐ <code>EventEmitter</code>
Scheduler for scheduled tasks
**Kind**: global class
**Extends**: <code>EventEmitter</code>
* [Scheduler](#Scheduler) ⇐ <code>EventEmitter</code>
* [.service](#Scheduler+service) : <code>Service</code>
* [.taskQueue](#Scheduler+taskQueue) : <code>Channel</code>
* ~~[.addScheduledJobs()](#Scheduler+addScheduledJobs)~~
* [.addScheduledTask(options)](#Scheduler+addScheduledTask) ⇒ <code>String</code>
* [.getScheduledTask(id)](#Scheduler+getScheduledTask) ⇒ [<code>Promise.<ScheduledTask></code>](#ScheduledTask)
* [.getScheduledTasks()](#Scheduler+getScheduledTasks) ⇒ <code>Promise.<Array.<ScheduledTask>></code>
* [.initialise()](#Scheduler+initialise) ⇒ <code>Promise</code>
* [.removeScheduledTask()](#Scheduler+removeScheduledTask) ⇒ <code>Promise</code>
* [.setJobsForScheduledTask(taskID, jobs)](#Scheduler+setJobsForScheduledTask) ⇒ <code>Promise</code>
* [.shutdown()](#Scheduler+shutdown)
* [.toggleTask(taskID, [enabled])](#Scheduler+toggleTask) ⇒ [<code>ScheduledTask</code>](#ScheduledTask)
* [.triggerTask(taskID)](#Scheduler+triggerTask) ⇒ <code>Promise</code>
* [.updateTaskProperties(taskID, ops)](#Scheduler+updateTaskProperties) ⇒ [<code>ScheduledTask</code>](#ScheduledTask)
* [._cronSchedule()](#Scheduler+_cronSchedule) ⇒ <code>Object</code>
* [._executeTask(taskOrTaskID, [force])](#Scheduler+_executeTask)
* [._unwatchTask(task)](#Scheduler+_unwatchTask) ⇒ <code>Boolean</code>
* [._watchTask(task)](#Scheduler+_watchTask)
* [._writeTask(task)](#Scheduler+_writeTask) ⇒ <code>Promise</code>
* ["taskAdded"](#Scheduler+event_taskAdded)
* ["taskJobsUpdated"](#Scheduler+event_taskJobsUpdated)
* ["taskStatusToggled"](#Scheduler+event_taskStatusToggled)
* ["taskPropertiesUpdated"](#Scheduler+event_taskPropertiesUpdated)
* ["createdJobsFromTask"](#Scheduler+event_createdJobsFromTask)
* ["taskScheduled"](#Scheduler+event_taskScheduled)
<a name="Scheduler+service"></a>
### scheduler.service : <code>Service</code>
Service reference
**Kind**: instance property of [<code>Scheduler</code>](#Scheduler)
<a name="Scheduler+taskQueue"></a>
### scheduler.taskQueue : <code>Channel</code>
Task queue for job schedule checks
**Kind**: instance property of [<code>Scheduler</code>](#Scheduler)
**Read only**: true
<a name="Scheduler+addScheduledJobs"></a>
### ~~scheduler.addScheduledJobs()~~
***Deprecated***
Add scheduled jobs
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**See**: Scheduler#addScheduledTask
<a name="Scheduler+addScheduledTask"></a>
### scheduler.addScheduledTask(options) ⇒ <code>String</code>
Add scheduled jobs task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: <code>String</code> - The ID of the scheduled task
**Throws**:
- <code>Error</code> Throws if the schedule is not a valid CRON format
**Emits**: [<code>taskAdded</code>](#Scheduler+event_taskAdded)
| Param | Type | Description |
| --- | --- | --- |
| options | [<code>NewScheduledTask</code>](#NewScheduledTask) | Task structure for the newly scheduled job |
<a name="Scheduler+getScheduledTask"></a>
### scheduler.getScheduledTask(id) ⇒ [<code>Promise.<ScheduledTask></code>](#ScheduledTask)
Get a scheduled task by its ID
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: [<code>Promise.<ScheduledTask></code>](#ScheduledTask) - A promise that resolves with the scheduled task
| Param | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
<a name="Scheduler+getScheduledTasks"></a>
### scheduler.getScheduledTasks() ⇒ <code>Promise.<Array.<ScheduledTask>></code>
Get all scheduled tasks
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: <code>Promise.<Array.<ScheduledTask>></code> - A promise that resolves with an array of all
scheduled tasks
<a name="Scheduler+initialise"></a>
### scheduler.initialise() ⇒ <code>Promise</code>
Initialise the scheduler
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
<a name="Scheduler+removeScheduledTask"></a>
### scheduler.removeScheduledTask() ⇒ <code>Promise</code>
Remove a scheduled task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
<a name="Scheduler+setJobsForScheduledTask"></a>
### scheduler.setJobsForScheduledTask(taskID, jobs) ⇒ <code>Promise</code>
Set the jobs array for a task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Emits**: [<code>taskJobsUpdated</code>](#Scheduler+event_taskJobsUpdated)
| Param | Type | Description |
| --- | --- | --- |
| taskID | <code>String</code> | The ID of the task |
| jobs | [<code>Array.<NewJob></code>](#NewJob) | An array of job templates |
<a name="Scheduler+shutdown"></a>
### scheduler.shutdown()
Shutdown the scheduler
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
<a name="Scheduler+toggleTask"></a>
### scheduler.toggleTask(taskID, [enabled]) ⇒ [<code>ScheduledTask</code>](#ScheduledTask)
Enable/disable a task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: [<code>ScheduledTask</code>](#ScheduledTask) - Returns the toggled task
**Emits**: [<code>taskStatusToggled</code>](#Scheduler+event_taskStatusToggled)
| Param | Type | Description |
| --- | --- | --- |
| taskID | <code>String</code> | The ID of the task |
| [enabled] | <code>Boolean</code> | Set the enabled status of the task to true or false. If not specified, the status of the task will be toggled. |
<a name="Scheduler+triggerTask"></a>
### scheduler.triggerTask(taskID) ⇒ <code>Promise</code>
Trigger a task (skip schedule)
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
| Param | Type | Description |
| --- | --- | --- |
| taskID | <code>String</code> | The scheduled task's ID |
<a name="Scheduler+updateTaskProperties"></a>
### scheduler.updateTaskProperties(taskID, ops) ⇒ [<code>ScheduledTask</code>](#ScheduledTask)
Update properties of a task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: [<code>ScheduledTask</code>](#ScheduledTask) - Returns the toggled task
**Emits**: [<code>taskPropertiesUpdated</code>](#Scheduler+event_taskPropertiesUpdated)
| Param | Type | Description |
| --- | --- | --- |
| taskID | <code>String</code> | The ID of the task to update |
| ops | [<code>UpdateTaskPropertiesOptions</code>](#UpdateTaskPropertiesOptions) | Properties to update on the task |
<a name="Scheduler+_cronSchedule"></a>
### scheduler.\_cronSchedule() ⇒ <code>Object</code>
Schedule a CRON execution
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: <code>Object</code> - The CRON task
**Access**: protected
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| schedule | <code>String</code> | The minute-accurate CRON string |
| cb | <code>function</code> | The callback to fire when the CRON timer matches current time |
<a name="Scheduler+_executeTask"></a>
### scheduler.\_executeTask(taskOrTaskID, [force])
Execute a task
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Emits**: [<code>createdJobsFromTask</code>](#Scheduler+event_createdJobsFromTask)
**Access**: protected
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| taskOrTaskID | [<code>ScheduledTask</code>](#ScheduledTask) \| <code>String</code> | | The scheduled task or an ID of a task |
| [force] | <code>Boolean</code> | <code>false</code> | Optionally force the execution (bypass disabled statuses). Default is false. |
<a name="Scheduler+_unwatchTask"></a>
### scheduler.\_unwatchTask(task) ⇒ <code>Boolean</code>
Unwatch a CRON task (deschedule it)
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Returns**: <code>Boolean</code> - True if a task was found, false otherwise
**Access**: protected
| Param | Type | Description |
| --- | --- | --- |
| task | [<code>ScheduledTask</code>](#ScheduledTask) | The task to deschedule |
<a name="Scheduler+_watchTask"></a>
### scheduler.\_watchTask(task)
Watch a task (start timer for scheduling)
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Emits**: [<code>taskScheduled</code>](#Scheduler+event_taskScheduled)
**Access**: protected
| Param | Type | Description |
| --- | --- | --- |
| task | [<code>ScheduledTask</code>](#ScheduledTask) | The task to watch |
<a name="Scheduler+_writeTask"></a>
### scheduler.\_writeTask(task) ⇒ <code>Promise</code>
Write a task to storage
**Kind**: instance method of [<code>Scheduler</code>](#Scheduler)
**Access**: protected
| Param | Type | Description |
| --- | --- | --- |
| task | [<code>ScheduledTask</code>](#ScheduledTask) | The task to write (will overwrite) |
<a name="Scheduler+event_taskAdded"></a>
### "taskAdded"
Event for when a new task is added
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| title | <code>String</code> | The title of the task |
| schedule | <code>String</code> | The CRON schedule for the task |
| enabled | <code>Boolean</code> | Whether the task is enabled or not |
| jobs | [<code>Array.<NewJob></code>](#NewJob) | Array of job templates for scheduled creation |
<a name="Scheduler+event_taskJobsUpdated"></a>
### "taskJobsUpdated"
Event for when a task's jobs are updated
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| jobs | [<code>Array.<NewJob></code>](#NewJob) | Array of job templates for scheduled creation |
<a name="Scheduler+event_taskStatusToggled"></a>
### "taskStatusToggled"
Event for when a task has its status toggled (enabled/disabled)
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| enabled | <code>Boolean</code> | Whether the task is enabled or disabled |
<a name="Scheduler+event_taskPropertiesUpdated"></a>
### "taskPropertiesUpdated"
Event for when a task's properties (title/schedule) are updated
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| title | <code>String</code> | The title of the task |
| schedule | <code>String</code> | The CRON schedule for the task |
<a name="Scheduler+event_createdJobsFromTask"></a>
### "createdJobsFromTask"
Event for when jobs are created as a result of a scheduled task
having been fired using its CRON schedule
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| title | <code>String</code> | The title of the task |
| schedule | <code>String</code> | The CRON schedule for the task |
| jobs | [<code>Array.<NewJob></code>](#NewJob) | Array of job templates for scheduled creation |
<a name="Scheduler+event_taskScheduled"></a>
### "taskScheduled"
Event for when a task has been scheduled (fired both when created and
when being read from storage upon a fresh start-up)
**Kind**: event emitted by [<code>Scheduler</code>](#Scheduler)
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The ID of the task |
| title | <code>String</code> | The title of the task |
| schedule | <code>String</code> | The CRON schedule for the task |
| enabled | <code>Boolean</code> | Whether the task is enabled or not |
<a name="JobPriorities"></a>
## JobPriorities : <code>enum</code>
Job priorities
**Kind**: global enum
**Read only**: true
<a name="JobResultTypes"></a>
## JobResultTypes : <code>enum</code>
Job result types
**Kind**: global enum
**Read only**: true
<a name="JobStatuses"></a>
## JobStatuses : <code>enum</code>
Job statuses
**Kind**: global enum
**Read only**: true
<a name="generateEmptyJob"></a>
## generateEmptyJob() ⇒ [<code>Job</code>](#Job)
Generate an empty job
**Kind**: global function
**Returns**: [<code>Job</code>](#Job) - A new empty job
<a name="jobSatisfiesPredicates"></a>
## jobSatisfiesPredicates(service, job) ⇒ [<code>PredicatesTestResult</code>](#PredicatesTestResult)
Test if a job satisfies all of its predicates
**Kind**: global function
**Returns**: [<code>PredicatesTestResult</code>](#PredicatesTestResult) - Test results
| Param | Type | Description |
| --- | --- | --- |
| service | <code>Service</code> | The service |
| job | [<code>Job</code>](#Job) | The job to test |
<a name="sortJobs"></a>
## sortJobs(jobs, [sortSteps]) ⇒ [<code>Array.<Job></code>](#Job)
Sort jobs by some criteria
**Kind**: global function
**Returns**: [<code>Array.<Job></code>](#Job) - An array of sorted jobs
| Param | Type | Description |
| --- | --- | --- |
| jobs | [<code>Array.<Job></code>](#Job) | The jobs to sort |
| [sortSteps] | [<code>JobSortingStep</code>](#JobSortingStep) | Sorting criteia for sorting the jobs |
**Example**
```js
// Sort jobs by priority:
sortJobs(
[{ id: "some job" }],
[
{ property: "priority", direction: "desc" },
{ property: "created", direction: "asc" }
]
);
// This sorts the jobs by priority (highest) first, and then by created
// (oldest) second..
```
<a name="sortJobsByPriority"></a>
## sortJobsByPriority(jobs) ⇒ [<code>Array.<Job></code>](#Job)
Sort jobs by priority
**Kind**: global function
**Returns**: [<code>Array.<Job></code>](#Job) - An array of sorted jobs
**See**: sortJobs
| Param | Type | Description |
| --- | --- | --- |
| jobs | [<code>Array.<Job></code>](#Job) | An array of jobs |
<a name="updateStatsForJob"></a>
## updateStatsForJob(jobStats, job)
Updates the properties in `jobStats` according to the state
of the `job`
**Kind**: global function
| Param | Type | Description |
| --- | --- | --- |
| jobStats | <code>Object</code> | Job stats - mutated during execution (not pure) |
| job | [<code>Job</code>](#Job) | A raw job |
<a name="NewJobAttachmentOptions"></a>
## NewJobAttachmentOptions : <code>Object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| [title] | <code>String</code> | The title of the attachment |
| data | <code>Buffer</code> \| <code>String</code> \| <code>ReadableStream</code> | The attachment data |
| mime | <code>String</code> | The mime type of the attachment |
| [created] | <code>Number</code> | The timestamp of creation |
<a name="JobAttachment"></a>
## JobAttachment : <code>Object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The attachment/artifact ID |
| title | <code>String</code> | The artifact title |
| mime | <code>String</code> | The mime type for the artifact |
| created | <code>Number</code> | The JS timestamp of creation/addition |
<a name="AutoArchiveHelperOptions"></a>
## AutoArchiveHelperOptions : <code>Object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| [checkInterval] | <code>Number</code> | Milliseconds between archive checks |
| [archivePeriod] | <code>Number</code> | Milliseconds that a job has been stopped before it can be archived |
| [queryLimit] | <code>Number</code> | Max job results from queries for archving |
<a name="NewJob"></a>
## NewJob : <code>Object</code>
New job data
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| [type] | <code>String</code> | The type of job (custom, controlled by the consumer) |
| [priority] | [<code>Priority</code>](#Priority) | The priority of the job (defaults to normal priority) |
| [parents] | <code>Array.<String></code> | Parents of this job |
| [predicate] | <code>String</code> | The predicate function that should evaluate to true before this job can run |
| [data] | <code>Object</code> | Data for this job |
| [timeLimit] | <code>Number</code> | Time limit in milliseconds (defaults to the default timelimit on the Service instance). Set to null to disable timeouts. |
| [attemptsMax] | <code>Number</code> | The maximum number of soft failures that can occur before this job |
| [archived] | <code>Boolean</code> | Determining if job will be excluded from queries or not |
<a name="Job"></a>
## Job : <code>Object</code>
A job
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| id | <code>String</code> | The job's ID |
| type | <code>String</code> | The job type (consumer controlled) |
| status | [<code>Status</code>](#Status) | The current job state |
| priority | [<code>Priority</code>](#Priority) | The job's priority |
| created | <code>Number</code> | The creation timestamp of the job |
| parents | <code>Array.<String></code> | An array of IDs of the job's parents |
| predicate | <code>Object</code> | Predicate restraints for the job |
| predicate.attemptsMax | <code>Number</code> | Maximum attempts that can be undertaken on the job before it is failed |
| predicate.timeBetweenRetries | <code>Number</code> | Milliseconds between retries (minimum) |
| data | <code>Object</code> | The data for the job (incoming) |
| result | <code>Object</code> | Result information |
| result.type | [<code>ResultType</code>](#ResultType) \| <code>null</code> | The type of result (null if not stopped at least once) |
| result.data | <code>Object</code> | Resulting data from the last execution (outgoing) |
| times | <code>Object</code> | Collection of notable timestamps for the job |
| times.firstStarted | <code>Number</code> \| <code>null</code> | Timestamp for when the job was first started |
| times.started | <code>Number</code> \| <code>null</code> | Timestamp for when the job was last started |
| times.stopped | <code>Number</code> \| <code>null</code> | Timestamp for when the job was last stopped |
| times.completed | <code>Number</code> \| <code>null</code> | Timestamp for when the job was completed successfully |
| timeLimit | <code>Number</code> \| <code>null</code> | Time limitation for the job's execution. null means no limit. |
| attempts | <code>Number</code> | Number of attempts the job has had |
| archived | <code>Boolean</code> | True means the job will be archived and excluded from queries |
<a name="PredicatesTestResult"></a>
## PredicatesTestResult : <code>Object</code>
**Kind**: global typedef
**Properties**
| Name | Type | Description |
| --- | --- | --- |
| satisfies | <code>Boolean</code> | True if all predicates satisfied, false otherwise |
| [predicate] | <code>String</cod