Skip to content

Commit b2c47f7

Browse files
authored
chore: upgrade to NAPI-RS 3.0 stable (#419)
1 parent 7db64e8 commit b2c47f7

File tree

6 files changed

+204
-109
lines changed

6 files changed

+204
-109
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ version = "0.1.0"
1010
crate-type = ["cdylib"]
1111

1212
[dependencies]
13-
napi = "3.0.0-beta"
14-
napi-derive = "3.0.0-beta"
13+
napi = "3.0.0"
14+
napi-derive = "3.0.0"
1515

1616
[build-dependencies]
1717
napi-build = "2"
1818

1919
[profile.release]
2020
lto = true
21+
strip = "symbols"

index.js

Lines changed: 110 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ function requireNative() {
8282
} catch (e) {
8383
loadErrors.push(e)
8484
}
85-
8685
} else if (process.arch === 'arm') {
8786
try {
8887
return require('./package-template.android-arm-eabi.node')
@@ -94,7 +93,6 @@ function requireNative() {
9493
} catch (e) {
9594
loadErrors.push(e)
9695
}
97-
9896
} else {
9997
loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
10098
}
@@ -110,7 +108,6 @@ function requireNative() {
110108
} catch (e) {
111109
loadErrors.push(e)
112110
}
113-
114111
} else if (process.arch === 'ia32') {
115112
try {
116113
return require('./package-template.win32-ia32-msvc.node')
@@ -122,7 +119,6 @@ function requireNative() {
122119
} catch (e) {
123120
loadErrors.push(e)
124121
}
125-
126122
} else if (process.arch === 'arm64') {
127123
try {
128124
return require('./package-template.win32-arm64-msvc.node')
@@ -134,22 +130,20 @@ function requireNative() {
134130
} catch (e) {
135131
loadErrors.push(e)
136132
}
137-
138133
} else {
139134
loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
140135
}
141136
} else if (process.platform === 'darwin') {
142137
try {
143-
return require('./package-template.darwin-universal.node')
144-
} catch (e) {
145-
loadErrors.push(e)
146-
}
147-
try {
148-
return require('@napi-rs/package-template-darwin-universal')
149-
} catch (e) {
150-
loadErrors.push(e)
151-
}
152-
138+
return require('./package-template.darwin-universal.node')
139+
} catch (e) {
140+
loadErrors.push(e)
141+
}
142+
try {
143+
return require('@napi-rs/package-template-darwin-universal')
144+
} catch (e) {
145+
loadErrors.push(e)
146+
}
153147
if (process.arch === 'x64') {
154148
try {
155149
return require('./package-template.darwin-x64.node')
@@ -161,7 +155,6 @@ function requireNative() {
161155
} catch (e) {
162156
loadErrors.push(e)
163157
}
164-
165158
} else if (process.arch === 'arm64') {
166159
try {
167160
return require('./package-template.darwin-arm64.node')
@@ -173,7 +166,6 @@ function requireNative() {
173166
} catch (e) {
174167
loadErrors.push(e)
175168
}
176-
177169
} else {
178170
loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
179171
}
@@ -189,7 +181,6 @@ function requireNative() {
189181
} catch (e) {
190182
loadErrors.push(e)
191183
}
192-
193184
} else if (process.arch === 'arm64') {
194185
try {
195186
return require('./package-template.freebsd-arm64.node')
@@ -201,141 +192,167 @@ function requireNative() {
201192
} catch (e) {
202193
loadErrors.push(e)
203194
}
204-
205195
} else {
206196
loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
207197
}
208198
} else if (process.platform === 'linux') {
209199
if (process.arch === 'x64') {
210200
if (isMusl()) {
211201
try {
212-
return require('./package-template.linux-x64-musl.node')
213-
} catch (e) {
214-
loadErrors.push(e)
215-
}
216-
try {
217-
return require('@napi-rs/package-template-linux-x64-musl')
218-
} catch (e) {
219-
loadErrors.push(e)
220-
}
221-
202+
return require('./package-template.linux-x64-musl.node')
203+
} catch (e) {
204+
loadErrors.push(e)
205+
}
206+
try {
207+
return require('@napi-rs/package-template-linux-x64-musl')
208+
} catch (e) {
209+
loadErrors.push(e)
210+
}
222211
} else {
223212
try {
224-
return require('./package-template.linux-x64-gnu.node')
225-
} catch (e) {
226-
loadErrors.push(e)
227-
}
228-
try {
229-
return require('@napi-rs/package-template-linux-x64-gnu')
230-
} catch (e) {
231-
loadErrors.push(e)
232-
}
233-
213+
return require('./package-template.linux-x64-gnu.node')
214+
} catch (e) {
215+
loadErrors.push(e)
216+
}
217+
try {
218+
return require('@napi-rs/package-template-linux-x64-gnu')
219+
} catch (e) {
220+
loadErrors.push(e)
221+
}
234222
}
235223
} else if (process.arch === 'arm64') {
236224
if (isMusl()) {
237225
try {
238-
return require('./package-template.linux-arm64-musl.node')
239-
} catch (e) {
240-
loadErrors.push(e)
241-
}
242-
try {
243-
return require('@napi-rs/package-template-linux-arm64-musl')
244-
} catch (e) {
245-
loadErrors.push(e)
246-
}
247-
226+
return require('./package-template.linux-arm64-musl.node')
227+
} catch (e) {
228+
loadErrors.push(e)
229+
}
230+
try {
231+
return require('@napi-rs/package-template-linux-arm64-musl')
232+
} catch (e) {
233+
loadErrors.push(e)
234+
}
248235
} else {
249236
try {
250-
return require('./package-template.linux-arm64-gnu.node')
251-
} catch (e) {
252-
loadErrors.push(e)
253-
}
254-
try {
255-
return require('@napi-rs/package-template-linux-arm64-gnu')
256-
} catch (e) {
257-
loadErrors.push(e)
258-
}
259-
237+
return require('./package-template.linux-arm64-gnu.node')
238+
} catch (e) {
239+
loadErrors.push(e)
240+
}
241+
try {
242+
return require('@napi-rs/package-template-linux-arm64-gnu')
243+
} catch (e) {
244+
loadErrors.push(e)
245+
}
260246
}
261247
} else if (process.arch === 'arm') {
262248
if (isMusl()) {
263249
try {
264-
return require('./package-template.linux-arm-musleabihf.node')
265-
} catch (e) {
266-
loadErrors.push(e)
267-
}
268-
try {
269-
return require('@napi-rs/package-template-linux-arm-musleabihf')
270-
} catch (e) {
271-
loadErrors.push(e)
250+
return require('./package-template.linux-arm-musleabihf.node')
251+
} catch (e) {
252+
loadErrors.push(e)
253+
}
254+
try {
255+
return require('@napi-rs/package-template-linux-arm-musleabihf')
256+
} catch (e) {
257+
loadErrors.push(e)
258+
}
259+
} else {
260+
try {
261+
return require('./package-template.linux-arm-gnueabihf.node')
262+
} catch (e) {
263+
loadErrors.push(e)
264+
}
265+
try {
266+
return require('@napi-rs/package-template-linux-arm-gnueabihf')
267+
} catch (e) {
268+
loadErrors.push(e)
269+
}
272270
}
273-
271+
} else if (process.arch === 'riscv64') {
272+
if (isMusl()) {
273+
try {
274+
return require('./package-template.linux-riscv64-musl.node')
275+
} catch (e) {
276+
loadErrors.push(e)
277+
}
278+
try {
279+
return require('@napi-rs/package-template-linux-riscv64-musl')
280+
} catch (e) {
281+
loadErrors.push(e)
282+
}
274283
} else {
275284
try {
276-
return require('./package-template.linux-arm-gnueabihf.node')
285+
return require('./package-template.linux-riscv64-gnu.node')
286+
} catch (e) {
287+
loadErrors.push(e)
288+
}
289+
try {
290+
return require('@napi-rs/package-template-linux-riscv64-gnu')
291+
} catch (e) {
292+
loadErrors.push(e)
293+
}
294+
}
295+
} else if (process.arch === 'ppc64') {
296+
try {
297+
return require('./package-template.linux-ppc64-gnu.node')
277298
} catch (e) {
278299
loadErrors.push(e)
279300
}
280301
try {
281-
return require('@napi-rs/package-template-linux-arm-gnueabihf')
302+
return require('@napi-rs/package-template-linux-ppc64-gnu')
282303
} catch (e) {
283304
loadErrors.push(e)
284305
}
285-
286-
}
287-
} else if (process.arch === 'riscv64') {
288-
if (isMusl()) {
289-
try {
290-
return require('./package-template.linux-riscv64-musl.node')
306+
} else if (process.arch === 's390x') {
307+
try {
308+
return require('./package-template.linux-s390x-gnu.node')
291309
} catch (e) {
292310
loadErrors.push(e)
293311
}
294312
try {
295-
return require('@napi-rs/package-template-linux-riscv64-musl')
313+
return require('@napi-rs/package-template-linux-s390x-gnu')
296314
} catch (e) {
297315
loadErrors.push(e)
298316
}
299-
300-
} else {
301-
try {
302-
return require('./package-template.linux-riscv64-gnu.node')
317+
} else {
318+
loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
319+
}
320+
} else if (process.platform === 'openharmony') {
321+
if (process.arch === 'arm64') {
322+
try {
323+
return require('./package-template.linux-arm64-ohos.node')
303324
} catch (e) {
304325
loadErrors.push(e)
305326
}
306327
try {
307-
return require('@napi-rs/package-template-linux-riscv64-gnu')
328+
return require('@napi-rs/package-template-linux-arm64-ohos')
308329
} catch (e) {
309330
loadErrors.push(e)
310331
}
311-
312-
}
313-
} else if (process.arch === 'ppc64') {
332+
} else if (process.arch === 'x64') {
314333
try {
315-
return require('./package-template.linux-ppc64-gnu.node')
334+
return require('./package-template.linux-x64-ohos.node')
316335
} catch (e) {
317336
loadErrors.push(e)
318337
}
319338
try {
320-
return require('@napi-rs/package-template-linux-ppc64-gnu')
339+
return require('@napi-rs/package-template-linux-x64-ohos')
321340
} catch (e) {
322341
loadErrors.push(e)
323342
}
324-
325-
} else if (process.arch === 's390x') {
343+
} else if (process.arch === 'arm') {
326344
try {
327-
return require('./package-template.linux-s390x-gnu.node')
345+
return require('./package-template.linux-arm-ohos.node')
328346
} catch (e) {
329347
loadErrors.push(e)
330348
}
331349
try {
332-
return require('@napi-rs/package-template-linux-s390x-gnu')
350+
return require('@napi-rs/package-template-linux-arm-ohos')
333351
} catch (e) {
334352
loadErrors.push(e)
335353
}
336-
337354
} else {
338-
loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
355+
loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
339356
}
340357
} else {
341358
loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))

