1 | var fs = require('fs')
|
2 | var path = require('path')
|
3 | var os = require('os')
|
4 |
|
5 | var abi = process.versions.modules
|
6 | var runtime = isElectron() ? 'electron' : 'node'
|
7 | var arch = os.arch()
|
8 | var platform = os.platform()
|
9 |
|
10 | module.exports = load
|
11 |
|
12 | function load (dir) {
|
13 | return require(load.path(dir))
|
14 | }
|
15 |
|
16 | load.path = function (dir) {
|
17 | dir = path.resolve(dir || '.')
|
18 |
|
19 | var release = getFirst(path.join(dir, 'build/Release'), matchBuild)
|
20 | if (release) return release
|
21 |
|
22 | var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)
|
23 | if (debug) return debug
|
24 |
|
25 | var prebuild = getFirst(path.join(dir, 'prebuilds/' + platform + '-' + arch), matchPrebuild)
|
26 | if (prebuild) return prebuild
|
27 |
|
28 | throw new Error('No native build was found for runtime=' + runtime + ' abi=' + abi + ' platform=' + platform + ' arch=' + arch)
|
29 | }
|
30 |
|
31 | function getFirst (dir, filter) {
|
32 | try {
|
33 | var files = fs.readdirSync(dir).filter(filter)
|
34 | return files[0] && path.join(dir, files[0])
|
35 | } catch (err) {
|
36 | return null
|
37 | }
|
38 | }
|
39 |
|
40 | function matchPrebuild (name) {
|
41 | var parts = name.split('-')
|
42 | return parts[0] === runtime && parts[1] === abi + '.node'
|
43 | }
|
44 |
|
45 | function matchBuild (name) {
|
46 | return /\.node$/.test(name)
|
47 | }
|
48 |
|
49 | function isElectron () {
|
50 | if (process.versions && process.versions.electron) return true
|
51 | if (process.env.ELECTRON_RUN_AS_NODE) return true
|
52 | return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'
|
53 | }
|