index.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. const { existsSync, readFileSync } = require('fs')
  2. const { join } = require('path')
  3. const { platform, arch } = process
  4. let nativeBinding = null
  5. let localFileExisted = false
  6. let loadError = null
  7. function isMusl() {
  8. // For Node 10
  9. if (!process.report || typeof process.report.getReport !== 'function') {
  10. try {
  11. return readFileSync('/usr/bin/ldd', 'utf8').includes('musl')
  12. } catch (e) {
  13. return true
  14. }
  15. } else {
  16. const { glibcVersionRuntime } = process.report.getReport().header
  17. return !glibcVersionRuntime
  18. }
  19. }
  20. switch (platform) {
  21. case 'android':
  22. switch (arch) {
  23. case 'arm64':
  24. localFileExisted = existsSync(join(__dirname, 'package-template.android-arm64.node'))
  25. try {
  26. if (localFileExisted) {
  27. nativeBinding = require('./package-template.android-arm64.node')
  28. } else {
  29. nativeBinding = require('@napi-rs/package-template-android-arm64')
  30. }
  31. } catch (e) {
  32. loadError = e
  33. }
  34. break
  35. case 'arm':
  36. localFileExisted = existsSync(join(__dirname, 'package-template.android-arm-eabi.node'))
  37. try {
  38. if (localFileExisted) {
  39. nativeBinding = require('./package-template.android-arm-eabi.node')
  40. } else {
  41. nativeBinding = require('@napi-rs/package-template-android-arm-eabi')
  42. }
  43. } catch (e) {
  44. loadError = e
  45. }
  46. break
  47. default:
  48. throw new Error(`Unsupported architecture on Android ${arch}`)
  49. }
  50. break
  51. case 'win32':
  52. switch (arch) {
  53. case 'x64':
  54. localFileExisted = existsSync(join(__dirname, 'package-template.win32-x64-msvc.node'))
  55. try {
  56. if (localFileExisted) {
  57. nativeBinding = require('./package-template.win32-x64-msvc.node')
  58. } else {
  59. nativeBinding = require('@napi-rs/package-template-win32-x64-msvc')
  60. }
  61. } catch (e) {
  62. loadError = e
  63. }
  64. break
  65. case 'ia32':
  66. localFileExisted = existsSync(join(__dirname, 'package-template.win32-ia32-msvc.node'))
  67. try {
  68. if (localFileExisted) {
  69. nativeBinding = require('./package-template.win32-ia32-msvc.node')
  70. } else {
  71. nativeBinding = require('@napi-rs/package-template-win32-ia32-msvc')
  72. }
  73. } catch (e) {
  74. loadError = e
  75. }
  76. break
  77. case 'arm64':
  78. localFileExisted = existsSync(join(__dirname, 'package-template.win32-arm64-msvc.node'))
  79. try {
  80. if (localFileExisted) {
  81. nativeBinding = require('./package-template.win32-arm64-msvc.node')
  82. } else {
  83. nativeBinding = require('@napi-rs/package-template-win32-arm64-msvc')
  84. }
  85. } catch (e) {
  86. loadError = e
  87. }
  88. break
  89. default:
  90. throw new Error(`Unsupported architecture on Windows: ${arch}`)
  91. }
  92. break
  93. case 'darwin':
  94. switch (arch) {
  95. case 'x64':
  96. localFileExisted = existsSync(join(__dirname, 'package-template.darwin-x64.node'))
  97. try {
  98. if (localFileExisted) {
  99. nativeBinding = require('./package-template.darwin-x64.node')
  100. } else {
  101. nativeBinding = require('@napi-rs/package-template-darwin-x64')
  102. }
  103. } catch (e) {
  104. loadError = e
  105. }
  106. break
  107. case 'arm64':
  108. localFileExisted = existsSync(join(__dirname, 'package-template.darwin-arm64.node'))
  109. try {
  110. if (localFileExisted) {
  111. nativeBinding = require('./package-template.darwin-arm64.node')
  112. } else {
  113. nativeBinding = require('@napi-rs/package-template-darwin-arm64')
  114. }
  115. } catch (e) {
  116. loadError = e
  117. }
  118. break
  119. default:
  120. throw new Error(`Unsupported architecture on macOS: ${arch}`)
  121. }
  122. break
  123. case 'freebsd':
  124. if (arch !== 'x64') {
  125. throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
  126. }
  127. localFileExisted = existsSync(join(__dirname, 'package-template.freebsd-x64.node'))
  128. try {
  129. if (localFileExisted) {
  130. nativeBinding = require('./package-template.freebsd-x64.node')
  131. } else {
  132. nativeBinding = require('@napi-rs/package-template-freebsd-x64')
  133. }
  134. } catch (e) {
  135. loadError = e
  136. }
  137. break
  138. case 'linux':
  139. switch (arch) {
  140. case 'x64':
  141. if (isMusl()) {
  142. localFileExisted = existsSync(join(__dirname, 'package-template.linux-x64-musl.node'))
  143. try {
  144. if (localFileExisted) {
  145. nativeBinding = require('./package-template.linux-x64-musl.node')
  146. } else {
  147. nativeBinding = require('@napi-rs/package-template-linux-x64-musl')
  148. }
  149. } catch (e) {
  150. loadError = e
  151. }
  152. } else {
  153. localFileExisted = existsSync(join(__dirname, 'package-template.linux-x64-gnu.node'))
  154. try {
  155. if (localFileExisted) {
  156. nativeBinding = require('./package-template.linux-x64-gnu.node')
  157. } else {
  158. nativeBinding = require('@napi-rs/package-template-linux-x64-gnu')
  159. }
  160. } catch (e) {
  161. loadError = e
  162. }
  163. }
  164. break
  165. case 'arm64':
  166. if (isMusl()) {
  167. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm64-musl.node'))
  168. try {
  169. if (localFileExisted) {
  170. nativeBinding = require('./package-template.linux-arm64-musl.node')
  171. } else {
  172. nativeBinding = require('@napi-rs/package-template-linux-arm64-musl')
  173. }
  174. } catch (e) {
  175. loadError = e
  176. }
  177. } else {
  178. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm64-gnu.node'))
  179. try {
  180. if (localFileExisted) {
  181. nativeBinding = require('./package-template.linux-arm64-gnu.node')
  182. } else {
  183. nativeBinding = require('@napi-rs/package-template-linux-arm64-gnu')
  184. }
  185. } catch (e) {
  186. loadError = e
  187. }
  188. }
  189. break
  190. case 'arm':
  191. localFileExisted = existsSync(join(__dirname, 'package-template.linux-arm-gnueabihf.node'))
  192. try {
  193. if (localFileExisted) {
  194. nativeBinding = require('./package-template.linux-arm-gnueabihf.node')
  195. } else {
  196. nativeBinding = require('@napi-rs/package-template-linux-arm-gnueabihf')
  197. }
  198. } catch (e) {
  199. loadError = e
  200. }
  201. break
  202. default:
  203. throw new Error(`Unsupported architecture on Linux: ${arch}`)
  204. }
  205. break
  206. default:
  207. throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
  208. }
  209. if (!nativeBinding) {
  210. if (loadError) {
  211. throw loadError
  212. }
  213. throw new Error(`Failed to load native binding`)
  214. }
  215. const { plus100 } = nativeBinding
  216. module.exports.plus100 = plus100