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 +6 -0
- package/dist/v2/v2_nim_client.js +9 -1
- package/dist/v2/v2_nim_client.js.map +1 -1
- package/package.json +1 -1
- package/script/download-sdk.js +42 -9
- package/script/package-ohpm-har.js +547 -0
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.`.
|
package/dist/v2/v2_nim_client.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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
package/script/download-sdk.js
CHANGED
|
@@ -6,9 +6,9 @@ const decompress = require('decompress')
|
|
|
6
6
|
|
|
7
7
|
// Global variables
|
|
8
8
|
const default_arch = 'universal'
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
314
|
-
|
|
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 &&
|
|
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,
|
|
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
|
+
}
|