emnapi 1.9.2 → 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.
Files changed (36) hide show
  1. package/dist/library_napi.js +392 -82
  2. package/include/node/emnapi.h +27 -2
  3. package/include/node/js_native_api.h +10 -0
  4. package/include/node/js_native_api_types.h +4 -0
  5. package/lib/wasm32/libdlmalloc-mt.a +0 -0
  6. package/lib/wasm32/libdlmalloc.a +0 -0
  7. package/lib/wasm32/libemmalloc-mt.a +0 -0
  8. package/lib/wasm32/libemmalloc.a +0 -0
  9. package/lib/wasm32/libemnapi-basic-mt.a +0 -0
  10. package/lib/wasm32/libemnapi-basic.a +0 -0
  11. package/lib/wasm32/libemnapi.a +0 -0
  12. package/lib/wasm32-emscripten/libemnapi-basic.a +0 -0
  13. package/lib/wasm32-emscripten/libemnapi-mt.a +0 -0
  14. package/lib/wasm32-emscripten/libemnapi.a +0 -0
  15. package/lib/wasm32-wasi/libemnapi-basic-mt.a +0 -0
  16. package/lib/wasm32-wasi/libemnapi-basic.a +0 -0
  17. package/lib/wasm32-wasi/libemnapi.a +0 -0
  18. package/lib/wasm32-wasi-threads/libemnapi-basic-mt.a +0 -0
  19. package/lib/wasm32-wasi-threads/libemnapi-basic-napi-rs-mt.a +0 -0
  20. package/lib/wasm32-wasi-threads/libemnapi-basic.a +0 -0
  21. package/lib/wasm32-wasi-threads/libemnapi-mt.a +0 -0
  22. package/lib/wasm32-wasi-threads/libemnapi-napi-rs-mt.a +0 -0
  23. package/lib/wasm32-wasi-threads/libemnapi.a +0 -0
  24. package/lib/wasm32-wasip1/libemnapi-basic-mt.a +0 -0
  25. package/lib/wasm32-wasip1/libemnapi-basic.a +0 -0
  26. package/lib/wasm32-wasip1/libemnapi.a +0 -0
  27. package/lib/wasm32-wasip1-threads/libemnapi-basic-mt.a +0 -0
  28. package/lib/wasm32-wasip1-threads/libemnapi-basic-napi-rs-mt.a +0 -0
  29. package/lib/wasm32-wasip1-threads/libemnapi-basic.a +0 -0
  30. package/lib/wasm32-wasip1-threads/libemnapi-mt.a +0 -0
  31. package/lib/wasm32-wasip1-threads/libemnapi-napi-rs-mt.a +0 -0
  32. package/lib/wasm32-wasip1-threads/libemnapi.a +0 -0
  33. package/lib/wasm64-emscripten/libemnapi-basic.a +0 -0
  34. package/lib/wasm64-emscripten/libemnapi-mt.a +0 -0
  35. package/lib/wasm64-emscripten/libemnapi.a +0 -0
  36. package/package.json +1 -1
