mirror of
https://github.com/electron/node-gyp.git
synced 2025-08-15 12:58:19 +02:00
57 lines
1.9 KiB
JavaScript
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() }
|