@napi-rs/cli
Version:
Cli tools for napi-rs
1,259 lines (1,238 loc) • 39.8 kB
Markdown
# Snapshot report for `src/api/__tests__/templates.spec.ts`
The actual snapshot is saved in `templates.spec.ts.snap`.
Generated by [AVA](https://avajs.dev).
## createWasiBrowserBinding default
> Snapshot 1
`import {␊
emnapiAsyncWorkPlugin as __emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin as __emnapiTSFNPlugin,␊
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
WASI as __WASI,␊
} from '@napi-rs/wasm-runtime'␊
import { createContext as __emnapiCreateContext } from '@emnapi/runtime'␊
␊
␊
␊
const __wasi = new __WASI({␊
version: 'preview1',␊
})␊
␊
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
const __wasmResponse = await globalThis.fetch(__wasmUrl)␊
if (!__wasmResponse.ok) {␊
throw new Error(␊
'Failed to fetch WASI module ' +␊
__wasmUrl +␊
': ' +␊
__wasmResponse.status +␊
' ' +␊
(__wasmResponse.statusText || 'Unknown Status'),␊
)␊
}␊
const __wasmFile = await __wasmResponse.arrayBuffer()␊
␊
const __sharedMemory = new WebAssembly.Memory({␊
initial: 4000,␊
maximum: 65536,␊
shared: true,␊
})␊
␊
let __emnapiContext␊
␊
const __wasiDisposeSymbol = Symbol.for('napi.rs.wasi.dispose')␊
const __wasiWorkers = new Set()␊
let __napiInstance␊
let __emnapiContextDestroyed = false␊
let __emnapiContextDestroyPromise␊
let __emnapiWasmEnvCleanupPrepared = false␊
let __wasiDisposed = false␊
let __wasiDisposePromise␊
let __completeWasiDisposal = function() {}␊
␊
function __isThenable(value) {␊
return (␊
value !== null &&␊
(typeof value === 'object' || typeof value === 'function') &&␊
typeof value.then === 'function'␊
)␊
}␊
␊
function __createCleanupError(errors, message) {␊
if (errors.length === 1) {␊
return errors[0]␊
}␊
const __AggregateError = globalThis.AggregateError␊
if (typeof __AggregateError === 'function') {␊
return new __AggregateError(errors, message)␊
}␊
const error = new Error(message)␊
error.errors = errors␊
return error␊
}␊
␊
function __attachCleanupErrors(error, cleanupErrors) {␊
if (cleanupErrors.length === 0) {␊
return error␊
}␊
const cleanupError = __createCleanupError(␊
cleanupErrors,␊
'WASI binding cleanup failed',␊
)␊
try {␊
if (␊
error &&␊
(typeof error === 'object' || typeof error === 'function')␊
) {␊
if (error.cause === undefined) {␊
error.cause = cleanupError␊
if (error.cause === cleanupError) {␊
return error␊
}␊
}␊
if (Array.isArray(error.cleanupErrors)) {␊
error.cleanupErrors.push(cleanupError)␊
return error␊
} else {␊
const attachedCleanupErrors = [cleanupError]␊
error.cleanupErrors = attachedCleanupErrors␊
if (error.cleanupErrors === attachedCleanupErrors) {␊
return error␊
}␊
}␊
}␊
} catch {}␊
const aggregate = __createCleanupError(␊
[error, cleanupError],␊
'WASI binding initialization and cleanup failed',␊
)␊
try {␊
aggregate.cause = error␊
} catch {}␊
return aggregate␊
}␊
␊
function __prepareWasmEnvCleanup() {␊
if (__emnapiWasmEnvCleanupPrepared) {␊
return␊
}␊
const prepare = __napiInstance?.exports?.napi_prepare_wasm_env_cleanup␊
if (typeof prepare === 'function') {␊
prepare()␊
}␊
__emnapiWasmEnvCleanupPrepared = true␊
}␊
␊
function __destroyEmnapiContext() {␊
if (__emnapiContextDestroyed || __emnapiContext === undefined) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
if (__emnapiContextDestroyPromise) {␊
return __emnapiContextDestroyPromise␊
}␊
␊
__prepareWasmEnvCleanup()␊
const result = __emnapiContext.destroy()␊
if (!__isThenable(result)) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
␊
const destroyPromise = Promise.resolve(result).then(␊
(value) => {␊
__emnapiContextDestroyed = true␊
return value␊
},␊
(error) => {␊
__emnapiContextDestroyPromise = undefined␊
throw error␊
},␊
)␊
__emnapiContextDestroyPromise = destroyPromise␊
return destroyPromise␊
}␊
␊
function __terminateWasiWorkers() {␊
const cleanupErrors = []␊
const pending = []␊
␊
for (const worker of __wasiWorkers) {␊
let result␊
try {␊
result = worker.terminate()␊
} catch (error) {␊
cleanupErrors.push(error)␊
continue␊
}␊
if (__isThenable(result)) {␊
pending.push(␊
Promise.resolve(result).then(␊
() => {␊
__wasiWorkers.delete(worker)␊
},␊
(error) => {␊
cleanupErrors.push(error)␊
},␊
),␊
)␊
} else {␊
__wasiWorkers.delete(worker)␊
}␊
}␊
␊
const finish = () => {␊
if (cleanupErrors.length > 0) {␊
throw __createCleanupError(␊
cleanupErrors,␊
'Failed to terminate WASI workers',␊
)␊
}␊
}␊
return pending.length > 0 ? Promise.all(pending).then(finish) : finish()␊
}␊
␊
function __finishWasiDisposal() {␊
const workerResult = __terminateWasiWorkers()␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult).then(__completeWasiDisposal)␊
}␊
return __completeWasiDisposal()␊
}␊
␊
function __startWasiDisposal() {␊
const destroyResult = __destroyEmnapiContext()␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult).then(__finishWasiDisposal)␊
}␊
return __finishWasiDisposal()␊
}␊
␊
/**␊
* Disposes this generated WASI binding.␊
*␊
* Access this function with:␊
* binding[Symbol.for('napi.rs.wasi.dispose')]()␊
*/␊
function __disposeWasiBinding() {␊
if (__wasiDisposePromise) {␊
return __wasiDisposePromise␊
}␊
if (__wasiDisposed) {␊
return Promise.resolve()␊
}␊
␊
let resolveDispose␊
let rejectDispose␊
const disposePromise = new Promise((resolve, reject) => {␊
resolveDispose = resolve␊
rejectDispose = reject␊
})␊
__wasiDisposePromise = disposePromise␊
␊
let result␊
try {␊
result = __startWasiDisposal()␊
} catch (error) {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
return disposePromise␊
}␊
␊
Promise.resolve(result).then(␊
(value) => {␊
__wasiDisposed = true␊
resolveDispose(value)␊
},␊
(error) => {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
},␊
)␊
return disposePromise␊
}␊
␊
function __publishWasiDispose(exports) {␊
Object.defineProperty(exports, __wasiDisposeSymbol, {␊
configurable: false,␊
enumerable: false,␊
value: __disposeWasiBinding,␊
writable: false,␊
})␊
}␊
␊
function __finishWasiInitializationRollback(cleanupErrors) {␊
let workerResult␊
try {␊
workerResult = __terminateWasiWorkers()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return cleanupErrors␊
}␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => cleanupErrors)␊
}␊
return cleanupErrors␊
}␊
␊
function __rollbackWasiInitialization() {␊
const cleanupErrors = []␊
let destroyResult␊
try {␊
destroyResult = __destroyEmnapiContext()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => __finishWasiInitializationRollback(cleanupErrors))␊
}␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
␊
let __wasiModule␊
let __napiModule␊
␊
try {␊
__emnapiContext = __emnapiCreateContext({ autoDestroy: false })␊
__emnapiContext.suppressDestroy()␊
␊
;({␊
instance: __napiInstance,␊
module: __wasiModule,␊
napiModule: __napiModule,␊
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
context: __emnapiContext,␊
asyncWorkPoolSize: 4,␊
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],␊
wasi: __wasi,␊
onCreateWorker() {␊
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
type: 'module',␊
})␊
__wasiWorkers.add(worker)␊
␊
␊
return worker␊
},␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: __sharedMemory,␊
}␊
return importObject␊
},␊
beforeInit({ instance }) {␊
__napiInstance = instance␊
for (const name of Object.keys(instance.exports)) {␊
if (name.startsWith('__napi_register__')) {␊
instance.exports[name]()␊
}␊
}␊
},␊
}))␊
__publishWasiDispose(__napiModule.exports)␊
} catch (error) {␊
const cleanupErrors = await __rollbackWasiInitialization()␊
throw __attachCleanupErrors(error, cleanupErrors)␊
}␊
`
## createWasiBrowserBinding with errorEvent
> Snapshot 1
`import {␊
emnapiAsyncWorkPlugin as __emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin as __emnapiTSFNPlugin,␊
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
WASI as __WASI,␊
} from '@napi-rs/wasm-runtime'␊
import { createContext as __emnapiCreateContext } from '@emnapi/runtime'␊
␊
␊
␊
const __wasi = new __WASI({␊
version: 'preview1',␊
})␊
␊
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
const __wasmResponse = await globalThis.fetch(__wasmUrl)␊
if (!__wasmResponse.ok) {␊
throw new Error(␊
'Failed to fetch WASI module ' +␊
__wasmUrl +␊
': ' +␊
__wasmResponse.status +␊
' ' +␊
(__wasmResponse.statusText || 'Unknown Status'),␊
)␊
}␊
const __wasmFile = await __wasmResponse.arrayBuffer()␊
␊
const __sharedMemory = new WebAssembly.Memory({␊
initial: 4000,␊
maximum: 65536,␊
shared: true,␊
})␊
␊
let __emnapiContext␊
␊
const __wasiDisposeSymbol = Symbol.for('napi.rs.wasi.dispose')␊
const __wasiWorkers = new Set()␊
let __napiInstance␊
let __emnapiContextDestroyed = false␊
let __emnapiContextDestroyPromise␊
let __emnapiWasmEnvCleanupPrepared = false␊
let __wasiDisposed = false␊
let __wasiDisposePromise␊
let __completeWasiDisposal = function() {}␊
␊
function __isThenable(value) {␊
return (␊
value !== null &&␊
(typeof value === 'object' || typeof value === 'function') &&␊
typeof value.then === 'function'␊
)␊
}␊
␊
function __createCleanupError(errors, message) {␊
if (errors.length === 1) {␊
return errors[0]␊
}␊
const __AggregateError = globalThis.AggregateError␊
if (typeof __AggregateError === 'function') {␊
return new __AggregateError(errors, message)␊
}␊
const error = new Error(message)␊
error.errors = errors␊
return error␊
}␊
␊
function __attachCleanupErrors(error, cleanupErrors) {␊
if (cleanupErrors.length === 0) {␊
return error␊
}␊
const cleanupError = __createCleanupError(␊
cleanupErrors,␊
'WASI binding cleanup failed',␊
)␊
try {␊
if (␊
error &&␊
(typeof error === 'object' || typeof error === 'function')␊
) {␊
if (error.cause === undefined) {␊
error.cause = cleanupError␊
if (error.cause === cleanupError) {␊
return error␊
}␊
}␊
if (Array.isArray(error.cleanupErrors)) {␊
error.cleanupErrors.push(cleanupError)␊
return error␊
} else {␊
const attachedCleanupErrors = [cleanupError]␊
error.cleanupErrors = attachedCleanupErrors␊
if (error.cleanupErrors === attachedCleanupErrors) {␊
return error␊
}␊
}␊
}␊
} catch {}␊
const aggregate = __createCleanupError(␊
[error, cleanupError],␊
'WASI binding initialization and cleanup failed',␊
)␊
try {␊
aggregate.cause = error␊
} catch {}␊
return aggregate␊
}␊
␊
function __prepareWasmEnvCleanup() {␊
if (__emnapiWasmEnvCleanupPrepared) {␊
return␊
}␊
const prepare = __napiInstance?.exports?.napi_prepare_wasm_env_cleanup␊
if (typeof prepare === 'function') {␊
prepare()␊
}␊
__emnapiWasmEnvCleanupPrepared = true␊
}␊
␊
function __destroyEmnapiContext() {␊
if (__emnapiContextDestroyed || __emnapiContext === undefined) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
if (__emnapiContextDestroyPromise) {␊
return __emnapiContextDestroyPromise␊
}␊
␊
__prepareWasmEnvCleanup()␊
const result = __emnapiContext.destroy()␊
if (!__isThenable(result)) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
␊
const destroyPromise = Promise.resolve(result).then(␊
(value) => {␊
__emnapiContextDestroyed = true␊
return value␊
},␊
(error) => {␊
__emnapiContextDestroyPromise = undefined␊
throw error␊
},␊
)␊
__emnapiContextDestroyPromise = destroyPromise␊
return destroyPromise␊
}␊
␊
function __terminateWasiWorkers() {␊
const cleanupErrors = []␊
const pending = []␊
␊
for (const worker of __wasiWorkers) {␊
let result␊
try {␊
result = worker.terminate()␊
} catch (error) {␊
cleanupErrors.push(error)␊
continue␊
}␊
if (__isThenable(result)) {␊
pending.push(␊
Promise.resolve(result).then(␊
() => {␊
__wasiWorkers.delete(worker)␊
},␊
(error) => {␊
cleanupErrors.push(error)␊
},␊
),␊
)␊
} else {␊
__wasiWorkers.delete(worker)␊
}␊
}␊
␊
const finish = () => {␊
if (cleanupErrors.length > 0) {␊
throw __createCleanupError(␊
cleanupErrors,␊
'Failed to terminate WASI workers',␊
)␊
}␊
}␊
return pending.length > 0 ? Promise.all(pending).then(finish) : finish()␊
}␊
␊
function __finishWasiDisposal() {␊
const workerResult = __terminateWasiWorkers()␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult).then(__completeWasiDisposal)␊
}␊
return __completeWasiDisposal()␊
}␊
␊
function __startWasiDisposal() {␊
const destroyResult = __destroyEmnapiContext()␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult).then(__finishWasiDisposal)␊
}␊
return __finishWasiDisposal()␊
}␊
␊
/**␊
* Disposes this generated WASI binding.␊
*␊
* Access this function with:␊
* binding[Symbol.for('napi.rs.wasi.dispose')]()␊
*/␊
function __disposeWasiBinding() {␊
if (__wasiDisposePromise) {␊
return __wasiDisposePromise␊
}␊
if (__wasiDisposed) {␊
return Promise.resolve()␊
}␊
␊
let resolveDispose␊
let rejectDispose␊
const disposePromise = new Promise((resolve, reject) => {␊
resolveDispose = resolve␊
rejectDispose = reject␊
})␊
__wasiDisposePromise = disposePromise␊
␊
let result␊
try {␊
result = __startWasiDisposal()␊
} catch (error) {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
return disposePromise␊
}␊
␊
Promise.resolve(result).then(␊
(value) => {␊
__wasiDisposed = true␊
resolveDispose(value)␊
},␊
(error) => {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
},␊
)␊
return disposePromise␊
}␊
␊
function __publishWasiDispose(exports) {␊
Object.defineProperty(exports, __wasiDisposeSymbol, {␊
configurable: false,␊
enumerable: false,␊
value: __disposeWasiBinding,␊
writable: false,␊
})␊
}␊
␊
function __finishWasiInitializationRollback(cleanupErrors) {␊
let workerResult␊
try {␊
workerResult = __terminateWasiWorkers()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return cleanupErrors␊
}␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => cleanupErrors)␊
}␊
return cleanupErrors␊
}␊
␊
function __rollbackWasiInitialization() {␊
const cleanupErrors = []␊
let destroyResult␊
try {␊
destroyResult = __destroyEmnapiContext()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => __finishWasiInitializationRollback(cleanupErrors))␊
}␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
␊
let __wasiModule␊
let __napiModule␊
␊
try {␊
__emnapiContext = __emnapiCreateContext({ autoDestroy: false })␊
__emnapiContext.suppressDestroy()␊
␊
;({␊
instance: __napiInstance,␊
module: __wasiModule,␊
napiModule: __napiModule,␊
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
context: __emnapiContext,␊
asyncWorkPoolSize: 4,␊
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],␊
wasi: __wasi,␊
onCreateWorker() {␊
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
type: 'module',␊
})␊
__wasiWorkers.add(worker)␊
␊
worker.addEventListener('message', (event) => {␊
if (event.data && typeof event.data === 'object' && event.data.type === 'error') {␊
const __CustomEvent = globalThis.CustomEvent␊
if (␊
typeof globalThis.dispatchEvent === 'function' &&␊
typeof __CustomEvent === 'function'␊
) {␊
globalThis.dispatchEvent(␊
new __CustomEvent('napi-rs-worker-error', { detail: event.data }),␊
)␊
}␊
}␊
})␊
␊
return worker␊
},␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: __sharedMemory,␊
}␊
return importObject␊
},␊
beforeInit({ instance }) {␊
__napiInstance = instance␊
for (const name of Object.keys(instance.exports)) {␊
if (name.startsWith('__napi_register__')) {␊
instance.exports[name]()␊
}␊
}␊
},␊
}))␊
__publishWasiDispose(__napiModule.exports)␊
} catch (error) {␊
const cleanupErrors = await __rollbackWasiInitialization()␊
throw __attachCleanupErrors(error, cleanupErrors)␊
}␊
`
## createWasiBrowserBinding with errorEvent and fs
> Snapshot 1
`import {␊
emnapiAsyncWorkPlugin as __emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin as __emnapiTSFNPlugin,␊
createOnMessage as __wasmCreateOnMessageForFsProxy,␊
instantiateNapiModuleSync as __emnapiInstantiateNapiModuleSync,␊
WASI as __WASI,␊
} from '@napi-rs/wasm-runtime'␊
import { createContext as __emnapiCreateContext } from '@emnapi/runtime'␊
import { memfs } from '@napi-rs/wasm-runtime/fs'␊
␊
␊
export const { fs: __fs, vol: __volume } = memfs()␊
␊
const __wasi = new __WASI({␊
version: 'preview1',␊
fs: __fs,␊
preopens: {␊
'/': '/',␊
},␊
})␊
␊
const __wasmUrl = new URL('./test-wasi.wasm', import.meta.url).href␊
const __wasmResponse = await globalThis.fetch(__wasmUrl)␊
if (!__wasmResponse.ok) {␊
throw new Error(␊
'Failed to fetch WASI module ' +␊
__wasmUrl +␊
': ' +␊
__wasmResponse.status +␊
' ' +␊
(__wasmResponse.statusText || 'Unknown Status'),␊
)␊
}␊
const __wasmFile = await __wasmResponse.arrayBuffer()␊
␊
const __sharedMemory = new WebAssembly.Memory({␊
initial: 4000,␊
maximum: 65536,␊
shared: true,␊
})␊
␊
let __emnapiContext␊
␊
const __wasiDisposeSymbol = Symbol.for('napi.rs.wasi.dispose')␊
const __wasiWorkers = new Set()␊
let __napiInstance␊
let __emnapiContextDestroyed = false␊
let __emnapiContextDestroyPromise␊
let __emnapiWasmEnvCleanupPrepared = false␊
let __wasiDisposed = false␊
let __wasiDisposePromise␊
let __completeWasiDisposal = function() {}␊
␊
function __isThenable(value) {␊
return (␊
value !== null &&␊
(typeof value === 'object' || typeof value === 'function') &&␊
typeof value.then === 'function'␊
)␊
}␊
␊
function __createCleanupError(errors, message) {␊
if (errors.length === 1) {␊
return errors[0]␊
}␊
const __AggregateError = globalThis.AggregateError␊
if (typeof __AggregateError === 'function') {␊
return new __AggregateError(errors, message)␊
}␊
const error = new Error(message)␊
error.errors = errors␊
return error␊
}␊
␊
function __attachCleanupErrors(error, cleanupErrors) {␊
if (cleanupErrors.length === 0) {␊
return error␊
}␊
const cleanupError = __createCleanupError(␊
cleanupErrors,␊
'WASI binding cleanup failed',␊
)␊
try {␊
if (␊
error &&␊
(typeof error === 'object' || typeof error === 'function')␊
) {␊
if (error.cause === undefined) {␊
error.cause = cleanupError␊
if (error.cause === cleanupError) {␊
return error␊
}␊
}␊
if (Array.isArray(error.cleanupErrors)) {␊
error.cleanupErrors.push(cleanupError)␊
return error␊
} else {␊
const attachedCleanupErrors = [cleanupError]␊
error.cleanupErrors = attachedCleanupErrors␊
if (error.cleanupErrors === attachedCleanupErrors) {␊
return error␊
}␊
}␊
}␊
} catch {}␊
const aggregate = __createCleanupError(␊
[error, cleanupError],␊
'WASI binding initialization and cleanup failed',␊
)␊
try {␊
aggregate.cause = error␊
} catch {}␊
return aggregate␊
}␊
␊
function __prepareWasmEnvCleanup() {␊
if (__emnapiWasmEnvCleanupPrepared) {␊
return␊
}␊
const prepare = __napiInstance?.exports?.napi_prepare_wasm_env_cleanup␊
if (typeof prepare === 'function') {␊
prepare()␊
}␊
__emnapiWasmEnvCleanupPrepared = true␊
}␊
␊
function __destroyEmnapiContext() {␊
if (__emnapiContextDestroyed || __emnapiContext === undefined) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
if (__emnapiContextDestroyPromise) {␊
return __emnapiContextDestroyPromise␊
}␊
␊
__prepareWasmEnvCleanup()␊
const result = __emnapiContext.destroy()␊
if (!__isThenable(result)) {␊
__emnapiContextDestroyed = true␊
return␊
}␊
␊
const destroyPromise = Promise.resolve(result).then(␊
(value) => {␊
__emnapiContextDestroyed = true␊
return value␊
},␊
(error) => {␊
__emnapiContextDestroyPromise = undefined␊
throw error␊
},␊
)␊
__emnapiContextDestroyPromise = destroyPromise␊
return destroyPromise␊
}␊
␊
function __terminateWasiWorkers() {␊
const cleanupErrors = []␊
const pending = []␊
␊
for (const worker of __wasiWorkers) {␊
let result␊
try {␊
result = worker.terminate()␊
} catch (error) {␊
cleanupErrors.push(error)␊
continue␊
}␊
if (__isThenable(result)) {␊
pending.push(␊
Promise.resolve(result).then(␊
() => {␊
__wasiWorkers.delete(worker)␊
},␊
(error) => {␊
cleanupErrors.push(error)␊
},␊
),␊
)␊
} else {␊
__wasiWorkers.delete(worker)␊
}␊
}␊
␊
const finish = () => {␊
if (cleanupErrors.length > 0) {␊
throw __createCleanupError(␊
cleanupErrors,␊
'Failed to terminate WASI workers',␊
)␊
}␊
}␊
return pending.length > 0 ? Promise.all(pending).then(finish) : finish()␊
}␊
␊
function __finishWasiDisposal() {␊
const workerResult = __terminateWasiWorkers()␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult).then(__completeWasiDisposal)␊
}␊
return __completeWasiDisposal()␊
}␊
␊
function __startWasiDisposal() {␊
const destroyResult = __destroyEmnapiContext()␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult).then(__finishWasiDisposal)␊
}␊
return __finishWasiDisposal()␊
}␊
␊
/**␊
* Disposes this generated WASI binding.␊
*␊
* Access this function with:␊
* binding[Symbol.for('napi.rs.wasi.dispose')]()␊
*/␊
function __disposeWasiBinding() {␊
if (__wasiDisposePromise) {␊
return __wasiDisposePromise␊
}␊
if (__wasiDisposed) {␊
return Promise.resolve()␊
}␊
␊
let resolveDispose␊
let rejectDispose␊
const disposePromise = new Promise((resolve, reject) => {␊
resolveDispose = resolve␊
rejectDispose = reject␊
})␊
__wasiDisposePromise = disposePromise␊
␊
let result␊
try {␊
result = __startWasiDisposal()␊
} catch (error) {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
return disposePromise␊
}␊
␊
Promise.resolve(result).then(␊
(value) => {␊
__wasiDisposed = true␊
resolveDispose(value)␊
},␊
(error) => {␊
__wasiDisposePromise = undefined␊
rejectDispose(error)␊
},␊
)␊
return disposePromise␊
}␊
␊
function __publishWasiDispose(exports) {␊
Object.defineProperty(exports, __wasiDisposeSymbol, {␊
configurable: false,␊
enumerable: false,␊
value: __disposeWasiBinding,␊
writable: false,␊
})␊
}␊
␊
function __finishWasiInitializationRollback(cleanupErrors) {␊
let workerResult␊
try {␊
workerResult = __terminateWasiWorkers()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return cleanupErrors␊
}␊
if (__isThenable(workerResult)) {␊
return Promise.resolve(workerResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => cleanupErrors)␊
}␊
return cleanupErrors␊
}␊
␊
function __rollbackWasiInitialization() {␊
const cleanupErrors = []␊
let destroyResult␊
try {␊
destroyResult = __destroyEmnapiContext()␊
} catch (cleanupError) {␊
cleanupErrors.push(cleanupError)␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
if (__isThenable(destroyResult)) {␊
return Promise.resolve(destroyResult)␊
.catch((cleanupError) => {␊
cleanupErrors.push(cleanupError)␊
})␊
.then(() => __finishWasiInitializationRollback(cleanupErrors))␊
}␊
return __finishWasiInitializationRollback(cleanupErrors)␊
}␊
␊
let __wasiModule␊
let __napiModule␊
␊
try {␊
__emnapiContext = __emnapiCreateContext({ autoDestroy: false })␊
__emnapiContext.suppressDestroy()␊
␊
;({␊
instance: __napiInstance,␊
module: __wasiModule,␊
napiModule: __napiModule,␊
} = __emnapiInstantiateNapiModuleSync(__wasmFile, {␊
context: __emnapiContext,␊
asyncWorkPoolSize: 4,␊
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],␊
wasi: __wasi,␊
onCreateWorker() {␊
const worker = new Worker(new URL('./wasi-worker-browser.mjs', import.meta.url), {␊
type: 'module',␊
})␊
__wasiWorkers.add(worker)␊
worker.addEventListener('message', __wasmCreateOnMessageForFsProxy(__fs))␊
␊
worker.addEventListener('message', (event) => {␊
if (event.data && typeof event.data === 'object' && event.data.type === 'error') {␊
const __CustomEvent = globalThis.CustomEvent␊
if (␊
typeof globalThis.dispatchEvent === 'function' &&␊
typeof __CustomEvent === 'function'␊
) {␊
globalThis.dispatchEvent(␊
new __CustomEvent('napi-rs-worker-error', { detail: event.data }),␊
)␊
}␊
}␊
})␊
␊
return worker␊
},␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: __sharedMemory,␊
}␊
return importObject␊
},␊
beforeInit({ instance }) {␊
__napiInstance = instance␊
for (const name of Object.keys(instance.exports)) {␊
if (name.startsWith('__napi_register__')) {␊
instance.exports[name]()␊
}␊
}␊
},␊
}))␊
__publishWasiDispose(__napiModule.exports)␊
} catch (error) {␊
const cleanupErrors = await __rollbackWasiInitialization()␊
throw __attachCleanupErrors(error, cleanupErrors)␊
}␊
`
## createWasiBrowserWorkerBinding default
> Snapshot 1
`import {␊
instantiateNapiModuleSync,␊
MessageHandler,␊
WASI,␊
emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin,␊
} from '@napi-rs/wasm-runtime'␊
␊
const handler = new MessageHandler({␊
onLoad({ wasmModule, wasmMemory }) {␊
const wasi = new WASI({␊
print: function () {␊
// eslint-disable-next-line no-console␊
console.log.apply(console, arguments)␊
},␊
printErr: function() {␊
// eslint-disable-next-line no-console␊
console.error.apply(console, arguments)␊
␊
},␊
})␊
return instantiateNapiModuleSync(wasmModule, {␊
childThread: true,␊
wasi,␊
// The wasm links a "basic" emnapi archive (no C async-work /␊
// threadsafe-function implementations), so every thread that␊
// instantiates it must provide the JavaScript implementations␊
// through the emnapi plugins.␊
plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: wasmMemory,␊
}␊
},␊
})␊
},␊
␊
})␊
␊
globalThis.onmessage = function (e) {␊
handler.handle(e)␊
}␊
`
## createWasiBrowserWorkerBinding with errorEvent
> Snapshot 1
`import {␊
instantiateNapiModuleSync,␊
MessageHandler,␊
WASI,␊
emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin,␊
} from '@napi-rs/wasm-runtime'␊
␊
const errorOutputs = []␊
␊
const handler = new MessageHandler({␊
onLoad({ wasmModule, wasmMemory }) {␊
const wasi = new WASI({␊
print: function () {␊
// eslint-disable-next-line no-console␊
console.log.apply(console, arguments)␊
},␊
printErr: function() {␊
// eslint-disable-next-line no-console␊
console.error.apply(console, arguments)␊
␊
errorOutputs.push([...arguments])␊
},␊
})␊
return instantiateNapiModuleSync(wasmModule, {␊
childThread: true,␊
wasi,␊
// The wasm links a "basic" emnapi archive (no C async-work /␊
// threadsafe-function implementations), so every thread that␊
// instantiates it must provide the JavaScript implementations␊
// through the emnapi plugins.␊
plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: wasmMemory,␊
}␊
},␊
})␊
},␊
onError(error) {␊
postMessage({ type: 'error', error, errorOutputs })␊
errorOutputs.length = 0␊
}␊
})␊
␊
globalThis.onmessage = function (e) {␊
handler.handle(e)␊
}␊
`
## createWasiBrowserWorkerBinding with errorEvent and fs
> Snapshot 1
`import {␊
instantiateNapiModuleSync,␊
MessageHandler,␊
WASI,␊
createFsProxy,␊
emnapiAsyncWorkPlugin,␊
emnapiTSFNPlugin,␊
} from '@napi-rs/wasm-runtime'␊
import { memfsExported as __memfsExported } from '@napi-rs/wasm-runtime/fs'␊
␊
const fs = createFsProxy(__memfsExported)␊
␊
const errorOutputs = []␊
␊
const handler = new MessageHandler({␊
onLoad({ wasmModule, wasmMemory }) {␊
const wasi = new WASI({␊
fs,␊
preopens: {␊
'/': '/',␊
},␊
print: function () {␊
// eslint-disable-next-line no-console␊
console.log.apply(console, arguments)␊
},␊
printErr: function() {␊
// eslint-disable-next-line no-console␊
console.error.apply(console, arguments)␊
␊
errorOutputs.push([...arguments])␊
},␊
})␊
return instantiateNapiModuleSync(wasmModule, {␊
childThread: true,␊
wasi,␊
// The wasm links a "basic" emnapi archive (no C async-work /␊
// threadsafe-function implementations), so every thread that␊
// instantiates it must provide the JavaScript implementations␊
// through the emnapi plugins.␊
plugins: [emnapiAsyncWorkPlugin, emnapiTSFNPlugin],␊
overwriteImports(importObject) {␊
importObject.env = {␊
...importObject.env,␊
...importObject.napi,␊
...importObject.emnapi,␊
memory: wasmMemory,␊
}␊
},␊
})␊
},␊
onError(error) {␊
postMessage({ type: 'error', error, errorOutputs })␊
errorOutputs.length = 0␊
}␊
})␊
␊
globalThis.onmessage = function (e) {␊
handler.handle(e)␊
}␊
`