napi-rs/examples/napi/electron.cjs
LongYinan 4719caa643
feat(napi): support Return generic of ThreadsafeFunction (#1997)
* feat(napi): support to use tuple with either (#1993)

`Either` uses `ValidateNapiValue` + `TypeName` to validate and report error on value not being matched. So there's no way to remove these super traits from it. So I implemented these types to `Tuple` types.

* feat(napi): support `Return` generic of ThreadsafeFunction

* depracate JsFunction

* CalleeHandled tsfn should handle Result in callback

* Pass env to call_with_return_value callback

* Fix compile

* clippy fix

* Fix electron test

* Function args

---------

Co-authored-by: Hana <andywangsy@gmail.com>
2024-03-20 21:37:08 +08:00

100 lines
2.2 KiB
JavaScript

const assert = require('node:assert')
const { readFileSync } = require('node:fs')
const { app, BrowserWindow, ipcMain } = require('electron')
const FILE_CONTENT = readFileSync(__filename, 'utf8')
const createWindowAndReload = async () => {
await app.whenReady()
const win = new BrowserWindow({
width: 800,
height: 600,
show: false,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
})
await win.loadFile('./electron-renderer/index.html')
await new Promise((resolve, reject) => {
win.webContents.on('render-process-gone', (e, detail) => {
reject(
new Error(
`Renderer process crashed: ${detail.reason}, exitCode: ${detail.exitCode}`,
),
)
})
// reload to check if there is any crash
win.reload()
// make sure the renderer process is still alive
ipcMain.once('pong', () => {
console.info('pong')
resolve()
})
// Wait for a while to make sure if a crash happens, the 'resolve' function should be called after the crash
setTimeout(() => {
win.webContents.send('ping')
console.info('ping')
}, 1000)
})
}
async function main() {
const {
readFileAsync,
callThreadsafeFunction,
withAbortController,
createExternalTypedArray,
} = require('./index.cjs')
const ctrl = new AbortController()
const promise = withAbortController(1, 2, ctrl.signal)
try {
ctrl.abort()
await promise
throw new Error('Should throw AbortError')
} catch (err) {
assert(err.message === 'AbortError')
}
const buf = await readFileAsync(__filename)
assert(FILE_CONTENT === buf.toString('utf8'))
const value = await new Promise((resolve, reject) => {
let i = 0
let value = 0
callThreadsafeFunction((err, v) => {
if (err != null) {
reject(err)
return
}
i++
value += v
if (i === 100) {
resolve(value)
}
})
})
assert(
value ===
Array.from({ length: 100 }, (_, i) => i).reduce((a, b) => a + b),
)
console.info(createExternalTypedArray())
}
Promise.all([main(), createWindowAndReload()])
.then(() => {
process.exit(0)
})
.catch((e) => {
console.error(e)
process.exit(1)
})