Skip to content

Instantly share code, notes, and snippets.

@justingreenberg
Last active January 11, 2017 06:58
Show Gist options
  • Save justingreenberg/94bf164496ab2eab79fd0adf0df0c7b7 to your computer and use it in GitHub Desktop.
Save justingreenberg/94bf164496ab2eab79fd0adf0df0c7b7 to your computer and use it in GitHub Desktop.
Simple tracing using ES Proxies
import assert from 'assert'
const tracer = async obj => {
const trace = {}
let order = []
const object = new Proxy(obj, {
get (target, prop) {
order = order.concat(prop)
trace[prop] = Reflect.has(trace, prop) ? trace[prop] + 1 : 1
return Reflect.get(target, prop)
}
})
return {
object,
getTrace: async () => trace,
getOrder: async () => order
}
}
const runner = async () => {
const test = {
one: async () => true,
two: async () => true,
three: async () => true
}
Object.defineProperty(test, 'run', {
value: async obj => {
await obj.one()
await obj.three()
await obj.two()
await obj.one()
}
})
const { object, getTrace, getOrder } = await tracer(test)
await test.run(object)
return {
order: await getOrder(),
trace: await getTrace()
}
}
runner().then(({ order, trace }) => {
assert.deepEqual(order, [
'methodOne',
'methodThree',
'methodTwo',
'methodOne'
])
assert.deepEqual(trace, {
methodOne: 2,
methodThree: 1,
methodTwo: 1
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment