forked from node-ffi/node-ffi
/
library.js
56 lines (44 loc) · 1.33 KB
/
library.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var ffi = require('./ffi')
, debug = require('debug')('ffi:Library')
, EXT = ffi.LIB_EXT
, RTLD_NOW = ffi.DynamicLibrary.FLAGS.RTLD_NOW
/**
* Provides a friendly abstraction/API on-top of DynamicLibrary and
* ForeignFunction.
*/
function Library (libfile, opts, funcs) {
debug('creating Library object for', libfile)
if (libfile && libfile.indexOf(EXT) === -1) {
debug('appending library extension to library name', EXT)
libfile += EXT
}
if (!funcs) {
funcs = opts;
opts = {};
}
var lib = {}
var dl = new ffi.DynamicLibrary(libfile || null, opts, RTLD_NOW)
Object.keys(funcs || {}).forEach(function (func) {
debug('defining function', func)
var fptr = dl.get(func)
, info = funcs[func]
if (fptr.isNull()) {
throw new Error('Library: "' + libfile
+ '" returned NULL function pointer for "' + func + '"')
}
var resultType = info[0]
, paramTypes = info[1]
, fopts = info[2]
, abi = fopts && fopts.abi
, async = fopts && fopts.async
, varargs = fopts && fopts.varargs
if (varargs) {
lib[func] = ffi.VariadicForeignFunction(fptr, resultType, paramTypes, abi)
} else {
var ff = ffi.ForeignFunction(fptr, resultType, paramTypes, abi)
lib[func] = async ? ff.async : ff
}
})
return lib
}
module.exports = Library