Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/seamapi/ava-typescript-worker
🪄 register shared TypeScript workers with AVA
https://github.com/seamapi/ava-typescript-worker
ava esbuild typescript worker
Last synced: 3 months ago
JSON representation
🪄 register shared TypeScript workers with AVA
- Host: GitHub
- URL: https://github.com/seamapi/ava-typescript-worker
- Owner: seamapi
- License: mit
- Created: 2022-04-21T14:34:51.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-06-25T04:26:16.000Z (over 1 year ago)
- Last Synced: 2024-07-03T06:45:50.526Z (4 months ago)
- Topics: ava, esbuild, typescript, worker
- Language: TypeScript
- Homepage:
- Size: 196 KB
- Stars: 1
- Watchers: 5
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-ava - ava-typescript-worker - use TypeScript in shared workers (Packages)
README
# ava-typescript-worker
[AVA](https://github.com/avajs/ava) has a really cool feature called [shared workers](https://github.com/avajs/ava/blob/843644b10fa2d3a9e6449f6022c40119c22fc9cf/docs/recipes/shared-workers.md).
But when using TypeScript and AVA with on-the-fly transpilation with something like [tsx](https://www.npmjs.com/package/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
```bash
npm install ava-typescript-worker --save-dev
```or
```bash
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`:
```typescript
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`:
```typescript
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.