@atakama/capio

Capture logs and i/o in an async-safe way


Keywords
coverage, diffs, diff
License
ISC
Install
npm install @atakama/capio@0.0.1

Documentation

Capio - async log, io and generic global state capture

When writing unit test for complex async code it's somtimes difficult to isolate compoenent output.

Node's async_hooks library provides enough information to allow globals to be swapped in and out.

Alternately, the deprecated domain module is used if needed.

Capio wraps both of these libraries, meaning you don't have to think about which version of node you're running.

Console log capture:

Consider this:

test1 = async ()=>{
    await thing1()
}

test2 = async ()=>{
    await thing2()
}

When run linearly, we can use the simple capture_console hook to capture output:

However, if we want to run thing1 and thing2 in parallel, the logs will get jumbled up.

Capio injects a 'captio' member to errors, which allows this to work:

run1 = async (test) => {
    try {
        await capio.captureLog(test)
    } except (e) {
        for (args of e.capio) {
            console.log(...args)
        }
    }
}

Promise.all(tests.map(t=>run1(t)))

I/O Spies

Capio can be used to 'spy' streams as well:

spied = await capio.captureIo(test, [socket, process.stdout], {spy: true})

console.log("socket", spied[0])
console.log("stdout", spied[1])

Low level tool for framework devs

This will call swapIn every time async execution contexts are run in the test, and will call swapOut evert time they are finished.

await capio.capture(test, swapIn, swapOut)