Electronのipc通信で連想配列を送れるか?

Electronではレンダーとサーバーは別プロセスなので、情報交換はプロセス間通信となる。
そんな訳で情報交換には多少の制約はありそうだ。
以下の例はプロセス間(レンダーとサーバー)で配列をやり取りしている。

サーバー側

  • index.js

レンダー側

  • render.js
  • subrender.js

全ソースは以下。
index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Electron ipc test</title>
    <script type="text/javascript" src="render.js"></script>
  </head>
  <body>
    <div>ipc test !</div>
  </body>
</html>

index.js

'use strict';

var electron = require('electron');
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;
var mainWindow = null;

app.on(
  'window-all-closed',
  function() {
    if (process.platform != 'darwin')
    app.quit();
  }
);
app.on(
  'ready',
  function() {
    mainWindow = new BrowserWindow({width: 500, height: 300});
    mainWindow.loadURL('file://' + __dirname + '/index.html');
    mainWindow.webContents.openDevTools();
    mainWindow.on(
      'closed',
      function() {
        mainWindow = null;
      }
    );
  }
);
electron.ipcMain.on(
  'hello-from-render',
  function(ev, arg) {
    console.log('receive data from render.');
    for(var key of Object.keys(arg))
      console.log('key=' + key + ' v=' + arg[key]);
    console.log('send data from server.');
    var ary = [];
    ary.push('A');
    ary.push('B');
    ary.push('C');
    ary['A'] = 'a';
    ary['B'] = 'b';
    ary['C'] = 'c';
    for(var key of Object.keys(ary))
      console.log('key=' + key + ' v=' + ary[key]);
    console.log('send ...');
    mainWindow.webContents.send('hello-from-server', ary);
  }
);

render.js

'use strict';

var electron = require('electron');

window.onload = function() {
  console.log('send data from render.');
  var ary = [];
  ary.push('A');
  ary.push('B');
  ary.push('C');
  ary['A'] = 'a';
  ary['B'] = 'b';
  ary['C'] = 'c';
  for(var key of Object.keys(ary))
    console.log('key=' + key + ' v=' + ary[key]);
  console.log('send ...');
  electron.ipcRenderer.send('hello-from-render', ary);
  console.log('send to sub ...');
  require('./subrender').emit('hello-from-render', ary);
}
electron.ipcRenderer.on(
  'hello-from-server',
  function(ev, arg) {
    console.log('receive data from server.');
    for(var key of Object.keys(arg))
      console.log('key=' + key + ' v=' + arg[key]);
  }
);

subrender.js

'use strict';

var EventEmitter = require('events').EventEmitter;
const event = new EventEmitter;
module.exports = event;

event.on(
  'hello-from-render',
  function(arg) {
    console.log('receive data from render by sub.');
    for(var key of Object.keys(arg))
      console.log('key=' + key + ' v=' + arg[key]);
  }
);

実行結果は以下の通り。

サーバー側のログ

receive data from render. <-- 連想配列の要素が欠落
key=0 v=A
key=1 v=B
key=2 v=C
send data from server.
key=0 v=A
key=1 v=B
key=2 v=C
key=A v=a
key=B v=b
key=C v=c
send ...

レンダー側のログ

send data from render.
key=0 v=A
key=1 v=B
key=2 v=C
key=A v=a
key=B v=b
key=C v=c
send ...
send to sub ...
receive data from render by sub. <-- EventEmitterでは連想配列もOK。
key=0 v=A
key=1 v=B
key=2 v=C
key=A v=a
key=B v=b
key=C v=c
receive data from server. <-- 連想配列の要素が欠落
key=0 v=A
key=1 v=B
key=2 v=C

添え字の配列は渡せるが、連想配列を渡すことはできなかった。
Jsonに変換できない、というのが理由でしょうか。
因みにNode.jsのイベントモジュールEventEmitterで送ればプロセス内なので連想配列も無事送ることができた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です