-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnative-binding.ts
More file actions
63 lines (54 loc) · 2.14 KB
/
native-binding.ts
File metadata and controls
63 lines (54 loc) · 2.14 KB
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
57
58
59
60
61
62
63
import {createRequire} from 'node:module'
import process from 'node:process'
function shouldSkipNativeBinding(): boolean {
if (process.env['TNMSC_FORCE_NATIVE_BINDING'] === '1') return false
if (process.env['TNMSC_DISABLE_NATIVE_BINDING'] === '1') return true
return process.env['NODE_ENV'] === 'test' || process.env['VITEST'] != null || process.env['VITEST_WORKER_ID'] != null
}
export function tryLoadNativeBinding<T extends object>(): T | undefined {
const testGlobals = globalThis as typeof globalThis & {__TNMSC_TEST_NATIVE_BINDING__?: object}
const testBinding: unknown = testGlobals.__TNMSC_TEST_NATIVE_BINDING__
if (testBinding != null && typeof testBinding === 'object') return testBinding as T
if (shouldSkipNativeBinding()) return void 0
const suffixMap: Readonly<Record<string, string>> = {
'win32-x64': 'win32-x64-msvc',
'linux-x64': 'linux-x64-gnu',
'linux-arm64': 'linux-arm64-gnu',
'darwin-arm64': 'darwin-arm64',
'darwin-x64': 'darwin-x64'
}
const suffix = suffixMap[`${process.platform}-${process.arch}`]
if (suffix == null) return void 0
try {
const _require = createRequire(import.meta.url)
const packageName = `@truenine/memory-sync-cli-${suffix}`
const binaryFile = `napi-memory-sync-cli.${suffix}.node`
const candidates = [
packageName,
`${packageName}/${binaryFile}`,
`./${binaryFile}`,
`../npm/${suffix}`,
`../npm/${suffix}/${binaryFile}`,
`../../npm/${suffix}`,
`../../npm/${suffix}/${binaryFile}`
]
for (const specifier of candidates) {
try {
const loaded = _require(specifier) as unknown
const possibleBindings = [
(loaded as {config?: unknown})?.config,
(loaded as {default?: {config?: unknown}})?.default?.config,
(loaded as {default?: unknown})?.default,
loaded
]
for (const candidate of possibleBindings) {
if (candidate != null && typeof candidate === 'object') return candidate as T
}
} catch {}
}
} catch {}
return void 0
}
export function getNativeBinding<T extends object>(): T | undefined {
return tryLoadNativeBinding<T>()
}