OverviewFilesCommitsIssuesDocsReleasesPeers

mirall-cli / node_modules / bare-worker / lib / ipc.js

70 lines · javascript ref:
const { Duplex } = require('bare-stream')
const constants = require('./constants')

module.exports = class IPC extends Duplex {
  constructor(port) {
    super()

    this._port = port
    this._state = 0

    this.on('newListener', this._onnewlistener).on('removeListener', this._onremovelistener)
  }

  async _write(chunk, encoding, cb) {
    let err = null

    try {
      await this._port._write({ type: constants.message.IPC_DATA, value: chunk })
    } catch (e) {
      err = e
    }

    cb(err)
  }

  async _final(cb) {
    let err = null

    try {
      await this._port._write({ type: constants.message.IPC_END })
    } catch (e) {
      err = e
    }

    cb(err)
  }

  _destroy(err, cb) {
    if (this._state & constants.state.REFED) {
      this._state &= ~constants.state.REFED
      this._port._unref()
    }

    cb(err)
  }

  _consumers() {
    return this.listenerCount('data') + this.listenerCount('readable')
  }

  _onnewlistener(name) {
    if (name !== 'data' && name !== 'readable') return

    if (this._consumers() === 0) {
      this._state |= constants.state.REFED
      this._port.start()
      this._port._ref()
    }
  }

  _onremovelistener(name) {
    if (name !== 'data' && name !== 'readable') return

    if (this._consumers() === 0) {
      this._state &= ~constants.state.REFED
      this._port._unref()
    }
  }
}