{"_id":"@captemulation/throng","_rev":"2-87e2265973b53f284f13bf0f22ac20b1","name":"@captemulation/throng","dist-tags":{"latest":"6.0.2"},"versions":{"6.0.0":{"name":"@captemulation/throng","version":"6.0.0","description":"A simple worker-manager for clustered apps","keywords":["cluster","worker","process"],"repository":{"type":"git","url":"git+https://github.com/captemulation/throng.git"},"homepage":"https://github.com/captemulation/throng","bugs":{"url":"https://github.com/captemulation/throng/issues"},"main":"lib/throng.js","types":"src/throng.ts","scripts":{"test":"mocha","test:bail":"mocha --bail","prepublish":"tsc"},"engines":{"node":">= 14"},"author":{"name":"John Dean","email":"john.holmes.dean@gmail.com"},"license":"MIT","devDependencies":{"@types/node":"^18.11.11","chai":"^4.2.0","mocha":"^8.1.3","typescript":"^4.9.3"},"gitHead":"0152254eed9239d12f17069df59d7a8c27664967","_id":"@captemulation/throng@6.0.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-jge4Gr/haBpOr1dtk+4jh1iHwbhq7L5ZKLrJAqHQkyOMw6s8kZ6Ol7nBbunLaUVMYfzdTXg0IVXgcvAV0hxZIw==","shasum":"bc59222da8ea006ccccdedc1cd8ad014d95a0fdc","tarball":"https://registry.npmjs.org/@captemulation/throng/-/throng-6.0.0.tgz","fileCount":3,"unpackedSize":7209,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID5lBQ5yYeEx1JeM0ZMU3qtJhJagIrzZIvsiez+LqjXjAiEArrWm0NPgjGVPvX8urCCv1s6BenMADhM5zqsDaBn9hkQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjjoMGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrYLA/+Ke+Sohh5WDUPihYBWxxdz26jkGPZsUj0kmB/3WCU0WF5TY72\r\n1grmyTvp2Gc+yeMTDtE784yb2ETBTotRTn/uj3sEAejHGhLRwoCHNZjzHCl3\r\n5R0sWWBapc8JVAncUh6dPoV02dSsye9L8M+GJKo5sfgUSuj8qQuoUZCIBV67\r\nl/kcDpl9V5HSbKpScNY450JcvzY5G1uV0DooHQRF7c+T6KTBZ59PoI7pxQgT\r\nwMygypzIkrLeKtdBDcZbbNkvemWKmhJWf6DXcWPfGDhXq8vQ6rEDTsg/oRSv\r\nCxLXDNki4pZpfDZt9PygGUNVv3pkqxoWuRmEU8fjtLedyrtTkZYM92Cg+2Lo\r\nYboF1F9clT3JF54wdlXtNxE27Gr0CqLiwHxCdiZfHEdxz0S35hLPxU/ppJlu\r\nx908ZR3U3njeXBFeIgKloGwvPmz5svf75O5CFMgPF9m0jYN9FJtxL1r+HI+g\r\nOhv+jYGgoB5WFIK7eRzbK4o7iSNe/Ih0DEQ4cqa8LmRIT0wyTWl2qFxaLrtT\r\nZFPhGaWPaTrAEPAN8t0yEUE944zUOb6NcW5eRdlzc1KRvtKEa/3YnVsl8zfo\r\nRZLLe0Q3QhFxsm2ng+6uP2pVYgtlXGxmZm0tQvtan5RTriLhVdoY89irScMi\r\nXtTFVWEEKZlKUjpo6zabxB8xzZWvMfYtfXI=\r\n=Y5sX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"captemulation","email":"john.holmes.dean@gmail.com"},"directories":{},"maintainers":[{"name":"captemulation","email":"john.holmes.dean@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/throng_6.0.0_1670284038495_0.02948442890385583"},"_hasShrinkwrap":false},"6.0.1":{"name":"@captemulation/throng","version":"6.0.1","description":"A simple worker-manager for clustered apps","keywords":["cluster","worker","process"],"repository":{"type":"git","url":"git+https://github.com/captemulation/throng.git"},"homepage":"https://github.com/captemulation/throng","bugs":{"url":"https://github.com/captemulation/throng/issues"},"main":"lib/throng.js","types":"src/throng.ts","scripts":{"test":"mocha","test:bail":"mocha --bail","prepublish":"tsc"},"engines":{"node":">= 14"},"author":{"name":"John Dean","email":"john.holmes.dean@gmail.com"},"license":"MIT","devDependencies":{"@types/node":"^18.11.11","chai":"^4.2.0","mocha":"^8.1.3","typescript":"^4.9.3"},"gitHead":"ba87935e2499bb6dc655253e218938551a70a72b","_id":"@captemulation/throng@6.0.1","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-bKKHC3EH5b0aId5yzq77uZFEbgBi/P3nknFetxnnDRGPFi0xL/rb2P3Gga8KQWH4qLIAHJYYhIp/aalLi2U9rQ==","shasum":"d05dce2222b76f5248a1f2819e5b6405e3000e0d","tarball":"https://registry.npmjs.org/@captemulation/throng/-/throng-6.0.1.tgz","fileCount":4,"unpackedSize":11085,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBUcjbUhuv+kdkZ32o62DQbyyQY14zEdLFxYpLImnmeUAiEA2/Zz0+712HlwU8KeoRse9ZX5/5mO8vUqg4koMAGbwiU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkSGvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr55w//Wd143gJTqjs0b757SHMsAgvBzrIVKizheIxst7ZuX1vxc7wp\r\noMMM3+XT76V3JDRRqa6l0IyX0yMJgCl7PGNIYnWa/6HuUUhz+9V0uBuujzP4\r\nZqSziIugbFxWMMySyiqowxgYPMsN7duEQmI6mr3YrvJfLUT1qv1Mru8aUjMl\r\nnCzabRU1AUsV8fPESSMOMl/tyk+5eES9Lj17duSSv2ZX+gjtTvO04jSC+QFE\r\nwkfpUGx7SvVW8JfKwdX7DKaA6/D9VXPW/wt3ejbYDydgxFFSitBLyhUkUoeN\r\nAViHnQJFV6q1hJmB44Rtq8QLbq56wcrLrZbOCXLF18M93UboHquaAA7GumN1\r\nT/jN/Maz3p7LwOIW3TghLUJkMA1EGonjmZ30EVpCGqgWyi6D+zXxtd5j+7bz\r\nlacSTctKH5cz1A/l5/T0nGaHH+nlHY1ScFYBy/ovzEHg0kw3J3gxe+sKBzTF\r\n/ci+Az0TDn9SUWq+3vcpKSuZ9RcAM3u+JrfnHjRQgr5mtJt+bHcqbrB3g9Bh\r\nl2xOkfHR2zHYcasXHt2FKgW3kAfO/Ot4C5muFflK8s3h3b6zCGGElHXr7D07\r\nEyoou8RWaQVo5QPygQskPJE9sPKnbFgKIzNGSL/HBm4BFzfsAv7wPJ+SxUYR\r\nL8hIgLlKiXGNoW2P3m7ZGe81vI+6VFH/ahU=\r\n=LpoL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"captemulation","email":"john.holmes.dean@gmail.com"},"directories":{},"maintainers":[{"name":"captemulation","email":"john.holmes.dean@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/throng_6.0.1_1670455727009_0.6114254597083981"},"_hasShrinkwrap":false},"6.0.2":{"name":"@captemulation/throng","version":"6.0.2","description":"A simple worker-manager for clustered apps","keywords":["cluster","worker","process"],"repository":{"type":"git","url":"git+https://github.com/captemulation/throng.git"},"homepage":"https://github.com/captemulation/throng","bugs":{"url":"https://github.com/captemulation/throng/issues"},"main":"lib/throng.js","types":"src/throng.ts","scripts":{"test":"mocha","test:bail":"mocha --bail","build":"tsc","prepublish":"tsc"},"engines":{"node":">= 14"},"author":{"name":"John Dean","email":"john.holmes.dean@gmail.com"},"license":"MIT","devDependencies":{"@types/node":"^18.11.11","chai":"^4.2.0","mocha":"^8.1.3","typescript":"^4.9.3"},"gitHead":"1da9d246b54b93410649961f8e5ab3e9b258f25f","_id":"@captemulation/throng@6.0.2","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-surV5wZCrE/KgMk39c5iLwSgv5enYsXhWzZovGIlxUa3xfyOnzsWFin5L/BPCda2kRBiNp02ABZaR+FpwXfcHQ==","shasum":"ff97aafc85f2d2b8365405d44459cfc035a5892a","tarball":"https://registry.npmjs.org/@captemulation/throng/-/throng-6.0.2.tgz","fileCount":4,"unpackedSize":15015,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0lGEYSyxo1VAZ+aGy3aWdgQdcBjLyllwv9b4aueHYPQIhANbpemgxu3DegrDawug7jEV4JdZkquSuxsWp6IpD0nPs"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk8QKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoggg/9F55ac5jX5pwEkcjejVgEE0h6Sm90M3Hsm//5r1f+j+gi723n\r\n2gNqjGmeqpEnsE2IOlIPWOjj0wbv8Ay5TxCsXMjANihOw6hR5/of6LRpIJuX\r\nyvCJf5qMmvv2KFGckZdmX+qfPFfwfASbRzkAFTNLrWFPJDFXID91B3biQ5Hi\r\nUZ4Cyvpa9RsmoyKM82VjDZmpVQUFSVVgx5VqEn2KjiMhLWcpU1czkWoke5Py\r\np7NqqJvU4q8QHYxQkiwqpoOQYO/CSnBf7liJ0u5OKPUj0BaifQKmimm6KFAY\r\nlomRzESUBFNzjiiqKjRtbAGRkdFi4F+ANFkFlGf/MuTvPqomvAdEMTV12ZCi\r\nM6+qd6zIIKqqVxcrtmzjjRUpeIRXUkBc2TQgt3CAX4xj3BeZgyw1jxGgJVwM\r\nqpaNJ1d0VInHETXoUV7EoZnqwS0ySTKa6vvmpGt4qNmwnZnQltrGjfTKNXYm\r\nHtaP6MvKPTWBT015AasrOaXctc0Cz8WnOZq4lPdcrOqX+8QmRwBdY9/xmzZx\r\n6vmMtKm7TdR7nleZf8soO1IePZCGJ1XSVKj12UWt44W70ele9FM3Usft1lL7\r\nC39ccE/sMPuRBbrX2a/uY41ieaMVVO2kQzRVGtJcl4fwt1/ulHJpbiAt3+vB\r\nyH+doLry0UU8pW+u9G91/c48ZpzzgsLMPkA=\r\n=Q19q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"captemulation","email":"john.holmes.dean@gmail.com"},"directories":{},"maintainers":[{"name":"captemulation","email":"john.holmes.dean@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/throng_6.0.2_1670628361909_0.7760214819813549"},"_hasShrinkwrap":false}},"time":{"created":"2022-12-05T23:47:18.444Z","6.0.0":"2022-12-05T23:47:18.708Z","modified":"2022-12-09T23:26:02.196Z","6.0.1":"2022-12-07T23:28:47.226Z","6.0.2":"2022-12-09T23:26:02.076Z"},"maintainers":[{"name":"captemulation","email":"john.holmes.dean@gmail.com"}],"description":"A simple worker-manager for clustered apps","homepage":"https://github.com/captemulation/throng","keywords":["cluster","worker","process"],"repository":{"type":"git","url":"git+https://github.com/captemulation/throng.git"},"author":{"name":"John Dean","email":"john.holmes.dean@gmail.com"},"bugs":{"url":"https://github.com/captemulation/throng/issues"},"license":"MIT","readme":"# Throng\n\n[![npm package](https://img.shields.io/npm/v/throng.svg?style=flat-square)](https://www.npmjs.org/package/throng)\n[![Dependency Status](https://david-dm.org/hunterloftis/throng.svg?style=flat-square)](https://david-dm.org/hunterloftis/throng)\n[![devDependency Status](https://david-dm.org/hunterloftis/throng/dev-status.svg?style=flat-square)](https://david-dm.org/hunterloftis/throng#info=devDependencies)\n[![Build Status](https://travis-ci.org/hunterloftis/throng.svg?branch=master)](https://travis-ci.org/hunterloftis/throng)\n\nDead-simple one-liner for clustered Node.js apps.\n\nForks N workers and creates new ones if they go down.\nCorrectly handles signals from the OS.\n\n```js\nconst throng = require('throng')\n\nthrong(id => console.log(`Started worker ${id}`))\n```\n\n```\n$ node examples/basic\nStarted worker 1\nStarted worker 2\nStarted worker 3\nStarted worker 4\n```\n\n## Installation\n\n```\n$ npm install --save throng\n```\n\n## Use\n\n### Fork 1 worker per CPU:\n\n```js\nthrong(workerStartFunction)\n```\n\n### Specify the number of workers:\n\n```js\nthrong({ worker: workerStartFunction, count: 3 })\n```\n\n### More options:\n\n```js\nthrong({\n  master: masterStartFunction,\n  worker: workerStartFunction,\n  count: 16,\n  grace: 1000\n})\n```\n\n### Handling signals:\n\n(for cleaning up before disconnecting a worker on a SIGTERM, for instance)\n\n```js\nthrong({ worker })\n\nfunction worker(id, disconnect) {\n  console.log(`Started worker ${id}`)\n\n  process.on('SIGTERM', () => {\n    console.log(`Worker ${id} exiting (cleanup here)`)\n    disconnect()\n  })\n})\n```\n\n## All options (with defaults)\n\n```js\nthrong({\n  master: () => {},               // Fn to call in master process (can be async)\n  worker: yourWorkerFunc,         // Fn to call in cluster workers (can be async)\n  count: os.cpus().length,        // Number of workers\n  lifetime: Infinity,             // Min time to keep cluster alive (ms)\n  grace: 5000,                    // Grace period between signal and hard shutdown (ms)\n  signals: ['SIGTERM', 'SIGINT']  // Signals that trigger a shutdown (proxied to workers)\n})\n```\n\n## A complex example\n\n```js\nconst throng = require('throng')\n\nthrong({ master, worker, count: 4 })\n\n// This will only be called once\nfunction master() {\n  console.log('Started master')\n\n  process.on('beforeExit', () => {\n    console.log('Master cleanup.')\n  })\n}\n\n// This will be called four times\nfunction worker(id, disconnect) {\n  let exited = false\n\n  console.log(`Started worker ${ id }`)\n  process.on('SIGTERM', shutdown)\n  process.on('SIGINT', shutdown)\n\n  async function shutdown() {\n    if (exited) return\n    exited = true\n\n    await new Promise(r => setTimeout(r, 300))  // simulate async cleanup work\n    console.log(`Worker ${ id } cleanup done.`)\n    disconnect()\n  }\n}\n```\n\n```\n$ node examples/complex\nStarted master\nStarted worker 1\nStarted worker 3\nStarted worker 2\nStarted worker 4\n^C\nWorker 1 cleanup done.\nWorker 3 cleanup done.\nWorker 2 cleanup done.\nWorker 4 cleanup done.\nMaster cleanup.\n```\n\n## Staying alive\n\nThrong forks replacements for workers that crash so your cluster can continue working through failures.\n\n```\n$ node examples/crashy\n-1--2--3--4--2--1--3--4--crash!--1--3--4--crash!--5--3--4--6--5--3--4--crash!--6--crash!--crash!--7--6--8--9--7--6--8--9--crash!--7--6--9--10--7--6--9--10--crash!--7--9--10--11--7--crash!--9--crash!--7--12--9--13--crash!--12--9--crash!--crash!--crash!--14--crash!--12--15--crash!--14--18--15--19--14--18--15--crash!--19--14--crash!--15--20--14--21--15--20--14--21--15--20--14--21--15--20--14--21--15-\n```\n\n## Test\n\n```\n$ docker-compose run --rm dev\n\nnode@docker:/home/app$ npm test\n```\n","readmeFilename":"readme.md"}