ipcをPromiseで制御できるようにするモジュール

EventEmitterをPromiseで制御できるようにするライブラリでモジュールを作ったのだけど、 微妙な感じだったのでEventEmitterと広く捉えるのでなくてipc専用のモジュールとして別にipc-promiseを作ってみた。 今度はいい感じのような気がする。

リポジトリにあるテストのコードとほとんど変わらないのだけど、一応書いておく。

main process

Electron実行時に読み込むmain.jsを以下のように書く。

'use strict';

let app = require('app'),
    BrowserWindow = require('browser-window'),
    ipcPromise = require('ipc-promise');

let mainWindow;

// renderer向けのlistenerを登録
ipcPromise.on('to-main-from-renderer', function(params) {
  // Promiseを返す
  return new Promise(function(resolve, reject) {
    if (params.value === 'main') {
      resolve({ id: 42 });
    } else {
      reject(new Error('to-main-from-renderer'));
    }
  });
});

app.on('window-all-closed', function() {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('ready', function() {
  mainWindow = new BrowserWindow({
    show: false
  });
  mainWindow.on('closed', function() {
    mainWindow = null;
  });
  mainWindow.loadUrl(`file://${__dirname}/index.html`);
});

ipc-promiseでlistenerを登録する。listenerがPromiseを返すように書く以外はipcと変わらない。

あとはウィンドウを非表示にして生成しているだけ。

renderer process

Electronで表示させるページのindex.htmlと、そのページで実行するrenderer.jsを以下のように書く。

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ipc-promise</title>
  </head>
  <body>
    <script src="ipc-promise.min.js"></script>
    <script src="renderer.js"></script>
  </body>
</html>

ipc-promiseとrenderer.jsを読み込むだけのHTMLを書く。

renderer.js

(function(){
  'use strict';

  ipcPromise
    // mainにsendする
    .send('to-main-from-renderer', {
      value: 'main'
    })
    .then(function(result) {
      console.log(JSON.stringify(result));
    })
    .catch(function(err) {
      console.error(JSON.stringify(err));
    });
}());

rendererではipc-promiseでsendするだけ。あとはPromiseが返ってくる。


かなり記述が簡単になったような気がする。Promiseにできればcoで扱えるのでいい感じだ。

\\\ ٩( ˘ω˘ )و ////