| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | const ipc = require('node-ipc')const DEFAULT_ID = process.env.VUE_CLI_IPC || 'vue-cli'const DEFAULT_IDLE_TIMEOUT = 3000const DEFAULT_OPTIONS = {  networkId: DEFAULT_ID,  autoConnect: true,  disconnectOnIdle: false,  idleTimeout: DEFAULT_IDLE_TIMEOUT,  namespaceOnProject: true}const PROJECT_ID = process.env.VUE_CLI_PROJECT_IDexports.IpcMessenger = class IpcMessenger {  constructor (options = {}) {    options = Object.assign({}, DEFAULT_OPTIONS, options)    ipc.config.id = this.id = options.networkId    ipc.config.retry = 1500    ipc.config.silent = true    this.connected = false    this.connecting = false    this.disconnecting = false    this.queue = null    this.options = options    this.listeners = []    this.disconnectTimeout = 15000    this.idleTimer = null    // Prevent forced process exit    // (or else ipc messages may not be sent before kill)    process.exit = code => {      process.exitCode = code    }    this._reset()  }  checkConnection () {    if (!ipc.of[this.id]) {      this.connected = false    }  }  send (data, type = 'message') {    this.checkConnection()    if (this.connected) {      if (this.options.namespaceOnProject && PROJECT_ID) {        data = {          _projectId: PROJECT_ID,          _data: data        }      }      ipc.of[this.id].emit(type, data)      clearTimeout(this.idleTimer)      if (this.options.disconnectOnIdle) {        this.idleTimer = setTimeout(() => {          this.disconnect()        }, this.options.idleTimeout)      }    } else {      this.queue.push(data)      if (this.options.autoConnect && !this.connecting) {        this.connect()      }    }  }  connect () {    this.checkConnection()    if (this.connected || this.connecting) return    this.connecting = true    this.disconnecting = false    ipc.connectTo(this.id, () => {      this.connected = true      this.connecting = false      this.queue && this.queue.forEach(data => this.send(data))      this.queue = null      ipc.of[this.id].on('message', this._onMessage)    })  }  disconnect () {    this.checkConnection()    if (!this.connected || this.disconnecting) return    this.disconnecting = true    this.connecting = false    const ipcTimer = setTimeout(() => {      this._disconnect()    }, this.disconnectTimeout)    this.send({ done: true }, 'ack')    ipc.of[this.id].on('ack', data => {      if (data.ok) {        clearTimeout(ipcTimer)        this._disconnect()      }    })  }  on (listener) {    this.listeners.push(listener)  }  off (listener) {    const index = this.listeners.indexOf(listener)    if (index !== -1) this.listeners.splice(index, 1)  }  _reset () {    this.queue = []    this.connected = false  }  _disconnect () {    this.connected = false    this.disconnecting = false    ipc.disconnect(this.id)    this._reset()  }  _onMessage (data) {    this.listeners.forEach(fn => {      if (this.options.namespaceOnProject && data._projectId) {        if (data._projectId === PROJECT_ID) {          data = data._data        } else {          return        }      }      fn(data)    })  }}
 |