package-template.wasi-browser.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import {
66
} from '@napi-rs/wasm-runtime'
77

88

9+
910
const __wasi = new __WASI({
1011
version: 'preview1',
1112
})
1213

1314
const __wasmUrl = new URL('./package-template.wasm32-wasi.wasm', import.meta.url).href
1415
const __emnapiContext = __emnapiGetDefaultContext()
1516

17+
1618
const __sharedMemory = new WebAssembly.Memory({
1719
initial: 4000,
1820
maximum: 65536,

package-template.wasi.cjs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,29 @@ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule
6565
worker.onmessage = ({ data }) => {
6666
__wasmCreateOnMessageForFsProxy(__nodeFs)(data)
6767
}
68+
69+
// The main thread of Node.js waits for all the active handles before exiting.
70+
// But Rust threads are never waited without `thread::join`.
71+
// So here we hack the code of Node.js to prevent the workers from being referenced (active).
72+
// According to https://github.com/nodejs/node/blob/19e0d472728c79d418b74bddff588bea70a403d0/lib/internal/worker.js#L415,
73+
// a worker is consist of two handles: kPublicPort and kHandle.
74+
{
75+
const kPublicPort = Object.getOwnPropertySymbols(worker).find(s =>
76+
s.toString().includes("kPublicPort")
77+
);
78+
if (kPublicPort) {
79+
worker[kPublicPort].ref = () => {};
80+
}
81+
82+
const kHandle = Object.getOwnPropertySymbols(worker).find(s =>
83+
s.toString().includes("kHandle")
84+
);
85+
if (kHandle) {
86+
worker[kHandle].ref = () => {};
87+
}
88+
89+
worker.unref();
90+
}
6891
return worker
6992
},
7093
overwriteImports(importObject) {

0 commit comments

Comments
 (0)