node-gyp/test/node_modules/hello_napi/hello.js

57 lines
1.9 KiB
JavaScript

const path = require('path')
const fs = require('fs')
const addon = (function () {
const entry = (() => {
try {
return require.resolve('./build/Release/hello.node')
} catch (_) {
return require.resolve('./build/Release/hello.wasm')
}
})()
const ext = path.extname(entry)
if (ext === '.node') {
return require(entry)
}
if (ext === '.wasm') {
const values = [undefined, undefined, null, false, true, global, {}]
const module = new WebAssembly.Module(fs.readFileSync(entry))
const instance = new WebAssembly.Instance(module, {
napi: {
napi_create_string_utf8: (env, str, len, ret) => {
let end = str
const buffer = new Uint8Array(instance.exports.memory.buffer)
while (buffer[end]) end++
values.push(new TextDecoder().decode(buffer.slice(str, end)))
new DataView(instance.exports.memory.buffer).setInt32(ret, values.length - 1, true)
return 0
},
napi_create_function: (env, name, len, fn, data, ret) => {
values.push(function () {
return values[instance.exports.__indirect_function_table.get(fn)(env, 0)]
})
new DataView(instance.exports.memory.buffer).setInt32(ret, values.length - 1, true)
return 0
},
napi_set_named_property: (env, obj, key, val) => {
const buffer = new Uint8Array(instance.exports.memory.buffer)
let end = key
while (buffer[end]) end++
const k = new TextDecoder().decode(buffer.slice(key, end))
values[obj][k] = values[val]
return 0
}
}
})
const newExports = values[instance.exports.napi_register_wasm_v1(1, 6)]
if (newExports) {
values[6] = newExports
}
return values[6]
}
throw new Error('Failed to initialize Node-API wasm module')
})()
exports.hello = function() { return addon.hello() }