npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

celeryjs

v0.0.5

Published

A node.js Celery client with promises

Downloads

5

Readme

Celery.js

Downloads License GPLv2 Build Status NPM Version

A node.js Celery client utilizing callbacks and promises.

Install:

npm install celeryjs

Use:

var celery = require('celeryjs');

var client = new celery.createClient({
	BROKER_URL: 'amqp://celery:celery@lab-cel02',
	DEFAULT_QUEUE: 'default'
});

client.on('connect', function() {
	var task = client.createTask('native.platform');

	task.applyAsync().then(successful);
});

function successful(message) {
	console.log(message);
}

Returns:

{ status: 'SUCCESS',
  traceback: null,
  result: 'linux posix',
  taskId: 'c141e770-182a-4fc8-af2e-9fd8e2692410',
  children: [] }

##API

###require('celeryjs') ####.createClient(conf, [callback]) Emits:

  • connect
  • error
  • and end, all mirroring the underlying amqp connection.

###Client ####.createTask(name, [options,] [callback]) #####options

  • task
    • These are overwritten by supplying the same attributes to Task-level options
    • defaults
      • task: Supplied task name when created.
      • id: Generated uuid used internally.
      • args: []
      • kwargs: {}
    • optional
      • 'args', 'callbacks', 'chord',
      • 'errbacks', 'eta', 'expires', 'id', 'kwargs',
      • 'queue', 'retries', 'task', 'taskset', 'timeouts', 'utc'
  • broker
    • amqp exchange.publish options, see here.
    • contentType, default: 'application/json' required
    • contentEncoding, default: 'utf-8'

Example:

var options = {
	queue: 'windows'
	task: {
		args: [1,2,3],
		kwargs: {verbose: true}
	},
	broker: {
		appId: 'TestApp'
	}
}

####.close([callback]) alias: end

###Configuration ####supplied to createClient's conf parameter

  • debug, default: true
  • camelCaseResults, default: true
    • converts python-based response into javascript-style attributes.
  • BROKER_URL, default: 'amqp://'
  • DEFAULT_EXCHANGE, default: ''
  • DEFAULT_EXCHANGE_TYPE, default: 'topic'
  • DEFAULT_QUEUE, default: 'default'
  • DEFAULT_ROUTING_KEY, default: 'default'
  • RESULT_EXCHANGE, default: 'celeryresults'
  • TASK_RESULT_DURABLE, default: true
  • TASK_RESULT_EXPIRES, default: 30 * 60 * 1000 // 30 minutes
  • ROUTES, default: {}

###Task ####.applyAsync([options]) Execute the task, returns a Promise.

####.apply([options,] callback) Execute the task with callback.

####.delayAsync([options,] ms) Execute the task with ms delay, returns a Promise.

####.delay([options,] ms, callback) Executes the task with callback using ms delay.

####.mapAsync(arrayOfValues, [options,] [settle]) Executes a given task in parallel, once for each of the values in arrayOfValues.

arrayOfValues should contain elements of array that represent the mapped args to the celery function.

options are task level options.

settle (which can also be set in options) determines if all the executing task promises should fail individually or as a group. When settle is set to true the returned resultsArray will contain SUCCESS and FAILURE tasks. When it's set to false if any one task fails the whole promise fails and returns a FAILURE response.

Example:

var task = client.createTask('js.add'),
    
    values = [ [1,2], [3,4], [5,'a']];

task.mapAsync(values, {settle: true}).then(successful).catch(errorous);

Returns:

[ { state: 'fulfilled',
    value: 
     { status: 'SUCCESS',
       traceback: null,
       result: 3,
       taskId: '8fd67bde-71b4-4572-b450-6844ff626b84',
       children: [] } },
  { state: 'fulfilled',
    value: 
     { status: 'SUCCESS',
       traceback: null,
       result: 7,
       taskId: '8b1fc93f-985c-4aba-a99d-ba010b535ca6',
       children: [] } },
  { state: 'rejected',
    reason: 
     { status: 'FAILURE',
       traceback: 'Traceback (most recent call last....',
       result: [Object],
       taskId: '4554ab51-84e3-4c71-99c6-c59d47a2f0c1',
       children: [] } } ]

If settle were false on the 3rd response would be returned and all the tasks would be marked as FAILURE.

####.map(arrayOfValues, [options,] [settle,] callback)

Same as .mapAsync except it's handled with a function(error, results) callback.

Example:

var task = client.createTask('js.add'),

    values = [ [1,2], [3,4], [5,'a']];

task.map(values, {settle: false}, function(err, res) {
    (err) ? errorous('doh!') : successful('yay!');
})

Returns:

error doh!

Setting settle to true returns success yay! with an array of possible SUCCESS and FAILURE tasks.

####.times([options,] n, callback) Executes the task n times with callback.

####.link(task) Pushes a task alias, or Array of task aliases, onto the Canvas stack.

If no task is supplied, the underlying Cavas will act as a single task.apply()

####.s([options]) Creates an alias of task to use with .link

A task alias is a shallow copy of a task where the supplied options overwrite those in the original task.

If you don't have any options to change, just call task.s() and it will be identical.

###.Canvas ####.chain(callback) Calls the linked task aliases where the result of the previous function is the last parameters for the next function.

Given:

@app.task(name='js.add')
def add(x, y):
    return x + y
client.on('connect', function() {
	var task = client.createTask('js.add', {queue: 'js', args: [1,2]});

	task
	.link([
		task.s({args: [1]}),
		task.s({args: [5]})
	])
	.Canvas
	.chain(successful);	// 1 + 2 = 3
});						// 3 + 1 = 4
						// 4 + 5 = 9


function successful(message) {
	console.log(message);
}

Returns:

{ status: 'SUCCESS',
  traceback: null,
  result: 9,
  taskId: '8925043b-462f-470b-87eb-d7384e1f299d',
  children: [] }

###Result A JSON message from amqp containing:

  • status: SUCCESS or FAILURE, PENDING possible with promises.
  • traceback: Python stack-trace if there was an error.
  • result: Return value of the python program.
  • taskId: Internal task ID, and the same one in the message queue.
  • children: soon -- these are sub-tasks spawned from the original task; will be in Canvas.

##Usage Task-level Queue

var task = client.createTask('native.platform', {queue: 'windows'});

Execute-level Queue

var task = client.createTask('native.platform');
task.applyAsync(task: {queue: 'windows'});

Both return:

{ status: 'SUCCESS',
  traceback: null,
  result: 'windows nt 2.7',
  taskId: '40a68e93-aedc-4cc2-b15c-be2ecdec82f8',
  children: [] }

###Note

Attribution to: https://github.com/mher/node-celery by Mher Movsisyan for the inspiration and design pattern.

Use the one that suits your programming flow better!

Blake VandeMerwe 2014