/** * Module dependencies. */ var DynamicLibrary = require('./dynamic_library') , ForeignFunction = require('./foreign_function') , VariadicForeignFunction = require('./foreign_function_var') , debug = require('debug')('ffi:Library') , RTLD_NOW = DynamicLibrary.FLAGS.RTLD_NOW /** * The extension to use on libraries. * i.e. libm -> libm.so on linux */ var EXT = Library.EXT = { 'linux': '.so' , 'linux2': '.so' , 'sunos': '.so' , 'solaris':'.so' , 'freebsd':'.so' , 'openbsd':'.so' , 'darwin': '.dylib' , 'mac': '.dylib' , 'win32': '.dll' }[process.platform] /** * Provides a friendly abstraction/API on-top of DynamicLibrary and * ForeignFunction. */ function Library (libfile, funcs, lib) { debug('creating Library object for', libfile) if (libfile && libfile.indexOf(EXT) === -1) { debug('appending library extension to library name', EXT) libfile += EXT } if (!lib) { lib = {} } var dl = new DynamicLibrary(libfile || null, 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] = VariadicForeignFunction(fptr, resultType, paramTypes, abi) } else { var ff = ForeignFunction(fptr, resultType, paramTypes, abi) lib[func] = async ? ff.async : ff } }) return lib } module.exports = Library