@@ -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) {
@@ -236,8 +236,8 @@ function __emnapi_close_handle_scope(_scope) {
236
236
  /* eslint-disable @typescript-eslint/indent */
237
237
  /* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */
238
238
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
239
+ /* eslint-disable @typescript-eslint/indent */
239
240
  /**
240
- * @__deps emscripten_resize_heap
241
241
  * @__sig ipjp
242
242
  */
243
243
  function _napi_adjust_external_memory(env, low, high, adjusted_value) {
@@ -248,33 +248,24 @@ function _napi_adjust_external_memory(env, low, high, adjusted_value) {
248
248
  #if WASM_BIGINT
249
249
  if (!high)
250
250
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
251
- change_in_bytes = Number(low);
251
+ change_in_bytes = BigInt(low);
252
252
  #else
253
253
  if (!adjusted_value)
254
254
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
255
- change_in_bytes = (low >>> 0) + (high * Math.pow(2, 32));
255
+ change_in_bytes = BigInt(low >>> 0) + (BigInt(high) << BigInt(32));
256
256
  #endif
257
- if (change_in_bytes < 0) {
258
- return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
259
- }
260
- if (change_in_bytes > 0) {
261
- var old_size = wasmMemory.buffer.byteLength;
262
- var new_size = old_size + change_in_bytes;
263
- if (!_emscripten_resize_heap(new_size)) {
264
- return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
265
- }
266
- }
257
+ var adjusted_memory = emnapiCtx.adjustAmountOfExternalAllocatedMemory(change_in_bytes);
267
258
  #if WASM_BIGINT
268
259
  {{{ from64('high') }}};
269
260
  if (emnapiCtx.feature.supportBigInt) {
270
- {{{ makeSetValue('high', 0, 'wasmMemory.buffer.byteLength', 'i64') }}};
261
+ {{{ makeSetValue('high', 0, 'adjusted_memory', 'i64') }}};
271
262
  }
272
263
  else {
273
- emnapiSetValueI64(high, wasmMemory.buffer.byteLength);
264
+ emnapiSetValueI64(high, Number(adjusted_memory));
274
265
  }
275
266
  #else
276
267
  {{{ from64('adjusted_value') }}};
277
- {{{ makeSetValue('adjusted_value', 0, 'wasmMemory.buffer.byteLength', 'i64') }}};
268
+ {{{ makeSetValue('adjusted_value', 0, 'adjusted_memory', 'i64') }}};
278
269
  #endif
279
270
  return envObject.clearLastError();
280
271
  }
@@ -308,7 +299,7 @@ function __emnapi_worker_unref(pid) {
308
299
  * @__postset
309
300
  * ```
310
301
  * PThread.unusedWorkers.forEach(emnapiAddSendListener);
311
- * PThread.runningWorkers.forEach(emnapiAddSendListener);
302
+ * Object.values(PThread.pthreads).forEach(emnapiAddSendListener);
312
303
  * (function () {
313
304
  * var __original_getNewWorker = PThread.getNewWorker;
314
305
  * PThread.getNewWorker = function () {
@@ -1064,8 +1055,7 @@ var emnapiExternalMemory = {
1064
1055
  }
1065
1056
  return view;
1066
1057
  }
1067
- var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) ||
1068
- ((typeof SharedArrayBuffer === 'function') && (view.buffer instanceof SharedArrayBuffer));
1058
+ var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || emnapiExternalMemory.isSharedArrayBuffer(view.buffer);
1069
1059
  if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) {
1070
1060
  var info = emnapiExternalMemory.wasmMemoryViewTable.get(view);
1071
1061
  var Ctor = info.Ctor;
@@ -1095,6 +1085,73 @@ var emnapiExternalMemory = {
1095
1085
  return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view };
1096
1086
  }
1097
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
+ };
1098
1155
  /**
1099
1156
  * @__sig ippp
1100
1157
  */
@@ -1296,13 +1353,12 @@ function _napi_get_typedarray_info(env, typedarray, type, length, data, arraybuf
1296
1353
  }
1297
1354
  {{{ makeSetValue('type', 0, 't', 'i32') }}};
1298
1355
  }
1356
+ v = emnapiExternalMemory.getOrUpdateMemoryView(v);
1299
1357
  if (length) {
1300
1358
  {{{ from64('length') }}};
1301
1359
  {{{ makeSetValue('length', 0, 'v.length', SIZE_TYPE) }}};
1302
1360
  }
1303
- var buffer;
1304
1361
  if (data || arraybuffer) {
1305
- buffer = v.buffer;
1306
1362
  if (data) {
1307
1363
  {{{ from64('data') }}};
1308
1364
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -1312,7 +1368,7 @@ function _napi_get_typedarray_info(env, typedarray, type, length, data, arraybuf
1312
1368
  if (arraybuffer) {
1313
1369
  {{{ from64('arraybuffer') }}};
1314
1370
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1315
- var ab = envObject.ensureHandleId(buffer);
1371
+ var ab = envObject.ensureHandleId(v.buffer);
1316
1372
  {{{ makeSetValue('arraybuffer', 0, 'ab', '*') }}};
1317
1373
  }
1318
1374
  }
@@ -1356,14 +1412,12 @@ function _napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer,
1356
1412
  if (!handle.isDataView()) {
1357
1413
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
1358
1414
  }
1359
- var v = handle.value;
1415
+ var v = emnapiExternalMemory.getOrUpdateMemoryView(handle.value);
1360
1416
  if (byte_length) {
1361
1417
  {{{ from64('byte_length') }}};
1362
1418
  {{{ makeSetValue('byte_length', 0, 'v.byteLength', SIZE_TYPE) }}};
1363
1419
  }
1364
- var buffer;
1365
1420
  if (data || arraybuffer) {
1366
- buffer = v.buffer;
1367
1421
  if (data) {
1368
1422
  {{{ from64('data') }}};
1369
1423
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -1373,7 +1427,7 @@ function _napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer,
1373
1427
  if (arraybuffer) {
1374
1428
  {{{ from64('arraybuffer') }}};
1375
1429
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1376
- var ab = envObject.ensureHandleId(buffer);
1430
+ var ab = envObject.ensureHandleId(v.buffer);
1377
1431
  {{{ makeSetValue('arraybuffer', 0, 'ab', '*') }}};
1378
1432
  }
1379
1433
  }
@@ -2867,7 +2921,107 @@ function _emnapi_get_runtime_version(env, version) {
2867
2921
  {{{ makeSetValue('version', 8, 'versions[2]', 'u32') }}};
2868
2922
  return envObject.clearLastError();
2869
2923
  }
2870
- // 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
+ }
2871
3025
  // emnapiImplementHelper('$emnapiGetMemoryAddress', undefined, emnapiGetMemoryAddress, ['$emnapiExternalMemory'], 'getMemoryAddress')
2872
3026
  /**
2873
3027
  * @__sig ipp
@@ -3114,6 +3268,64 @@ function _napi_create_external_arraybuffer(env, external_data, byte_length, fina
3114
3268
  return envObject.setLastError(10 /* napi_status.napi_pending_exception */);
3115
3269
  }
3116
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
+ }
3117
3329
  /**
3118
3330
  * @__sig ipp
3119
3331
  */
@@ -3231,9 +3443,6 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
3231
3443
  if (!result)
3232
3444
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3233
3445
  var handle = emnapiCtx.handleStore.get(arraybuffer);
3234
- if (!handle.isArrayBuffer()) {
3235
- return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3236
- }
3237
3446
  var buffer = handle.value;
3238
3447
  {{{ from64('byte_offset') }}};
3239
3448
  {{{ from64('length') }}};
@@ -3273,36 +3482,41 @@ function _napi_create_typedarray(env, type, length, arraybuffer, byte_offset, re
3273
3482
  {{{ makeSetValue('result', 0, 'value', '*') }}};
3274
3483
  return envObject.getReturnStatus();
3275
3484
  };
3276
- switch (type) {
3277
- case 0 /* napi_typedarray_type.napi_int8_array */:
3278
- return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length);
3279
- case 1 /* napi_typedarray_type.napi_uint8_array */:
3280
- return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length);
3281
- case 2 /* napi_typedarray_type.napi_uint8_clamped_array */:
3282
- return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length);
3283
- case 3 /* napi_typedarray_type.napi_int16_array */:
3284
- return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length);
3285
- case 4 /* napi_typedarray_type.napi_uint16_array */:
3286
- return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length);
3287
- case 5 /* napi_typedarray_type.napi_int32_array */:
3288
- return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length);
3289
- case 6 /* napi_typedarray_type.napi_uint32_array */:
3290
- return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length);
3291
- case 7 /* napi_typedarray_type.napi_float32_array */:
3292
- return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length);
3293
- case 8 /* napi_typedarray_type.napi_float64_array */:
3294
- return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length);
3295
- case 9 /* napi_typedarray_type.napi_bigint64_array */:
3296
- return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length);
3297
- case 10 /* napi_typedarray_type.napi_biguint64_array */:
3298
- return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length);
3299
- case 11 /* napi_typedarray_type.napi_float16_array */:
3300
- 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:
3301
3515
  return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3302
- }
3303
- return createTypedArray(envObject, Float16Array, 2, buffer, byte_offset, length);
3304
- default:
3305
- return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3516
+ }
3517
+ }
3518
+ else {
3519
+ return envObject.setLastError(1 /* napi_status.napi_invalid_arg */);
3306
3520
  }
3307
3521
  }
3308
3522
  catch (err) {
@@ -5541,6 +5755,7 @@ function _napi_run_script(env, script, result) {
5541
5755
  * ```
5542
5756
  */
5543
5757
  var emnapiTSFN = {
5758
+ _liveSet: {},
5544
5759
  offset: {
5545
5760
  __size__: 0,
5546
5761
  /* napi_ref */ resource: 0,
@@ -5549,6 +5764,9 @@ var emnapiTSFN = {
5549
5764
  /* size_t */ queue_size: 0,
5550
5765
  /* bool */ is_some: 0,
5551
5766
  /* void* */ queue: 0,
5767
+ // Reuse uv_async_t storage as JS-side wakeup state: pending event + scheduled drain.
5768
+ async_pending: 0,
5769
+ async_u_fd: 0,
5552
5770
  /* size_t */ thread_count: 0,
5553
5771
  /* int32_t */ state: 0,
5554
5772
  /* atomic_uchar */ dispatch_state: 0,
@@ -5565,6 +5783,7 @@ var emnapiTSFN = {
5565
5783
  /* int32_t */ cond: 0
5566
5784
  },
5567
5785
  init: function () {
5786
+ emnapiTSFN._liveSet = new Set();
5568
5787
  #if MEMORY64
5569
5788
  emnapiTSFN.offset.__size__ = 320 /* NapiTSFNOffset64.__size__ */;
5570
5789
  emnapiTSFN.offset.resource = 0 /* NapiTSFNOffset64.async_resource_resource */;
@@ -5573,6 +5792,8 @@ var emnapiTSFN = {
5573
5792
  emnapiTSFN.offset.queue_size = 88 /* NapiTSFNOffset64.queue_size */;
5574
5793
  emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset64.async_resource_is_some */;
5575
5794
  emnapiTSFN.offset.queue = 96 /* NapiTSFNOffset64.queue */;
5795
+ emnapiTSFN.offset.async_pending = 232 /* NapiTSFNOffset64.async_pending */;
5796
+ emnapiTSFN.offset.async_u_fd = 160 /* NapiTSFNOffset64.async_u_fd */;
5576
5797
  emnapiTSFN.offset.thread_count = 240 /* NapiTSFNOffset64.thread_count */;
5577
5798
  emnapiTSFN.offset.state = 248 /* NapiTSFNOffset64.state */;
5578
5799
  emnapiTSFN.offset.dispatch_state = 252 /* NapiTSFNOffset64.dispatch_state */;
@@ -5595,6 +5816,8 @@ var emnapiTSFN = {
5595
5816
  emnapiTSFN.offset.queue_size = 60 /* NapiTSFNOffset32.queue_size */;
5596
5817
  emnapiTSFN.offset.is_some = 24 /* NapiTSFNOffset32.async_resource_is_some */;
5597
5818
  emnapiTSFN.offset.queue = 64 /* NapiTSFNOffset32.queue */;
5819
+ emnapiTSFN.offset.async_pending = 132 /* NapiTSFNOffset32.async_pending */;
5820
+ emnapiTSFN.offset.async_u_fd = 96 /* NapiTSFNOffset32.async_u_fd */;
5598
5821
  emnapiTSFN.offset.thread_count = 136 /* NapiTSFNOffset32.thread_count */;
5599
5822
  emnapiTSFN.offset.state = 140 /* NapiTSFNOffset32.state */;
5600
5823
  emnapiTSFN.offset.dispatch_state = 144 /* NapiTSFNOffset32.dispatch_state */;
@@ -5613,7 +5836,7 @@ var emnapiTSFN = {
5613
5836
  emnapiTSFN.offset.mutex = emnapiTSFN.offset.mutex + 4;
5614
5837
  if (typeof PThread !== 'undefined') {
5615
5838
  PThread.unusedWorkers.forEach(emnapiTSFN.addListener);
5616
- PThread.runningWorkers.forEach(emnapiTSFN.addListener);
5839
+ Object.values(PThread.pthreads).forEach(emnapiTSFN.addListener);
5617
5840
  var __original_getNewWorker_1 = PThread.getNewWorker;
5618
5841
  PThread.getNewWorker = function () {
5619
5842
  var r = __original_getNewWorker_1.apply(this, arguments);
@@ -5634,7 +5857,10 @@ var emnapiTSFN = {
5634
5857
  var type = __emnapi__.type;
5635
5858
  var payload = __emnapi__.payload;
5636
5859
  if (type === 'tsfn-send') {
5637
- emnapiTSFN.dispatch(payload.tsfn);
5860
+ var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;
5861
+ if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
5862
+ emnapiTSFN.enqueue(payload.tsfn);
5863
+ }
5638
5864
  }
5639
5865
  }
5640
5866
  };
@@ -5669,6 +5895,12 @@ var emnapiTSFN = {
5669
5895
  destroyQueue: function (func) {
5670
5896
  var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false);
5671
5897
  if (queue) {
5898
+ var node = emnapiTSFN.loadSizeTypeValue(queue, false);
5899
+ while (node !== 0) {
5900
+ var next = emnapiTSFN.loadSizeTypeValue(node + {{{ POINTER_SIZE }}}, false);
5901
+ _free({{{ to64('node') }}});
5902
+ node = next;
5903
+ }
5672
5904
  _free({{{ to64('queue') }}});
5673
5905
  }
5674
5906
  },
@@ -6027,6 +6259,7 @@ var emnapiTSFN = {
6027
6259
  }
6028
6260
  },
6029
6261
  destroy: function (func) {
6262
+ emnapiTSFN._liveSet.delete(func);
6030
6263
  emnapiTSFN.destroyQueue(func);
6031
6264
  emnapiTSFN.releaseResources(func);
6032
6265
  _free({{{ to64('func') }}});
@@ -6121,6 +6354,7 @@ var emnapiTSFN = {
6121
6354
  return;
6122
6355
  }
6123
6356
  emnapiTSFN.setHandlesClosing(func, 1);
6357
+ Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);
6124
6358
  emnapiCtx.feature.setImmediate(function () {
6125
6359
  emnapiTSFN.finalize(func);
6126
6360
  });
@@ -6224,25 +6458,85 @@ var emnapiTSFN = {
6224
6458
  emnapiTSFN.send(func);
6225
6459
  }
6226
6460
  },
6227
- send: function (func) {
6228
- var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2, 1 << 1);
6229
- if ((current_state & 1) === 1) {
6461
+ enqueue: function (func) {
6462
+ // `pending` means a worker thread has requested a wakeup that has not
6463
+ // been drained on the main thread yet.
6464
+ var pending = func + emnapiTSFN.offset.async_pending;
6465
+ // `scheduled` prevents queueing the same main-thread drain chain more than
6466
+ // once while a previous wakeup is still in flight.
6467
+ var scheduled = func + emnapiTSFN.offset.async_u_fd;
6468
+ var i32a = new Int32Array(wasmMemory.buffer);
6469
+ if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {
6230
6470
  return;
6231
6471
  }
6232
- if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
6233
- postMessage({
6234
- __emnapi__: {
6235
- type: 'tsfn-send',
6236
- payload: {
6237
- tsfn: func
6472
+ // Match uv_async_send-style coalescing in JS: the first turn represents
6473
+ // the wakeup reaching the main thread, and the second turn performs the
6474
+ // actual TSFN drain after nearby Send/Signal calls have had a chance to
6475
+ // collapse into the shared AsyncProgressWorker state.
6476
+ emnapiCtx.feature.setImmediate(function () {
6477
+ if (!emnapiTSFN._liveSet.has(func)) {
6478
+ return;
6479
+ }
6480
+ if (Atomics.load(i32a, pending >>> 2) === 0) {
6481
+ Atomics.store(i32a, scheduled >>> 2, 0);
6482
+ return;
6483
+ }
6484
+ emnapiCtx.feature.setImmediate(function () {
6485
+ try {
6486
+ // Consume the coalesced wakeup once, then let dispatch() observe any
6487
+ // queue mutations through dispatch_state like the C implementation.
6488
+ if (Atomics.exchange(i32a, pending >>> 2, 0) === 0) {
6489
+ return;
6490
+ }
6491
+ // After destroy(), the func address is freed. Skip dispatch
6492
+ // to avoid use-after-free (JS-side lifecycle check).
6493
+ if (!emnapiTSFN._liveSet.has(func)) {
6494
+ return;
6495
+ }
6496
+ emnapiTSFN.dispatch(func);
6497
+ }
6498
+ finally {
6499
+ // Allow a later wakeup to schedule a new drain chain. If another
6500
+ // worker-thread send raced with this drain, enqueue one more turn.
6501
+ if (emnapiTSFN._liveSet.has(func)) {
6502
+ Atomics.store(i32a, scheduled >>> 2, 0);
6503
+ if (Atomics.load(i32a, pending >>> 2) !== 0) {
6504
+ emnapiTSFN.enqueue(func);
6505
+ }
6238
6506
  }
6239
6507
  }
6240
6508
  });
6509
+ });
6510
+ },
6511
+ send: function (func) {
6512
+ var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2, 1 << 1);
6513
+ if ((current_state & 1) === 1) {
6514
+ return;
6241
6515
  }
6242
- else {
6243
- emnapiCtx.feature.setImmediate(function () {
6244
- emnapiTSFN.dispatch(func);
6245
- });
6516
+ var pendng = func + emnapiTSFN.offset.async_pending;
6517
+ // A wakeup is already pending, so this send only needs to leave the queued
6518
+ // work in the TSFN queue and let the existing drain pick it up.
6519
+ if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
6520
+ return;
6521
+ }
6522
+ if (Atomics.exchange(new Int32Array(wasmMemory.buffer), pendng >>> 2, 1) === 0) {
6523
+ if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
6524
+ // Worker threads only post a wakeup token. Main-thread draining is
6525
+ // serialized by enqueue() once the message is received.
6526
+ postMessage({
6527
+ __emnapi__: {
6528
+ type: 'tsfn-send',
6529
+ payload: {
6530
+ tsfn: func
6531
+ }
6532
+ }
6533
+ });
6534
+ }
6535
+ else {
6536
+ // On the main thread we can skip the cross-thread hop and schedule the
6537
+ // coalesced drain chain directly.
6538
+ emnapiTSFN.enqueue(func);
6539
+ }
6246
6540
  }
6247
6541
  }
6248
6542
  };
@@ -6329,6 +6623,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6329
6623
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.finalize_cb', 'thread_finalize_cb', '*') }}};
6330
6624
  {{{ makeSetValue('tsfn', 'emnapiTSFN.offset.call_js_cb', 'call_js_cb', '*') }}};
6331
6625
  emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn);
6626
+ emnapiTSFN._liveSet.add(tsfn);
6332
6627
  envObject.ref();
6333
6628
  __emnapi_runtime_keepalive_push();
6334
6629
  emnapiCtx.increaseWaitingRequestCounter();
@@ -6931,14 +7226,18 @@ function _napi_get_version(env, result) {
6931
7226
  return envObject.clearLastError();
6932
7227
  }
6933
7228
  (typeof addToLibrary === "function" ? addToLibrary : (...args) => mergeInto(LibraryManager.library, ...args))({
6934
- $emnapiAddSendListener: emnapiAddSendListener,
6935
- $emnapiAddSendListener__deps: ["$PThread"],
6936
- $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})();",
6937
- $emnapiAsyncWorkPoolSize: "0",
6938
7229
  $emnapiCtx: "undefined",
6939
7230
  $emnapiExternalMemory: emnapiExternalMemory,
6940
7231
  $emnapiExternalMemory__deps: ["$emnapiCtx", "malloc", "free"],
6941
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",
6942
7241
  $emnapiGetMemoryAddress: emnapiGetMemoryAddress,
6943
7242
  $emnapiGetMemoryAddress__deps: ["$emnapiExternalMemory"],
6944
7243
  $emnapiModule: emnapiModule,
@@ -7037,6 +7336,8 @@ function _napi_get_version(env, result) {
7037
7336
  _emnapi_worker_unref: __emnapi_worker_unref,
7038
7337
  _emnapi_worker_unref__deps: ["$PThread"],
7039
7338
  _emnapi_worker_unref__sig: "vp",
7339
+ emnapi_acquire_external_sharedarraybuffer: _emnapi_acquire_external_sharedarraybuffer,
7340
+ emnapi_acquire_external_sharedarraybuffer__sig: "vp",
7040
7341
  $emnapiGetHandle: emnapiGetHandle,
7041
7342
  $emnapiGetHandle__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
7042
7343
  napi_add_finalizer: _napi_add_finalizer,
@@ -7045,6 +7346,9 @@ function _napi_get_version(env, result) {
7045
7346
  emnapi_create_memory_view: _emnapi_create_memory_view,
7046
7347
  emnapi_create_memory_view__deps: ["$emnapiCtx", "$emnapiExternalMemory", "napi_add_finalizer"],
7047
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",
7048
7352
  emnapi_get_memory_address: _emnapi_get_memory_address,
7049
7353
  emnapi_get_memory_address__deps: ["$emnapiCtx", "$emnapiGetMemoryAddress"],
7050
7354
  emnapi_get_memory_address__sig: "ipppp",
@@ -7066,6 +7370,9 @@ function _napi_get_version(env, result) {
7066
7370
  emnapi_is_support_weakref: _emnapi_is_support_weakref,
7067
7371
  emnapi_is_support_weakref__deps: ["$emnapiCtx"],
7068
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",
7069
7376
  emnapi_sync_memory: _emnapi_sync_memory,
7070
7377
  emnapi_sync_memory__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiSyncMemory"],
7071
7378
  emnapi_sync_memory__sig: "ipippp",
@@ -7079,7 +7386,7 @@ function _napi_get_version(env, result) {
7079
7386
  napi_add_env_cleanup_hook__deps: ["$emnapiCtx"],
7080
7387
  napi_add_env_cleanup_hook__sig: "ippp",
7081
7388
  napi_adjust_external_memory: _napi_adjust_external_memory,
7082
- napi_adjust_external_memory__deps: ["$emnapiCtx", "$emnapiSetValueI64", "emscripten_resize_heap"],
7389
+ napi_adjust_external_memory__deps: ["$emnapiCtx", "$emnapiSetValueI64"],
7083
7390
  napi_adjust_external_memory__sig: "ipjp",
7084
7391
  napi_call_function: _napi_call_function,
7085
7392
  napi_call_function__deps: ["$emnapiCtx"],
@@ -7498,6 +7805,9 @@ function _napi_get_version(env, result) {
7498
7805
  node_api_create_buffer_from_arraybuffer: _node_api_create_buffer_from_arraybuffer,
7499
7806
  node_api_create_buffer_from_arraybuffer__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
7500
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",
7501
7811
  node_api_create_external_string_latin1: _node_api_create_external_string_latin1,
7502
7812
  node_api_create_external_string_latin1__deps: ["$emnapiString", "napi_create_string_latin1"],
7503
7813
  node_api_create_external_string_latin1__sig: "ippppppp",
@@ -6,8 +6,8 @@
6
6
  #include "emnapi_common.h"
7
7
 
8
8
  #define EMNAPI_MAJOR_VERSION 1
9
- #define EMNAPI_MINOR_VERSION 9
10
- #define EMNAPI_PATCH_VERSION 2
9
+ #define EMNAPI_MINOR_VERSION 11
10
+ #define EMNAPI_PATCH_VERSION 0
11
11
 
12
12
  typedef enum {
13
13
  emnapi_runtime,
@@ -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;
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emnapi",
3
- "version": "1.9.2",
3
+ "version": "1.11.0",
4
4
  "description": "Node-API implementation for Emscripten",
5
5
  "main": "index.js",
6
6
  "gypfile": false,