Skip to content

Commit

Permalink
Merge pull request #633 from rjrodger/master
Browse files Browse the repository at this point in the history
refine message meta data edge cases
  • Loading branch information
rjrodger committed May 15, 2017
2 parents c0efd90 + 6be3b39 commit cd63d67
Show file tree
Hide file tree
Showing 9 changed files with 417 additions and 75 deletions.
37 changes: 7 additions & 30 deletions lib/api.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
/* Copyright (c) 2017 Richard Rodger and other contributors, MIT License */
'use strict'

var Assert = require('assert')

var _ = require('lodash')
var Jsonic = require('jsonic')
var Eraro = require('eraro')
Expand Down Expand Up @@ -61,40 +59,19 @@ exports.status = function(flags) {
return status
}

// res: msg id string, or
// flag object: {
// id: msg-id,
// strict: false // if true, return null if not found
// }
exports.reply = function(res) {
exports.reply = function(rep) {
var instance = this

Assert.ok(null != res)

var id = _.isString(res) ? res : res.id
Assert.ok(null != id)

var item = instance.private$.history.get(id)
var reply = item && item.reply
var item = null

if (!reply) {
if (res.strict) {
throw internals.error('unknown_message_reply', { id: id, args: '' })
} else {
reply = function reply() {
instance.log.warn(
Common.make_standard_err_log_entry(
internals.error('unknown_message_reply', {
id: id,
args: arguments
})
)
)
}
if (rep && rep.meta$) {
item = instance.private$.history.get(rep.meta$.id)
if (item) {
item.reply(rep.empty$ || rep.meta$.empty ? null : rep)
}
}

return reply
return !!item
}

exports.listen = function(callpoint) {
Expand Down
2 changes: 1 addition & 1 deletion lib/logging.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ logging.preload = function() {
.substring(0, 88)
)

logb.push(data.meta.name)
logb.push(data.meta.id)

if (data.notice) {
logb.push(data.notice)
Expand Down
49 changes: 39 additions & 10 deletions lib/transport.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ module.exports = function(seneca) {
tu.externalize_reply = externalize_reply
tu.internalize_msg = internalize_msg
tu.internalize_reply = internalize_reply
tu.close = close
}

function externalize_msg(msg) {
Expand All @@ -48,13 +49,18 @@ function externalize_msg(msg) {
return msg
}

function externalize_reply(out) {
if (!out) return

out.meta$ = out.meta$
function externalize_reply(out, meta) {
if (!out) {
out = { meta$: meta }
meta.empty = true
} else {
// de-prototype
out.meta$ = out.meta$
}

if (_.isError(out)) {
out = Common.copydata(out)
out.meta$.error = true
}

return out
Expand All @@ -76,11 +82,34 @@ function internalize_msg(msg) {
}

function internalize_reply(out) {
if (!out) return
var empty = false

//console.dir(out,{depth:null,colors:true})

if (!out) {
out = {}
empty = true
}

var meta = out.meta$ || {}
delete out.meta$
Common.setmeta(out, { trace$: meta })

if (meta.error) {
var err = new Error(out.message)
var pn = Object.getOwnPropertyNames(out)
for (var i = 0; i < pn.length; i++) {
var p = pn[i]
err[p] = out[p]
}
out = err
}

Common.setmeta(out, meta)
out.__proto__.trace$ = true

if (empty) {
out.__proto__.empty$ = true
}

// TODO: handle entity

Expand Down Expand Up @@ -124,15 +153,15 @@ function register(config, reply) {
}

function close(seneca, closer) {
seneca.add('role:seneca,cmd:close', function(close_args, done) {
seneca.add('role:seneca,cmd:close', function(msg, reply) {
var seneca = this

closer.call(seneca, function(err) {
if (err) {
seneca.log.error(err)
}

seneca.prior(close_args, done)
seneca.prior(msg, reply)
})
})
}
Expand Down Expand Up @@ -179,11 +208,11 @@ function hook_listen_web(msg, reply) {

var listener = listen()

close(seneca, function(done) {
close(seneca, function(reply) {
if (listener) {
listener.close()
}
done()
reply()
})

function listen() {
Expand Down
49 changes: 31 additions & 18 deletions seneca.js
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ function make_seneca(initial_options) {
.add(Inward.announce)

private$.outward = Ordu({ name: 'outward' })
.add(Outward.make_error)
//.add(Outward.make_error)
.add(Outward.act_stats)
.add(Outward.act_cache)
.add(Outward.res_object)
Expand Down Expand Up @@ -1218,6 +1218,8 @@ function make_seneca(initial_options) {
}

function handle_result(err, out) {
// console.log('HR',root.id,_.isError(err), err || out, (err || out || {}).meta$)

var delegate = this
var actdef = action_ctxt.actdef

Expand Down Expand Up @@ -1245,9 +1247,16 @@ function make_seneca(initial_options) {
meta.end = actend

if (data.res) {
if (data.res.trace$) {
if (data.res.trace$ && data.res.meta$) {
data.res.__proto__.trace$ = false

var res_meta = data.res.meta$

meta.trace = meta.trace || []
meta.trace.push(data.res.trace$)
meta.trace.push({
desc: make_trace_desc(res_meta),
trace: res_meta.trace || []
})
}

Common.setmeta(data.res, meta)
Expand All @@ -1257,17 +1266,8 @@ function make_seneca(initial_options) {
if (parent_meta) {
parent_meta.trace = parent_meta.trace || []
parent_meta.trace.push({
desc: [
meta.pattern,
meta.id,
meta.instance,
meta.start,
meta.end,
meta.sync,
meta.instance,
meta.action
],
trace: meta.trace
desc: make_trace_desc(meta),
trace: meta.trace || []
})
}

Expand Down Expand Up @@ -1312,15 +1312,15 @@ function make_seneca(initial_options) {

try {
if (call_cb) {
var rout = data.res
var rout = data.res || null
var rerr = null

if (_.isError(data.res)) {
rerr = errordesc.err
rout = null
}

reply.call(delegate, rerr, rout)
reply.call(delegate, rerr, rout, meta)
}
} catch (ex) {
// for exceptions thrown inside the callback
Expand Down Expand Up @@ -1442,8 +1442,8 @@ function make_seneca(initial_options) {
if (err.meta$.err) {
var errmeta = _.clone(msg.meta$)
errmeta.err = seneca_err
err.meta$.err_trail = err.meta$.err_trail || []
err.meta$.err_trail.push(errmeta)
err.meta$.err_trace = err.meta$.err_trace || []
err.meta$.err_trace.push(errmeta)
} else {
err.meta$.err = seneca_err
}
Expand Down Expand Up @@ -1896,6 +1896,7 @@ function make_act_delegate(instance, opts, meta, actdef) {
msg.prior$ = actdef.priormeta.id
this.act(msg, reply)
} else {
var meta = msg.meta$ || {}
var out = msg.default$ || meta.dflt || null
if (out) {
Common.setmeta(out, meta)
Expand All @@ -1907,3 +1908,15 @@ function make_act_delegate(instance, opts, meta, actdef) {

return delegate
}

function make_trace_desc(meta) {
return [
meta.pattern,
meta.id,
meta.instance,
meta.start,
meta.end,
meta.sync,
meta.action
]
}
78 changes: 78 additions & 0 deletions test/actions.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
'use strict'

var Code = require('code')
var Lab = require('lab')

var lab = (exports.lab = Lab.script())
var describe = lab.describe
var it = lab.it
var expect = Code.expect

var Seneca = require('..')

describe('api', function() {
var si = Seneca({ log: 'silent' })

function z(msg, reply) {
reply({ z: msg.z })
}

it('cmd_stats', function(fin) {
si.test(fin).act('role:seneca,cmd:stats', function(err, out) {
expect(out.act).exists()
expect(out.actmap).not.exists()

this.act('role:seneca,cmd:stats,summary:false', function(err, out) {
expect(out.act).exists()
expect(out.actmap).exists()
fin()
})
})
})

it('cmd_close', function(fin) {
var si = Seneca({ log: 'silent' })

var log = []
si.on('close', function() {
log.push('event-close')
})
si.add('role:seneca,cmd:close', function(msg, reply) {
log.push('custom-close')
this.prior(msg, reply)
})
si.close(function() {
expect(log).equals(['custom-close', 'event-close'])
fin()
})
})

it('info_fatal', function(fin) {
var si = Seneca({ log: 'silent' })
si.close = function() {}

si
.add('role:seneca,cmd:close', function(msg, reply) {
reply()
})
.sub('role:seneca,info:fatal', function(msg) {
expect(msg.err.meta$.pattern).equal('a:1')
fin()
})
.add('a:1', function() {
throw new Error('a:1')
})
.act('a:1,fatal$:true')
})

it('get_options', function(fin) {
var si = Seneca({ tag: 'foo' }).test(fin)
si.act('role:seneca,get:options', function(err, out) {
expect(err).not.exist()
expect(out).exist()
expect(out.tag).equals('foo')
expect(si.tag).equals('foo')
fin()
})
})
})
22 changes: 11 additions & 11 deletions test/error.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (c) 2014-2015 Richard Rodger, MIT License */
/* Copyright (c) 2014-2017 Richard Rodger, MIT License */
'use strict'

var Assert = require('assert')
Expand Down Expand Up @@ -67,9 +67,9 @@ describe('error', function() {
})
}

function exec_deep_action_result(done) {
Seneca({ legacy: { error: false }, log: 'silent' })
.error(fail_assert(done))
function exec_deep_action_result(fin) {
Seneca({ id$: 'edar', legacy: { error: false }, log: 'silent' })
.error(fail_assert(fin))
.add('a:1', function(msg, reply) {
this.act('b:1', reply)
})
Expand All @@ -83,16 +83,16 @@ describe('error', function() {
assert.equal('EDAR', err.message)
assert.equal('c:1', err.meta$.pattern)
assert.equal('act_execute', err.meta$.err.code)
assert.equal('b:1', err.meta$.err_trail[0].pattern)
assert.equal('a:1', err.meta$.err_trail[1].pattern)
assert.equal('b:1', err.meta$.err_trace[0].pattern)
assert.equal('a:1', err.meta$.err_trace[1].pattern)

assert.ok(err.meta$.id !== err.meta$.err_trail[0].id)
assert.ok(err.meta$.id !== err.meta$.err_trail[1].id)
assert.ok(err.meta$.id !== err.meta$.err_trace[0].id)
assert.ok(err.meta$.id !== err.meta$.err_trace[1].id)

assert.equal(err.meta$.tx, err.meta$.err_trail[0].tx)
assert.equal(err.meta$.tx, err.meta$.err_trail[1].tx)
assert.equal(err.meta$.tx, err.meta$.err_trace[0].tx)
assert.equal(err.meta$.tx, err.meta$.err_trace[1].tx)

return done()
return fin()
})
}

Expand Down

0 comments on commit cd63d67

Please sign in to comment.