@php-wasm/web-5-2 3.1.62 → 3.1.63

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.
Binary file
@@ -1,7 +1,7 @@
1
1
  const dependencyFilename = new URL('./5_2_17/php_5_2.wasm', import.meta.url)
2
2
  .href;
3
3
  export { dependencyFilename };
4
- export const dependenciesTotalSize = 9781068;
4
+ export const dependenciesTotalSize = 9783633;
5
5
  const phpVersionString = '5.2.17';
6
6
  export function init(RuntimeName, PHPLoader) {
7
7
  // The rest of the code comes from the built php.js file and esm-suffix.js
@@ -5202,8 +5202,6 @@ export function init(RuntimeName, PHPLoader) {
5202
5202
  wakeUp(-ERRNO_CODES.ECONNREFUSED);
5203
5203
  return;
5204
5204
  }
5205
- // Wait for the connection to be established. A zero timeval
5206
- // disables the timeout, matching SO_SNDTIMEO semantics.
5207
5205
  const sendTimeout = PHPWASM.socketTimeouts.get(sockfd)?.send;
5208
5206
  const timeout = sendTimeout ?? 3e4;
5209
5207
  let resolved = false;
@@ -5214,7 +5212,6 @@ export function init(RuntimeName, PHPLoader) {
5214
5212
  const peer = PHPWASM.getAllPeers(sock).find(
5215
5213
  (candidate) => candidate.socket === ws
5216
5214
  );
5217
-
5218
5215
  const cleanupConnectListeners = () => {
5219
5216
  if (typeof timeoutId !== 'undefined') {
5220
5217
  clearTimeout(timeoutId);
@@ -5223,7 +5220,6 @@ export function init(RuntimeName, PHPLoader) {
5223
5220
  ws.removeEventListener('error', handleError);
5224
5221
  ws.removeEventListener('close', handleClose);
5225
5222
  };
5226
-
5227
5223
  const cleanupFailedConnect = (errno) => {
5228
5224
  try {
5229
5225
  if (
@@ -5232,16 +5228,13 @@ export function init(RuntimeName, PHPLoader) {
5232
5228
  ) {
5233
5229
  ws.close();
5234
5230
  }
5235
- } catch (e) {
5236
- // Ignore close errors on an already-failed connect.
5237
- }
5231
+ } catch (e) {}
5238
5232
  if (peer) {
5239
5233
  SOCKFS.websocket_sock_ops.removePeer(sock, peer);
5240
5234
  }
5241
5235
  sock.connecting = false;
5242
5236
  sock.error = errno;
5243
5237
  };
5244
-
5245
5238
  const finishConnect = (result) => {
5246
5239
  if (!resolved) {
5247
5240
  resolved = true;
@@ -5252,21 +5245,17 @@ export function init(RuntimeName, PHPLoader) {
5252
5245
  wakeUp(result);
5253
5246
  }
5254
5247
  };
5255
-
5256
5248
  if (timeout > 0) {
5257
5249
  timeoutId = setTimeout(() => {
5258
5250
  finishConnect(-ERRNO_CODES.ETIMEDOUT);
5259
5251
  }, timeout);
5260
5252
  }
5261
-
5262
5253
  handleOpen = () => {
5263
5254
  finishConnect(0);
5264
5255
  };
5265
-
5266
5256
  handleError = () => {
5267
5257
  finishConnect(-ERRNO_CODES.ECONNREFUSED);
5268
5258
  };
5269
-
5270
5259
  handleClose = () => {
5271
5260
  finishConnect(-ERRNO_CODES.ECONNREFUSED);
5272
5261
  };
@@ -6522,6 +6511,13 @@ export function init(RuntimeName, PHPLoader) {
6522
6511
  return false;
6523
6512
  };
6524
6513
  _emscripten_resize_heap.sig = 'ip';
6514
+ var runAndAbortIfError = (func) => {
6515
+ try {
6516
+ return func();
6517
+ } catch (e) {
6518
+ abort(e);
6519
+ }
6520
+ };
6525
6521
  var runtimeKeepalivePush = () => {
6526
6522
  runtimeKeepaliveCounter += 1;
6527
6523
  };
@@ -6530,6 +6526,193 @@ export function init(RuntimeName, PHPLoader) {
6530
6526
  runtimeKeepaliveCounter -= 1;
6531
6527
  };
6532
6528
  runtimeKeepalivePop.sig = 'v';
6529
+ var Asyncify = {
6530
+ instrumentWasmImports(imports) {
6531
+ var importPattern =
6532
+ /^(invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_iij|invoke_iiji|invoke_iiij|invoke_iijii|invoke_iijiji|invoke_jii|invoke_jiii|invoke_viijii|invoke_vji|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|__syscall_fcntl64|___syscall_fcntl64|_asyncjs___syscall_fcntl64|js_release_file_locks|_js_release_file_locks|_async_js_release_file_locks|js_flock|_js_flock|_async_js_flock|js_fd_read|_js_fd_read|fd_close|_fd_close|_asyncjs__fd_close|close|_close|js_module_onMessage|zend_hash_str_find|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|_wasm_shutdown|_asyncjs__wasm_shutdown|recv|_recv|setsockopt|_setsockopt|wasm_connect|_wasm_connect|__asyncjs__.*)$/;
6533
+ for (let [x, original] of Object.entries(imports)) {
6534
+ if (typeof original == 'function') {
6535
+ let isAsyncifyImport =
6536
+ original.isAsync || importPattern.test(x);
6537
+ }
6538
+ }
6539
+ },
6540
+ instrumentFunction(original) {
6541
+ var wrapper = (...args) => {
6542
+ Asyncify.exportCallStack.push(original);
6543
+ try {
6544
+ return original(...args);
6545
+ } finally {
6546
+ if (!ABORT) {
6547
+ var top = Asyncify.exportCallStack.pop();
6548
+ Asyncify.maybeStopUnwind();
6549
+ }
6550
+ }
6551
+ };
6552
+ Asyncify.funcWrappers.set(original, wrapper);
6553
+ wrapper.orig = original;
6554
+ return wrapper;
6555
+ },
6556
+ instrumentWasmExports(exports) {
6557
+ var ret = {};
6558
+ for (let [x, original] of Object.entries(exports)) {
6559
+ if (typeof original == 'function') {
6560
+ var wrapper = Asyncify.instrumentFunction(original);
6561
+ ret[x] = wrapper;
6562
+ } else {
6563
+ ret[x] = original;
6564
+ }
6565
+ }
6566
+ return ret;
6567
+ },
6568
+ State: { Normal: 0, Unwinding: 1, Rewinding: 2, Disabled: 3 },
6569
+ state: 0,
6570
+ StackSize: 4096,
6571
+ currData: null,
6572
+ handleSleepReturnValue: 0,
6573
+ exportCallStack: [],
6574
+ callstackFuncToId: new Map(),
6575
+ callStackIdToFunc: new Map(),
6576
+ funcWrappers: new Map(),
6577
+ callStackId: 0,
6578
+ asyncPromiseHandlers: null,
6579
+ sleepCallbacks: [],
6580
+ getCallStackId(func) {
6581
+ if (!Asyncify.callstackFuncToId.has(func)) {
6582
+ var id = Asyncify.callStackId++;
6583
+ Asyncify.callstackFuncToId.set(func, id);
6584
+ Asyncify.callStackIdToFunc.set(id, func);
6585
+ }
6586
+ return Asyncify.callstackFuncToId.get(func);
6587
+ },
6588
+ maybeStopUnwind() {
6589
+ if (
6590
+ Asyncify.currData &&
6591
+ Asyncify.state === Asyncify.State.Unwinding &&
6592
+ Asyncify.exportCallStack.length === 0
6593
+ ) {
6594
+ Asyncify.state = Asyncify.State.Normal;
6595
+ runtimeKeepalivePush();
6596
+ runAndAbortIfError(_asyncify_stop_unwind);
6597
+ if (typeof Fibers != 'undefined') {
6598
+ Fibers.trampoline();
6599
+ }
6600
+ }
6601
+ },
6602
+ whenDone() {
6603
+ return new Promise((resolve, reject) => {
6604
+ Asyncify.asyncPromiseHandlers = { resolve, reject };
6605
+ });
6606
+ },
6607
+ allocateData() {
6608
+ var ptr = _malloc(12 + Asyncify.StackSize);
6609
+ Asyncify.setDataHeader(ptr, ptr + 12, Asyncify.StackSize);
6610
+ Asyncify.setDataRewindFunc(ptr);
6611
+ return ptr;
6612
+ },
6613
+ setDataHeader(ptr, stack, stackSize) {
6614
+ HEAPU32[ptr >> 2] = stack;
6615
+ HEAPU32[(ptr + 4) >> 2] = stack + stackSize;
6616
+ },
6617
+ setDataRewindFunc(ptr) {
6618
+ var bottomOfCallStack = Asyncify.exportCallStack[0];
6619
+ var rewindId = Asyncify.getCallStackId(bottomOfCallStack);
6620
+ HEAP32[(ptr + 8) >> 2] = rewindId;
6621
+ },
6622
+ getDataRewindFunc(ptr) {
6623
+ var id = HEAP32[(ptr + 8) >> 2];
6624
+ var func = Asyncify.callStackIdToFunc.get(id);
6625
+ return func;
6626
+ },
6627
+ doRewind(ptr) {
6628
+ var original = Asyncify.getDataRewindFunc(ptr);
6629
+ var func = Asyncify.funcWrappers.get(original);
6630
+ runtimeKeepalivePop();
6631
+ return func();
6632
+ },
6633
+ handleSleep(startAsync) {
6634
+ if (ABORT) return;
6635
+ if (Asyncify.state === Asyncify.State.Normal) {
6636
+ var reachedCallback = false;
6637
+ var reachedAfterCallback = false;
6638
+ startAsync((handleSleepReturnValue = 0) => {
6639
+ if (ABORT) return;
6640
+ Asyncify.handleSleepReturnValue = handleSleepReturnValue;
6641
+ reachedCallback = true;
6642
+ if (!reachedAfterCallback) {
6643
+ return;
6644
+ }
6645
+ Asyncify.state = Asyncify.State.Rewinding;
6646
+ runAndAbortIfError(() =>
6647
+ _asyncify_start_rewind(Asyncify.currData)
6648
+ );
6649
+ if (typeof MainLoop != 'undefined' && MainLoop.func) {
6650
+ MainLoop.resume();
6651
+ }
6652
+ var asyncWasmReturnValue,
6653
+ isError = false;
6654
+ try {
6655
+ asyncWasmReturnValue = Asyncify.doRewind(
6656
+ Asyncify.currData
6657
+ );
6658
+ } catch (err) {
6659
+ asyncWasmReturnValue = err;
6660
+ isError = true;
6661
+ }
6662
+ var handled = false;
6663
+ if (!Asyncify.currData) {
6664
+ var asyncPromiseHandlers =
6665
+ Asyncify.asyncPromiseHandlers;
6666
+ if (asyncPromiseHandlers) {
6667
+ Asyncify.asyncPromiseHandlers = null;
6668
+ (isError
6669
+ ? asyncPromiseHandlers.reject
6670
+ : asyncPromiseHandlers.resolve)(
6671
+ asyncWasmReturnValue
6672
+ );
6673
+ handled = true;
6674
+ }
6675
+ }
6676
+ if (isError && !handled) {
6677
+ throw asyncWasmReturnValue;
6678
+ }
6679
+ });
6680
+ reachedAfterCallback = true;
6681
+ if (!reachedCallback) {
6682
+ Asyncify.state = Asyncify.State.Unwinding;
6683
+ if (!Asyncify._cachedData) {
6684
+ Asyncify._cachedData = Asyncify.allocateData();
6685
+ } else {
6686
+ Asyncify.setDataHeader(
6687
+ Asyncify._cachedData,
6688
+ Asyncify._cachedData + 12,
6689
+ Asyncify.StackSize
6690
+ );
6691
+ Asyncify.setDataRewindFunc(Asyncify._cachedData);
6692
+ }
6693
+ Asyncify.currData = Asyncify._cachedData;
6694
+ if (typeof MainLoop != 'undefined' && MainLoop.func) {
6695
+ MainLoop.pause();
6696
+ }
6697
+ runAndAbortIfError(() =>
6698
+ _asyncify_start_unwind(Asyncify.currData)
6699
+ );
6700
+ }
6701
+ } else if (Asyncify.state === Asyncify.State.Rewinding) {
6702
+ Asyncify.state = Asyncify.State.Normal;
6703
+ runAndAbortIfError(_asyncify_stop_rewind);
6704
+ Asyncify.currData = null;
6705
+ Asyncify.sleepCallbacks.forEach(callUserCallback);
6706
+ } else {
6707
+ abort(`invalid state: ${Asyncify.state}`);
6708
+ }
6709
+ return Asyncify.handleSleepReturnValue;
6710
+ },
6711
+ handleAsync: (startAsync) =>
6712
+ Asyncify.handleSleep((wakeUp) => {
6713
+ startAsync().then(wakeUp);
6714
+ }),
6715
+ };
6533
6716
  var safeSetTimeout = (func, timeout) => {
6534
6717
  runtimeKeepalivePush();
6535
6718
  return setTimeout(() => {
@@ -6539,9 +6722,6 @@ export function init(RuntimeName, PHPLoader) {
6539
6722
  };
6540
6723
  var _emscripten_sleep = function (ms) {
6541
6724
  return Asyncify.handleSleep((wakeUp) => {
6542
- // select() yields between socket reads. Nested zero-delay timers are
6543
- // clamped by browsers, adding seconds to even a local curl download.
6544
- // Use a task (not a microtask) so network events still get a turn.
6545
6725
  if (ms === 0 && globalThis.scheduler?.postTask) {
6546
6726
  runtimeKeepalivePush();
6547
6727
  globalThis.scheduler.postTask(() => {
@@ -6970,13 +7150,11 @@ export function init(RuntimeName, PHPLoader) {
6970
7150
  envLength
6971
7151
  ) {
6972
7152
  if (!command) {
6973
- ___errno_location(ERRNO_CODES.EINVAL);
6974
- return -1;
7153
+ return -ERRNO_CODES.EINVAL;
6975
7154
  }
6976
7155
  const cmdstr = UTF8ToString(command);
6977
7156
  if (!cmdstr.length) {
6978
- ___errno_location(ERRNO_CODES.EINVAL);
6979
- return -1;
7157
+ return -ERRNO_CODES.EINVAL;
6980
7158
  }
6981
7159
  let argsArray = [];
6982
7160
  if (argsLength) {
@@ -7031,13 +7209,11 @@ export function init(RuntimeName, PHPLoader) {
7031
7209
  }
7032
7210
  } catch (e) {
7033
7211
  if (e.code === 'SPAWN_UNSUPPORTED') {
7034
- ___errno_location(ERRNO_CODES.ENOSYS);
7035
- return -1;
7212
+ return -ERRNO_CODES.ENOSYS;
7036
7213
  }
7037
7214
  if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
7038
7215
  throw e;
7039
- ___errno_location(e.code);
7040
- return -1;
7216
+ return -e.errno;
7041
7217
  }
7042
7218
  const ProcInfo = { pid: cp.pid, exited: false };
7043
7219
  PHPWASM.processTable[ProcInfo.pid] = ProcInfo;
@@ -7048,7 +7224,12 @@ export function init(RuntimeName, PHPLoader) {
7048
7224
  stderrChildFd = std[2]?.child,
7049
7225
  stderrParentFd = std[2]?.parent;
7050
7226
  const detachPipeDataListeners = [];
7051
- cp.on('exit', function (code) {
7227
+ let childPipesClosed = false;
7228
+ const closeChildPipes = function () {
7229
+ if (childPipesClosed) {
7230
+ return;
7231
+ }
7232
+ childPipesClosed = true;
7052
7233
  for (const detach of detachPipeDataListeners) {
7053
7234
  detach();
7054
7235
  }
@@ -7057,6 +7238,9 @@ export function init(RuntimeName, PHPLoader) {
7057
7238
  FS.close(FS.streams[fd]);
7058
7239
  }
7059
7240
  }
7241
+ };
7242
+ cp.on('exit', function (code) {
7243
+ closeChildPipes();
7060
7244
  ProcInfo.exitCode = code;
7061
7245
  ProcInfo.exited = true;
7062
7246
  });
@@ -7136,6 +7320,10 @@ export function init(RuntimeName, PHPLoader) {
7136
7320
  });
7137
7321
  } catch (e) {
7138
7322
  console.error(e);
7323
+ closeChildPipes();
7324
+ if (!ProcInfo.pid) {
7325
+ return -(ERRNO_CODES[e.code] ?? ERRNO_CODES.ECHILD);
7326
+ }
7139
7327
  return ProcInfo.pid;
7140
7328
  }
7141
7329
  if (stdinChildFd) {
@@ -7208,16 +7396,49 @@ export function init(RuntimeName, PHPLoader) {
7208
7396
  const interval = setInterval(pump, 20);
7209
7397
  pump();
7210
7398
  } else {
7211
- /**
7212
- * Descriptor 0 was not provided, so the child process must observe EOF.
7213
- * Closing stdin explicitly lets spawn handlers distinguish that case from
7214
- * a valid pipe whose first bytes have not arrived yet.
7215
- */
7216
7399
  cp.stdin.end();
7217
7400
  }
7218
7401
  return ProcInfo.pid;
7219
7402
  });
7220
7403
  }
7404
+ function _js_popen_clear_pid_for_fd(fd) {
7405
+ for (const pid in PHPWASM.processTable) {
7406
+ if (PHPWASM.processTable[pid].fd === fd) {
7407
+ delete PHPWASM.processTable[pid].fd;
7408
+ return;
7409
+ }
7410
+ }
7411
+ }
7412
+ function _js_popen_get_pid_for_fd(fd) {
7413
+ for (const pid in PHPWASM.processTable) {
7414
+ if (PHPWASM.processTable[pid].fd === fd) {
7415
+ return PHPWASM.processTable[pid].pid;
7416
+ }
7417
+ }
7418
+ return -1;
7419
+ }
7420
+ function _js_popen_set_pid_for_fd(fd, pid) {
7421
+ if (PHPWASM.processTable[pid]) {
7422
+ PHPWASM.processTable[pid].fd = fd;
7423
+ }
7424
+ }
7425
+ function _js_waitpid(pid, exitCodePtr) {
7426
+ if (!PHPWASM.processTable[pid]) {
7427
+ return -1;
7428
+ }
7429
+ return Asyncify.handleSleep((wakeUp) => {
7430
+ const poll = function () {
7431
+ if (PHPWASM.processTable[pid]?.exited) {
7432
+ HEAPU32[exitCodePtr >> 2] =
7433
+ PHPWASM.processTable[pid].exitCode;
7434
+ wakeUp(pid);
7435
+ } else {
7436
+ setTimeout(poll, 50);
7437
+ }
7438
+ };
7439
+ poll();
7440
+ });
7441
+ }
7221
7442
  var arraySum = (array, index) => {
7222
7443
  var sum = 0;
7223
7444
  for (var i = 0; i <= index; sum += array[i++]) {}
@@ -7564,200 +7785,6 @@ export function init(RuntimeName, PHPLoader) {
7564
7785
  ws.setSocketOpt(level, optionName, optionValuePtr);
7565
7786
  return 0;
7566
7787
  }
7567
- var runAndAbortIfError = (func) => {
7568
- try {
7569
- return func();
7570
- } catch (e) {
7571
- abort(e);
7572
- }
7573
- };
7574
- var Asyncify = {
7575
- instrumentWasmImports(imports) {
7576
- var importPattern =
7577
- /^(invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiii|invoke_iiiiiiiiii|invoke_v|invoke_vi|invoke_vii|invoke_viidii|invoke_viii|invoke_viiii|invoke_viiiii|invoke_viiiiii|invoke_viiiiiii|invoke_viiiiiiiii|invoke_i|invoke_ii|invoke_iii|invoke_iiii|invoke_iiiii|invoke_iiiiii|invoke_iiiiiii|invoke_iiiiiiii|invoke_iiiiiiiiii|invoke_iij|invoke_iiji|invoke_iiij|invoke_iijii|invoke_iijiji|invoke_jii|invoke_jiii|invoke_viijii|invoke_vji|js_open_process|_js_open_process|_asyncjs__js_open_process|js_popen_to_file|_js_popen_to_file|_asyncjs__js_popen_to_file|__syscall_fcntl64|___syscall_fcntl64|_asyncjs___syscall_fcntl64|js_release_file_locks|_js_release_file_locks|_async_js_release_file_locks|js_flock|_js_flock|_async_js_flock|js_fd_read|_js_fd_read|fd_close|_fd_close|_asyncjs__fd_close|close|_close|js_module_onMessage|zend_hash_str_find|_js_module_onMessage|_asyncjs__js_module_onMessage|js_waitpid|_js_waitpid|_asyncjs__js_waitpid|wasm_poll_socket|_wasm_poll_socket|_asyncjs__wasm_poll_socket|_wasm_shutdown|_asyncjs__wasm_shutdown|recv|_recv|setsockopt|_setsockopt|wasm_connect|_wasm_connect|__asyncjs__.*)$/;
7578
- for (let [x, original] of Object.entries(imports)) {
7579
- if (typeof original == 'function') {
7580
- let isAsyncifyImport =
7581
- original.isAsync || importPattern.test(x);
7582
- }
7583
- }
7584
- },
7585
- instrumentFunction(original) {
7586
- var wrapper = (...args) => {
7587
- Asyncify.exportCallStack.push(original);
7588
- try {
7589
- return original(...args);
7590
- } finally {
7591
- if (!ABORT) {
7592
- var top = Asyncify.exportCallStack.pop();
7593
- Asyncify.maybeStopUnwind();
7594
- }
7595
- }
7596
- };
7597
- Asyncify.funcWrappers.set(original, wrapper);
7598
- wrapper.orig = original;
7599
- return wrapper;
7600
- },
7601
- instrumentWasmExports(exports) {
7602
- var ret = {};
7603
- for (let [x, original] of Object.entries(exports)) {
7604
- if (typeof original == 'function') {
7605
- var wrapper = Asyncify.instrumentFunction(original);
7606
- ret[x] = wrapper;
7607
- } else {
7608
- ret[x] = original;
7609
- }
7610
- }
7611
- return ret;
7612
- },
7613
- State: { Normal: 0, Unwinding: 1, Rewinding: 2, Disabled: 3 },
7614
- state: 0,
7615
- StackSize: 4096,
7616
- currData: null,
7617
- handleSleepReturnValue: 0,
7618
- exportCallStack: [],
7619
- callstackFuncToId: new Map(),
7620
- callStackIdToFunc: new Map(),
7621
- funcWrappers: new Map(),
7622
- callStackId: 0,
7623
- asyncPromiseHandlers: null,
7624
- sleepCallbacks: [],
7625
- getCallStackId(func) {
7626
- if (!Asyncify.callstackFuncToId.has(func)) {
7627
- var id = Asyncify.callStackId++;
7628
- Asyncify.callstackFuncToId.set(func, id);
7629
- Asyncify.callStackIdToFunc.set(id, func);
7630
- }
7631
- return Asyncify.callstackFuncToId.get(func);
7632
- },
7633
- maybeStopUnwind() {
7634
- if (
7635
- Asyncify.currData &&
7636
- Asyncify.state === Asyncify.State.Unwinding &&
7637
- Asyncify.exportCallStack.length === 0
7638
- ) {
7639
- Asyncify.state = Asyncify.State.Normal;
7640
- runtimeKeepalivePush();
7641
- runAndAbortIfError(_asyncify_stop_unwind);
7642
- if (typeof Fibers != 'undefined') {
7643
- Fibers.trampoline();
7644
- }
7645
- }
7646
- },
7647
- whenDone() {
7648
- return new Promise((resolve, reject) => {
7649
- Asyncify.asyncPromiseHandlers = { resolve, reject };
7650
- });
7651
- },
7652
- allocateData() {
7653
- var ptr = _malloc(12 + Asyncify.StackSize);
7654
- Asyncify.setDataHeader(ptr, ptr + 12, Asyncify.StackSize);
7655
- Asyncify.setDataRewindFunc(ptr);
7656
- return ptr;
7657
- },
7658
- setDataHeader(ptr, stack, stackSize) {
7659
- HEAPU32[ptr >> 2] = stack;
7660
- HEAPU32[(ptr + 4) >> 2] = stack + stackSize;
7661
- },
7662
- setDataRewindFunc(ptr) {
7663
- var bottomOfCallStack = Asyncify.exportCallStack[0];
7664
- var rewindId = Asyncify.getCallStackId(bottomOfCallStack);
7665
- HEAP32[(ptr + 8) >> 2] = rewindId;
7666
- },
7667
- getDataRewindFunc(ptr) {
7668
- var id = HEAP32[(ptr + 8) >> 2];
7669
- var func = Asyncify.callStackIdToFunc.get(id);
7670
- return func;
7671
- },
7672
- doRewind(ptr) {
7673
- var original = Asyncify.getDataRewindFunc(ptr);
7674
- var func = Asyncify.funcWrappers.get(original);
7675
- runtimeKeepalivePop();
7676
- return func();
7677
- },
7678
- handleSleep(startAsync) {
7679
- if (ABORT) return;
7680
- if (Asyncify.state === Asyncify.State.Normal) {
7681
- var reachedCallback = false;
7682
- var reachedAfterCallback = false;
7683
- startAsync((handleSleepReturnValue = 0) => {
7684
- if (ABORT) return;
7685
- Asyncify.handleSleepReturnValue = handleSleepReturnValue;
7686
- reachedCallback = true;
7687
- if (!reachedAfterCallback) {
7688
- return;
7689
- }
7690
- Asyncify.state = Asyncify.State.Rewinding;
7691
- runAndAbortIfError(() =>
7692
- _asyncify_start_rewind(Asyncify.currData)
7693
- );
7694
- if (typeof MainLoop != 'undefined' && MainLoop.func) {
7695
- MainLoop.resume();
7696
- }
7697
- var asyncWasmReturnValue,
7698
- isError = false;
7699
- try {
7700
- asyncWasmReturnValue = Asyncify.doRewind(
7701
- Asyncify.currData
7702
- );
7703
- } catch (err) {
7704
- asyncWasmReturnValue = err;
7705
- isError = true;
7706
- }
7707
- var handled = false;
7708
- if (!Asyncify.currData) {
7709
- var asyncPromiseHandlers =
7710
- Asyncify.asyncPromiseHandlers;
7711
- if (asyncPromiseHandlers) {
7712
- Asyncify.asyncPromiseHandlers = null;
7713
- (isError
7714
- ? asyncPromiseHandlers.reject
7715
- : asyncPromiseHandlers.resolve)(
7716
- asyncWasmReturnValue
7717
- );
7718
- handled = true;
7719
- }
7720
- }
7721
- if (isError && !handled) {
7722
- throw asyncWasmReturnValue;
7723
- }
7724
- });
7725
- reachedAfterCallback = true;
7726
- if (!reachedCallback) {
7727
- Asyncify.state = Asyncify.State.Unwinding;
7728
- if (!Asyncify._cachedData) {
7729
- Asyncify._cachedData = Asyncify.allocateData();
7730
- } else {
7731
- Asyncify.setDataHeader(
7732
- Asyncify._cachedData,
7733
- Asyncify._cachedData + 12,
7734
- Asyncify.StackSize
7735
- );
7736
- Asyncify.setDataRewindFunc(Asyncify._cachedData);
7737
- }
7738
- Asyncify.currData = Asyncify._cachedData;
7739
- if (typeof MainLoop != 'undefined' && MainLoop.func) {
7740
- MainLoop.pause();
7741
- }
7742
- runAndAbortIfError(() =>
7743
- _asyncify_start_unwind(Asyncify.currData)
7744
- );
7745
- }
7746
- } else if (Asyncify.state === Asyncify.State.Rewinding) {
7747
- Asyncify.state = Asyncify.State.Normal;
7748
- runAndAbortIfError(_asyncify_stop_rewind);
7749
- Asyncify.currData = null;
7750
- Asyncify.sleepCallbacks.forEach(callUserCallback);
7751
- } else {
7752
- abort(`invalid state: ${Asyncify.state}`);
7753
- }
7754
- return Asyncify.handleSleepReturnValue;
7755
- },
7756
- handleAsync: (startAsync) =>
7757
- Asyncify.handleSleep((wakeUp) => {
7758
- startAsync().then(wakeUp);
7759
- }),
7760
- };
7761
7788
  var getCFunc = (ident) => {
7762
7789
  var func = Module['_' + ident];
7763
7790
  return func;
@@ -8084,10 +8111,7 @@ export function init(RuntimeName, PHPLoader) {
8084
8111
  return ERRNO_CODES.EWOULDBLOCK;
8085
8112
  }
8086
8113
  return returnCallback(async (wakeUp) => {
8087
- var retries = 0;
8088
8114
  var interval = 50;
8089
- var timeout = 5e3;
8090
- var maxRetries = timeout / interval;
8091
8115
  while (true) {
8092
8116
  var returnCode;
8093
8117
  var stream;
@@ -8111,7 +8135,6 @@ export function init(RuntimeName, PHPLoader) {
8111
8135
  return wakeUp(0);
8112
8136
  }
8113
8137
  if (
8114
- ++retries > maxRetries ||
8115
8138
  !stream ||
8116
8139
  FS.isClosed(stream) ||
8117
8140
  returnCode !== ERRNO_CODES.EWOULDBLOCK ||
@@ -8153,20 +8176,35 @@ export function init(RuntimeName, PHPLoader) {
8153
8176
  });
8154
8177
  }
8155
8178
  __asyncjs__js_module_onMessage.sig = 'iii';
8156
- var _calloc,
8179
+ var _php_info_print_table_header,
8180
+ _calloc,
8157
8181
  _malloc,
8158
8182
  _free,
8159
8183
  ___errno_location,
8184
+ _rename,
8185
+ _unlink,
8186
+ _mkdir,
8187
+ _rmdir,
8188
+ _opendir,
8189
+ _ftell,
8190
+ _strncasecmp,
8191
+ _strtoll,
8160
8192
  _wasm_sleep,
8161
8193
  _ntohs,
8162
8194
  _htons,
8163
8195
  _htonl,
8196
+ _fseek,
8164
8197
  _wasm_read,
8165
8198
  _fflush,
8199
+ _closedir,
8200
+ _readdir,
8201
+ _isalnum,
8166
8202
  _php_pollfd_for,
8167
8203
  _wasm_php_exec,
8204
+ _sscanf,
8168
8205
  ___wrap_usleep,
8169
8206
  _wasm_popen,
8207
+ _wasm_pclose,
8170
8208
  ___wrap_select,
8171
8209
  _wasm_set_sapi_name,
8172
8210
  _wasm_set_phpini_path,
@@ -8191,9 +8229,12 @@ export function init(RuntimeName, PHPLoader) {
8191
8229
  _wasm_free,
8192
8230
  _wasm_trace,
8193
8231
  _initgroups,
8232
+ _sqlite3_auto_extension,
8233
+ _sqlite3_cancel_auto_extension,
8194
8234
  ___funcs_on_exit,
8195
8235
  ___dl_seterr,
8196
8236
  __emscripten_find_dylib,
8237
+ _explicit_bzero,
8197
8238
  _emscripten_builtin_memalign,
8198
8239
  __emscripten_timeout,
8199
8240
  _emscripten_get_sbrk_ptr,
@@ -8263,6 +8304,8 @@ export function init(RuntimeName, PHPLoader) {
8263
8304
  wasmTable,
8264
8305
  wasmMemory;
8265
8306
  function assignWasmExports(wasmExports) {
8307
+ _php_info_print_table_header = Module['_php_info_print_table_header'] =
8308
+ wasmExports['php_info_print_table_header'];
8266
8309
  _calloc = wasmExports['calloc'];
8267
8310
  _malloc =
8268
8311
  PHPLoader['malloc'] =
@@ -8271,19 +8314,33 @@ export function init(RuntimeName, PHPLoader) {
8271
8314
  _free = wasmExports['free'];
8272
8315
  ___errno_location = Module['___errno_location'] =
8273
8316
  wasmExports['__errno_location'];
8317
+ _rename = Module['_rename'] = wasmExports['rename'];
8318
+ _unlink = Module['_unlink'] = wasmExports['unlink'];
8319
+ _mkdir = Module['_mkdir'] = wasmExports['mkdir'];
8320
+ _rmdir = Module['_rmdir'] = wasmExports['rmdir'];
8321
+ _opendir = Module['_opendir'] = wasmExports['opendir'];
8322
+ _ftell = Module['_ftell'] = wasmExports['ftell'];
8323
+ _strncasecmp = Module['_strncasecmp'] = wasmExports['strncasecmp'];
8324
+ _strtoll = Module['_strtoll'] = wasmExports['strtoll'];
8274
8325
  _wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'];
8275
8326
  _ntohs = wasmExports['ntohs'];
8276
8327
  _htons = wasmExports['htons'];
8277
8328
  _htonl = wasmExports['htonl'];
8329
+ _fseek = Module['_fseek'] = wasmExports['fseek'];
8278
8330
  _wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'];
8279
8331
  _fflush = wasmExports['fflush'];
8332
+ _closedir = Module['_closedir'] = wasmExports['closedir'];
8333
+ _readdir = Module['_readdir'] = wasmExports['readdir'];
8334
+ _isalnum = Module['_isalnum'] = wasmExports['isalnum'];
8280
8335
  _php_pollfd_for = Module['_php_pollfd_for'] =
8281
8336
  wasmExports['php_pollfd_for'];
8282
8337
  _wasm_php_exec = Module['_wasm_php_exec'] =
8283
8338
  wasmExports['wasm_php_exec'];
8339
+ _sscanf = Module['_sscanf'] = wasmExports['sscanf'];
8284
8340
  ___wrap_usleep = Module['___wrap_usleep'] =
8285
8341
  wasmExports['__wrap_usleep'];
8286
8342
  _wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'];
8343
+ _wasm_pclose = Module['_wasm_pclose'] = wasmExports['wasm_pclose'];
8287
8344
  ___wrap_select = Module['___wrap_select'] =
8288
8345
  wasmExports['__wrap_select'];
8289
8346
  _wasm_set_sapi_name = Module['_wasm_set_sapi_name'] =
@@ -8331,9 +8388,16 @@ export function init(RuntimeName, PHPLoader) {
8331
8388
  wasmExports['wasm_free'];
8332
8389
  _wasm_trace = Module['_wasm_trace'] = wasmExports['wasm_trace'];
8333
8390
  _initgroups = Module['_initgroups'] = wasmExports['initgroups'];
8391
+ _sqlite3_auto_extension = Module['_sqlite3_auto_extension'] =
8392
+ wasmExports['sqlite3_auto_extension'];
8393
+ _sqlite3_cancel_auto_extension = Module[
8394
+ '_sqlite3_cancel_auto_extension'
8395
+ ] = wasmExports['sqlite3_cancel_auto_extension'];
8334
8396
  ___funcs_on_exit = wasmExports['__funcs_on_exit'];
8335
8397
  ___dl_seterr = wasmExports['__dl_seterr'];
8336
8398
  __emscripten_find_dylib = wasmExports['_emscripten_find_dylib'];
8399
+ _explicit_bzero = Module['_explicit_bzero'] =
8400
+ wasmExports['explicit_bzero'];
8337
8401
  _emscripten_builtin_memalign =
8338
8402
  wasmExports['emscripten_builtin_memalign'];
8339
8403
  __emscripten_timeout = wasmExports['_emscripten_timeout'];
@@ -8418,7 +8482,7 @@ export function init(RuntimeName, PHPLoader) {
8418
8482
  __indirect_function_table = wasmTable =
8419
8483
  wasmExports['__indirect_function_table'];
8420
8484
  }
8421
- var ___heap_base = 5122080;
8485
+ var ___heap_base = 5121936;
8422
8486
  var wasmImports = {
8423
8487
  __assert_fail: ___assert_fail,
8424
8488
  __asyncify_data: ___asyncify_data,
@@ -8515,7 +8579,11 @@ export function init(RuntimeName, PHPLoader) {
8515
8579
  invoke_viiiiiii,
8516
8580
  js_fd_read,
8517
8581
  js_open_process: _js_open_process,
8582
+ js_popen_clear_pid_for_fd: _js_popen_clear_pid_for_fd,
8583
+ js_popen_get_pid_for_fd: _js_popen_get_pid_for_fd,
8584
+ js_popen_set_pid_for_fd: _js_popen_set_pid_for_fd,
8518
8585
  js_popen_to_file,
8586
+ js_waitpid: _js_waitpid,
8519
8587
  js_wasm_trace: _js_wasm_trace,
8520
8588
  proc_exit: _proc_exit,
8521
8589
  strptime: _strptime,
Binary file
package/jspi/php_5_2.js CHANGED
@@ -1,7 +1,7 @@
1
1
  const dependencyFilename = new URL('./5_2_17/php_5_2.wasm', import.meta.url)
2
2
  .href;
3
3
  export { dependencyFilename };
4
- export const dependenciesTotalSize = 9428070;
4
+ export const dependenciesTotalSize = 9429659;
5
5
  const phpVersionString = '5.2.17';
6
6
  export function init(RuntimeName, PHPLoader) {
7
7
  // The rest of the code comes from the built php.js file and esm-suffix.js
@@ -5159,8 +5159,6 @@ export function init(RuntimeName, PHPLoader) {
5159
5159
  wakeUp(-ERRNO_CODES.ECONNREFUSED);
5160
5160
  return;
5161
5161
  }
5162
- // Wait for the connection to be established. A zero timeval
5163
- // disables the timeout, matching SO_SNDTIMEO semantics.
5164
5162
  const sendTimeout = PHPWASM.socketTimeouts.get(sockfd)?.send;
5165
5163
  const timeout = sendTimeout ?? 3e4;
5166
5164
  let resolved = false;
@@ -5171,7 +5169,6 @@ export function init(RuntimeName, PHPLoader) {
5171
5169
  const peer = PHPWASM.getAllPeers(sock).find(
5172
5170
  (candidate) => candidate.socket === ws
5173
5171
  );
5174
-
5175
5172
  const cleanupConnectListeners = () => {
5176
5173
  if (typeof timeoutId !== 'undefined') {
5177
5174
  clearTimeout(timeoutId);
@@ -5180,7 +5177,6 @@ export function init(RuntimeName, PHPLoader) {
5180
5177
  ws.removeEventListener('error', handleError);
5181
5178
  ws.removeEventListener('close', handleClose);
5182
5179
  };
5183
-
5184
5180
  const cleanupFailedConnect = (errno) => {
5185
5181
  try {
5186
5182
  if (
@@ -5189,16 +5185,13 @@ export function init(RuntimeName, PHPLoader) {
5189
5185
  ) {
5190
5186
  ws.close();
5191
5187
  }
5192
- } catch (e) {
5193
- // Ignore close errors on an already-failed connect.
5194
- }
5188
+ } catch (e) {}
5195
5189
  if (peer) {
5196
5190
  SOCKFS.websocket_sock_ops.removePeer(sock, peer);
5197
5191
  }
5198
5192
  sock.connecting = false;
5199
5193
  sock.error = errno;
5200
5194
  };
5201
-
5202
5195
  const finishConnect = (result) => {
5203
5196
  if (!resolved) {
5204
5197
  resolved = true;
@@ -5209,21 +5202,17 @@ export function init(RuntimeName, PHPLoader) {
5209
5202
  wakeUp(result);
5210
5203
  }
5211
5204
  };
5212
-
5213
5205
  if (timeout > 0) {
5214
5206
  timeoutId = setTimeout(() => {
5215
5207
  finishConnect(-ERRNO_CODES.ETIMEDOUT);
5216
5208
  }, timeout);
5217
5209
  }
5218
-
5219
5210
  handleOpen = () => {
5220
5211
  finishConnect(0);
5221
5212
  };
5222
-
5223
5213
  handleError = () => {
5224
5214
  finishConnect(-ERRNO_CODES.ECONNREFUSED);
5225
5215
  };
5226
-
5227
5216
  handleClose = () => {
5228
5217
  finishConnect(-ERRNO_CODES.ECONNREFUSED);
5229
5218
  };
@@ -6483,6 +6472,65 @@ export function init(RuntimeName, PHPLoader) {
6483
6472
  runtimeKeepaliveCounter -= 1;
6484
6473
  };
6485
6474
  runtimeKeepalivePop.sig = 'v';
6475
+ var Asyncify = {
6476
+ instrumentWasmImports(imports) {
6477
+ var importPattern =
6478
+ /^(js_open_process|js_fd_read|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|wasm_recv|wasm_connect|__syscall_fcntl64|js_flock|js_release_file_locks|js_waitpid|invoke_.*|__asyncjs__.*)$/;
6479
+ for (let [x, original] of Object.entries(imports)) {
6480
+ if (typeof original == 'function') {
6481
+ let isAsyncifyImport =
6482
+ original.isAsync || importPattern.test(x);
6483
+ if (isAsyncifyImport) {
6484
+ imports[x] = original = new WebAssembly.Suspending(
6485
+ original
6486
+ );
6487
+ }
6488
+ }
6489
+ }
6490
+ },
6491
+ instrumentFunction(original) {
6492
+ var wrapper = (...args) => original(...args);
6493
+ wrapper.orig = original;
6494
+ return wrapper;
6495
+ },
6496
+ instrumentWasmExports(exports) {
6497
+ var exportPattern =
6498
+ /^(php_wasm_init|wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|wasm_recv|wasm_connect|__wasm_call_ctors|__errno_location|__funcs_on_exit|main|__main_argc_argv)$/;
6499
+ Asyncify.asyncExports = new Set();
6500
+ var ret = {};
6501
+ for (let [x, original] of Object.entries(exports)) {
6502
+ if (typeof original == 'function') {
6503
+ let isAsyncifyExport = exportPattern.test(x);
6504
+ if (isAsyncifyExport) {
6505
+ Asyncify.asyncExports.add(original);
6506
+ original = Asyncify.makeAsyncFunction(original);
6507
+ }
6508
+ var wrapper = Asyncify.instrumentFunction(original);
6509
+ ret[x] = wrapper;
6510
+ } else {
6511
+ ret[x] = original;
6512
+ }
6513
+ }
6514
+ return ret;
6515
+ },
6516
+ asyncExports: null,
6517
+ isAsyncExport(func) {
6518
+ return Asyncify.asyncExports?.has(func);
6519
+ },
6520
+ handleAsync: async (startAsync) => {
6521
+ runtimeKeepalivePush();
6522
+ try {
6523
+ return await startAsync();
6524
+ } finally {
6525
+ runtimeKeepalivePop();
6526
+ }
6527
+ },
6528
+ handleSleep: (startAsync) =>
6529
+ Asyncify.handleAsync(() => new Promise(startAsync)),
6530
+ makeAsyncFunction(original) {
6531
+ return WebAssembly.promising(original);
6532
+ },
6533
+ };
6486
6534
  var safeSetTimeout = (func, timeout) => {
6487
6535
  runtimeKeepalivePush();
6488
6536
  return setTimeout(() => {
@@ -6492,9 +6540,6 @@ export function init(RuntimeName, PHPLoader) {
6492
6540
  };
6493
6541
  var _emscripten_sleep = function (ms) {
6494
6542
  return Asyncify.handleSleep((wakeUp) => {
6495
- // select() yields between socket reads. Nested zero-delay timers are
6496
- // clamped by browsers, adding seconds to even a local curl download.
6497
- // Use a task (not a microtask) so network events still get a turn.
6498
6543
  if (ms === 0 && globalThis.scheduler?.postTask) {
6499
6544
  runtimeKeepalivePush();
6500
6545
  globalThis.scheduler.postTask(() => {
@@ -6923,13 +6968,11 @@ export function init(RuntimeName, PHPLoader) {
6923
6968
  envLength
6924
6969
  ) {
6925
6970
  if (!command) {
6926
- ___errno_location(ERRNO_CODES.EINVAL);
6927
- return -1;
6971
+ return -ERRNO_CODES.EINVAL;
6928
6972
  }
6929
6973
  const cmdstr = UTF8ToString(command);
6930
6974
  if (!cmdstr.length) {
6931
- ___errno_location(ERRNO_CODES.EINVAL);
6932
- return -1;
6975
+ return -ERRNO_CODES.EINVAL;
6933
6976
  }
6934
6977
  let argsArray = [];
6935
6978
  if (argsLength) {
@@ -6984,13 +7027,11 @@ export function init(RuntimeName, PHPLoader) {
6984
7027
  }
6985
7028
  } catch (e) {
6986
7029
  if (e.code === 'SPAWN_UNSUPPORTED') {
6987
- ___errno_location(ERRNO_CODES.ENOSYS);
6988
- return -1;
7030
+ return -ERRNO_CODES.ENOSYS;
6989
7031
  }
6990
7032
  if (typeof FS == 'undefined' || !(e.name === 'ErrnoError'))
6991
7033
  throw e;
6992
- ___errno_location(e.code);
6993
- return -1;
7034
+ return -e.errno;
6994
7035
  }
6995
7036
  const ProcInfo = { pid: cp.pid, exited: false };
6996
7037
  PHPWASM.processTable[ProcInfo.pid] = ProcInfo;
@@ -7001,7 +7042,12 @@ export function init(RuntimeName, PHPLoader) {
7001
7042
  stderrChildFd = std[2]?.child,
7002
7043
  stderrParentFd = std[2]?.parent;
7003
7044
  const detachPipeDataListeners = [];
7004
- cp.on('exit', function (code) {
7045
+ let childPipesClosed = false;
7046
+ const closeChildPipes = function () {
7047
+ if (childPipesClosed) {
7048
+ return;
7049
+ }
7050
+ childPipesClosed = true;
7005
7051
  for (const detach of detachPipeDataListeners) {
7006
7052
  detach();
7007
7053
  }
@@ -7010,6 +7056,9 @@ export function init(RuntimeName, PHPLoader) {
7010
7056
  FS.close(FS.streams[fd]);
7011
7057
  }
7012
7058
  }
7059
+ };
7060
+ cp.on('exit', function (code) {
7061
+ closeChildPipes();
7013
7062
  ProcInfo.exitCode = code;
7014
7063
  ProcInfo.exited = true;
7015
7064
  });
@@ -7089,6 +7138,10 @@ export function init(RuntimeName, PHPLoader) {
7089
7138
  });
7090
7139
  } catch (e) {
7091
7140
  console.error(e);
7141
+ closeChildPipes();
7142
+ if (!ProcInfo.pid) {
7143
+ return -(ERRNO_CODES[e.code] ?? ERRNO_CODES.ECHILD);
7144
+ }
7092
7145
  return ProcInfo.pid;
7093
7146
  }
7094
7147
  if (stdinChildFd) {
@@ -7161,16 +7214,49 @@ export function init(RuntimeName, PHPLoader) {
7161
7214
  const interval = setInterval(pump, 20);
7162
7215
  pump();
7163
7216
  } else {
7164
- /**
7165
- * Descriptor 0 was not provided, so the child process must observe EOF.
7166
- * Closing stdin explicitly lets spawn handlers distinguish that case from
7167
- * a valid pipe whose first bytes have not arrived yet.
7168
- */
7169
7217
  cp.stdin.end();
7170
7218
  }
7171
7219
  return ProcInfo.pid;
7172
7220
  });
7173
7221
  }
7222
+ function _js_popen_clear_pid_for_fd(fd) {
7223
+ for (const pid in PHPWASM.processTable) {
7224
+ if (PHPWASM.processTable[pid].fd === fd) {
7225
+ delete PHPWASM.processTable[pid].fd;
7226
+ return;
7227
+ }
7228
+ }
7229
+ }
7230
+ function _js_popen_get_pid_for_fd(fd) {
7231
+ for (const pid in PHPWASM.processTable) {
7232
+ if (PHPWASM.processTable[pid].fd === fd) {
7233
+ return PHPWASM.processTable[pid].pid;
7234
+ }
7235
+ }
7236
+ return -1;
7237
+ }
7238
+ function _js_popen_set_pid_for_fd(fd, pid) {
7239
+ if (PHPWASM.processTable[pid]) {
7240
+ PHPWASM.processTable[pid].fd = fd;
7241
+ }
7242
+ }
7243
+ function _js_waitpid(pid, exitCodePtr) {
7244
+ if (!PHPWASM.processTable[pid]) {
7245
+ return -1;
7246
+ }
7247
+ return Asyncify.handleSleep((wakeUp) => {
7248
+ const poll = function () {
7249
+ if (PHPWASM.processTable[pid]?.exited) {
7250
+ HEAPU32[exitCodePtr >> 2] =
7251
+ PHPWASM.processTable[pid].exitCode;
7252
+ wakeUp(pid);
7253
+ } else {
7254
+ setTimeout(poll, 50);
7255
+ }
7256
+ };
7257
+ poll();
7258
+ });
7259
+ }
7174
7260
  var arraySum = (array, index) => {
7175
7261
  var sum = 0;
7176
7262
  for (var i = 0; i <= index; sum += array[i++]) {}
@@ -7517,66 +7603,6 @@ export function init(RuntimeName, PHPLoader) {
7517
7603
  ws.setSocketOpt(level, optionName, optionValuePtr);
7518
7604
  return 0;
7519
7605
  }
7520
-
7521
- var Asyncify = {
7522
- instrumentWasmImports(imports) {
7523
- var importPattern =
7524
- /^(js_open_process|js_fd_read|js_waitpid|js_process_status|js_create_input_device|wasm_setsockopt|wasm_shutdown|wasm_close|wasm_recv|wasm_connect|__syscall_fcntl64|js_flock|js_release_file_locks|js_waitpid|invoke_.*|__asyncjs__.*)$/;
7525
- for (let [x, original] of Object.entries(imports)) {
7526
- if (typeof original == 'function') {
7527
- let isAsyncifyImport =
7528
- original.isAsync || importPattern.test(x);
7529
- if (isAsyncifyImport) {
7530
- imports[x] = original = new WebAssembly.Suspending(
7531
- original
7532
- );
7533
- }
7534
- }
7535
- }
7536
- },
7537
- instrumentFunction(original) {
7538
- var wrapper = (...args) => original(...args);
7539
- wrapper.orig = original;
7540
- return wrapper;
7541
- },
7542
- instrumentWasmExports(exports) {
7543
- var exportPattern =
7544
- /^(php_wasm_init|wasm_sleep|wasm_read|emscripten_sleep|wasm_sapi_handle_request|wasm_sapi_request_shutdown|wasm_poll_socket|wrap_select|__wrap_select|select|php_pollfd_for|fflush|wasm_popen|wasm_read|wasm_php_exec|run_cli|wasm_recv|wasm_connect|__wasm_call_ctors|__errno_location|__funcs_on_exit|main|__main_argc_argv)$/;
7545
- Asyncify.asyncExports = new Set();
7546
- var ret = {};
7547
- for (let [x, original] of Object.entries(exports)) {
7548
- if (typeof original == 'function') {
7549
- let isAsyncifyExport = exportPattern.test(x);
7550
- if (isAsyncifyExport) {
7551
- Asyncify.asyncExports.add(original);
7552
- original = Asyncify.makeAsyncFunction(original);
7553
- }
7554
- var wrapper = Asyncify.instrumentFunction(original);
7555
- ret[x] = wrapper;
7556
- } else {
7557
- ret[x] = original;
7558
- }
7559
- }
7560
- return ret;
7561
- },
7562
- asyncExports: null,
7563
- isAsyncExport(func) {
7564
- return Asyncify.asyncExports?.has(func);
7565
- },
7566
- handleAsync: async (startAsync) => {
7567
- runtimeKeepalivePush();
7568
- try {
7569
- return await startAsync();
7570
- } finally {
7571
- runtimeKeepalivePop();
7572
- }
7573
- },
7574
- handleSleep: (startAsync) =>
7575
- Asyncify.handleAsync(() => new Promise(startAsync)),
7576
- makeAsyncFunction(original) {
7577
- return WebAssembly.promising(original);
7578
- },
7579
- };
7580
7606
  var getCFunc = (ident) => {
7581
7607
  var func = Module['_' + ident];
7582
7608
  return func;
@@ -7902,10 +7928,7 @@ export function init(RuntimeName, PHPLoader) {
7902
7928
  return ERRNO_CODES.EWOULDBLOCK;
7903
7929
  }
7904
7930
  return returnCallback(async (wakeUp) => {
7905
- var retries = 0;
7906
7931
  var interval = 50;
7907
- var timeout = 5e3;
7908
- var maxRetries = timeout / interval;
7909
7932
  while (true) {
7910
7933
  var returnCode;
7911
7934
  var stream;
@@ -7929,7 +7952,6 @@ export function init(RuntimeName, PHPLoader) {
7929
7952
  return wakeUp(0);
7930
7953
  }
7931
7954
  if (
7932
- ++retries > maxRetries ||
7933
7955
  !stream ||
7934
7956
  FS.isClosed(stream) ||
7935
7957
  returnCode !== ERRNO_CODES.EWOULDBLOCK ||
@@ -7971,7 +7993,8 @@ export function init(RuntimeName, PHPLoader) {
7971
7993
  });
7972
7994
  }
7973
7995
  __asyncjs__js_module_onMessage.sig = 'iii';
7974
- var _compile_string,
7996
+ var _php_info_print_table_header,
7997
+ _compile_string,
7975
7998
  __efree,
7976
7999
  __zval_ptr_dtor,
7977
8000
  _destroy_op_array,
@@ -7980,16 +8003,33 @@ export function init(RuntimeName, PHPLoader) {
7980
8003
  _calloc,
7981
8004
  _malloc,
7982
8005
  ___errno_location,
8006
+ ___wasm_setjmp,
8007
+ ___wasm_setjmp_test,
8008
+ ___wasm_longjmp,
8009
+ _rename,
8010
+ _unlink,
8011
+ _mkdir,
8012
+ _rmdir,
8013
+ _opendir,
8014
+ _ftell,
8015
+ _strncasecmp,
8016
+ _strtoll,
7983
8017
  _wasm_sleep,
7984
8018
  _ntohs,
7985
8019
  _htons,
7986
8020
  _htonl,
8021
+ _fseek,
7987
8022
  _wasm_read,
7988
8023
  _fflush,
8024
+ _closedir,
8025
+ _readdir,
8026
+ _isalnum,
7989
8027
  _php_pollfd_for,
7990
8028
  _wasm_php_exec,
8029
+ _sscanf,
7991
8030
  ___wrap_usleep,
7992
8031
  _wasm_popen,
8032
+ _wasm_pclose,
7993
8033
  ___wrap_select,
7994
8034
  _wasm_set_sapi_name,
7995
8035
  _wasm_set_phpini_path,
@@ -8014,9 +8054,12 @@ export function init(RuntimeName, PHPLoader) {
8014
8054
  _wasm_free,
8015
8055
  _wasm_trace,
8016
8056
  _initgroups,
8057
+ _sqlite3_auto_extension,
8058
+ _sqlite3_cancel_auto_extension,
8017
8059
  ___funcs_on_exit,
8018
8060
  ___dl_seterr,
8019
8061
  __emscripten_find_dylib,
8062
+ _explicit_bzero,
8020
8063
  _emscripten_builtin_memalign,
8021
8064
  __emscripten_timeout,
8022
8065
  _emscripten_get_sbrk_ptr,
@@ -8030,9 +8073,12 @@ export function init(RuntimeName, PHPLoader) {
8030
8073
  __ZNSt3__25mutex6unlockEv,
8031
8074
  memory,
8032
8075
  __indirect_function_table,
8076
+ ___c_longjmp,
8033
8077
  wasmTable,
8034
8078
  wasmMemory;
8035
8079
  function assignWasmExports(wasmExports) {
8080
+ _php_info_print_table_header = Module['_php_info_print_table_header'] =
8081
+ wasmExports['php_info_print_table_header'];
8036
8082
  _compile_string = Module['_compile_string'] =
8037
8083
  wasmExports['compile_string'];
8038
8084
  __efree = Module['__efree'] = wasmExports['_efree'];
@@ -8050,19 +8096,39 @@ export function init(RuntimeName, PHPLoader) {
8050
8096
  wasmExports['malloc'];
8051
8097
  ___errno_location = Module['___errno_location'] =
8052
8098
  wasmExports['__errno_location'];
8099
+ ___wasm_setjmp = Module['___wasm_setjmp'] =
8100
+ wasmExports['__wasm_setjmp'];
8101
+ ___wasm_setjmp_test = Module['___wasm_setjmp_test'] =
8102
+ wasmExports['__wasm_setjmp_test'];
8103
+ ___wasm_longjmp = Module['___wasm_longjmp'] =
8104
+ wasmExports['__wasm_longjmp'];
8105
+ _rename = Module['_rename'] = wasmExports['rename'];
8106
+ _unlink = Module['_unlink'] = wasmExports['unlink'];
8107
+ _mkdir = Module['_mkdir'] = wasmExports['mkdir'];
8108
+ _rmdir = Module['_rmdir'] = wasmExports['rmdir'];
8109
+ _opendir = Module['_opendir'] = wasmExports['opendir'];
8110
+ _ftell = Module['_ftell'] = wasmExports['ftell'];
8111
+ _strncasecmp = Module['_strncasecmp'] = wasmExports['strncasecmp'];
8112
+ _strtoll = Module['_strtoll'] = wasmExports['strtoll'];
8053
8113
  _wasm_sleep = Module['_wasm_sleep'] = wasmExports['wasm_sleep'];
8054
8114
  _ntohs = wasmExports['ntohs'];
8055
8115
  _htons = wasmExports['htons'];
8056
8116
  _htonl = wasmExports['htonl'];
8117
+ _fseek = Module['_fseek'] = wasmExports['fseek'];
8057
8118
  _wasm_read = Module['_wasm_read'] = wasmExports['wasm_read'];
8058
8119
  _fflush = wasmExports['fflush'];
8120
+ _closedir = Module['_closedir'] = wasmExports['closedir'];
8121
+ _readdir = Module['_readdir'] = wasmExports['readdir'];
8122
+ _isalnum = Module['_isalnum'] = wasmExports['isalnum'];
8059
8123
  _php_pollfd_for = Module['_php_pollfd_for'] =
8060
8124
  wasmExports['php_pollfd_for'];
8061
8125
  _wasm_php_exec = Module['_wasm_php_exec'] =
8062
8126
  wasmExports['wasm_php_exec'];
8127
+ _sscanf = Module['_sscanf'] = wasmExports['sscanf'];
8063
8128
  ___wrap_usleep = Module['___wrap_usleep'] =
8064
8129
  wasmExports['__wrap_usleep'];
8065
8130
  _wasm_popen = Module['_wasm_popen'] = wasmExports['wasm_popen'];
8131
+ _wasm_pclose = Module['_wasm_pclose'] = wasmExports['wasm_pclose'];
8066
8132
  ___wrap_select = Module['___wrap_select'] =
8067
8133
  wasmExports['__wrap_select'];
8068
8134
  _wasm_set_sapi_name = Module['_wasm_set_sapi_name'] =
@@ -8110,9 +8176,16 @@ export function init(RuntimeName, PHPLoader) {
8110
8176
  wasmExports['wasm_free'];
8111
8177
  _wasm_trace = Module['_wasm_trace'] = wasmExports['wasm_trace'];
8112
8178
  _initgroups = Module['_initgroups'] = wasmExports['initgroups'];
8179
+ _sqlite3_auto_extension = Module['_sqlite3_auto_extension'] =
8180
+ wasmExports['sqlite3_auto_extension'];
8181
+ _sqlite3_cancel_auto_extension = Module[
8182
+ '_sqlite3_cancel_auto_extension'
8183
+ ] = wasmExports['sqlite3_cancel_auto_extension'];
8113
8184
  ___funcs_on_exit = wasmExports['__funcs_on_exit'];
8114
8185
  ___dl_seterr = wasmExports['__dl_seterr'];
8115
8186
  __emscripten_find_dylib = wasmExports['_emscripten_find_dylib'];
8187
+ _explicit_bzero = Module['_explicit_bzero'] =
8188
+ wasmExports['explicit_bzero'];
8116
8189
  _emscripten_builtin_memalign =
8117
8190
  wasmExports['emscripten_builtin_memalign'];
8118
8191
  __emscripten_timeout = wasmExports['_emscripten_timeout'];
@@ -8135,19 +8208,20 @@ export function init(RuntimeName, PHPLoader) {
8135
8208
  memory = wasmMemory = wasmExports['memory'];
8136
8209
  __indirect_function_table = wasmTable =
8137
8210
  wasmExports['__indirect_function_table'];
8211
+ ___c_longjmp = Module['___c_longjmp'] = wasmExports['__c_longjmp'];
8138
8212
  }
8139
- var _file_globals = (Module['_file_globals'] = 4026816);
8140
- var _sapi_module = (Module['_sapi_module'] = 4032012);
8141
- var _sapi_globals = (Module['_sapi_globals'] = 4032152);
8142
- var _compiler_globals = (Module['_compiler_globals'] = 4025696);
8143
- var _executor_globals = (Module['_executor_globals'] = 4026040);
8144
- var _zend_ce_traversable = (Module['_zend_ce_traversable'] = 4020136);
8145
- var _zend_ce_aggregate = (Module['_zend_ce_aggregate'] = 4020140);
8146
- var _zend_ce_iterator = (Module['_zend_ce_iterator'] = 4020144);
8147
- var _zend_ce_arrayaccess = (Module['_zend_ce_arrayaccess'] = 4020148);
8148
- var _zend_ce_serializable = (Module['_zend_ce_serializable'] = 4020152);
8149
- var _std_object_handlers = (Module['_std_object_handlers'] = 3648076);
8150
- var ___heap_base = 5123888;
8213
+ var _file_globals = (Module['_file_globals'] = 4026688);
8214
+ var _sapi_module = (Module['_sapi_module'] = 4031884);
8215
+ var _sapi_globals = (Module['_sapi_globals'] = 4032024);
8216
+ var _compiler_globals = (Module['_compiler_globals'] = 4025568);
8217
+ var _executor_globals = (Module['_executor_globals'] = 4025912);
8218
+ var _zend_ce_traversable = (Module['_zend_ce_traversable'] = 4020008);
8219
+ var _zend_ce_aggregate = (Module['_zend_ce_aggregate'] = 4020012);
8220
+ var _zend_ce_iterator = (Module['_zend_ce_iterator'] = 4020016);
8221
+ var _zend_ce_arrayaccess = (Module['_zend_ce_arrayaccess'] = 4020020);
8222
+ var _zend_ce_serializable = (Module['_zend_ce_serializable'] = 4020024);
8223
+ var _std_object_handlers = (Module['_std_object_handlers'] = 3648060);
8224
+ var ___heap_base = 5123760;
8151
8225
  var wasmImports = {
8152
8226
  __assert_fail: ___assert_fail,
8153
8227
  __asyncjs__js_module_onMessage,
@@ -8225,6 +8299,10 @@ export function init(RuntimeName, PHPLoader) {
8225
8299
  getprotobynumber: _getprotobynumber,
8226
8300
  js_fd_read,
8227
8301
  js_open_process: _js_open_process,
8302
+ js_popen_clear_pid_for_fd: _js_popen_clear_pid_for_fd,
8303
+ js_popen_get_pid_for_fd: _js_popen_get_pid_for_fd,
8304
+ js_popen_set_pid_for_fd: _js_popen_set_pid_for_fd,
8305
+ js_waitpid: _js_waitpid,
8228
8306
  js_wasm_trace: _js_wasm_trace,
8229
8307
  proc_exit: _proc_exit,
8230
8308
  strptime: _strptime,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@php-wasm/web-5-2",
3
- "version": "3.1.62",
3
+ "version": "3.1.63",
4
4
  "description": "PHP 5.2 WebAssembly binaries for web (legacy)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,10 +35,10 @@
35
35
  "node": ">=24.18.0",
36
36
  "npm": ">=11.16.0"
37
37
  },
38
- "gitHead": "8c52f103f3ce30668994c0e75c2c530b82097a5e",
38
+ "gitHead": "d9392e2c6a2eb8c5cd5c4d357c725572fac56c12",
39
39
  "dependencies": {
40
40
  "wasm-feature-detect": "1.8.0",
41
- "@php-wasm/universal": "3.1.62"
41
+ "@php-wasm/universal": "3.1.63"
42
42
  },
43
43
  "packageManager": "npm@10.9.2",
44
44
  "overrides": {