{"id":19560679,"url":"https://github.com/zoubin/run-callback","last_synced_at":"2026-06-18T07:31:01.072Z","repository":{"id":143907169,"uuid":"42568658","full_name":"zoubin/run-callback","owner":"zoubin","description":"Run async \u0026 sync callbacks","archived":false,"fork":false,"pushed_at":"2015-12-09T05:17:13.000Z","size":26,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-21T07:02:56.023Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zoubin.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-09-16T06:20:46.000Z","updated_at":"2015-09-17T04:11:21.000Z","dependencies_parsed_at":"2023-03-21T10:11:59.818Z","dependency_job_id":null,"html_url":"https://github.com/zoubin/run-callback","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/zoubin/run-callback","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoubin%2Frun-callback","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoubin%2Frun-callback/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoubin%2Frun-callback/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoubin%2Frun-callback/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zoubin","download_url":"https://codeload.github.com/zoubin/run-callback/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zoubin%2Frun-callback/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34481199,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T05:08:27.535Z","updated_at":"2026-06-18T07:31:01.056Z","avatar_url":"https://github.com/zoubin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# run-callback\n[![version](https://img.shields.io/npm/v/run-callback.svg)](https://www.npmjs.org/package/run-callback)\n[![status](https://travis-ci.org/zoubin/run-callback.svg?branch=master)](https://travis-ci.org/zoubin/run-callback)\n[![coverage](https://img.shields.io/coveralls/zoubin/run-callback.svg)](https://coveralls.io/github/zoubin/run-callback)\n[![dependencies](https://david-dm.org/zoubin/run-callback.svg)](https://david-dm.org/zoubin/run-callback)\n[![devDependencies](https://david-dm.org/zoubin/run-callback/dev-status.svg)](https://david-dm.org/zoubin/run-callback#info=devDependencies)\n\nRun async or sync callbacks, such as [gulp tasks](https://github.com/gulpjs/gulp/blob/master/docs/API.md#fn).\n\n## Usage\n\n```javascript\nvar run = require('run-callback')\nvar thunkify = run.thunkify\n\n```\n\n### promise = run(callback, ...args)\n\nRun `callback` with `args`,\nand return a promise to fetch the results,\nwhich is always an `Array`.\n\n#### callback\n\nType: `Function`\n\n`callback` can be made asynchronous if it does one of the following:\n\n##### Return a promise\n\n```javascript\nrun(function () {\n  return new Promise(function (resolve) {\n    process.nextTick(function () {\n      resolve('done')\n    })\n  })\n})\n.then(function (res) {\n  // 'done'\n  console.log(res[0])\n})\n\n```\n\n##### Return a stream\n\n```javascript\nvar Readable = require('stream').Readable\n\nvar src = ['beep', '\\n', 'boop']\nrun(function () {\n  var stream = createStream(src)\n  stream.pipe(process.stdout)\n  return stream\n})\n.then(function () {\n  console.log('\\n')\n  // `[]`\n  console.log(src)\n})\n\nfunction createStream(source) {\n  var rs = Readable()\n  rs._read = function () {\n    if (source.length) {\n      this.push(source.pop())\n    } else {\n      this.push(null)\n    }\n  }\n  return rs\n}\n\n```\n\n##### Accept one more argument than declared\n\n```javascript\nrun(function (a, b, next) {\n  process.nextTick(function () {\n    next(null, a + b, a - b)\n  })\n}, 2, 1)\n.then(function (res) {\n  // `[3, 1]`\n  console.log(res)\n})\n\n```\n\n### run.thunkify(fn)\n\nReturn a new function to run `fn` later with a list of arguments.\n\n```javascript\nvar task = run.thunkify(function (a, b, next) {\n  process.nextTick(function () {\n    next(null, a + b, a - b)\n  })\n})\n\ntask(2, 1).then(function (res) {\n  // `[3, 1]`\n  console.log(res)\n})\n\n```\n\n### Runner = run.Runner\n\n`var runner = Runner(opts)`\n\nCreate a custom `Runner` instance to run callbacks.\n\n#### opts\n\nBy default, callbacks returning a stream is thought to be in progress before the stream ends.\nHowever, if `opts.stream` is `false`,\ncallbacks returning a stream wil be treated as synchronous.\n\nIf `opts.promise` is `false`,\ncallbacks returning a promise will be treated as synchronous.\n\nIf `opts.async` is `false`,\ncallbacks can only be made asynchronous\nby returning a promise (when `opts.promise` is `true`),\nor returning a stream (when `opts.stream` is `true`).\n\n```javascript\nvar Stream = require('stream')\nvar Readable = Stream.Readable\nvar Writable = Stream.Writable\n\n;(function handleStream() {\n  var runner = require('..').Runner({ stream: true })\n\n  var outputs = []\n  var rs = createReadable([1, 2])\n\n  return runner.thunkify(function () {\n    setTimeout(function() {\n      var ws = createWritable(outputs)\n      rs.pipe(ws)\n    }, 0)\n    return rs\n  })().then(function (res) {\n    // []\n    console.log(res)\n  })\n})()\n.then(function doNotHandleStream() {\n  var runner = require('..').Runner({ stream: false })\n\n  var outputs = []\n  var rs = createReadable([1, 2])\n\n  runner.thunkify(function () {\n    setTimeout(function() {\n      var ws = createWritable(outputs)\n      rs.pipe(ws)\n    }, 0)\n    return rs\n  })().then(function (res) {\n    // true\n    console.log(res[0] === rs)\n  })\n})\n\nfunction createReadable(input) {\n  var stream = Readable({ objectMode: true })\n  var i = 0\n  stream._read = function () {\n    if (i \u003c input.length) {\n      this.push(input[i++])\n    } else {\n      this.push(null)\n    }\n  }\n  return stream\n}\n\nfunction createWritable(output) {\n  var stream = Writable({ objectMode: true })\n  var i = 0\n  stream._write = function (data, _, next) {\n    output.push(data)\n    next()\n  }\n  return stream\n}\n\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoubin%2Frun-callback","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzoubin%2Frun-callback","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzoubin%2Frun-callback/lists"}