Skip to content

🪄 register shared TypeScript workers with AVA

License

Notifications You must be signed in to change notification settings

seamapi/ava-typescript-worker

Repository files navigation

ava-typescript-worker

AVA has a really cool feature called shared workers.

But when using TypeScript and AVA with on-the-fly transpilation with something like tsx, loaded worker files are not transpiled--meaning you're limited to just using Javascript.

This library fixes that and allows you to register and load TypeScript workers.

Installation

npm install ava-typescript-worker --save-dev

or

yarn add ava-typescript-worker --dev

Usage

For the most part, shared workers behave identically with a few differences.

Here's an example of what a worker might look like:

test.ts:

import test from "ava"
import { registerSharedTypeScriptWorker } from "ava-typescript-worker"
import path from "path"

const worker = registerSharedTypeScriptWorker({
  filename: path.resolve("echo.worker.ts"),
})

test("is worker available", async (t) => {
  await worker.available()
  t.pass()
})

echo.worker.ts:

import { SharedWorker } from "ava/plugin"

const echo = async (protocol: SharedWorker.Protocol) => {
  for await (const msg of protocol.subscribe()) {
    msg.reply(msg.data)
  }
}

export default echo

Notice that:

  • supportedProtocols cannot be passed as an option to registerSharedTypeScriptWorker()
  • Workers don't need to do protocol negotiation with await negotiateProtocol(["ava-4"]).ready()

This is because TypeScript files are loaded through a Javascript "proxy" loader, which handles protocol negotiations out of necessity.