ljlm0402 / typescript-express-starter

πŸ“˜ Quick and Easy TypeScript Express Starter
http://npm.im/typescript-express-starter
MIT License
2.71k stars 419 forks source link

Graceful close #215

Open jeanniton-mnr opened 1 year ago

jeanniton-mnr commented 1 year ago

Graceful close

Motivation

I want to ensure there is no brute (sub-)process termination and that any open requests are fulfilled when the Express server is closing.

// POST endpoint to process the shopping cart
app.post('/purchase', (req, res) => {
  // Get the items from the request body

  try {
      const { buyer, items } = req.body;

      // Process the items (e.g., calculate total price, initiate payment, etc.)
      const totalPrice = calculateTotalPrice(items);
      // Charge the buyer for the purchase
      const payment = chargeBuyerForPurchase(totalPrice);

      // πŸ₯· I don't want the server to close before it executes this line for every request
      // Create shipping for the purchased items
      const shipping = carrierAPI.createShipping(items, buyer.address);

      res.status(200).json([totalPrice, payment, shipping]);
      // πŸ’β€β™‚οΈ This is now safe to close the server
    } catch (error) {
      next(error);
    }

});

Proposed Solution

See documentation at this link

// ./src/app.ts
import process from 'node:process';

// Begin reading from stdin so the process does not exit.
process.stdin.resume();

process.on('SIGINT', () => {
  console.log('Received SIGINT. Press Control-D to exit.');
});

// FYI docker "stop" <container>, a process manager, and most hosts will send SIGTERM signal when it is shutting down.
// server.close stops the server from accepting new connections and closes all connections connected to this server that are not sending a request or waiting for a response
function gracefulClose(signal) {
  console.log(`Received ${signal}`);
  const server = this.app.listen(this.port, () => { ... } );
  server.close( () => { log('HTTP(S) server closed') } );

}

process.on('SIGINT', gracefulClose);
process.on('SIGTERM', gracefulClose);

Is it a feature to implement? Is this feature redundant?