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
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)
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}")
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)