emnapi 1.10.0 → 1.11.1

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);
@@ -5631,7 +5858,7 @@ var emnapiTSFN = {
5631
5858
  var payload = __emnapi__.payload;
5632
5859
  if (type === 'tsfn-send') {
5633
5860
  var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;
5634
- if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
5861
+ if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
5635
5862
  emnapiTSFN.enqueue(payload.tsfn);
5636
5863
  }
5637
5864
  }
@@ -5655,13 +5882,28 @@ var emnapiTSFN = {
5655
5882
  }
5656
5883
  return true;
5657
5884
  },
5885
+ /**
5886
+ * When another thread grows the shared WebAssembly.Memory, this agent's
5887
+ * cached `wasmMemory.buffer` may still have the old shorter length
5888
+ * (V8 refreshes it lazily). If a pointer derived from shared memory lies
5889
+ * beyond the cached length, `wasmMemory.grow(0)` forces the agent to
5890
+ * observe the current memory size and refreshes the buffer.
5891
+ */
5892
+ ensureBufferFor: function (end) {
5893
+ var buffer = wasmMemory.buffer;
5894
+ if (end > buffer.byteLength) {
5895
+ wasmMemory.grow(0);
5896
+ buffer = wasmMemory.buffer;
5897
+ }
5898
+ return buffer;
5899
+ },
5658
5900
  initQueue: function (func) {
5659
5901
  var size = 2 * {{{ POINTER_SIZE }}};
5660
5902
  var queue = _malloc({{{ to64('size') }}});
5661
5903
  if (!queue)
5662
5904
  return false;
5663
5905
  {{{ from64('queue') }}};
5664
- new Uint8Array(wasmMemory.buffer, queue, size).fill(0);
5906
+ new Uint8Array(emnapiTSFN.ensureBufferFor(queue + size), queue, size).fill(0);
5665
5907
  emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false);
5666
5908
  return true;
5667
5909
  },
