fork-with-emitter
    TypeScript icon, indicating that this package has built-in type declarations

    3.0.0 • Public • Published

    fork-with-emitter Build Status

    Simple EventEmitter wrapper for IPC, enhanced with async .request().

    • Zero dependencies.
    • TypeScript support.
    • Intuitive naming (fork/host).

    Basics

    bot.js (fork):

    const { host } = require('fork-with-emitter')
     
    host.on('hello', name => {
      console.log(`Hello ${name}`)
    })
     
    host.onRequest('getRandomNumber', async () => {
      await sleep(1000)
      return Math.floor(Math.random() * 1000)
    })
     
    //returns promise that resolves after given ms
    const sleep = ms => 
      new Promise(res => setTimeout(res, ms))

    index.js (host):

    const { createFork } = require('fork-with-emitter')
     
    const fork = createFork('bot.js')
    //pipe fork's console.log to host's console.log
    fork.process.stdout.pipe(process.stdout)
     
    fork.emit('hello', 'Artur')
     
    ;(async () => {
      const randomNumber = await fork.request('getRandomNumber')
      console.log(randomNumber)
     
      fork.kill()
    })()

    Output:

    Hello Artur
    623

    Handling errors

    bot.js (fork):

    const { host } = require('fork-with-emitter')
     
    host.onRequest('throwError', async () => {
      throw new Error(`Some error message`)
    })

    index.js (host):

    const { createFork } = require('fork-with-emitter')
     
    const fork = createFork('bot.js')
     
    ;(async () => {
      try {
        await fork.request('throwError')
      } catch(error) {
        console.log(error)
      }
    })()

    Output:

    Error: Some error message
        at (fork's stack)

    Errors and rejections are captured only from .onRequest() handlers.

    Exports

    {
      /*
        Returns new spawned fork.
      */
      createFork(modulePath, options = { args: [] }),
     
      /*
        Variable indicating if process is a fork. 
      */
      isForked,
     
      /*
        Points to host (use those methods from fork).
      */
      host: {
        /*
          process.on('message', listener) with events
        */
        on(event, listener),
     
        /*
          Listener is removed after execution.
        */
        once(event, listener),
     
        removeListener(event, listener),
     
        /*
          process.send(payload) with events
        */
        emit(event, listener),
     
        /*
          Returned/resolved data from async function will be passed to host's request.  
        */
        onRequest(event, listener),
     
        onceRequest(event, listener),
     
        removeRequestListener(event, listener),
     
        /*
          Returns Promise that resolves with data resolved from host's .onRequest() listener.
          Rejects if response is not sent after 10 seconds.
          maximumTimeout = Infinity -> for very long tasks, not recommended though, because if task stucks and fork still works it causes a memory leak.
        */
        request(event, listener, maximumTimeout = 10)
      }
    }

    Fork object

    Object that points to spawned fork.

    {
      /*
        Native ChildProcess object.
      */
      process,
     
      /*
        Exits process with SIGINT.
      */
      kill(),
     
      on(event, listener),
      once(event, listener),
      removeListener(event, listener),
      emit(event, listener),
      onRequest(event, listener),
      onceRequest(event, listener),
      removeRequestListener(event, listener),
      request(event, listener, maximumTimeout = 10)
    }

    License

    MIT

    Install

    npm i fork-with-emitter

    DownloadsWeekly Downloads

    35

    Version

    3.0.0

    License

    ISC

    Unpacked Size

    41.7 kB

    Total Files

    33

    Last publish

    Collaborators

    • reski78