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

node-graceful-shutdown

v1.1.5

Published

Gracefully shutdown your modular NodeJS application

Downloads

22,733

Readme

node-graceful-shutdown

npm License Build Status

Gracefully handle your modular NodeJS application's shutdown (termination), using dependencies.

Process signals captured: SIGINT, SIGTERM, SIGQUIT.

Example

It doesn't matter in which order and where you define these graceful handlers, node-graceful-shutdown will handle them appropriately and exit the process once all of them are processed.

import { onShutdown } from "node-graceful-shutdown";

// module1.js
onShutdown("http-server", async function () {
  // Stop your http server here.
});

// module2.js
onShutdown("message-bus", ["http-server"], async function () {
  // Close your RabbitMQ connection here ONLY AFTER http server's onShutdown completed.
});

// moduleX.js
onShutdown("database", ["http-server", "message-bus"], async function () {
  // Shut down your database here, ONLY AFTER http-server and message-bus are completed.
});

// After all handlers are processed without errors, process exits with code 0.
// Otherwise it exits with exit code 42759, or exit code 42758 if there are any errors in assigned shutdown handlers.

// If some of specified dependencies are not defined (like when "http-server" is missing in the above example),
// node-graceful-shutdown will run the current handler without waiting for the undefined dependency.

Or, if you have all your modules as exports and they all shutdown one after another, this will work at its best in your application's main.js:

import { onShutdown } from "node-graceful-shutdown";
import {
  startModule1,
  startModule2,
  stopModule1,
  stopModule2 /*, ...*/,
} from "./src";

export const startMyApp = async () => {
  await startModule1();
  await startModule2();
};

export const stopMyApp = async () => {
  // Stop modules one after another.
  await stopModule1();
  await stopModule2();
  // ...
};

// Handle application's shutdown.
onShutdown(stopMyApp);

Features and Guidelines

This library, along existing ones, allow your application to be modular. You define a cleanup callback in-place, in the same module, where initialization happens. In addition, it allows specifying the order

Recommendations:

  1. Please, do not use this module in libraries (packages). It is intended for end applications only (see why in 5.).
  2. Once imported, onShutdown is application-wide (in terms of a single process), so the callbacks and their dependencies will see each other when imported from multiple files.
  3. Circular shutdown handler dependencies will throw an error immediately once declared.
  4. There's also an onShutdownError export which takes an error as an argument when any of assigned shutdown handlers throw an error (added for very-very prudent programmers only).
  5. Importing this module deletes existing handlers (SIGINT, SIGTERM, SIGQUIT) if there are any. This is intended as other custom handlers can exit the process at any time.
  6. You may also consider defining constants in your application, instead of string arguments (names).

Licence

MIT © Nikita Savchenko