singletron

0.0.5 • Public • Published

Singletron

This is a thin wrapper around node-ipc to simplify inter-process communication among Electron apps. The main aim is to allow apps to share a single instance of Electron, to minimize memory foot-print.

Currently, this is just a proof-of-concept, and not meant for production use. Please refer to on-going discussion in the Electron repo about sharing a runtime among apps.

Usage

For a working demonstration, see singletron-example.

Below is an example of how to set up the server/clients. Please note that startApp and createWindow are defined earlier in the file.

In main.js (main process):

const singletron = require('singletron')
 
// Share single instance of Electron
 
singletron.createClient().then(({ client, config }) => {
 
  console.log('Connected to singletron server', config)
 
  client.on('loaded', () => app.quit())
 
  client.emit('load', path.join(__dirname, 'index.html'))
 
}).catch((e) => {
 
  // Start the app instance
  startApp()
 
  // Start singletron server
 
  singletron.createServer().then(({ server, config }) => {
 
    console.log('Singletron server started', config)
 
    // Request from client
    server.on('load', (data, socket) => {
 
      console.log('Request for new window', data)
 
      // Create window for new app
      createWindow(data)
 
      server.emit(socket, 'loaded')
    })
 
  }).catch((e) => {
    console.log('Error creating singletron server')
  })
})

Methods

createClient( options )

options = {
  clientId: 'singletronClient',
  serverId: 'singletronServer'
}

Returns a promise that resolves if connected to an existing server.

On success, the then() handler will receive an object with two properties:

  • client is an instance of node-ipc.
    • client.emit( eventName, data ) - Send a message to server
    • client.on( eventName, (data, socket) => {} ) - Listen to message from server
  • config is an object that the server sent
    • id - server ID
    • versions - { node, chrome, electron }

It's up to the app how to negotiate with the server. In the example above, the client requests to open a new window with its index.html, then quits when it's loaded.

If no server is found, it throws: you can catch() it and start a server.

createServer( options )

options = {
  serverId: 'singletronServer'
}

Returns a promise that resolves if server was created successfully.

On success, the then() handler will receive an object with two properties:

  • server is an instance of node-ipc.
    • server.emit( socket, eventName, data ) - Send a message to client specified by socket
    • server.on( eventName, (data, socket) => {} ) - Listen to message from client
  • config is the same object as described for client above

It's up to the app how to negotiate with the client. In the example above, the server listens for a request to open a new window with given URL.

Readme

Keywords

none

Package Sidebar

Install

npm i singletron

Weekly Downloads

1

Version

0.0.5

License

MIT

Last publish

Collaborators

  • eliot