Skip to content

Elec-ipc

A library that makes communication between different processes more convenient for Electron applications.

Installtion

npm i elec-ipc
pnpm add elec-ipc
yarn add elec-ipc

Feature

  • two-way communication between the rendering process and the main process
  • renderer process to renderer process bidirectional communication

Usage

between the renderer process and the main process

js
const { app, BrowserWindow } = require('electron')
const path = require('node:path')
const { send, receive } = require('elec-ipc')

function createWindow() {
  const mainWindow = new BrowserWindow({
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      // This option needs to be enable, otherwise preload cannot access the node module
      nodeIntegration: true
    }
  })
  mainWindow.webContents.openDevTools()
  mainWindow.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow()

  console.log('main send', 'first msg')
  send('mainMsg', 'first msg', (data) => {
    console.log('rendererAnswer', data)
  })

  setTimeout(() => {
    console.log('main send', 'second msg')
    send('mainMsg', 'second msg', (data) => {
      console.log('rendererAnswer', data)
    })
  }, 1000)

  setTimeout(() => {
    console.log('main send', 'third msg')
    send('mainMsg', 'third msg', (data) => {
      console.log('rendererAnswer', data)
    })
  }, 3000)

  receive('rendererMsg', (data) => {
    console.log('mainReceive', data)
    return 'nice for you'
  })

  app.on('activate', function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})
js
const { receive, send } = require('elec-ipc')

const cancel = receive('mainMsg', (data) => {
  console.log('RendererReceive', data)
  return 'hi,there'
})

setTimeout(() => {
  cancel()
}, 2000)

console.log('renderer send', 'have a good day')
send('rendererMsg', 'have a good day', (data) => {
  console.log('mainAnswer', data)
})

between the renderer process and the renderer process

js
const { app, BrowserWindow } = require('electron')
const path = require('node:path')

function createWindow(preload) {
  const mainWindow = new BrowserWindow({
    webPreferences: {
      preload: path.join(__dirname, preload + '.js'),
      // This option needs to be enable, otherwise preload cannot access the node module
      nodeIntegration: true
    }
  })

  mainWindow.webContents.openDevTools()
  mainWindow.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow('preload')
  createWindow('preload2')

  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})
js
const { send, receive } = require('elec-ipc')

console.log('here is renderer1')
console.log('renderer1 send', 'hello')
send('renderer:msg', 'hello', (data) => {
  console.log('renderer1 get answer', data)
})

receive('renderer2:msg', (data) => {
  console.log('renderer1 receive', data)
  console.log('renderer1 answer', 'baz')
  return 'baz'
})
js
const { receive, send } = require('elec-ipc')

console.log('here is renderer 2')

receive('renderer:msg', (data) => {
  console.log('renderer2 receive', data)

  console.log('renderer2 answer', 'hi,there')
  return 'hi,there'
})

console.log('renderer2 send', 'foo')
send('renderer2:msg', 'foo', (data) => {
  console.log('renderer2 get answer', data)
})

Issues

Please let me know if there are any issues, click this link.

Released under the MIT License.