@@ -5768,7 +6010,7 @@ var emnapiTSFN = {
5768
6010
  var mutex = {
5769
6011
  lock: function () {
5770
6012
  var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;
5771
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6013
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
5772
6014
  if (isBrowserMain) {
5773
6015
  while (true) {
5774
6016
  var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
@@ -5791,7 +6033,7 @@ var emnapiTSFN = {
5791
6033
  return new Promise<void>(resolve => {
5792
6034
  const again = (): void => { fn() }
5793
6035
  const fn = (): void => {
5794
- const i32a = new Int32Array(wasmMemory.buffer, index, 1)
6036
+ const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
5795
6037
  const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)
5796
6038
  if (oldValue === 0) {
5797
6039
  resolve()
@@ -5803,7 +6045,7 @@ var emnapiTSFN = {
5803
6045
  })
5804
6046
  }, */
5805
6047
  unlock: function () {
5806
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6048
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
5807
6049
  var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);
5808
6050
  if (oldValue !== 10) {
5809
6051
  throw new Error('Tried to unlock while not holding the mutex');
@@ -5837,14 +6079,14 @@ var emnapiTSFN = {
5837
6079
  var mutex = emnapiTSFN.getMutex(func);
5838
6080
  var cond = {
5839
6081
  wait: function () {
5840
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6082
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
5841
6083
  var value = Atomics.load(i32a, 0);
5842
6084
  mutex.unlock();
5843
6085
  Atomics.wait(i32a, 0, value);
5844
6086
  mutex.lock();
5845
6087
  },
5846
6088
  /* waitAsync () {
5847
- const i32a = new Int32Array(wasmMemory.buffer, index, 1)
6089
+ const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
5848
6090
  const value = Atomics.load(i32a, 0)
5849
6091
  mutex.unlock()
5850
6092
  const lock = (): Promise<void> => mutex.lockAsync()
@@ -5855,7 +6097,7 @@ var emnapiTSFN = {
5855
6097
  }
5856
6098
  }, */
5857
6099
  signal: function () {
5858
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6100
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
5859
6101
  Atomics.add(i32a, 0, 1);
5860
6102
  Atomics.notify(i32a, 0, 1);
5861
6103
  }
@@ -5869,10 +6111,10 @@ var emnapiTSFN = {
5869
6111
  var offset = emnapiTSFN.offset.queue_size;
5870
6112
  var arr, index;
5871
6113
  #if MEMORY64
5872
- arr = new BigUint64Array(wasmMemory.buffer);
6114
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
5873
6115
  index = (func + offset) >>> 3;
5874
6116
  #else
5875
- arr = new Uint32Array(wasmMemory.buffer);
6117
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
5876
6118
  index = (func + offset) >>> 2;
5877
6119
  #endif
5878
6120
  Atomics.add(arr, index, {{{ to64('1') }}});
@@ -5881,10 +6123,10 @@ var emnapiTSFN = {
5881
6123
  var offset = emnapiTSFN.offset.queue_size;
5882
6124
  var arr, index;
5883
6125
  #if MEMORY64
5884
- arr = new BigUint64Array(wasmMemory.buffer);
6126
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
5885
6127
  index = (func + offset) >>> 3;
5886
6128
  #else
5887
- arr = new Uint32Array(wasmMemory.buffer);
6129
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
5888
6130
  index = (func + offset) >>> 2;
5889
6131
  #endif
5890
6132
  Atomics.sub(arr, index, {{{ to64('1') }}});
@@ -5896,10 +6138,10 @@ var emnapiTSFN = {
5896
6138
  var offset = emnapiTSFN.offset.thread_count;
5897
6139
  var arr, index;
5898
6140
  #if MEMORY64
5899
- arr = new BigUint64Array(wasmMemory.buffer);
6141
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
5900
6142
  index = (func + offset) >>> 3;
5901
6143
  #else
5902
- arr = new Uint32Array(wasmMemory.buffer);
6144
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
5903
6145
  index = (func + offset) >>> 2;
5904
6146
  #endif
5905
6147
  Atomics.add(arr, index, {{{ to64('1') }}});
@@ -5908,28 +6150,28 @@ var emnapiTSFN = {
5908
6150
  var offset = emnapiTSFN.offset.thread_count;
5909
6151
  var arr, index;
5910
6152
  #if MEMORY64
5911
- arr = new BigUint64Array(wasmMemory.buffer);
6153
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
5912
6154
  index = (func + offset) >>> 3;
5913
6155
  #else
5914
- arr = new Uint32Array(wasmMemory.buffer);
6156
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
5915
6157
  index = (func + offset) >>> 2;
5916
6158
  #endif
5917
6159
  Atomics.sub(arr, index, {{{ to64('1') }}});
5918
6160
  },
5919
6161
  getState: function (func) {
5920
- return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >>> 2);
6162
+ return Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.state + 4)), (func + emnapiTSFN.offset.state) >>> 2);
5921
6163
  },
5922
6164
  setState: function (func, value) {
5923
- Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.state) >>> 2, value);
6165
+ Atomics.store(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.state + 4)), (func + emnapiTSFN.offset.state) >>> 2, value);
5924
6166
  },
5925
6167
  getHandlesClosing: function (func) {
5926
- return Atomics.load(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing));
6168
+ return Atomics.load(new Int8Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.handles_closing + 1)), (func + emnapiTSFN.offset.handles_closing));
5927
6169
  },
5928
6170
  setHandlesClosing: function (func, value) {
5929
- Atomics.store(new Int8Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing), value);
6171
+ Atomics.store(new Int8Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.handles_closing + 1)), (func + emnapiTSFN.offset.handles_closing), value);
5930
6172
  },
5931
6173
  getDispatchState: function (func) {
5932
- return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2);
6174
+ return Atomics.load(new Uint32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.dispatch_state + 4)), (func + emnapiTSFN.offset.dispatch_state) >>> 2);
5933
6175
  },
5934
6176
  getContext: function (func) {
5935
6177
  return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false);
