Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/eliot-akira/singletron

Inter-process communication hub for Electron apps
https://github.com/eliot-akira/singletron

Last synced: about 1 month ago
JSON representation

Inter-process communication hub for Electron apps

Awesome Lists containing this project

README

        

# Singletron

This is a thin wrapper around [`node-ipc`](https://github.com/RIAEvangelist/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](https://github.com/electron/electron/issues/673) about sharing a runtime among apps.

## Usage

For a working demonstration, see [singletron-example](https://github.com/eliot-akira/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):

```js
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 )

```js
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 )

```js
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.