emnapi 1.11.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.
@@ -5858,7 +5858,7 @@ var emnapiTSFN = {
5858
5858
  var payload = __emnapi__.payload;
5859
5859
  if (type === 'tsfn-send') {
5860
5860
  var pendng = payload.tsfn + emnapiTSFN.offset.async_pending;
5861
- if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
5861
+ if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
5862
5862
  emnapiTSFN.enqueue(payload.tsfn);
5863
5863
  }
5864
5864
  }
@@ -5882,13 +5882,28 @@ var emnapiTSFN = {
5882
5882
  }
5883
5883
  return true;
5884
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
+ },
5885
5900
  initQueue: function (func) {
5886
5901
  var size = 2 * {{{ POINTER_SIZE }}};
5887
5902
  var queue = _malloc({{{ to64('size') }}});
5888
5903
  if (!queue)
5889
5904
  return false;
5890
5905
  {{{ from64('queue') }}};
5891
- new Uint8Array(wasmMemory.buffer, queue, size).fill(0);
5906
+ new Uint8Array(emnapiTSFN.ensureBufferFor(queue + size), queue, size).fill(0);
5892
5907
  emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false);
5893
5908
  return true;
5894
5909
  },
@@ -5995,7 +6010,7 @@ var emnapiTSFN = {
5995
6010
  var mutex = {
5996
6011
  lock: function () {
5997
6012
  var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE;
5998
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6013
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
5999
6014
  if (isBrowserMain) {
6000
6015
  while (true) {
6001
6016
  var oldValue = Atomics.compareExchange(i32a, 0, 0, 10);
@@ -6018,7 +6033,7 @@ var emnapiTSFN = {
6018
6033
  return new Promise<void>(resolve => {
6019
6034
  const again = (): void => { fn() }
6020
6035
  const fn = (): void => {
6021
- const i32a = new Int32Array(wasmMemory.buffer, index, 1)
6036
+ const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
6022
6037
  const oldValue = Atomics.compareExchange(i32a, 0, 0, 10)
6023
6038
  if (oldValue === 0) {
6024
6039
  resolve()
@@ -6030,7 +6045,7 @@ var emnapiTSFN = {
6030
6045
  })
6031
6046
  }, */
6032
6047
  unlock: function () {
6033
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6048
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
6034
6049
  var oldValue = Atomics.compareExchange(i32a, 0, 10, 0);
6035
6050
  if (oldValue !== 10) {
6036
6051
  throw new Error('Tried to unlock while not holding the mutex');
@@ -6064,14 +6079,14 @@ var emnapiTSFN = {
6064
6079
  var mutex = emnapiTSFN.getMutex(func);
6065
6080
  var cond = {
6066
6081
  wait: function () {
6067
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6082
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
6068
6083
  var value = Atomics.load(i32a, 0);
6069
6084
  mutex.unlock();
6070
6085
  Atomics.wait(i32a, 0, value);
6071
6086
  mutex.lock();
6072
6087
  },
6073
6088
  /* waitAsync () {
6074
- const i32a = new Int32Array(wasmMemory.buffer, index, 1)
6089
+ const i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1)
6075
6090
  const value = Atomics.load(i32a, 0)
6076
6091
  mutex.unlock()
6077
6092
  const lock = (): Promise<void> => mutex.lockAsync()
@@ -6082,7 +6097,7 @@ var emnapiTSFN = {
6082
6097
  }
6083
6098
  }, */
6084
6099
  signal: function () {
6085
- var i32a = new Int32Array(wasmMemory.buffer, index, 1);
6100
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(index + 4), index, 1);
6086
6101
  Atomics.add(i32a, 0, 1);
6087
6102
  Atomics.notify(i32a, 0, 1);
6088
6103
  }
@@ -6096,10 +6111,10 @@ var emnapiTSFN = {
6096
6111
  var offset = emnapiTSFN.offset.queue_size;
6097
6112
  var arr, index;
6098
6113
  #if MEMORY64
6099
- arr = new BigUint64Array(wasmMemory.buffer);
6114
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
6100
6115
  index = (func + offset) >>> 3;
6101
6116
  #else
6102
- arr = new Uint32Array(wasmMemory.buffer);
6117
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
6103
6118
  index = (func + offset) >>> 2;
6104
6119
  #endif
6105
6120
  Atomics.add(arr, index, {{{ to64('1') }}});
@@ -6108,10 +6123,10 @@ var emnapiTSFN = {
6108
6123
  var offset = emnapiTSFN.offset.queue_size;
6109
6124
  var arr, index;
6110
6125
  #if MEMORY64
6111
- arr = new BigUint64Array(wasmMemory.buffer);
6126
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
6112
6127
  index = (func + offset) >>> 3;
6113
6128
  #else
6114
- arr = new Uint32Array(wasmMemory.buffer);
6129
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
6115
6130
  index = (func + offset) >>> 2;
6116
6131
  #endif
6117
6132
  Atomics.sub(arr, index, {{{ to64('1') }}});
@@ -6123,10 +6138,10 @@ var emnapiTSFN = {
6123
6138
  var offset = emnapiTSFN.offset.thread_count;
6124
6139
  var arr, index;
6125
6140
  #if MEMORY64
6126
- arr = new BigUint64Array(wasmMemory.buffer);
6141
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
6127
6142
  index = (func + offset) >>> 3;
6128
6143
  #else
6129
- arr = new Uint32Array(wasmMemory.buffer);
6144
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
6130
6145
  index = (func + offset) >>> 2;
6131
6146
  #endif
6132
6147
  Atomics.add(arr, index, {{{ to64('1') }}});
@@ -6135,28 +6150,28 @@ var emnapiTSFN = {
6135
6150
  var offset = emnapiTSFN.offset.thread_count;
6136
6151
  var arr, index;
6137
6152
  #if MEMORY64
6138
- arr = new BigUint64Array(wasmMemory.buffer);
6153
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(func + offset + 8));
6139
6154
  index = (func + offset) >>> 3;
6140
6155
  #else
6141
- arr = new Uint32Array(wasmMemory.buffer);
6156
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(func + offset + 4));
6142
6157
  index = (func + offset) >>> 2;
6143
6158
  #endif
6144
6159
  Atomics.sub(arr, index, {{{ to64('1') }}});
6145
6160
  },
6146
6161
  getState: function (func) {
6147
- 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);
6148
6163
  },
6149
6164
  setState: function (func, value) {
6150
- 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);
6151
6166
  },
6152
6167
  getHandlesClosing: function (func) {
6153
- 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));
6154
6169
  },
6155
6170
  setHandlesClosing: function (func, value) {
6156
- 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);
6157
6172
  },
6158
6173
  getDispatchState: function (func) {
6159
- 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);
6160
6175
  },
6161
6176
  getContext: function (func) {
6162
6177
  return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false);
@@ -6187,20 +6202,20 @@ var emnapiTSFN = {
6187
6202
  var arr;
6188
6203
  if (unsigned) {
6189
6204
  #if MEMORY64
6190
- arr = new BigUint64Array(wasmMemory.buffer);
6205
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
6191
6206
  ret = Number(Atomics.load(arr, offset >>> 3));
6192
6207
  #else
6193
- arr = new Uint32Array(wasmMemory.buffer);
6208
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
6194
6209
  ret = Atomics.load(arr, offset >>> 2);
6195
6210
  #endif
6196
6211
  return ret;
6197
6212
  }
6198
6213
  else {
6199
6214
  #if MEMORY64
6200
- arr = new BigInt64Array(wasmMemory.buffer);
6215
+ arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
6201
6216
  ret = Number(Atomics.load(arr, offset >>> 3));
6202
6217
  #else
6203
- arr = new Int32Array(wasmMemory.buffer);
6218
+ arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
6204
6219
  ret = Atomics.load(arr, offset >>> 2);
6205
6220
  #endif
6206
6221
  return ret;
@@ -6210,20 +6225,20 @@ var emnapiTSFN = {
6210
6225
  var arr;
6211
6226
  if (unsigned) {
6212
6227
  #if MEMORY64
6213
- arr = new BigUint64Array(wasmMemory.buffer);
6228
+ arr = new BigUint64Array(emnapiTSFN.ensureBufferFor(offset + 8));
6214
6229
  Atomics.store(arr, offset >>> 3, BigInt(value));
6215
6230
  #else
6216
- arr = new Uint32Array(wasmMemory.buffer);
6231
+ arr = new Uint32Array(emnapiTSFN.ensureBufferFor(offset + 4));
6217
6232
  Atomics.store(arr, offset >>> 2, value);
6218
6233
  #endif
6219
6234
  return undefined;
6220
6235
  }
6221
6236
  else {
6222
6237
  #if MEMORY64
6223
- arr = new BigInt64Array(wasmMemory.buffer);
6238
+ arr = new BigInt64Array(emnapiTSFN.ensureBufferFor(offset + 8));
6224
6239
  Atomics.store(arr, offset >>> 3, BigInt(value >>> 0));
6225
6240
  #else
6226
- arr = new Int32Array(wasmMemory.buffer);
6241
+ arr = new Int32Array(emnapiTSFN.ensureBufferFor(offset + 4));
6227
6242
  Atomics.store(arr, offset >>> 2, value >>> 0);
6228
6243
  #endif
6229
6244
  return undefined;
@@ -6240,18 +6255,20 @@ var emnapiTSFN = {
6240
6255
  }
6241
6256
  var resource = emnapiTSFN.getResource(func);
6242
6257
  emnapiCtx.refStore.get(resource).dispose();
6258
+ emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.is_some + 1);
6243
6259
  {{{ makeSetValue('func', 'emnapiTSFN.offset.is_some', '0', 'i8') }}};
6244
6260
  emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func);
6245
6261
  envObject.unref();
6246
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6247
- 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));
6248
6265
  if (Atomics.load(arr, asyncRefOffset) > 0) {
6249
6266
  Atomics.store(arr, asyncRefOffset, 0);
6250
6267
  __emnapi_runtime_keepalive_pop();
6251
6268
  emnapiCtx.decreaseWaitingRequestCounter();
6252
6269
  }
6253
6270
  if (emnapiNodeBinding) {
6254
- var view = new DataView(wasmMemory.buffer);
6271
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6255
6272
  var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
6256
6273
  var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
6257
6274
  __emnapi_node_emit_async_destroy(asyncId, triggerAsyncId);
@@ -6316,7 +6333,7 @@ var emnapiTSFN = {
6316
6333
  var resource = emnapiTSFN.getResource(func);
6317
6334
  var resource_value = emnapiCtx.refStore.get(resource).get();
6318
6335
  var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
6319
- var view = new DataView(wasmMemory.buffer);
6336
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6320
6337
  var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true);
6321
6338
  var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true);
6322
6339
  emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
@@ -6354,7 +6371,7 @@ var emnapiTSFN = {
6354
6371
  return;
6355
6372
  }
6356
6373
  emnapiTSFN.setHandlesClosing(func, 1);
6357
- 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);
6358
6375
  emnapiCtx.feature.setImmediate(function () {
6359
6376
  emnapiTSFN.finalize(func);
6360
6377
  });
@@ -6426,7 +6443,7 @@ var emnapiTSFN = {
6426
6443
  var resource = emnapiTSFN.getResource(func);
6427
6444
  var resource_value = emnapiCtx.refStore.get(resource).get();
6428
6445
  var resourceObject = emnapiCtx.handleStore.get(resource_value).value;
6429
- var view = new DataView(wasmMemory.buffer);
6446
+ var view = new DataView(emnapiTSFN.ensureBufferFor(func + emnapiTSFN.offset.trigger_async_id + 8));
6430
6447
  emnapiNodeBinding.node.makeCallback(resourceObject, f, [], {
6431
6448
  asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true),
6432
6449
  triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true)
@@ -6445,8 +6462,9 @@ var emnapiTSFN = {
6445
6462
  dispatch: function (func) {
6446
6463
  var has_more = true;
6447
6464
  var iterations_left = 1000;
6448
- var ui32a = new Uint32Array(wasmMemory.buffer);
6449
- 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;
6450
6468
  while (has_more && --iterations_left !== 0) {
6451
6469
  Atomics.store(ui32a, index, 1);
6452
6470
  has_more = emnapiTSFN.dispatchOne(func);
@@ -6465,7 +6483,7 @@ var emnapiTSFN = {
6465
6483
  // `scheduled` prevents queueing the same main-thread drain chain more than
6466
6484
  // once while a previous wakeup is still in flight.
6467
6485
  var scheduled = func + emnapiTSFN.offset.async_u_fd;
6468
- var i32a = new Int32Array(wasmMemory.buffer);
6486
+ var i32a = new Int32Array(emnapiTSFN.ensureBufferFor(Math.max(pending, scheduled) + 4));
6469
6487
  if (Atomics.exchange(i32a, scheduled >>> 2, 1) !== 0) {
6470
6488
  return;
6471
6489
  }
@@ -6509,17 +6527,18 @@ var emnapiTSFN = {
6509
6527
  });
6510
6528
  },
6511
6529
  send: function (func) {
6512
- 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);
6513
6532
  if ((current_state & 1) === 1) {
6514
6533
  return;
6515
6534
  }
6516
6535
  var pendng = func + emnapiTSFN.offset.async_pending;
6517
6536
  // A wakeup is already pending, so this send only needs to leave the queued
6518
6537
  // work in the TSFN queue and let the existing drain pick it up.
6519
- if (Atomics.load(new Int32Array(wasmMemory.buffer), pendng >>> 2) !== 0) {
6538
+ if (Atomics.load(new Int32Array(emnapiTSFN.ensureBufferFor(pendng + 4)), pendng >>> 2) !== 0) {
6520
6539
  return;
6521
6540
  }
6522
- 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) {
6523
6542
  if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) {
6524
6543
  // Worker threads only post a wakeup token. Main-thread draining is
6525
6544
  // serialized by enqueue() once the message is received.
@@ -6602,7 +6621,7 @@ function _napi_create_threadsafe_function(env, func, async_resource, async_resou
6602
6621
  if (!tsfn)
6603
6622
  return envObject.setLastError(9 /* napi_status.napi_generic_failure */);
6604
6623
  {{{ from64('tsfn') }}};
6605
- new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6624
+ new Uint8Array(emnapiTSFN.ensureBufferFor(tsfn + sizeofTSFN)).subarray(tsfn, tsfn + sizeofTSFN).fill(0);
6606
6625
  var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* ReferenceOwnership.kUserland */);
6607
6626
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
6608
6627
  var resource_ = resourceRef.id;
@@ -6715,8 +6734,9 @@ function _napi_unref_threadsafe_function(env, func) {
6715
6734
  return 1 /* napi_status.napi_invalid_arg */;
6716
6735
  }
6717
6736
  {{{ from64('func') }}};
6718
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6719
- 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));
6720
6740
  var currentValue = Atomics.load(arr, asyncRefOffset);
6721
6741
  if (currentValue > 0) {
6722
6742
  Atomics.store(arr, asyncRefOffset, currentValue - 1);
@@ -6734,8 +6754,9 @@ function _napi_ref_threadsafe_function(env, func) {
6734
6754
  return 1 /* napi_status.napi_invalid_arg */;
6735
6755
  }
6736
6756
  {{{ from64('func') }}};
6737
- var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >>> 2;
6738
- 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));
6739
6760
  var currentValue = Atomics.load(arr, asyncRefOffset);
6740
6761
  if (!currentValue) {
6741
6762
  __emnapi_runtime_keepalive_push();
@@ -7,7 +7,7 @@
7
7
 
8
8
  #define EMNAPI_MAJOR_VERSION 1
9
9
  #define EMNAPI_MINOR_VERSION 11
10
- #define EMNAPI_PATCH_VERSION 0
10
+ #define EMNAPI_PATCH_VERSION 1
11
11
 
12
12
  typedef enum {
13
13
  emnapi_runtime,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emnapi",
3
- "version": "1.11.0",
3
+ "version": "1.11.1",
4
4
  "description": "Node-API implementation for Emscripten",
5
5
  "main": "index.js",
6
6
  "gypfile": false,