napi-rs/examples/napi/__tests__/worker-thread.spec.ts
LongYinan 13d0ce075e
feat: integrate with emnapi (#1669)
* Integrate with emnapi

* resolve conflict

* ignore wasm

* generate wasi file

* Add wasi test to workflow

* Fix wasi template

* emnapi new initialize api

* Finish test

* Purne tsconfig

* Generate wasi worker

* Fix electron test

* Finalize check

* Noop adjust_external_memory

* Apply cr suggestions
2023-11-02 12:57:11 +08:00

109 lines
2.9 KiB
TypeScript

import { join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { Worker } from 'node:worker_threads'
import test from 'ava'
const { Animal, Kind, DEFAULT_COST } = (await import('../index.js')).default
const __dirname = join(fileURLToPath(import.meta.url), '..')
// aarch64-unknown-linux-gnu is extremely slow in CI, skip it or it will timeout
const t =
(process.arch === 'arm64' && process.platform === 'linux') ||
process.env.WASI_TEST
? test.skip
: test
const concurrency = process.platform === 'win32' || process.platform === 'darwin' || (process.platform === 'linux' && process.arch === 'x64') ? 50 : 10
t('should be able to require in worker thread', async (t) => {
await Promise.all(
Array.from({ length: concurrency }).map(() => {
const w = new Worker(join(__dirname, 'worker.cjs'), {
execArgv: [],
})
return new Promise<void>((resolve, reject) => {
w.postMessage({ type: 'require' })
w.on('message', (msg) => {
t.is(msg, Animal.withKind(Kind.Cat).whoami() + DEFAULT_COST)
resolve()
})
w.on('error', (err) => {
reject(err)
})
})
.then(() => w.terminate())
.then(() => {
t.pass()
})
}),
)
})
t('custom GC works on worker_threads', async (t) => {
await Promise.all(
Array.from({ length: concurrency }).map(() =>
Promise.all([
new Promise<Worker>((resolve, reject) => {
const w = new Worker(join(__dirname, 'worker.cjs'), {
execArgv: [],
})
w.postMessage({
type: 'async:buffer',
})
w.on('message', (msg) => {
t.is(msg, 'done')
resolve(w)
})
w.on('error', (err) => {
reject(err)
})
}).then((w) => {
return w.terminate()
}),
new Promise<Worker>((resolve, reject) => {
const w = new Worker(join(__dirname, 'worker.cjs'), {
execArgv: [],
})
w.postMessage({
type: 'async:arraybuffer',
})
w.on('message', (msg) => {
t.is(msg, 'done')
resolve(w)
})
w.on('error', (err) => {
reject(err)
})
}).then((w) => {
return w.terminate()
}),
]),
),
)
})
t('should be able to new Class in worker thread concurrently', async (t) => {
await Promise.all(
Array.from({ length: concurrency }).map(() => {
const w = new Worker(join(__dirname, 'worker.cjs'), {
execArgv: [],
})
return new Promise<void>((resolve, reject) => {
w.postMessage({ type: 'constructor' })
w.on('message', (msg) => {
t.is(msg, 'Ellie')
resolve()
})
w.on('error', (err) => {
reject(err)
})
})
.then(() => w.terminate())
.then(() => {
t.pass()
})
}),
)
})