Mailspring/src/window-bridge.coffee

43 lines
1.5 KiB
CoffeeScript

_ = require 'underscore'
{ipcRenderer} = require 'electron'
Utils = require './flux/models/utils'
class WindowBridge
constructor: ->
@_tasks = {}
ipcRenderer.on("remote-run-results", @_onResults)
ipcRenderer.on("run-in-window", @_onRunInWindow)
runInWindow: (window, objectName, methodName, args) ->
taskId = Utils.generateTempId()
new Promise (resolve, reject) =>
@_tasks[taskId] = {resolve, reject}
args = Utils.serializeRegisteredObjects(args)
params = {window, objectName, methodName, args, taskId}
ipcRenderer.send("run-in-window", params)
runInMainWindow: (args...) ->
@runInWindow("main", args...)
runInWorkWindow: (args...) ->
@runInWindow("work", args...)
_onResults: (event, {returnValue, taskId}={}) =>
returnValue = Utils.deserializeRegisteredObjects(returnValue)
@_tasks[taskId].resolve(returnValue)
delete @_tasks[taskId]
_onRunInWindow: (event, {objectName, methodName, args, taskId}={}) =>
args = Utils.deserializeRegisteredObjects(args)
exports = require 'nylas-exports'
result = exports[objectName][methodName].apply(null, args)
if _.isFunction(result.then)
result.then (returnValue) ->
returnValue = Utils.serializeRegisteredObjects(returnValue)
ipcRenderer.send('remote-run-results', {returnValue, taskId})
else
returnValue = result
returnValue = Utils.serializeRegisteredObjects(returnValue)
ipcRenderer.send('remote-run-results', {returnValue, taskId})
module.exports = new WindowBridge