emnapi 1.10.0 → 1.11.0
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/dist/library_napi.js +284 -42
- package/include/node/emnapi.h +26 -1
- package/include/node/js_native_api.h +10 -0
- package/include/node/js_native_api_types.h +4 -0
- package/package.json +1 -1
package/dist/library_napi.js
CHANGED
|
@@ -53,11 +53,11 @@ function emnapiInit(options) {
|
|
|
53
53
|
var scope = emnapiCtx.openScope(envObject);
|
|
54
54
|
try {
|
|
55
55
|
envObject.callIntoModule(function (_envObject) {
|
|
56
|
-
var exports
|
|
56
|
+
var exports = emnapiModule.exports;
|
|
57
57
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
58
|
-
var exportsHandle = scope.add(exports
|
|
58
|
+
var exportsHandle = scope.add(exports);
|
|
59
59
|
var napiValue = _napi_register_wasm_v1({{{ to64('_envObject.id') }}}, {{{ to64('exportsHandle.id') }}});
|
|
60
|
-
emnapiModule.exports = (!napiValue) ? exports
|
|
60
|
+
emnapiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue).value;
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
catch (err) {
|
|
@@ -299,7 +299,7 @@ function __emnapi_worker_unref(pid) {
|
|
|
299
299
|
* @__postset
|
|
300
300
|
* ```
|
|
301
301
|
* PThread.unusedWorkers.forEach(emnapiAddSendListener);
|
|
302
|
-
* PThread.
|
|
302
|
+
* Object.values(PThread.pthreads).forEach(emnapiAddSendListener);
|
|
303
303
|
* (function () {
|
|
304
304
|
* var __original_getNewWorker = PThread.getNewWorker;
|
|
305
305
|
* PThread.getNewWorker = function () {
|
|
@@ -1085,6 +1085,73 @@ var emnapiExternalMemory = {
|
|
|
1085
1085
|
return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };
|
|
1086
1086
|
}
|
|
1087
1087
|
};
|
|
1088
|
+
/**
|
|
1089
|
+
* Metadata layout in wasm shared memory (allocated with _malloc):
|
|
1090
|
+
* offset 0: refcount (int32, 4 bytes - for Atomics)
|
|
1091
|
+
* offset POINTER_SIZE: external_data (pointer)
|
|
1092
|
+
* offset 2*POINTER_SIZE: byte_length (size_t)
|
|
1093
|
+
* offset 3*POINTER_SIZE: finalize_cb (pointer)
|
|
1094
|
+
* offset 4*POINTER_SIZE: finalize_data (pointer)
|
|
1095
|
+
* offset 5*POINTER_SIZE: finalize_hint (pointer)
|
|
1096
|
+
* Total: 6 * POINTER_SIZE bytes
|
|
1097
|
+
*/
|
|
1098
|
+
/**
|
|
1099
|
+
* @__postset
|
|
1100
|
+
* ```
|
|
1101
|
+
* emnapiExternalSAB.init();
|
|
1102
|
+
* ```
|
|
1103
|
+
*/
|
|
1104
|
+
var emnapiExternalSAB = {
|
|
1105
|
+
registry: undefined,
|
|
1106
|
+
handleTable: new WeakMap(),
|
|
1107
|
+
init: function () {
|
|
1108
|
+
emnapiExternalSAB.handleTable = new WeakMap();
|
|
1109
|
+
emnapiExternalSAB.registry = typeof FinalizationRegistry === 'function'
|
|
1110
|
+
? new FinalizationRegistry(function (metaPtr) {
|
|
1111
|
+
emnapiExternalSAB.release(metaPtr);
|
|
1112
|
+
})
|
|
1113
|
+
: undefined;
|
|
1114
|
+
},
|
|
1115
|
+
allocMeta: function (external_data, byte_length, finalize_cb, finalize_data, finalize_hint) {
|
|
1116
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1117
|
+
var size = {{{ POINTER_SIZE }}} * 6;
|
|
1118
|
+
// eslint-disable-next-line prefer-const
|
|
1119
|
+
var metaPtr = _malloc({{{ to64('size') }}});
|
|
1120
|
+
if (!metaPtr)
|
|
1121
|
+
throw new Error('Out of memory');
|
|
1122
|
+
{{{ from64('metaPtr') }}};
|
|
1123
|
+
// refcount = 1
|
|
1124
|
+
Atomics.store(new Int32Array(wasmMemory.buffer, metaPtr, 1), 0, 1);
|
|
1125
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE, 'external_data', '*') }}};
|
|
1126
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 2, 'byte_length', '*') }}};
|
|
1127
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 3, 'finalize_cb', '*') }}};
|
|
1128
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 4, 'finalize_data', '*') }}};
|
|
1129
|
+
{{{ makeSetValue('metaPtr', POINTER_SIZE * 5, 'finalize_hint', '*') }}};
|
|
1130
|
+
return metaPtr;
|
|
1131
|
+
},
|
|
1132
|
+
readMeta: function (metaPtr) {
|
|
1133
|
+
var external_data = {{{ makeGetValue('metaPtr', POINTER_SIZE, '*') }}};
|
|
1134
|
+
var byte_length = {{{ makeGetValue('metaPtr', POINTER_SIZE * 2, '*') }}};
|
|
1135
|
+
var finalize_cb = {{{ makeGetValue('metaPtr', POINTER_SIZE * 3, '*') }}};
|
|
1136
|
+
var finalize_data = {{{ makeGetValue('metaPtr', POINTER_SIZE * 4, '*') }}};
|
|
1137
|
+
var finalize_hint = {{{ makeGetValue('metaPtr', POINTER_SIZE * 5, '*') }}};
|
|
1138
|
+
return { external_data: external_data, byte_length: byte_length, finalize_cb: finalize_cb, finalize_data: finalize_data, finalize_hint: finalize_hint };
|
|
1139
|
+
},
|
|
1140
|
+
release: function (metaPtr) {
|
|
1141
|
+
var oldRefcount = Atomics.sub(new Int32Array(wasmMemory.buffer, metaPtr, 1), 0, 1);
|
|
1142
|
+
if (oldRefcount === 1) {
|
|
1143
|
+
// refcount reached 0, we are the last holder
|
|
1144
|
+
var info = emnapiExternalSAB.readMeta(metaPtr);
|
|
1145
|
+
var finalize_cb = info.finalize_cb;
|
|
1146
|
+
if (finalize_cb) {
|
|
1147
|
+
var finalize_data = info.finalize_data;
|
|
1148
|
+
var finalize_hint = info.finalize_hint;
|
|
1149
|
+
{{{ makeDynCall('vpp', 'finalize_cb') }}}(finalize_data, finalize_hint);
|
|
1150
|
+
}
|
|
1151
|
+
_free({{{ to64('metaPtr') }}});
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
};
|
|
1088
1155
|
/**
|
|
1089
1156
|
* @__sig ippp
|
|
1090
1157
|
*/
|
|
@@ -2854,7 +2921,107 @@ function _emnapi_get_runtime_version(env, version) {
|
|
|
2854
2921
|
{{{ makeSetValue('version', 8, 'versions[2]', 'u32') }}};
|
|
2855
2922
|
return envObject.clearLastError();
|
|
2856
2923
|
}
|
|
2857
|
-
|
|
2924
|
+
/**
|
|
2925
|
+
* Get the handle for an external SharedArrayBuffer.
|
|
2926
|
+
* Must be called on the emnapi main thread.
|
|
2927
|
+
* @__sig ippp
|
|
2928
|
+
*/
|
|
2929
|
+
function _emnapi_get_external_sharedarraybuffer_handle(env, sharedarraybuffer, handle) {
|
|
2930
|
+
if (!env)
|
|
2931
|
+
return 1 /* napi_status.napi_invalid_arg */;
|
|
2932
|
+
// @ts-expect-error
|
|
2933
|
+
var envObject = emnapiCtx.envStore.get(env);
|
|
2934
|
+
envObject.checkGCAccess();
|
|
2935
|
+
if (!envObject.tryCatch.isEmpty())
|
|
2936
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
2937
|
+
if (!envObject.canCallIntoJs())
|
|
2938
|
+
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
|
|
2939
|
+
envObject.clearLastError();
|
|
2940
|
+
try {
|
|
2941
|
+
if (!sharedarraybuffer)
|
|
2942
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2943
|
+
if (!handle)
|
|
2944
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2945
|
+
{{{ from64('handle') }}};
|
|
2946
|
+
var jsValue = emnapiCtx.handleStore.get(sharedarraybuffer).value;
|
|
2947
|
+
if (!emnapiExternalMemory.isSharedArrayBuffer(jsValue)) {
|
|
2948
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2949
|
+
}
|
|
2950
|
+
var metaPtr = emnapiExternalSAB.handleTable.get(jsValue);
|
|
2951
|
+
if (metaPtr === undefined) {
|
|
2952
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
2953
|
+
}
|
|
2954
|
+
{{{ makeSetValue('handle', 0, 'metaPtr', '*') }}};
|
|
2955
|
+
return envObject.getReturnStatus();
|
|
2956
|
+
}
|
|
2957
|
+
catch (err) {
|
|
2958
|
+
envObject.tryCatch.setError(err);
|
|
2959
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
/**
|
|
2963
|
+
* Acquire a reference to an external SharedArrayBuffer.
|
|
2964
|
+
* Can be called on any thread.
|
|
2965
|
+
* @__sig vp
|
|
2966
|
+
*/
|
|
2967
|
+
function _emnapi_acquire_external_sharedarraybuffer(handle) {
|
|
2968
|
+
{{{ from64('handle') }}};
|
|
2969
|
+
Atomics.add(new Int32Array(wasmMemory.buffer, handle, 1), 0, 1);
|
|
2970
|
+
}
|
|
2971
|
+
/**
|
|
2972
|
+
* Release a reference to an external SharedArrayBuffer.
|
|
2973
|
+
* Can be called on any thread.
|
|
2974
|
+
* @__sig vp
|
|
2975
|
+
*/
|
|
2976
|
+
function _emnapi_release_external_sharedarraybuffer(handle) {
|
|
2977
|
+
{{{ from64('handle') }}};
|
|
2978
|
+
emnapiExternalSAB.release(handle);
|
|
2979
|
+
}
|
|
2980
|
+
/**
|
|
2981
|
+
* Acquire a reference to an external SharedArrayBuffer on the current thread.
|
|
2982
|
+
* Can be called on any thread. Increments refcount and registers in
|
|
2983
|
+
* the current thread's FinalizationRegistry.
|
|
2984
|
+
* Exposed as Module.emnapiAcquireExternalSharedArrayBuffer (emscripten) or
|
|
2985
|
+
* napiModule.emnapi.acquireExternalSharedArrayBuffer (core).
|
|
2986
|
+
*/
|
|
2987
|
+
function emnapiAcquireExternalSharedArrayBuffer(handle, sab) {
|
|
2988
|
+
if (sab != null && !emnapiExternalMemory.isSharedArrayBuffer(sab)) {
|
|
2989
|
+
throw new TypeError('Expected a SharedArrayBuffer');
|
|
2990
|
+
}
|
|
2991
|
+
if (!emnapiExternalSAB.registry) {
|
|
2992
|
+
throw new Error('FinalizationRegistry is not supported in this environment');
|
|
2993
|
+
}
|
|
2994
|
+
{{{ from64('handle') }}};
|
|
2995
|
+
var meta = emnapiExternalSAB.readMeta(handle);
|
|
2996
|
+
// eslint-disable-next-line prefer-const
|
|
2997
|
+
var external_data = meta.external_data;
|
|
2998
|
+
{{{ from64('external_data') }}};
|
|
2999
|
+
if (sab == null) {
|
|
3000
|
+
sab = new SharedArrayBuffer(meta.byte_length);
|
|
3001
|
+
new Uint8Array(sab).set(new Uint8Array(wasmMemory.buffer, external_data, meta.byte_length));
|
|
3002
|
+
}
|
|
3003
|
+
else {
|
|
3004
|
+
if (emnapiExternalSAB.handleTable.has(sab)) {
|
|
3005
|
+
return sab;
|
|
3006
|
+
}
|
|
3007
|
+
}
|
|
3008
|
+
// Increment refcount atomically
|
|
3009
|
+
Atomics.add(new Int32Array(wasmMemory.buffer, handle, 1), 0, 1);
|
|
3010
|
+
// Register in emnapiExternalMemory.table for emnapi_sync_memory support
|
|
3011
|
+
if (!emnapiExternalMemory.table.has(sab)) {
|
|
3012
|
+
if (external_data) {
|
|
3013
|
+
emnapiExternalMemory.table.set(sab, {
|
|
3014
|
+
address: external_data,
|
|
3015
|
+
ownership: 1 /* ReferenceOwnership.kUserland */,
|
|
3016
|
+
runtimeAllocated: 0
|
|
3017
|
+
});
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
// Register in handleTable and FinalizationRegistry for this thread
|
|
3021
|
+
emnapiExternalSAB.handleTable.set(sab, handle);
|
|
3022
|
+
emnapiExternalSAB.registry.register(sab, handle);
|
|
3023
|
+
return sab;
|
|
3024
|
+
}
|
|
2858
3025
|
// emnapiImplementHelper('$emnapiGetMemoryAddress', undefined, emnapiGetMemoryAddress, ['$emnapiExternalMemory'], 'getMemoryAddress')
|
|
2859
3026
|
/**
|
|
2860
3027
|
* @__sig ipp
|
|
@@ -3101,6 +3268,64 @@ function _napi_create_external_arraybuffer(env, external_data, byte_length, fina
|
|
|
3101
3268
|
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3102
3269
|
}
|
|
3103
3270
|
}
|
|
3271
|
+
/**
|
|
3272
|
+
* @__sig ipppppp
|
|
3273
|
+
*/
|
|
3274
|
+
function _node_api_create_external_sharedarraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) {
|
|
3275
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
3276
|
+
var value;
|
|
3277
|
+
if (!env)
|
|
3278
|
+
return 1 /* napi_status.napi_invalid_arg */;
|
|
3279
|
+
// @ts-expect-error
|
|
3280
|
+
var envObject = emnapiCtx.envStore.get(env);
|
|
3281
|
+
envObject.checkGCAccess();
|
|
3282
|
+
if (!envObject.tryCatch.isEmpty())
|
|
3283
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3284
|
+
if (!envObject.canCallIntoJs())
|
|
3285
|
+
return envObject.setLastError(envObject.moduleApiVersion >= 10 ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */);
|
|
3286
|
+
envObject.clearLastError();
|
|
3287
|
+
try {
|
|
3288
|
+
if (!result)
|
|
3289
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3290
|
+
{{{ from64('byte_length') }}};
|
|
3291
|
+
{{{ from64('external_data') }}};
|
|
3292
|
+
{{{ from64('result') }}};
|
|
3293
|
+
byte_length = byte_length >>> 0;
|
|
3294
|
+
if (!external_data) {
|
|
3295
|
+
byte_length = 0;
|
|
3296
|
+
}
|
|
3297
|
+
if ((external_data + byte_length) > wasmMemory.buffer.byteLength) {
|
|
3298
|
+
throw new RangeError('Memory out of range');
|
|
3299
|
+
}
|
|
3300
|
+
if (!emnapiExternalSAB.registry && finalize_cb) {
|
|
3301
|
+
throw emnapiCtx.createNotSupportWeakRefError('node_api_create_external_sharedarraybuffer', 'Parameter "finalize_cb" must be 0(NULL)');
|
|
3302
|
+
}
|
|
3303
|
+
var sharedArrayBuffer = new SharedArrayBuffer(byte_length);
|
|
3304
|
+
if (byte_length !== 0) {
|
|
3305
|
+
var u8arr = new Uint8Array(sharedArrayBuffer);
|
|
3306
|
+
u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length));
|
|
3307
|
+
emnapiExternalMemory.table.set(sharedArrayBuffer, {
|
|
3308
|
+
address: external_data,
|
|
3309
|
+
ownership: 1 /* ReferenceOwnership.kUserland */,
|
|
3310
|
+
runtimeAllocated: 0
|
|
3311
|
+
});
|
|
3312
|
+
}
|
|
3313
|
+
value = emnapiCtx.addToCurrentScope(sharedArrayBuffer).id;
|
|
3314
|
+
if (finalize_cb) {
|
|
3315
|
+
{{{ from64('finalize_cb') }}};
|
|
3316
|
+
{{{ from64('finalize_hint') }}};
|
|
3317
|
+
var metaPtr = emnapiExternalSAB.allocMeta(external_data, byte_length, finalize_cb, external_data, finalize_hint);
|
|
3318
|
+
emnapiExternalSAB.handleTable.set(sharedArrayBuffer, metaPtr);
|
|
3319
|
+
emnapiExternalSAB.registry.register(sharedArrayBuffer, metaPtr);
|
|
3320
|
+
}
|
|
3321
|
+
{{{ makeSetValue('result', 0, 'value', '*') }}};
|
|
3322
|
+
return envObject.getReturnStatus();
|
|
3323
|
+
}
|
|
3324
|
+
catch (err) {
|
|
3325
|
+
envObject.tryCatch.setError(err);
|
|
3326
|
+
return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
|
|
3327
|
+
}
|
|
3328
|
+
}
|
|
3104
3329
|
/**
|
|
3105
3330
|
* @__sig ipp
|
|
3106
3331
|
*/
|
|
@@ -3218,9 +3443,6 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3218
3443
|
if (!result)
|
|
3219
3444
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3220
3445
|
var handle = emnapiCtx.handleStore.get(arraybuffer);
|
|
3221
|
-
if (!handle.isArrayBuffer()) {
|
|
3222
|
-
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3223
|
-
}
|
|
3224
3446
|
var buffer = handle.value;
|
|
3225
3447
|
{{{ from64('byte_offset') }}};
|
|
3226
3448
|
{{{ from64('length') }}};
|
|
@@ -3260,36 +3482,41 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
|
|
|
3260
3482
|
{{{ makeSetValue('result', 0, 'value', '*') }}};
|
|
3261
3483
|
return envObject.getReturnStatus();
|
|
3262
3484
|
};
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3485
|
+
if (buffer instanceof ArrayBuffer || emnapiExternalMemory.isSharedArrayBuffer(buffer)) {
|
|
3486
|
+
switch (type) {
|
|
3487
|
+
case 0 /* napi_typedarray_type.napi_int8_array */:
|
|
3488
|
+
return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);
|
|
3489
|
+
case 1 /* napi_typedarray_type.napi_uint8_array */:
|
|
3490
|
+
return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);
|
|
3491
|
+
case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:
|
|
3492
|
+
return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);
|
|
3493
|
+
case 3 /* napi_typedarray_type.napi_int16_array */:
|
|
3494
|
+
return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);
|
|
3495
|
+
case 4 /* napi_typedarray_type.napi_uint16_array */:
|
|
3496
|
+
return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);
|
|
3497
|
+
case 5 /* napi_typedarray_type.napi_int32_array */:
|
|
3498
|
+
return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);
|
|
3499
|
+
case 6 /* napi_typedarray_type.napi_uint32_array */:
|
|
3500
|
+
return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);
|
|
3501
|
+
case 7 /* napi_typedarray_type.napi_float32_array */:
|
|
3502
|
+
return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);
|
|
3503
|
+
case 8 /* napi_typedarray_type.napi_float64_array */:
|
|
3504
|
+
return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);
|
|
3505
|
+
case 9 /* napi_typedarray_type.napi_bigint64_array */:
|
|
3506
|
+
return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
|
|
3507
|
+
case 10 /* napi_typedarray_type.napi_biguint64_array */:
|
|
3508
|
+
return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
|
|
3509
|
+
case 11 /* napi_typedarray_type.napi_float16_array */:
|
|
3510
|
+
if (typeof Float16Array !== 'function') {
|
|
3511
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3512
|
+
}
|
|
3513
|
+
return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);
|
|
3514
|
+
default:
|
|
3288
3515
|
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3516
|
+
}
|
|
3517
|
+
}
|
|
3518
|
+
else {
|
|
3519
|
+
return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
|
|
3293
3520
|
}
|
|
3294
3521
|
}
|
|
3295
3522
|
catch (err) {
|
|
@@ -5609,7 +5836,7 @@ var emnapiTSFN = {
|
|
|
5609
5836
|
emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;
|
|
5610
5837
|
if (typeof PThread !== 'undefined') {
|
|
5611
5838
|
PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
|
|
5612
|
-
PThread.
|
|
5839
|
+
Object.values(PThread.pthreads).forEach(emnapiTSFN.addListener);
|
|
5613
5840
|
var __original_getNewWorker_1 = PThread.getNewWorker;
|
|
5614
5841
|
PThread.getNewWorker = function () {
|
|
5615
5842
|
var r = __original_getNewWorker_1.apply(this, arguments);
|
|
@@ -6999,14 +7226,18 @@ function _napi_get_version(env, result) {
|
|
|
6999
7226
|
return envObject.clearLastError();
|
|
7000
7227
|
}
|
|
7001
7228
|
(typeof addToLibrary === "function" ? addToLibrary : (...args) => mergeInto(LibraryManager.library, ...args))({
|
|
7002
|
-
$emnapiAddSendListener: emnapiAddSendListener,
|
|
7003
|
-
$emnapiAddSendListener__deps: ["$PThread"],
|
|
7004
|
-
$emnapiAddSendListener__postset: "PThread.unusedWorkers.forEach(emnapiAddSendListener);\nPThread.runningWorkers.forEach(emnapiAddSendListener);\n(function () {\n var __original_getNewWorker = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker.apply(this, arguments);\n emnapiAddSendListener(r);\n return r;\n };\n})();",
|
|
7005
|
-
$emnapiAsyncWorkPoolSize: "0",
|
|
7006
7229
|
$emnapiCtx: "undefined",
|
|
7007
7230
|
$emnapiExternalMemory: emnapiExternalMemory,
|
|
7008
7231
|
$emnapiExternalMemory__deps: ["$emnapiCtx", "malloc", "free"],
|
|
7009
7232
|
$emnapiExternalMemory__postset: "emnapiExternalMemory.init();",
|
|
7233
|
+
$emnapiExternalSAB: emnapiExternalSAB,
|
|
7234
|
+
$emnapiExternalSAB__postset: "emnapiExternalSAB.init();",
|
|
7235
|
+
$emnapiAcquireExternalSharedArrayBuffer: emnapiAcquireExternalSharedArrayBuffer,
|
|
7236
|
+
$emnapiAcquireExternalSharedArrayBuffer__deps: ["$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7237
|
+
$emnapiAddSendListener: emnapiAddSendListener,
|
|
7238
|
+
$emnapiAddSendListener__deps: ["$PThread"],
|
|
7239
|
+
$emnapiAddSendListener__postset: "PThread.unusedWorkers.forEach(emnapiAddSendListener);\nObject.values(PThread.pthreads).forEach(emnapiAddSendListener);\n(function () {\n var __original_getNewWorker = PThread.getNewWorker;\n PThread.getNewWorker = function () {\n var r = __original_getNewWorker.apply(this, arguments);\n emnapiAddSendListener(r);\n return r;\n };\n})();",
|
|
7240
|
+
$emnapiAsyncWorkPoolSize: "0",
|
|
7010
7241
|
$emnapiGetMemoryAddress: emnapiGetMemoryAddress,
|
|
7011
7242
|
$emnapiGetMemoryAddress__deps: ["$emnapiExternalMemory"],
|
|
7012
7243
|
$emnapiModule: emnapiModule,
|
|
@@ -7105,6 +7336,8 @@ function _napi_get_version(env, result) {
|
|
|
7105
7336
|
_emnapi_worker_unref: __emnapi_worker_unref,
|
|
7106
7337
|
_emnapi_worker_unref__deps: ["$PThread"],
|
|
7107
7338
|
_emnapi_worker_unref__sig: "vp",
|
|
7339
|
+
emnapi_acquire_external_sharedarraybuffer: _emnapi_acquire_external_sharedarraybuffer,
|
|
7340
|
+
emnapi_acquire_external_sharedarraybuffer__sig: "vp",
|
|
7108
7341
|
$emnapiGetHandle: emnapiGetHandle,
|
|
7109
7342
|
$emnapiGetHandle__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7110
7343
|
napi_add_finalizer: _napi_add_finalizer,
|
|
@@ -7113,6 +7346,9 @@ function _napi_get_version(env, result) {
|
|
|
7113
7346
|
emnapi_create_memory_view: _emnapi_create_memory_view,
|
|
7114
7347
|
emnapi_create_memory_view__deps: ["$emnapiCtx", "$emnapiExternalMemory", "napi_add_finalizer"],
|
|
7115
7348
|
emnapi_create_memory_view__sig: "ipippppp",
|
|
7349
|
+
emnapi_get_external_sharedarraybuffer_handle: _emnapi_get_external_sharedarraybuffer_handle,
|
|
7350
|
+
emnapi_get_external_sharedarraybuffer_handle__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiExternalSAB"],
|
|
7351
|
+
emnapi_get_external_sharedarraybuffer_handle__sig: "ippp",
|
|
7116
7352
|
emnapi_get_memory_address: _emnapi_get_memory_address,
|
|
7117
7353
|
emnapi_get_memory_address__deps: ["$emnapiCtx", "$emnapiGetMemoryAddress"],
|
|
7118
7354
|
emnapi_get_memory_address__sig: "ipppp",
|
|
@@ -7134,6 +7370,9 @@ function _napi_get_version(env, result) {
|
|
|
7134
7370
|
emnapi_is_support_weakref: _emnapi_is_support_weakref,
|
|
7135
7371
|
emnapi_is_support_weakref__deps: ["$emnapiCtx"],
|
|
7136
7372
|
emnapi_is_support_weakref__sig: "i",
|
|
7373
|
+
emnapi_release_external_sharedarraybuffer: _emnapi_release_external_sharedarraybuffer,
|
|
7374
|
+
emnapi_release_external_sharedarraybuffer__deps: ["$emnapiExternalSAB"],
|
|
7375
|
+
emnapi_release_external_sharedarraybuffer__sig: "vp",
|
|
7137
7376
|
emnapi_sync_memory: _emnapi_sync_memory,
|
|
7138
7377
|
emnapi_sync_memory__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiSyncMemory"],
|
|
7139
7378
|
emnapi_sync_memory__sig: "ipippp",
|
|
@@ -7566,6 +7805,9 @@ function _napi_get_version(env, result) {
|
|
|
7566
7805
|
node_api_create_buffer_from_arraybuffer: _node_api_create_buffer_from_arraybuffer,
|
|
7567
7806
|
node_api_create_buffer_from_arraybuffer__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
|
|
7568
7807
|
node_api_create_buffer_from_arraybuffer__sig: "ippppp",
|
|
7808
|
+
node_api_create_external_sharedarraybuffer: _node_api_create_external_sharedarraybuffer,
|
|
7809
|
+
node_api_create_external_sharedarraybuffer__deps: ["$emnapiCtx", "$emnapiExternalSAB", "$emnapiExternalMemory"],
|
|
7810
|
+
node_api_create_external_sharedarraybuffer__sig: "ipppppp",
|
|
7569
7811
|
node_api_create_external_string_latin1: _node_api_create_external_string_latin1,
|
|
7570
7812
|
node_api_create_external_string_latin1__deps: ["$emnapiString", "napi_create_string_latin1"],
|
|
7571
7813
|
node_api_create_external_string_latin1__sig: "ippppppp",
|
package/include/node/emnapi.h
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
#include "emnapi_common.h"
|
|
7
7
|
|
|
8
8
|
#define EMNAPI_MAJOR_VERSION 1
|
|
9
|
-
#define EMNAPI_MINOR_VERSION
|
|
9
|
+
#define EMNAPI_MINOR_VERSION 11
|
|
10
10
|
#define EMNAPI_PATCH_VERSION 0
|
|
11
11
|
|
|
12
12
|
typedef enum {
|
|
@@ -82,6 +82,31 @@ napi_status emnapi_get_memory_address(napi_env env,
|
|
|
82
82
|
emnapi_ownership* ownership,
|
|
83
83
|
bool* runtime_allocated);
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Get the handle for an external SharedArrayBuffer.
|
|
87
|
+
* This function must be called on the emnapi main thread.
|
|
88
|
+
*/
|
|
89
|
+
EMNAPI_EXTERN
|
|
90
|
+
napi_status emnapi_get_external_sharedarraybuffer_handle(
|
|
91
|
+
napi_env env,
|
|
92
|
+
napi_value sharedarraybuffer,
|
|
93
|
+
void** handle);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Acquire a reference to an external SharedArrayBuffer handle.
|
|
97
|
+
* This function may be called from any thread.
|
|
98
|
+
*/
|
|
99
|
+
EMNAPI_EXTERN
|
|
100
|
+
void emnapi_acquire_external_sharedarraybuffer(void* handle);
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Release a reference to an external SharedArrayBuffer handle.
|
|
104
|
+
* When the refcount reaches zero, finalize_cb is invoked.
|
|
105
|
+
* This function may be called from any thread.
|
|
106
|
+
*/
|
|
107
|
+
EMNAPI_EXTERN
|
|
108
|
+
void emnapi_release_external_sharedarraybuffer(void* handle);
|
|
109
|
+
|
|
85
110
|
EXTERN_C_END
|
|
86
111
|
|
|
87
112
|
#endif
|
|
@@ -443,6 +443,16 @@ napi_create_external_arraybuffer(napi_env env,
|
|
|
443
443
|
node_api_basic_finalize finalize_cb,
|
|
444
444
|
void* finalize_hint,
|
|
445
445
|
napi_value* result);
|
|
446
|
+
#ifdef NAPI_EXPERIMENTAL
|
|
447
|
+
#define NODE_API_EXPERIMENTAL_HAS_CREATE_EXTERNAL_SHAREDARRAYBUFFER
|
|
448
|
+
NAPI_EXTERN napi_status NAPI_CDECL
|
|
449
|
+
node_api_create_external_sharedarraybuffer(napi_env env,
|
|
450
|
+
void* external_data,
|
|
451
|
+
size_t byte_length,
|
|
452
|
+
node_api_noenv_finalize finalize_cb,
|
|
453
|
+
void* finalize_hint,
|
|
454
|
+
napi_value* result);
|
|
455
|
+
#endif // NAPI_EXPERIMENTAL
|
|
446
456
|
#endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
|
|
447
457
|
NAPI_EXTERN napi_status NAPI_CDECL napi_get_arraybuffer_info(
|
|
448
458
|
napi_env env, napi_value arraybuffer, void** data, size_t* byte_length);
|
|
@@ -188,6 +188,10 @@ typedef void(NAPI_CDECL* node_api_nogc_finalize)(node_api_nogc_env env,
|
|
|
188
188
|
#endif
|
|
189
189
|
typedef node_api_nogc_finalize node_api_basic_finalize;
|
|
190
190
|
|
|
191
|
+
// A finalizer that can be called from any thread and at any time.
|
|
192
|
+
typedef void(NAPI_CDECL* node_api_noenv_finalize)(void* finalize_data,
|
|
193
|
+
void* finalize_hint);
|
|
194
|
+
|
|
191
195
|
typedef struct {
|
|
192
196
|
// One of utf8name or name should be NULL.
|
|
193
197
|
const char* utf8name;
|