mirror of
https://github.com/napi-rs/napi-rs.git
synced 2025-12-08 19:56:07 +00:00
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
import assert from 'node:assert'
|
|
import { test } from 'node:test'
|
|
import { Worker, isMainThread, parentPort } from 'node:worker_threads'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
import * as memfs from 'memfs'
|
|
|
|
import { createFsProxy, createOnMessage } from './fs-proxy.cjs'
|
|
|
|
const __filename = fileURLToPath(import.meta.url)
|
|
|
|
await test(`fs-proxy between main and worker (${isMainThread ? 'main' : 'worker'})`, async () => {
|
|
const fs = isMainThread
|
|
? memfs.createFsFromVolume(
|
|
memfs.Volume.fromJSON({
|
|
'/test.txt': 'test',
|
|
'/test.json': JSON.stringify({ a: 'b' }),
|
|
}),
|
|
)
|
|
: createFsProxy(memfs)
|
|
|
|
if (isMainThread) {
|
|
fs.__custom1__ = () => {
|
|
throw null
|
|
}
|
|
fs.__custom2__ = (x) => x
|
|
|
|
const worker = new Worker(__filename)
|
|
|
|
const onMessage = createOnMessage(fs)
|
|
await new Promise((resolve, reject) => {
|
|
worker.on('message', (data) => {
|
|
if (data === 'pass') {
|
|
resolve()
|
|
return
|
|
}
|
|
onMessage({ data })
|
|
})
|
|
worker.on('error', (error) => {
|
|
reject(error)
|
|
})
|
|
})
|
|
} else {
|
|
Object.assign(globalThis, {
|
|
postMessage: (data) => {
|
|
parentPort.postMessage(data)
|
|
},
|
|
})
|
|
assert.strictEqual(fs.readFileSync('/test.txt', 'utf8'), 'test')
|
|
assert.strictEqual(fs.readFileSync('/test.json', 'utf8'), '{"a":"b"}')
|
|
assert.throws(() => fs.readFileSync('/notexist', 'utf8'), /ENOENT/)
|
|
assert.throws(
|
|
() => fs.__custom1__(),
|
|
(err) => {
|
|
return err === null
|
|
},
|
|
)
|
|
assert.throws(() => fs.__notexist__(), TypeError)
|
|
|
|
const primitives = [undefined, null, true, false, 1, 1.1, 1n, 'string']
|
|
primitives.forEach((primitive) => {
|
|
assert.strictEqual(fs.__custom2__(primitive), primitive)
|
|
})
|
|
postMessage('pass')
|
|
}
|
|
})
|