node-nim 10.10.0 → 10.10.1-beta.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -96,6 +96,12 @@ npm install node-nim --arch=x64 --platform=linux
96
96
  npm install node-nim --arch=arm64 --platform=linux
97
97
  ```
98
98
 
99
+ - HarmonyOS arm64
100
+
101
+ ```bash
102
+ npm install node-nim --platform=ohos
103
+ ```
104
+
99
105
  ## Build From Source
100
106
 
101
107
  Technically, native NIM SDK is shipped with a prebuilt node-nim.node binary file, so `there is no need to build it yourself.`.
@@ -31,7 +31,9 @@ class V2NIMClient extends eventemitter3_1.EventEmitter {
31
31
  this.instance = new loader_1.default.V2NIMClient({ emit: this.emit.bind(this) });
32
32
  }
33
33
  catch (e) {
34
- console.error(e);
34
+ const detail = e instanceof Error ? (e.stack || e.message) : String(e);
35
+ console.error(`[node-nim] Failed to create native V2NIMClient: ${detail}`);
36
+ throw new Error(`Failed to create native V2NIMClient: ${detail}`);
35
37
  }
36
38
  this.conversationIdUtil = null;
37
39
  this.messageCreator = null;
@@ -72,6 +74,9 @@ class V2NIMClient extends eventemitter3_1.EventEmitter {
72
74
  * ```
73
75
  */
