}
}
+const throwRPCError = function (message) {
+ const error = new Error(message)
+ error.code = 'EBADRPC'
+ throw error
+}
+
// Convert array of meta data from renderer into array of real values.
const unwrapArgs = function (sender, args) {
const metaToValue = function (meta) {
args = unwrapArgs(event.sender, args)
let constructor = objectsRegistry.get(id)
+ if (constructor == null) {
+ throwRPCError(`Cannot call constructor on missing remote object ${id}`)
+ }
+
// Call new with array of arguments.
// http://stackoverflow.com/questions/1606797/use-of-apply-with-new-operator-is-this-possible
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
try {
args = unwrapArgs(event.sender, args)
let func = objectsRegistry.get(id)
+
+ if (func == null) {
+ throwRPCError(`Cannot call function on missing remote object ${id}`)
+ }
+
callFunction(event, func, global, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
ipcMain.on('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', function (event, id, method, args) {
try {
args = unwrapArgs(event.sender, args)
- let constructor = objectsRegistry.get(id)[method]
+ let object = objectsRegistry.get(id)
+
+ if (object == null) {
+ throwRPCError(`Cannot call constructor '${method}' on missing remote object ${id}`)
+ }
// Call new with array of arguments.
+ let constructor = object[method]
let obj = new (Function.prototype.bind.apply(constructor, [null].concat(args)))()
event.returnValue = valueToMeta(event.sender, obj)
} catch (error) {
try {
args = unwrapArgs(event.sender, args)
let obj = objectsRegistry.get(id)
+
+ if (obj == null) {
+ throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`)
+ }
+
callFunction(event, obj[method], obj, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
ipcMain.on('ELECTRON_BROWSER_MEMBER_SET', function (event, id, name, value) {
try {
let obj = objectsRegistry.get(id)
+
+ if (obj == null) {
+ throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`)
+ }
+
obj[name] = value
event.returnValue = null
} catch (error) {