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.
@@ -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$1 = emnapiModule.exports;
56
+ var exports = emnapiModule.exports;
57
57
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
- var exportsHandle = scope.add(exports$1);
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$1 : emnapiCtx.handleStore.get(napiValue).value;
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.runningWorkers.forEach(emnapiAddSendListener);
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
- // emnapiImplementHelper('$emnapiSyncMemory', undefined, emnapiSyncMemory, ['$emnapiExternalMemory'], 'syncMemory')
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
- switch (type) {
3264
- case 0 /* napi_typedarray_type.napi_int8_array */:
3265
- return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);
3266
- case 1 /* napi_typedarray_type.napi_uint8_array */:
3267
- return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);
3268
- case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:
3269
- return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);
3270
- case 3 /* napi_typedarray_type.napi_int16_array */:
3271
- return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);
3272
- case 4 /* napi_typedarray_type.napi_uint16_array */:
3273
- return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);
3274
- case 5 /* napi_typedarray_type.napi_int32_array */:
3275
- return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);
3276
- case 6 /* napi_typedarray_type.napi_uint32_array */:
3277
- return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);
3278
- case 7 /* napi_typedarray_type.napi_float32_array */:
3279
- return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);
3280
- case 8 /* napi_typedarray_type.napi_float64_array */:
3281
- return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);
3282
- case 9 /* napi_typedarray_type.napi_bigint64_array */:
3283
- return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
3284
- case 10 /* napi_typedarray_type.napi_biguint64_array */:
3285
- return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
3286
- case 11 /* napi_typedarray_type.napi_float16_array */:
3287
- if (typeof Float16Array !== 'function') {
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
- return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);
3291
- default:
3292
- return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
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.runningWorkers.forEach(emnapiTSFN.addListener);
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",
@@ -6,7 +6,7 @@
6
6
  #include "emnapi_common.h"
7
7
 
8
8
  #define EMNAPI_MAJOR_VERSION 1
9
- #define EMNAPI_MINOR_VERSION 10
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emnapi",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "Node-API implementation for Emscripten",
5
5
  "main": "index.js",
6
6
  "gypfile": false,