74
76
  init(option) {
77
+ if (!this.instance) {
78
+ throw new Error('Native V2NIMClient is not available');
79
+ }
75
80
  let error = this.instance.init(option);
76
81
  if (error) {
77
82
  return error;
@@ -116,6 +121,9 @@ class V2NIMClient extends eventemitter3_1.EventEmitter {
116
121
  * ```
117
122
  */
118
123
  uninit() {
124
+ if (!this.instance) {
125
+ throw new Error('Native V2NIMClient is not available');
126
+ }
119
127
  this.conversationIdUtil = null;
120
128
  this.messageCreator = null;
121
129
  this.messageConverter = null;
@@ -1 +1 @@
1
- {"version":3,"file":"v2_nim_client.js","sourceRoot":"","sources":["../../ts/v2/v2_nim_client.ts"],"names":[],"mappings":";;;;;;AACA,uDAA2B;AAC3B,iDAA4C;AAC5C,iEAA0D;AAC1D,2FAAmF;AACnF,+EAAwE;AACxE,2FAAmF;AACnF,qEAA8D;AAC9D,+EAAwE;AACxE,qEAA8D;AAC9D,+DAAwD;AACxD,qEAA8D;AAC9D,mEAA4D;AAC5D,+DAAwD;AACxD,2DAAoD;AACpD,2EAAoE;AACpE,+EAAwE;AACxE,6EAAsE;AACtE,2EAAoE;AACpE,iEAA0D;AAC1D,yDAO2B;AAI3B,MAAa,WAAY,SAAQ,4BAAiC;IA0BhE;QACE,KAAK,EAAE,CAAA;QACP,IAAI;YACF,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SACpE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;SACjB;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAE,MAAuB;QAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,KAAK,EAAE;YACT,OAAO,KAAK,CAAA;SACb;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,0CAAuB,EAAE,CAAA;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,sCAAmB,EAAE,CAAA;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,wCAAqB,EAAE,CAAA;QACnD,IAAI,CAAC,wBAAwB,GAAG,IAAI,gDAA6B,EAAE,CAAA;QACnE,IAAI,CAAC,kBAAkB,GAAG,IAAI,0CAAuB,EAAE,CAAA;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,mCAAgB,EAAE,CAAA;QACzC,IAAI,CAAC,YAAY,GAAG,IAAI,wCAAiB,EAAE,CAAA;QAC3C,IAAI,CAAC,wBAAwB,GAAG,IAAI,iEAA6B,EAAE,CAAA;QACnE,IAAI,CAAC,cAAc,GAAG,IAAI,4CAAmB,EAAE,CAAA;QAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,sDAAwB,EAAE,CAAA;QACzD,IAAI,CAAC,cAAc,GAAG,IAAI,4CAAmB,EAAE,CAAA;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,sCAAgB,EAAE,CAAA;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,4CAAmB,EAAE,CAAA;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,sCAAgB,EAAE,CAAA;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,0CAAkB,EAAE,CAAA;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,kCAAc,EAAE,CAAA;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,kDAAsB,EAAE,CAAA;QACrD,IAAI,CAAC,mBAAmB,GAAG,IAAI,sDAAwB,EAAE,CAAA;QACzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,oDAAuB,EAAE,CAAA;QACvD,IAAI,CAAC,iBAAiB,GAAG,IAAI,kDAAsB,EAAE,CAAA;QACrD,IAAI,CAAC,YAAY,GAAG,IAAI,wCAAiB,EAAE,CAAA;QAC3C,IAAI;YACF,IAAI,CAAC,mBAAmB,GAAG,IAAI,sDAAwB,EAAE,CAAA;YACzD,IAAI,CAAC,wBAAwB,GAAG,IAAI,iEAA6B,EAAE,CAAA;SACpE;QAAC,OAAO,CAAC,EAAE,GAAE;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM;QACJ,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;IAC/B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,YAAY,CAAE,MAAc;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;;;OAOG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAA;IACjC,CAAC;IAED;;;;;;;;OAQG;IACH,2BAA2B;QACzB,OAAO,IAAI,CAAC,wBAAwB,CAAA;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,2BAA2B;QACzB,OAAO,IAAI,CAAC,wBAAwB,CAAA;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;;OAOG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAA;IACjC,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;;OAOG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;;OAOG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAA;IACjC,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB;QACpB,OAAO,IAAI,CAAC,kBAAkB,CAAA;IAChC,CAAC;IAED;;;;;;;OAOG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;CACF;AA3UD,kCA2UC"}
1
+ {"version":3,"file":"v2_nim_client.js","sourceRoot":"","sources":["../../ts/v2/v2_nim_client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-nim",
3
- "version": "10.10.0",
3
+ "version": "10.10.1-beta.76",
4
4
  "description": "NetEase IM nodejs wrapper based on NetEase IM C++ SDK",
5
5
  "main": "dist/node-nim.js",
6
6
  "bin": {
@@ -6,9 +6,9 @@ const decompress = require('decompress')
6
6
 
7
7
  // Global variables
8
8
  const default_arch = 'universal'
9
- const current_arch = process.env.npm_config_arch || process.arch
10
- const arch = process.platform === 'darwin' ? default_arch : current_arch
11
- const platform = process.env.npm_config_platform || process.platform
9
+ const platform = normalizePlatform(process.env.npm_config_platform || process.platform)
10
+ const current_arch = normalizeArch(process.env.npm_config_arch || (platform === 'ohos' ? 'arm64' : process.arch))
11
+ const arch = platform === 'darwin' ? default_arch : current_arch
12
12
  const channel = 'message'
13
13
  const product = 'nim'
14
14
  const savePath = path.join(__dirname, '..', 'temporary')
@@ -206,8 +206,7 @@ async function downloadSDK(customPackageUrl) {
206
206
  // Find package URL for specified version or latest
207
207
  downloadUrl = findPackageUrl(publishData, version, platform, arch, product)
208
208
  if (!downloadUrl) {
209
- log(` ❌ ERROR: Package not found for ${platform} (${arch})`)
210
- return
209
+ throw new Error(`Package not found for ${platform} (${arch})`)
211
210
  }
212
211
  log(` 🚀 Preparing to download package for ${platform} (${arch})`)
213
212
  }
@@ -309,12 +308,13 @@ function findPackageUrl(publishData, targetVersion, platform, arch, product) {
309
308
  let targetDownloadUrl = ''
310
309
  // Check if package matches current platform/arch
311
310
  const isMatchingPackage = (member) => {
311
+ const filename = member.filename || ''
312
312
  const basicMatch = member.filename.includes(product) &&
313
- member.filename.includes(platform) &&
314
- member.filename.includes(arch)
313
+ platformAliases(platform).some((value) => filename.includes(value)) &&
314
+ archAliases(arch).some((value) => filename.includes(value))
315
315
  // For win32 platform, also require 'multi-threaded' keyword
316
316
  if (platform === 'win32') {
317
- return basicMatch && member.filename.includes('multi-threaded')
317
+ return basicMatch && filename.includes('multi-threaded')
318
318
  }
319
319
  return basicMatch
320
320
  }
@@ -348,6 +348,34 @@ function findPackageUrl(publishData, targetVersion, platform, arch, product) {
348
348
  return null
349
349
  }
350
350
 
351
+ function platformAliases(nodePlatform) {
352
+ if (normalizePlatform(nodePlatform) === 'ohos') {
353
+ return ['ohos', 'harmony', 'harmonyos']
354
+ }
355
+ return [nodePlatform]
356
+ }
357
+
358
+ function archAliases(nodeArch) {
359
+ if (normalizeArch(nodeArch) === 'arm64') {
360
+ return ['arm64', 'arm64-v8a', 'arm64_v8a']
361
+ }
362
+ return [nodeArch]
363
+ }
364
+
365
+ function normalizePlatform(nodePlatform) {
366
+ if (['harmony', 'harmonyos'].includes(nodePlatform)) {
367
+ return 'ohos'
368
+ }
369
+ return nodePlatform
370
+ }
371
+
372
+ function normalizeArch(nodeArch) {
373
+ if (['arm64-v8a', 'arm64_v8a'].includes(nodeArch)) {
374
+ return 'arm64'
375
+ }
376
+ return nodeArch
377
+ }
378
+
351
379
  // Parse directory listing from HTTP server
352
380
  async function parseDirectoryListing(url) {
353
381
  try {
@@ -415,12 +443,17 @@ async function findLatestBuildWithPackage(baseUrl, branch, nodePlatform, nodeArc
415
443
 
416
444
  // Map Node.js platform/arch to SDK directory format
417
445
  function getPlatformArchDir(nodePlatform, nodeArch) {
446
+ nodePlatform = normalizePlatform(nodePlatform)
447
+ nodeArch = normalizeArch(nodeArch)
418
448
  // Normalize arch - default to x64 if not arm64
419
449
  const arch = nodeArch === 'arm64' ? 'arm64' : (nodeArch === 'ia32' ? 'ia32' : 'x64')
420
450
  // For win32, include multi-threaded suffix
421
451
  if (nodePlatform === 'win32') {
422
452
  return `win32-${arch}-multi-threaded/`
423
453
  }
454
+ if (nodePlatform === 'ohos') {
455
+ return `ohos-${arch === 'arm64' ? 'arm64-v8a' : arch}/`
456
+ }
424
457
  // For other platforms (darwin, linux)
425
458
  return `${nodePlatform}-${arch}/`
426
459
  }
@@ -486,7 +519,7 @@ if (require.main === module) {
486
519
  if (branch || (branchIndex !== -1 && args[branchIndex + 1])) {
487
520
  // Build URL from branch name
488
521
  branch = branch || args[branchIndex + 1]
489
- url = await buildPackageUrlFromBranch(branch, platform, process.arch)
522
+ url = await buildPackageUrlFromBranch(branch, platform, arch)
490
523
  } else if (downloadUrl || (urlIndex !== -1 && args[urlIndex + 1])) {
491
524
  // Use provided URL directly
492
525
  url = downloadUrl || args[urlIndex + 1]
@@ -0,0 +1,547 @@
1
+ const childProcess = require('child_process')
2
+ const fs = require('fs')
3
+ const os = require('os')
4
+ const path = require('path')
5
+
6
+ const repoRoot = path.resolve(__dirname, '../..')
7
+ const nodeNimRoot = path.resolve(__dirname, '..')
8
+
9
+ function parseArgs(argv) {
10
+ const options = {}
11
+ for (let i = 0; i < argv.length; i++) {
12
+ const arg = argv[i]
13
+ if (arg === '--ohos-install-dir') {
14
+ const value = argv[++i]
15
+ if (!value || value.startsWith('--')) {
16
+ throw new Error('--ohos-install-dir requires a value')
17
+ }
18
+ options.ohosInstallDir = value
19
+ } else if (arg === '--output') {
20
+ const value = argv[++i]
21
+ if (!value || value.startsWith('--')) {
22
+ throw new Error('--output requires a value')
23
+ }
24
+ options.output = value
25
+ } else if (arg === '--sdk-version') {
26
+ const value = argv[++i]
27
+ if (!value || value.startsWith('--')) {
28
+ throw new Error('--sdk-version requires a value')
29
+ }
30
+ options.sdkVersion = value
31
+ } else if (arg === '--skip-npm-install') {
32
+ options.skipNpmInstall = true
33
+ } else {
34
+ throw new Error(`Unknown argument: ${arg}`)
35
+ }
36
+ }
37
+ return options
38
+ }
39
+
40
+ function resolvePath(value) {
41
+ return path.isAbsolute(value) ? value : path.join(repoRoot, value)
42
+ }
43
+
44
+ function ensureDir(dir) {
45
+ fs.mkdirSync(dir, { recursive: true })
46
+ }
47
+
48
+ function removeDir(dir) {
49
+ fs.rmSync(dir, { recursive: true, force: true })
50
+ }
51
+
52
+ function removeDirContents(dir, preserveNames = new Set()) {
53
+ if (!fs.existsSync(dir)) {
54
+ return
55
+ }
56
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
57
+ if (preserveNames.has(entry.name)) {
58
+ continue
59
+ }
60
+ fs.rmSync(path.join(dir, entry.name), { recursive: true, force: true })
61
+ }
62
+ }
63
+
64
+ function copyDir(src, dest, options = {}) {
65
+ const stat = fs.statSync(src)
66
+ if (!stat.isDirectory()) {
67
+ throw new Error(`${src} is not a directory`)
68
+ }
69
+ ensureDir(dest)
70
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
71
+ if (entry.name === '.DS_Store') {
72
+ continue
73
+ }
74
+ const srcPath = path.join(src, entry.name)
75
+ const destPath = path.join(dest, entry.name)
76
+ if (options.filter && !options.filter(srcPath, entry)) {
77
+ continue
78
+ }
79
+ if (entry.isDirectory()) {
80
+ copyDir(srcPath, destPath, options)
81
+ } else if (entry.isFile()) {
82
+ fs.copyFileSync(srcPath, destPath)
83
+ }
84
+ }
85
+ }
86
+
87
+ function replaceInFiles(root, predicate, replacer) {
88
+ if (!fs.existsSync(root)) {
89
+ return
90
+ }
91
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
92
+ const entryPath = path.join(root, entry.name)
93
+ if (entry.isDirectory()) {
94
+ replaceInFiles(entryPath, predicate, replacer)
95
+ } else if (entry.isFile() && predicate(entryPath)) {
96
+ const before = fs.readFileSync(entryPath, 'utf8')
97
+ const after = replacer(before, entryPath)
98
+ if (after !== before) {
99
+ fs.writeFileSync(entryPath, after)
100
+ }
101
+ }
102
+ }
103
+ }
104
+
105
+ function replaceInFilesWithRestore(root, predicate, replacer) {
106
+ const originals = new Map()
107
+ replaceInFiles(root, predicate, (content, file) => {
108
+ const replaced = replacer(content, file)
109
+ if (replaced !== content) {
110
+ originals.set(file, content)
111
+ }
112
+ return replaced
113
+ })
114
+ return () => {
115
+ for (const [file, content] of originals) {
116
+ fs.writeFileSync(file, content)
117
+ }
118
+ }
119
+ }
120
+
121
+ function unique(values) {
122
+ return values.filter(Boolean).filter((value, index, array) => array.indexOf(value) === index)
123
+ }
124
+
125
+ function isFile(file) {
126
+ try {
127
+ return fs.statSync(file).isFile()
128
+ } catch (error) {
129
+ return false
130
+ }
131
+ }
132
+
133
+ function isDir(dir) {
134
+ try {
135
+ return fs.statSync(dir).isDirectory()
136
+ } catch (error) {
137
+ return false
138
+ }
139
+ }
140
+
141
+ function isExecutable(file) {
142
+ try {
143
+ fs.accessSync(file, fs.constants.X_OK)
144
+ return true
145
+ } catch (error) {
146
+ return false
147
+ }
148
+ }
149
+
150
+ function prependPath(dirs) {
151
+ const existing = (process.env.PATH || '').split(path.delimiter).filter(Boolean)
152
+ process.env.PATH = unique([...dirs.filter(isDir), ...existing]).join(path.delimiter)
153
+ }
154
+
155
+ function hasPathSeparator(command) {
156
+ return command.includes('/') || command.includes('\\')
157
+ }
158
+
159
+ function resolveExecutable(command, extraDirs = []) {
160
+ if (hasPathSeparator(command)) {
161
+ const executable = path.isAbsolute(command) ? command : path.resolve(repoRoot, command)
162
+ return isExecutable(executable) ? executable : ''
163
+ }
164
+
165
+ const pathDirs = (process.env.PATH || '').split(path.delimiter).filter(Boolean)
166
+ for (const dir of unique([...extraDirs, ...pathDirs])) {
167
+ const candidate = path.join(dir, command)
168
+ if (isExecutable(candidate)) {
169
+ return candidate
170
+ }
171
+ }
172
+ return ''
173
+ }
174
+
175
+ function getMacOhosEnvironment(sdkVersion) {
176
+ if (process.platform !== 'darwin') {
177
+ return null
178
+ }
179
+
180
+ const home = os.homedir()
181
+ const commandLineToolHomes = unique([
182
+ process.env.COMMAND_LINE_TOOLS_HOME,
183
+ process.env.DEVECO_TOOLS_HOME,
184
+ path.join(home, 'Downloads/command-line-tools')
185
+ ])
186
+
187
+ const toolHomeCandidates = unique([
188
+ process.env.DEVECO_TOOLS_HOME,
189
+ process.env.DEVECO_STUDIO_HOME ? path.join(process.env.DEVECO_STUDIO_HOME, 'Contents/tools') : '',
190
+ '/Applications/DevEco-Studio.app/Contents/tools',
191
+ '/Applications/DevEco Studio.app/Contents/tools',
192
+ ...commandLineToolHomes
193
+ ])
194
+
195
+ const openHarmonyHomes = unique([
196
+ process.env.OPENHARMONY_HOME,
197
+ path.join(home, 'Library/OpenHarmony')
198
+ ])
199
+ const baseSdkHomes = unique([
200
+ process.env.OHOS_BASE_SDK_HOME,
201
+ ...openHarmonyHomes.map((dir) => path.join(dir, 'Sdk')),
202
+ ...commandLineToolHomes.map((dir) => path.join(dir, 'sdk/default/openharmony')),
203
+ path.join(home, 'Library/Huawei/Sdk')
204
+ ])
205
+ const nativeHomeCandidates = unique([
206
+ process.env.OHOS_NATIVE_HOME,
207
+ ...baseSdkHomes.map((dir) => path.basename(dir) === 'openharmony'
208
+ ? path.join(dir, 'native')
209
+ : path.join(dir, sdkVersion, 'native'))
210
+ ])
211
+ const nativeHome = nativeHomeCandidates.find((dir) => isFile(path.join(dir, 'build/cmake/ohos.toolchain.cmake'))) || ''
212
+ const sdkHome = nativeHome ? path.dirname(nativeHome) : ''
213
+ const baseSdkHome = nativeHome && path.basename(sdkHome) === sdkVersion
214
+ ? path.dirname(sdkHome)
215
+ : sdkHome
216
+
217
+ const toolHome = toolHomeCandidates.find((dir) => {
218
+ return isExecutable(path.join(dir, 'bin/ohpm')) ||
219
+ isExecutable(path.join(dir, 'bin/hvigorw')) ||
220
+ isExecutable(path.join(dir, 'ohpm/bin/ohpm')) ||
221
+ isExecutable(path.join(dir, 'hvigor/bin/hvigorw'))
222
+ }) || ''
223
+
224
+ if (baseSdkHome) {
225
+ process.env.OHOS_BASE_SDK_HOME = baseSdkHome
226
+ if (baseSdkHome.endsWith('/Sdk')) {
227
+ process.env.OPENHARMONY_HOME = path.dirname(baseSdkHome)
228
+ }
229
+ }
230
+ if (nativeHome) {
231
+ process.env.OHOS_NATIVE_HOME = nativeHome
232
+ }
233
+ if (toolHome) {
234
+ process.env.COMMAND_LINE_TOOLS_HOME = toolHome
235
+ process.env.DEVECO_TOOLS_HOME = toolHome
236
+ }
237
+
238
+ prependPath([
239
+ nativeHome ? path.join(nativeHome, 'llvm/bin') : '',
240
+ sdkHome ? path.join(sdkHome, 'toolchains') : '',
241
+ toolHome ? path.join(toolHome, 'bin') : '',
242
+ toolHome ? path.join(toolHome, 'node/bin') : '',
243
+ toolHome ? path.join(toolHome, 'hvigor/bin') : '',
244
+ toolHome ? path.join(toolHome, 'ohpm/bin') : ''
245
+ ])
246
+
247
+ return {
248
+ nativeHome,
249
+ nativeHomeCandidates,
250
+ toolHome,
251
+ toolHomeCandidates
252
+ }
253
+ }
254
+
255
+ function formatMissingDependencies(missing) {
256
+ return [
257
+ 'Missing required tools for OHPM HAR packaging:',
258
+ ...missing.map((item) => {
259
+ const details = item.details && item.details.length > 0
260
+ ? `\n Checked:\n${item.details.map((detail) => ` - ${detail}`).join('\n')}`
261
+ : ''
262
+ return `- ${item.name}${details}`
263
+ })
264
+ ].join('\n')
265
+ }
266
+
267
+ function resolvePackagingTools(options) {
268
+ const macEnv = getMacOhosEnvironment(options.sdkVersion)
269
+ const missing = []
270
+
271
+ if (process.platform === 'darwin' && !macEnv.nativeHome) {
272
+ missing.push({
273
+ name: `OpenHarmony native SDK ${options.sdkVersion}`,
274
+ details: macEnv.nativeHomeCandidates.map((dir) => path.join(dir, 'build/cmake/ohos.toolchain.cmake'))
275
+ })
276
+ }
277
+
278
+ const npx = resolveExecutable('npx')
279
+ if (!npx) {
280
+ missing.push({
281
+ name: 'npx',
282
+ details: ['Install Node.js with npm, or add npx to PATH']
283
+ })
284
+ }
285
+
286
+ if (!options.skipNpmInstall && !resolveExecutable('npm')) {
287
+ missing.push({
288
+ name: 'npm',
289
+ details: ['Install Node.js with npm, or pass --skip-npm-install after dependencies are installed']
290
+ })
291
+ }
292
+
293
+ const ohpm = resolveExecutable('ohpm')
294
+ if (!ohpm) {
295
+ missing.push({
296
+ name: 'ohpm',
297
+ details: process.platform === 'darwin' && macEnv.toolHomeCandidates
298
+ ? macEnv.toolHomeCandidates.flatMap((dir) => [
299
+ path.join(dir, 'bin/ohpm'),
300
+ path.join(dir, 'ohpm/bin/ohpm')
301
+ ])
302
+ : [
303
+ '/home/conan/command-line-tools/bin/ohpm',
304
+ '/home/conan/command-line-tools/ohpm/bin/ohpm',
305
+ 'Add ohpm to PATH'
306
+ ]
307
+ })
308
+ }
309
+
310
+ const hvigorwCommand = process.env.HVIGORW || 'hvigorw'
311
+ const hvigorw = resolveExecutable(hvigorwCommand)
312
+ if (!hvigorw) {
313
+ missing.push({
314
+ name: hvigorwCommand,
315
+ details: process.platform === 'darwin' && macEnv.toolHomeCandidates
316
+ ? macEnv.toolHomeCandidates.flatMap((dir) => [
317
+ path.join(dir, 'bin/hvigorw'),
318
+ path.join(dir, 'hvigor/bin/hvigorw')
319
+ ])
320
+ : [
321
+ '/home/conan/command-line-tools/bin/hvigorw',
322
+ '/home/conan/command-line-tools/hvigor/bin/hvigorw',
323
+ 'Set HVIGORW or add hvigorw to PATH'
324
+ ]
325
+ })
326
+ }
327
+
328
+ if (missing.length > 0) {
329
+ throw new Error(formatMissingDependencies(missing))
330
+ }
331
+
332
+ return { ohpm, hvigorw }
333
+ }
334
+
335
+ function run(command, args, cwd) {
336
+ console.log(`[node-nim][ohpm] ${command} ${args.join(' ')}`)
337
+ childProcess.execFileSync(command, args, {
338
+ cwd,
339
+ stdio: 'inherit',
340
+ shell: process.platform === 'win32'
341
+ })
342
+ }
343
+
344
+ function runGit(args) {
345
+ try {
346
+ return childProcess.execFileSync('git', args, {
347
+ cwd: repoRoot,
348
+ encoding: 'utf8',
349
+ stdio: ['ignore', 'pipe', 'ignore']
350
+ }).trim()
351
+ } catch (error) {
352
+ return ''
353
+ }
354
+ }
355
+
356
+ function isSemverCore(version) {
357
+ return /^\d+\.\d+\.\d+$/.test(version)
358
+ }
359
+
360
+ function getPackageVersion() {
361
+ const gitTag = runGit(['describe', '--abbrev=0', '--tags', '--exact-match'])
362
+ const gitBranch = runGit(['rev-parse', '--abbrev-ref', 'HEAD'])
363
+ const latestTag = runGit(['describe', '--tags', '--abbrev=0'])
364
+ const gitCommitCount = runGit(['rev-list', '--count', 'HEAD', `^${latestTag}~1`])
365
+
366
+ console.log(`[node-nim][ohpm] Git tag: ${gitTag}`)
367
+ console.log(`[node-nim][ohpm] Git branch: ${gitBranch}`)
368
+ console.log(`[node-nim][ohpm] Git commit count: ${gitCommitCount}`)
369
+ console.log(`[node-nim][ohpm] Latest tag: ${latestTag}`)
370
+
371
+ if (gitTag) {
372
+ return gitTag
373
+ }
374
+
375
+ if (!gitBranch) {
376
+ throw new Error('Unable to derive package version: missing git branch')
377
+ }
378
+ if (!gitCommitCount) {
379
+ throw new Error('Unable to derive package version: missing git commit count')
380
+ }
381
+
382
+ let channel = 'latest'
383
+ if (gitBranch.startsWith('release') || gitBranch.startsWith('hotfix')) {
384
+ channel = 'beta'
385
+ } else if (gitBranch.startsWith('feature')) {
386
+ channel = 'alpha'
387
+ }
388
+
389
+ const branchVersion = gitBranch.replace(/.*\//, '').replace(/-.*/, '')
390
+ const baseVersion = isSemverCore(branchVersion) ? branchVersion : latestTag
391
+ if (!baseVersion) {
392
+ throw new Error(`Unable to derive package version from git branch or latest git tag: ${gitBranch}`)
393
+ }
394
+ return `${baseVersion}-${channel}.${gitCommitCount}`
395
+ }
396
+
397
+ function copyNativeLibraries(nativeLibDir, abiDir, expectedBridge) {
398
+ if (!fs.existsSync(nativeLibDir)) {
399
+ throw new Error(`Missing native lib dir: ${nativeLibDir}`)
400
+ }
401
+ const soFiles = fs.readdirSync(nativeLibDir).filter((name) => name.endsWith('.so'))
402
+ if (soFiles.length === 0) {
403
+ throw new Error(`No .so files found in ${nativeLibDir}`)
404
+ }
405
+ const legacyBridge = expectedBridge.replace(/-/g, '_')
406
+ if (soFiles.includes(legacyBridge)) {
407
+ throw new Error(`Unexpected OHOS native bridge ${legacyBridge}; rebuild native output as ${expectedBridge}`)
408
+ }
409
+ if (!soFiles.includes(expectedBridge)) {
410
+ throw new Error(`Missing OHOS native bridge ${path.join(nativeLibDir, expectedBridge)}`)
411
+ }
412
+ ensureDir(abiDir)
413
+ for (const file of soFiles) {
414
+ fs.copyFileSync(path.join(nativeLibDir, file), path.join(abiDir, file))
415
+ }
416
+ }
417
+
418
+ function main() {
419
+ const args = parseArgs(process.argv.slice(2))
420
+ if (!args.ohosInstallDir) {
421
+ throw new Error('Missing required argument: --ohos-install-dir')
422
+ }
423
+ const version = getPackageVersion()
424
+ const sdkVersion = args.sdkVersion || process.env.OHPM_SDK_VERSION || '20'
425
+ const tools = resolvePackagingTools({
426
+ sdkVersion,
427
+ skipNpmInstall: args.skipNpmInstall
428
+ })
429
+
430
+ const projectDir = resolvePath(process.env.OHPM_PROJECT_DIR || 'node-nim/ohpm')
431
+ const distDir = resolvePath(process.env.OHPM_DIST_DIR || 'node-nim/ohpm/dist')
432
+ const moduleDir = path.join(projectDir, 'node-nim')
433
+ const tsDir = path.join(moduleDir, 'ts')
434
+ const typesDir = path.join(moduleDir, 'types')
435
+ const abiDir = path.join(moduleDir, 'libs/arm64-v8a')
436
+ const legacyAbiDir = path.join(moduleDir, 'src/main/libs/arm64-v8a')
437
+ const legacyLibRootDir = path.join(moduleDir, 'src/main/libs')
438
+ const loaderFile = path.join(tsDir, 'loader.ts')
439
+ const ohosInstallDir = resolvePath(args.ohosInstallDir)
440
+ const nativeLibDir = path.join(ohosInstallDir, 'lib')
441
+ const harOutput = resolvePath(args.output || process.env.HAR_OUTPUT || `node-nim/ohpm/dist/node-nim-${version}.har`)
442
+ const tscOutDir = path.join(distDir, 'tsc-out')
443
+ const nativeTypePackage = 'libnode-nim.so'
444
+
445
+ console.log(`[node-nim][ohpm] Package version: ${version}`)
446
+ console.log(`[node-nim][ohpm] OHOS SDK version: ${sdkVersion}`)
447
+ console.log(`[node-nim][ohpm] OHOS install directory: ${ohosInstallDir}`)
448
+ if (process.env.OHOS_NATIVE_HOME) {
449
+ console.log(`[node-nim][ohpm] OHOS_NATIVE_HOME: ${process.env.OHOS_NATIVE_HOME}`)
450
+ }
451
+ if (process.env.DEVECO_TOOLS_HOME) {
452
+ console.log(`[node-nim][ohpm] DEVECO_TOOLS_HOME: ${process.env.DEVECO_TOOLS_HOME}`)
453
+ }
454
+
455
+ removeDir(distDir)
456
+ removeDir(path.join(projectDir, 'package'))
457
+ removeDir(path.join(projectDir, '.hvigor'))
458
+ removeDir(path.join(projectDir, 'oh_modules'))
459
+ removeDir(path.join(projectDir, 'build'))
460
+ removeDir(path.join(moduleDir, 'build'))
461
+ removeDir(path.join(moduleDir, 'oh_modules'))
462
+ removeDir(path.join(moduleDir, 'BuildProfile.ets'))
463
+ removeDir(path.join(projectDir, 'oh-package-lock.json5'))
464
+ removeDir(path.join(moduleDir, 'oh-package-lock.json5'))
465
+ ensureDir(distDir)
466
+
467
+ ensureDir(tsDir)
468
+ if (!fs.existsSync(loaderFile)) {
469
+ throw new Error(`Missing OHPM loader: ${loaderFile}`)
470
+ }
471
+ removeDirContents(tsDir, new Set(['loader.ts']))
472
+ removeDir(typesDir)
473
+ removeDir(abiDir)
474
+ removeDir(legacyAbiDir)
475
+ removeDir(legacyLibRootDir)
476
+ ensureDir(abiDir)
477
+ copyDir(path.join(nodeNimRoot, 'ts'), tsDir, {
478
+ filter: (srcPath, entry) => !(entry.isFile() && path.relative(path.join(nodeNimRoot, 'ts'), srcPath) === 'loader.ts')
479
+ })
480
+
481
+ if (!args.skipNpmInstall) {
482
+ run('npm', ['install', '--ignore-scripts', '--no-package-lock', '--include=dev'], nodeNimRoot)
483
+ }
484
+ run('npx', ['tsc', '--emitDeclarationOnly', '--declaration', '--declarationDir', typesDir, '--outDir', tscOutDir], nodeNimRoot)
485
+
486
+ const tsExt = (file) => file.endsWith('.ts') || file.endsWith('.d.ts')
487
+ replaceInFiles(tsDir, tsExt, (content) => content.replace(/from 'ts\/node-nim'/g, "from '../node-nim'"))
488
+ replaceInFiles(typesDir, tsExt, (content) => content.replace(/from 'ts\/node-nim'/g, "from '../node-nim'"))
489
+ fs.writeFileSync(path.join(typesDir, 'loader.d.ts'), [
490
+ `import type { NodeNimNativeSdk } from '${nativeTypePackage}'`,
491
+ '',
492
+ 'declare const sdk: NodeNimNativeSdk',
493
+ '',
494
+ 'export { sdk }',
495
+ 'export default sdk',
496
+ ''
497
+ ].join('\n'))
498
+
499
+ const placeholderExt = (file) => ['.json5', '.ets', '.ts', '.json'].includes(path.extname(file))
500
+ copyNativeLibraries(nativeLibDir, abiDir, nativeTypePackage)
501
+ const nativeBridge = path.join(abiDir, nativeTypePackage)
502
+ if (!fs.existsSync(nativeBridge)) {
503
+ throw new Error(`Missing OHOS native bridge ${nativeBridge}`)
504
+ }
505
+ const nodeAddon = path.join(abiDir, 'node-nim.node')
506
+ if (fs.existsSync(nodeAddon)) {
507
+ throw new Error('node-nim.node must not enter the HAR package')
508
+ }
509
+
510
+ const restoreProjectFiles = replaceInFilesWithRestore(projectDir, placeholderExt, (content) => {
511
+ return content
512
+ .replace(/\{\{VERSION\}\}/g, version)
513
+ .replace(/\{\{OHOS_SDK_VERSION\}\}/g, sdkVersion)
514
+ })
515
+
516
+ try {
517
+ run(tools.ohpm, ['install', '--all'], projectDir)
518
+ run(tools.hvigorw, ['assembleHar', '--no-daemon'], projectDir)
519
+
520
+ const outputDir = path.join(moduleDir, 'build/default/outputs/default')
521
+ const harFiles = fs.existsSync(outputDir)
522
+ ? fs.readdirSync(outputDir).filter((name) => name.endsWith('.har'))
523
+ : []
524
+ if (harFiles.length !== 1) {
525
+ throw new Error(`Expected one HAR file in ${outputDir}, found ${harFiles.length}`)
526
+ }
527
+ const harFile = path.join(outputDir, harFiles[0])
528
+ if (!fs.existsSync(harFile)) {
529
+ throw new Error(`No HAR file generated at ${harFile}`)
530
+ }
531
+ ensureDir(path.dirname(harOutput))
532
+ fs.copyFileSync(harFile, harOutput)
533
+ if (fs.statSync(harOutput).size === 0) {
534
+ throw new Error(`Generated HAR is empty: ${harOutput}`)
535
+ }
536
+ } finally {
537
+ restoreProjectFiles()
538
+ }
539
+ console.log(`[node-nim][ohpm] HAR output: ${harOutput}`)
540
+ }
541
+
542
+ try {
543
+ main()
544
+ } catch (error) {
545
+ console.error(`[node-nim][ohpm] ${error.message}`)
546
+ process.exit(1)
547
+ }