Improve error handling from remote
authorMax Claus Nunes <maxcnunes@gmail.com>
Sat, 31 Oct 2015 23:20:54 +0000 (21:20 -0200)
committerMax Claus Nunes <maxcnunes@gmail.com>
Sat, 31 Oct 2015 23:20:54 +0000 (21:20 -0200)
This way copy all properties available in the error object and keep the real stack trace

atom/browser/lib/rpc-server.coffee
atom/renderer/api/lib/remote.coffee

index 24ece22..953436e 100644 (file)
@@ -40,7 +40,7 @@ valueToMeta = (sender, value, optimizeSimpleObject=false) ->
   else if meta.type is 'promise'
     meta.then = valueToMeta(sender, value.then.bind(value))
   else if meta.type is 'error'
-    meta.message = value.message
+    meta = errorValueToMeta(value, meta)
   else if meta.type is 'date'
     meta.value = value.getTime()
   else
@@ -50,6 +50,13 @@ valueToMeta = (sender, value, optimizeSimpleObject=false) ->
   meta
 
 # Convert Error into meta data.
+errorValueToMeta = (err, meta) ->
+  Object.getOwnPropertyNames(err).reduce((obj, key) ->
+    obj[key] = err[key]
+    obj
+  , meta)
+
+# Convert Error into meta data.
 exceptionToMeta = (error) ->
   type: 'exception', message: error.message, stack: (error.stack || error)
 
index b5a3a69..d01027e 100644 (file)
@@ -46,7 +46,7 @@ metaToValue = (meta) ->
     when 'array' then (metaToValue(el) for el in meta.members)
     when 'buffer' then new Buffer(meta.value)
     when 'promise' then Promise.resolve(then: metaToValue(meta.then))
-    when 'error' then new Error(meta.message)
+    when 'error' then metaToError(meta)
     when 'date' then new Date(meta.value)
     when 'exception'
       throw new Error("#{meta.message}\n#{meta.stack}")
@@ -110,6 +110,17 @@ metaToValue = (meta) ->
 
       ret
 
+# Convert meta data from browser into Error.
+metaToError = (meta) ->
+  Object.getOwnPropertyNames(meta).reduce((error, prop) ->
+    Object.defineProperty(error, prop, {
+      get: -> meta[prop],
+      enumerable: false,
+      configurable: false
+    })
+    error
+  , new Error())
+
 # Browser calls a callback in renderer.
 ipc.on 'ATOM_RENDERER_CALLBACK', (id, args) ->
   callbacksRegistry.apply id, metaToValue(args)