@@ -5960,20 +6202,20 @@ var emnapiTSFN = {
5960
6202
  var arr;
5961
6203
  if (unsigned) {
5962
6204
  #if MEMORY64
5963
- arr = new BigUint64Array(wasmMemory.buffer);
6205
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
5964
6206
  ret = Number(Atomics.load(arr, offset >>> 3));
5965
6207
  #else
5966
- arr = new Uint32Array(wasmMemory.buffer);
6208
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
5967
6209
  ret = Atomics.load(arr, offset >>> 2);
5968
6210
  #endif
5969
6211
  return ret;
5970
6212
  }
5971
6213
  else {
5972
6214
  #if MEMORY64
5973
- arr = new BigInt64Array(wasmMemory.buffer);
6215
+ arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
5974
6216
  ret = Number(Atomics.load(arr, offset >>> 3));
5975
6217
  #else
5976
- arr = new Int32Array(wasmMemory.buffer);
6218
+ arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
5977
6219
  ret = Atomics.load(arr, offset >>> 2);
5978
6220
  #endif
5979
6221
  return ret;
@@ -5983,20 +6225,20 @@ var emnapiTSFN = {
5983
6225
  var arr;
5984
6226
  if (unsigned) {
5985
6227
  #if MEMORY64
5986
- arr = new BigUint64Array(wasmMemory.buffer);
6228
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
5987
6229
  Atomics.store(arr, offset >>> 3, BigInt(value));
5988
6230
  #else
5989
- arr = new Uint32Array(wasmMemory.buffer);
6231
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
5990
6232
  Atomics.store(arr, offset >>> 2, value);
5991
6233
  #endif
5992
6234
  return undefined;
5993
6235
  }
5994
6236
  else {
5995
6237
  #if MEMORY64
5996
- arr = new BigInt64Array(wasmMemory.buffer);
6238
+ arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
5997
6239
  Atomics.store(arr, offset >>> 3, BigInt(value >>> 0));
5998
6240
  #else
5999
- arr = new Int32Array(wasmMemory.buffer);
6241
+ arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
6000
6242
  Atomics.store(arr, offset >>> 2, value >>> 0);
6001
6243
  #endif
6002
6244
  return undefined;
@@ -6013,18 +6255,20 @@ var emnapiTSFN = {
6013
6255
  }
6014
6256
  var resource = emnapiTSFN.getResource(func);
6015
6257
  emnapiCtx.refStore.get(resource).dispose();
6258
+ emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.is_some + 1);
6016
6259
  {{{ makeSetValue('func', 'emnapiTSFN.offset.is_some', '0', 'i8') }}};
6017
6260
  emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
6018
6261
  envObject.unref();
6019
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6020
- var arr = new Uint32Array(wasmMemory.buffer);
6262
+ var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
6263
+ var asyncRefOffset = asyncRefAddress >>> 2;
6264
+ var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
6021
6265
  if (Atomics.load(arr, asyncRefOffset) > 0) {
6022
6266
  Atomics.store(arr, asyncRefOffset, 0);
6023
6267
  __emnapi_runtime_keepalive_pop();
6024
6268
  emnapiCtx.decreaseWaitingRequestCounter();
6025
6269
  }
6026
6270
  if (emnapiNodeBinding) {
6027
- var view = new DataView(wasmMemory.buffer);
6271
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6028
6272
  var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
6029
6273
  var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
6030
6274
  __emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
@@ -6089,7 +6333,7 @@ var emnapiTSFN = {
6089
6333
  var resource = emnapiTSFN.getResource(func);
6090
6334
  var resource_value = emnapiCtx.refStore.get(resource).get();
6091
6335
  var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
6092
- var view = new DataView(wasmMemory.buffer);
6336
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6093
6337
  var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
6094
6338
  var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
6095
6339
  emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
@@ -6127,7 +6371,7 @@ var emnapiTSFN = {
6127
6371
  return;
6128
6372
  }
6129
6373
  emnapiTSFN.setHandlesClosing(func, 1);
6130
- Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);
6374
+ Atomics.store(new Int32Array(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.async_pending + 4)), (func + emnapiTSFN.offset.async_pending) >>> 2, 1);
6131
6375
  emnapiCtx.feature.setImmediate(function () {
6132
6376
  emnapiTSFN.finalize(func);
6133
6377
  });
@@ -6199,7 +6443,7 @@ var emnapiTSFN = {
6199
6443
  var resource = emnapiTSFN.getResource(func);
6200
6444
  var resource_value = emnapiCtx.refStore.get(resource).get();
6201
6445
  var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
6202
- var view = new DataView(wasmMemory.buffer);
6446
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6203
6447
  emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
6204
6448
  asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true),
6205
6449
  triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true)
@@ -6218,8 +6462,9 @@ var emnapiTSFN = {
6218
6462
  dispatch: function (func) {
6219
6463
  var has_more = true;
6220
6464
  var iterations_left = 1000;
6221
- var ui32a = new Uint32Array(wasmMemory.buffer);
6222
- var index = (func + emnapiTSFN.offset.dispatch_state) >>> 2;
6465
+ var dispatchStateAddress = func + emnapiTSFN.offset.dispatch_state;
6466
+ var ui32a = new Uint32Array(emnapiTSFN.ensureBufferFor(dispatchStateAddress + 4));
6467
+ var index = dispatchStateAddress >>> 2;
6223
6468
  while (has_more && --iterations_left !== 0) {
6224
6469
  Atomics.store(ui32a, index, 1);
6225
6470
  has_more = emnapiTSFN.dispatchOne(func);
@@ -6238,7 +6483,7 @@ var emnapiTSFN = {
6238
6483
  // `scheduled` prevents queueing the same main-thread drain chain more than
6239
6484
  // once while a previous wakeup is still in flight.
6240
6485
  var scheduled = func + emnapiTSFN.offset.async_u_fd;
6241
- var i32a = new Int32Array(wasmMemory.buffer);
6486
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(Math.max(pending, scheduled) + 4));
6242
6487
  if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {
6243
6488
  return;
6244
6489
  }
@@ -6282,17 +6527,18 @@ var emnapiTSFN = {
6282
6527
  });
6283
6528
  },
6284
6529
  send: function (func) {
6285
- var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >>> 2, 1 << 1);
6530
+ var dispatchStateAddress = func + emnapiTSFN.offset.dispatch_state;
6531
+ var current_state = Atomics.or(new Uint32Array(emnapiTSFN.ensureBufferFor(dispatchStateAddress + 4)), dispatchStateAddress >>> 2, 1 << 1);
6286
6532
  if ((current_state & 1) === 1) {
6287
6533
  return;
6288
6534
  }
6289
6535
  var pendng = func + emnapiTSFN.offset.async_pending;
6290
6536
  // A wakeup is already pending, so this send only needs to leave the queued
6291
6537
  // work in the TSFN queue and let the existing drain pick it up.
6292
- if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
6538
+ if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
6293
6539
  return;
6294
6540
  }
6295
- if (Atomics.exchange(new Int32Array(wasmMemory.buffer), pendng >>> 2, 1) === 0) {
6541
+ if (Atomics.exchange(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2, 1) === 0) {
6296
6542
  if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
6297
6543
  // Worker threads only post a wakeup token. Main-thread draining is
6298
6544
  // serialized by enqueue() once the message is received.
@@ -6375,7 +6621,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6375
6621
  if (!tsfn)
6376
6622
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6377
6623
  {{{ from64('tsfn') }}};
6378
- new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6624
+ new Uint8Array(emnapiTSFN.ensureBufferFor(tsfn + sizeofTSFN)).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6379
6625
  var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
6380
6626
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
6381
6627
  var resource_ = resourceRef.id;
@@ -6488,8 +6734,9 @@ function _napi_unref_threadsafe_function(env, func) {
6488
6734
  return 1 /* napi_status.napi_invalid_arg */;
6489
6735
  }
6490
6736
  {{{ from64('func') }}};
6491
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6492
- var arr = new Uint32Array(wasmMemory.buffer);
6737
+ var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
6738
+ var asyncRefOffset = asyncRefAddress >>> 2;
6739
+ var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
6493
6740
  var currentValue = Atomics.load(arr, asyncRefOffset);
6494
6741
  if (currentValue > 0) {
6495
6742
  Atomics.store(arr, asyncRefOffset, currentValue - 1);
@@ -6507,8 +6754,9 @@ function _napi_ref_threadsafe_function(env, func) {
6507
6754
  return 1 /* napi_status.napi_invalid_arg */;
6508
6755
  }
6509
6756
  {{{ from64('func') }}};
6510
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6511
- var arr = new Uint32Array(wasmMemory.buffer);
6757
+ var asyncRefAddress = func + emnapiTSFN.offset.async_ref;
6758
+ var asyncRefOffset = asyncRefAddress >>> 2;
6759
+ var arr = new Uint32Array(emnapiTSFN.ensureBufferFor(asyncRefAddress + 4));
6512
6760
  var currentValue = Atomics.load(arr, asyncRefOffset);
6513
6761
  if (!currentValue) {
6514
6762
  __emnapi_runtime_keepalive_push();
@@ -6999,14 +7247,18 @@ function _napi_get_version(env, result) {
6999
7247
  return envObject.clearLastError();
7000
7248
  }
7001
7249
  (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
7250
  $emnapiCtx: "undefined",
7007
7251
  $emnapiExternalMemory: emnapiExternalMemory,
7008
7252
  $emnapiExternalMemory__deps: ["$emnapiCtx", "malloc", "free"],
7009
7253
  $emnapiExternalMemory__postset: "emnapiExternalMemory.init();",
7254
+ $emnapiExternalSAB: emnapiExternalSAB,
7255
+ $emnapiExternalSAB__postset: "emnapiExternalSAB.init();",
7256
+ $emnapiAcquireExternalSharedArrayBuffer: emnapiAcquireExternalSharedArrayBuffer,
7257
+ $emnapiAcquireExternalSharedArrayBuffer__deps: ["$emnapiExternalMemory", "$emnapiExternalSAB"],
7258
+ $emnapiAddSendListener: emnapiAddSendListener,
7259
+ $emnapiAddSendListener__deps: ["$PThread"],
7260
+ $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})();",
7261
+ $emnapiAsyncWorkPoolSize: "0",
7010
7262
  $emnapiGetMemoryAddress: emnapiGetMemoryAddress,
7011
7263
  $emnapiGetMemoryAddress__deps: ["$emnapiExternalMemory"],
7012
7264
  $emnapiModule: emnapiModule,
@@ -7105,6 +7357,8 @@ function _napi_get_version(env, result) {
7105
7357
  _emnapi_worker_unref: __emnapi_worker_unref,
7106
7358
  _emnapi_worker_unref__deps: ["$PThread"],
7107
7359
  _emnapi_worker_unref__sig: "vp",
7360
+ emnapi_acquire_external_sharedarraybuffer: _emnapi_acquire_external_sharedarraybuffer,
7361
+ emnapi_acquire_external_sharedarraybuffer__sig: "vp",
7108
7362
  $emnapiGetHandle: emnapiGetHandle,
7109
7363
  $emnapiGetHandle__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
7110
7364
  napi_add_finalizer: _napi_add_finalizer,
@@ -7113,6 +7367,9 @@ function _napi_get_version(env, result) {
7113
7367
  emnapi_create_memory_view: _emnapi_create_memory_view,
7114
7368
  emnapi_create_memory_view__deps: ["$emnapiCtx", "$emnapiExternalMemory", "napi_add_finalizer"],
7115
7369
  emnapi_create_memory_view__sig: "ipippppp",
7370
+ emnapi_get_external_sharedarraybuffer_handle: _emnapi_get_external_sharedarraybuffer_handle,
7371
+ emnapi_get_external_sharedarraybuffer_handle__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiExternalSAB"],
7372
+ emnapi_get_external_sharedarraybuffer_handle__sig: "ippp",
7116
7373
  emnapi_get_memory_address: _emnapi_get_memory_address,
7117
7374
  emnapi_get_memory_address__deps: ["$emnapiCtx", "$emnapiGetMemoryAddress"],
7118
7375
  emnapi_get_memory_address__sig: "ipppp",
@@ -7134,6 +7391,9 @@ function _napi_get_version(env, result) {
7134
7391
  emnapi_is_support_weakref: _emnapi_is_support_weakref,
7135
7392
  emnapi_is_support_weakref__deps: ["$emnapiCtx"],
7136
7393
  emnapi_is_support_weakref__sig: "i",
7394
+ emnapi_release_external_sharedarraybuffer: _emnapi_release_external_sharedarraybuffer,
7395
+ emnapi_release_external_sharedarraybuffer__deps: ["$emnapiExternalSAB"],
7396
+ emnapi_release_external_sharedarraybuffer__sig: "vp",
7137
7397
  emnapi_sync_memory: _emnapi_sync_memory,
7138
7398
  emnapi_sync_memory__deps: ["$emnapiCtx", "$emnapiExternalMemory", "$emnapiSyncMemory"],
7139
7399
  emnapi_sync_memory__sig: "ipippp",
@@ -7566,6 +7826,9 @@ function _napi_get_version(env, result) {
7566
7826
  node_api_create_buffer_from_arraybuffer: _node_api_create_buffer_from_arraybuffer,
7567
7827
  node_api_create_buffer_from_arraybuffer__deps: ["$emnapiCtx", "$emnapiExternalMemory"],
7568
7828
  node_api_create_buffer_from_arraybuffer__sig: "ippppp",
7829
+ node_api_create_external_sharedarraybuffer: _node_api_create_external_sharedarraybuffer,
7830
+ node_api_create_external_sharedarraybuffer__deps: ["$emnapiCtx", "$emnapiExternalSAB", "$emnapiExternalMemory"],
7831
+ node_api_create_external_sharedarraybuffer__sig: "ipppppp",
7569
7832
  node_api_create_external_string_latin1: _node_api_create_external_string_latin1,
7570
7833
  node_api_create_external_string_latin1__deps: ["$emnapiString", "napi_create_string_latin1"],
7571
7834
  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 10
10
- #define EMNAPI_PATCH_VERSION 0
9
+ #define EMNAPI_MINOR_VERSION 11
10
+ #define EMNAPI_PATCH_VERSION 1
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emnapi",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "Node-API implementation for Emscripten",
5
5
  "main": "index.js",
6
6
  "gypfile": false,