funicular 0.4.0 → 0.5.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +473 -1
  3. data/demo/local_notes.html +207 -0
  4. data/docs/architecture.md +181 -3
  5. data/docs/local_database.md +1035 -0
  6. data/lib/funicular/assets/funicular.rb +14 -0
  7. data/lib/funicular/configuration.rb +65 -0
  8. data/lib/funicular/epoch_header.rb +69 -0
  9. data/lib/funicular/epoch_stamping.rb +66 -0
  10. data/lib/funicular/helpers/picoruby_helper.rb +96 -1
  11. data/lib/funicular/railtie.rb +30 -0
  12. data/lib/funicular/schema.rb +45 -12
  13. data/lib/funicular/session_epoch.rb +110 -0
  14. data/lib/funicular/ssr/runtime.rb +57 -12
  15. data/lib/funicular/ssr.rb +25 -0
  16. data/lib/funicular/testing/node_runner.mjs +19 -0
  17. data/lib/funicular/testing.rb +47 -0
  18. data/lib/funicular/vendor/mrbc/VERSION +1 -1
  19. data/lib/funicular/vendor/mrbc/mrbc.js +82 -124
  20. data/lib/funicular/vendor/mrbc/mrbc.wasm +0 -0
  21. data/lib/funicular/vendor/picoruby/VERSION +1 -1
  22. data/lib/funicular/vendor/picoruby/debug/picoruby.js +241 -126
  23. data/lib/funicular/vendor/picoruby/debug/picoruby.wasm +0 -0
  24. data/lib/funicular/vendor/picoruby/dist/picoruby.js +1 -1
  25. data/lib/funicular/vendor/picoruby/dist/picoruby.wasm +0 -0
  26. data/lib/funicular/vendor/picoruby-test-node/VERSION +1 -1
  27. data/lib/funicular/vendor/picoruby-test-node/picoruby.js +2 -7201
  28. data/lib/funicular/vendor/picoruby-test-node/picoruby.wasm +0 -0
  29. data/lib/funicular/version.rb +4 -3
  30. data/lib/funicular.rb +1 -0
  31. data/lib/tasks/funicular.rake +33 -17
  32. data/minitest/callback_error_visibility_test.rb +48 -0
  33. data/minitest/configuration_test.rb +78 -0
  34. data/minitest/dsl_test.rb +27 -0
  35. data/minitest/epoch_header_test.rb +149 -0
  36. data/minitest/epoch_stamping_test.rb +225 -0
  37. data/minitest/fixtures/funicular_app/components/probe_component.rb +15 -0
  38. data/minitest/navigation_guard_test.rb +65 -0
  39. data/minitest/picoruby_helper_test.rb +236 -0
  40. data/minitest/schema_test.rb +47 -0
  41. data/minitest/session_epoch_test.rb +122 -0
  42. data/minitest/ssr_database_test.rb +78 -0
  43. data/minitest/ssr_reload_test.rb +106 -0
  44. data/minitest/ssr_test.rb +41 -0
  45. data/minitest/testing_ensure_compiled_test.rb +52 -0
  46. data/minitest/validations_test.rb +35 -5
  47. data/mrbgem.rake +2 -0
  48. data/mrblib/cable.rb +1 -1
  49. data/mrblib/component.rb +113 -1
  50. data/mrblib/db.rb +3116 -0
  51. data/mrblib/debug.rb +54 -10
  52. data/mrblib/differ.rb +7 -5
  53. data/mrblib/file_upload.rb +17 -7
  54. data/mrblib/funicular.rb +137 -21
  55. data/mrblib/http.rb +84 -107
  56. data/mrblib/model.rb +1178 -23
  57. data/mrblib/patcher.rb +57 -25
  58. data/mrblib/relation.rb +342 -0
  59. data/mrblib/router.rb +45 -4
  60. data/mrblib/styles.rb +20 -0
  61. data/mrblib/vdom.rb +5 -5
  62. data/mrblib/version.rb +11 -0
  63. data/sig/component.rbs +7 -0
  64. data/sig/db.rbs +328 -0
  65. data/sig/debug.rbs +5 -0
  66. data/sig/funicular.rbs +5 -0
  67. data/sig/http.rbs +8 -21
  68. data/sig/model.rbs +101 -7
  69. data/sig/patcher.rbs +1 -0
  70. data/sig/relation.rbs +44 -0
  71. data/sig/router.rbs +1 -0
  72. data/sig/styles.rbs +1 -0
  73. metadata +21 -3
  74. data/lib/funicular/vendor/picoruby-test-node/picoruby.wasm.map +0 -1
@@ -416,6 +416,8 @@ function initRuntime() {
416
416
  assert(!runtimeInitialized);
417
417
  runtimeInitialized = true;
418
418
 
419
+ setStackLimits();
420
+
419
421
  checkStackCookie();
420
422
 
421
423
  // Begin ATINITS hooks
@@ -644,36 +646,15 @@ async function createWasm() {
644
646
  }
645
647
  }
646
648
 
647
- /** @type {!Int16Array} */
648
- var HEAP16;
649
-
650
649
  /** @type {!Int32Array} */
651
650
  var HEAP32;
652
651
 
653
- /** not-@type {!BigInt64Array} */
654
- var HEAP64;
655
-
656
652
  /** @type {!Int8Array} */
657
653
  var HEAP8;
658
654
 
659
- /** @type {!Float32Array} */
660
- var HEAPF32;
661
-
662
- /** @type {!Float64Array} */
663
- var HEAPF64;
664
-
665
- /** @type {!Uint16Array} */
666
- var HEAPU16;
667
-
668
655
  /** @type {!Uint32Array} */
669
656
  var HEAPU32;
670
657
 
671
- /** not-@type {!BigUint64Array} */
672
- var HEAPU64;
673
-
674
- /** @type {!Uint8Array} */
675
- var HEAPU8;
676
-
677
658
  var callRuntimeCallbacks = (callbacks) => {
678
659
  while (callbacks.length > 0) {
679
660
  // Pass the module as the first argument.
@@ -687,26 +668,6 @@ async function createWasm() {
687
668
  var addOnPreRun = (cb) => onPreRuns.push(cb);
688
669
 
689
670
 
690
-
691
- /**
692
- * @param {number} ptr
693
- * @param {string} type
694
- */
695
- function getValue(ptr, type = 'i8') {
696
- if (type.endsWith('*')) type = '*';
697
- switch (type) {
698
- case 'i1': return HEAP8[ptr];
699
- case 'i8': return HEAP8[ptr];
700
- case 'i16': return HEAP16[((ptr)>>1)];
701
- case 'i32': return HEAP32[((ptr)>>2)];
702
- case 'i64': return HEAP64[((ptr)>>3)];
703
- case 'float': return HEAPF32[((ptr)>>2)];
704
- case 'double': return HEAPF64[((ptr)>>3)];
705
- case '*': return HEAPU32[((ptr)>>2)];
706
- default: abort(`invalid type for getValue: ${type}`);
707
- }
708
- }
709
-
710
671
  var noExitRuntime = true;
711
672
 
712
673
  function ptrToString(ptr) {
@@ -716,26 +677,11 @@ async function createWasm() {
716
677
  return '0x' + ptr.toString(16).padStart(8, '0');
717
678
  }
718
679
 
719
-
720
- /**
721
- * @param {number} ptr
722
- * @param {number} value
723
- * @param {string} type
724
- */
725
- function setValue(ptr, value, type = 'i8') {
726
- if (type.endsWith('*')) type = '*';
727
- switch (type) {
728
- case 'i1': HEAP8[ptr] = value; break;
729
- case 'i8': HEAP8[ptr] = value; break;
730
- case 'i16': HEAP16[((ptr)>>1)] = value; break;
731
- case 'i32': HEAP32[((ptr)>>2)] = value; break;
732
- case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break;
733
- case 'float': HEAPF32[((ptr)>>2)] = value; break;
734
- case 'double': HEAPF64[((ptr)>>3)] = value; break;
735
- case '*': HEAPU32[((ptr)>>2)] = value; break;
736
- default: abort(`invalid type for setValue: ${type}`);
737
- }
738
- }
680
+ var setStackLimits = () => {
681
+ var stackLow = _emscripten_stack_get_base();
682
+ var stackHigh = _emscripten_stack_get_end();
683
+ ___set_stack_limits(stackLow, stackHigh);
684
+ };
739
685
 
740
686
  var stackRestore = (val) => __emscripten_stack_restore(val);
741
687
 
@@ -819,6 +765,9 @@ async function createWasm() {
819
765
  return str;
820
766
  };
821
767
 
768
+ /** @type {!Uint8Array} */
769
+ var HEAPU8;
770
+
822
771
  /**
823
772
  * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
824
773
  * emscripten HEAP, returns a copy of that string as a Javascript String object.
@@ -854,6 +803,16 @@ async function createWasm() {
854
803
  };
855
804
  var ___call_sighandler = (fp, sig) => getWasmTableEntry(fp)(sig);
856
805
 
806
+
807
+
808
+ var ___handle_stack_overflow = (requested) => {
809
+ var base = _emscripten_stack_get_base();
810
+ var end = _emscripten_stack_get_end();
811
+ abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` +
812
+ `, with stack limits [${ptrToString(end)} - ${ptrToString(base)}` +
813
+ ']). If you require more stack space build with -sSTACK_SIZE=<bytes>');
814
+ };
815
+
857
816
  var PATH = {
858
817
  isAbs:(path) => path.charAt(0) === '/',
859
818
  splitPath:(filename) => {
@@ -1125,12 +1084,15 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1125
1084
  } catch (e) {
1126
1085
  throw new FS.ErrnoError(29);
1127
1086
  }
1128
- if (result === undefined && bytesRead === 0) {
1087
+ if (result === undefined && !bytesRead) {
1129
1088
  throw new FS.ErrnoError(6);
1130
1089
  }
1131
1090
  if (result === null || result === undefined) break;
1132
1091
  bytesRead++;
1133
1092
  buffer[offset+i] = result;
1093
+ // We currently only support canonical mode (ICANON), where
1094
+ // read(2) returns as soon as a line delimiter is read.
1095
+ if (result === 10) break;
1134
1096
  }
1135
1097
  if (bytesRead) {
1136
1098
  stream.node.atime = Date.now();
@@ -1225,6 +1187,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1225
1187
  if (ptr) zeroMemory(ptr, size);
1226
1188
  return ptr;
1227
1189
  };
1190
+
1228
1191
  var MEMFS = {
1229
1192
  ops_table:null,
1230
1193
  mount(mount) {
@@ -1368,7 +1331,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1368
1331
  return attr;
1369
1332
  },
1370
1333
  setattr(node, attr) {
1371
- for (const key of ["mode", "atime", "mtime", "ctime"]) {
1334
+ for (const key of ['mode', 'atime', 'mtime', 'ctime']) {
1372
1335
  if (attr[key] != null) {
1373
1336
  node[key] = attr[key];
1374
1337
  }
@@ -1454,10 +1417,10 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1454
1417
  node.mtime = node.ctime = Date.now();
1455
1418
 
1456
1419
  if (canOwn) {
1457
- assert(position === 0, 'canOwn must imply no weird position inside the file');
1420
+ assert(!position, 'canOwn must imply no weird position inside the file');
1458
1421
  node.contents = buffer.subarray(offset, offset + length);
1459
1422
  node.usedBytes = length;
1460
- } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data.
1423
+ } else if (!node.usedBytes && !position) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data.
1461
1424
  node.contents = buffer.slice(offset, offset + length);
1462
1425
  node.usedBytes = length;
1463
1426
  } else {
@@ -1745,7 +1708,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1745
1708
  assert(id, 'addRunDependency requires an ID')
1746
1709
  assert(!runDependencyTracking[id]);
1747
1710
  runDependencyTracking[id] = 1;
1748
- if (runDependencyWatcher === null && globalThis.setInterval) {
1711
+ if (!runDependencyWatcher && globalThis.setInterval) {
1749
1712
  // Check for missing dependencies every few seconds
1750
1713
  runDependencyWatcher = setInterval(() => {
1751
1714
  if (ABORT) {
@@ -1809,6 +1772,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
1809
1772
  var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => {
1810
1773
  FS_preloadFile(parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish).then(onload).catch(onerror);
1811
1774
  };
1775
+
1812
1776
  var FS = {
1813
1777
  root:null,
1814
1778
  mounts:[],
@@ -2800,7 +2764,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
2800
2764
  });
2801
2765
  },
2802
2766
  open(path, flags, mode = 0o666) {
2803
- if (path === "") {
2767
+ if (path === '') {
2804
2768
  throw new FS.ErrnoError(44);
2805
2769
  }
2806
2770
  flags = FS_modeStringToFlags(flags);
@@ -2814,7 +2778,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
2814
2778
  if (typeof path == 'object') {
2815
2779
  node = path;
2816
2780
  } else {
2817
- isDirPath = path.endsWith("/");
2781
+ isDirPath = path.endsWith('/');
2818
2782
  // noent_okay makes it so that if the final component of the path
2819
2783
  // doesn't exist, lookupPath returns `node: undefined`. `path` will be
2820
2784
  // updated to point to the target of all symlinks.
@@ -2996,8 +2960,8 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
2996
2960
  // to write to file opened in read-only mode with MAP_PRIVATE flag,
2997
2961
  // as all modifications will be visible only in the memory of
2998
2962
  // the current process.
2999
- if ((prot & 2) !== 0
3000
- && (flags & 2) === 0
2963
+ if ((prot & 2)
2964
+ && !(flags & 2)
3001
2965
  && (stream.flags & 2097155) !== 2) {
3002
2966
  throw new FS.ErrnoError(2);
3003
2967
  }
@@ -3090,7 +3054,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3090
3054
  // use a buffer to avoid overhead of individual crypto calls per byte
3091
3055
  var randomBuffer = new Uint8Array(1024), randomLeft = 0;
3092
3056
  var randomByte = () => {
3093
- if (randomLeft === 0) {
3057
+ if (!randomLeft) {
3094
3058
  randomFill(randomBuffer);
3095
3059
  randomLeft = randomBuffer.byteLength;
3096
3060
  }
@@ -3306,7 +3270,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3306
3270
  } catch (e) {
3307
3271
  throw new FS.ErrnoError(29);
3308
3272
  }
3309
- if (result === undefined && bytesRead === 0) {
3273
+ if (result === undefined && !bytesRead) {
3310
3274
  throw new FS.ErrnoError(6);
3311
3275
  }
3312
3276
  if (result === null || result === undefined) break;
@@ -3337,7 +3301,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3337
3301
  forceLoadFile(obj) {
3338
3302
  if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
3339
3303
  if (globalThis.XMLHttpRequest) {
3340
- abort("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
3304
+ abort('Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.');
3341
3305
  } else { // Command-line.
3342
3306
  try {
3343
3307
  obj.contents = readBinary(obj.url);
@@ -3368,11 +3332,11 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3368
3332
  var xhr = new XMLHttpRequest();
3369
3333
  xhr.open('HEAD', url, false);
3370
3334
  xhr.send(null);
3371
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status);
3372
- var datalength = Number(xhr.getResponseHeader("Content-length"));
3335
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort(`Couldn't load ${url}. Status: ${xhr.status}`);
3336
+ var datalength = Number(xhr.getResponseHeader('Content-length'));
3373
3337
  var header;
3374
- var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
3375
- var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
3338
+ var hasByteServing = (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes';
3339
+ var usesGzip = (header = xhr.getResponseHeader('Content-Encoding')) && header === 'gzip';
3376
3340
 
3377
3341
  var chunkSize = 1024*1024; // Chunk size in bytes
3378
3342
 
@@ -3386,7 +3350,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3386
3350
  // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.
3387
3351
  var xhr = new XMLHttpRequest();
3388
3352
  xhr.open('GET', url, false);
3389
- if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
3353
+ if (datalength !== chunkSize) xhr.setRequestHeader('Range', `bytes=${from}-${to}`);
3390
3354
 
3391
3355
  // Some hints to the browser that we want binary data.
3392
3356
  xhr.responseType = 'arraybuffer';
@@ -3395,7 +3359,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3395
3359
  }
3396
3360
 
3397
3361
  xhr.send(null);
3398
- if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status);
3362
+ if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort(`Couldn't load ${url}. Status: ${xhr.status}`);
3399
3363
  if (xhr.response !== undefined) {
3400
3364
  return new Uint8Array(/** @type{Array<number>} */(xhr.response || []));
3401
3365
  }
@@ -3418,7 +3382,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3418
3382
  chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file
3419
3383
  datalength = this.getter(0).length;
3420
3384
  chunkSize = datalength;
3421
- out("LazyFiles on gzip forces download of the whole file when length is accessed");
3385
+ out('LazyFiles on gzip forces download of the whole file when length is accessed');
3422
3386
  }
3423
3387
 
3424
3388
  this._length = datalength;
@@ -3508,6 +3472,12 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3508
3472
  },
3509
3473
  };
3510
3474
 
3475
+
3476
+
3477
+
3478
+
3479
+ /** not-@type {!BigInt64Array} */
3480
+ var HEAP64;
3511
3481
  var SYSCALLS = {
3512
3482
  currentUmask:18,
3513
3483
  calculateAt(dirfd, path, allowEmpty) {
@@ -3655,6 +3625,9 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3655
3625
  var syscallGetVarargP = syscallGetVarargI;
3656
3626
 
3657
3627
 
3628
+
3629
+ /** @type {!Int16Array} */
3630
+ var HEAP16;
3658
3631
  function ___syscall_fcntl64(fd, cmd, varargs) {
3659
3632
  SYSCALLS.varargs = varargs;
3660
3633
  try {
@@ -3739,6 +3712,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3739
3712
  }
3740
3713
 
3741
3714
 
3715
+
3742
3716
  var stringToUTF8 = (str, outPtr, maxBytesToWrite) => {
3743
3717
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF8 requires a third parameter that specifies the length of the output buffer');
3744
3718
  return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
@@ -3746,7 +3720,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3746
3720
  function ___syscall_getcwd(buf, size) {
3747
3721
  try {
3748
3722
 
3749
- if (size === 0) return -28;
3723
+ if (!size) return -28;
3750
3724
  var cwd = FS.cwd();
3751
3725
  var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1;
3752
3726
  if (size < cwdLengthInBytes) return -68;
@@ -3760,6 +3734,9 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3760
3734
 
3761
3735
 
3762
3736
 
3737
+
3738
+
3739
+
3763
3740
  function ___syscall_getdents64(fd, dirp, count) {
3764
3741
  try {
3765
3742
 
@@ -3821,6 +3798,9 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3821
3798
 
3822
3799
 
3823
3800
 
3801
+
3802
+
3803
+
3824
3804
  function ___syscall_ioctl(fd, op, varargs) {
3825
3805
  SYSCALLS.varargs = varargs;
3826
3806
  try {
@@ -3981,6 +3961,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
3981
3961
  }
3982
3962
 
3983
3963
 
3964
+
3984
3965
  var PIPEFS = {
3985
3966
  BUCKET_BUFFER_SIZE:8192,
3986
3967
  mount(mount) {
@@ -4240,17 +4221,17 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4240
4221
  // When the last write end closes, wake any poll/epoll waiter on the read
4241
4222
  // end with POLLHUP so a reader blocked on the writer dropping unblocks.
4242
4223
  if ((stream.flags & 2097155) === 1) {
4243
- if (--pipe.writerCount === 0) {
4224
+ if (!--pipe.writerCount) {
4244
4225
  pipe.writeClosed = true;
4245
4226
  pipe.readNode.notifyListeners(16 | 64 | 1);
4246
4227
  }
4247
- } else if (--pipe.readerCount === 0) {
4228
+ } else if (!--pipe.readerCount) {
4248
4229
  // Mirror: when the last read end closes, wake any poll/epoll waiter on
4249
4230
  // the write end with POLLERR (a further write would get EPIPE).
4250
4231
  pipe.readClosed = true;
4251
4232
  pipe.writeNode.notifyListeners(8 | 256 | 4);
4252
4233
  }
4253
- if (pipe.readerCount === 0 && pipe.writerCount === 0) {
4234
+ if (!pipe.readerCount && !pipe.writerCount) {
4254
4235
  pipe.buckets = null;
4255
4236
  }
4256
4237
  },
@@ -4262,6 +4243,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4262
4243
  return 'pipe[' + (PIPEFS.nextname.current++) + ']';
4263
4244
  },
4264
4245
  };
4246
+
4265
4247
  function ___syscall_pipe2(fdPtr, flags) {
4266
4248
  try {
4267
4249
 
@@ -4296,11 +4278,11 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4296
4278
  if (!stream) return 32;
4297
4279
  // Streams without a poll handler (regular files, incl. NODERAWFS/NODEFS
4298
4280
  // which leave stream_ops unset) are treated as always readable+writable.
4299
- var flags = stream.stream_ops?.poll
4300
- ? stream.stream_ops.poll(stream)
4301
- : 5;
4281
+ var flags = stream.stream_ops?.poll?.(stream) ?? 5;
4302
4282
  return flags & (events | 8 | 16 | 32);
4303
4283
  };
4284
+
4285
+
4304
4286
  var doPollSync = (fds, nfds) => {
4305
4287
  var count = 0;
4306
4288
  for (var i = 0, pollfd = fds; i < nfds; i++, pollfd += 8) {
@@ -4338,6 +4320,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4338
4320
 
4339
4321
 
4340
4322
 
4323
+
4341
4324
  function ___syscall_readlinkat(dirfd, path, buf, bufsize) {
4342
4325
  try {
4343
4326
 
@@ -4475,6 +4458,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4475
4458
  return yday;
4476
4459
  };
4477
4460
 
4461
+
4478
4462
  function __localtime_js(time, tmPtr) {
4479
4463
  time = bigintToI53Checked(time);
4480
4464
 
@@ -4506,6 +4490,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4506
4490
  }
4507
4491
 
4508
4492
 
4493
+
4509
4494
  var __mktime_js = function(tmPtr) {
4510
4495
 
4511
4496
  var ret = (() => {
@@ -4579,6 +4564,8 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4579
4564
  }
4580
4565
 
4581
4566
 
4567
+
4568
+
4582
4569
  var __tzset_js = (timezone, daylight, std_name, dst_name) => {
4583
4570
  // TODO: Use (malleable) environment variables instead of system settings.
4584
4571
  var currentYear = new Date().getFullYear();
@@ -4607,11 +4594,11 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4607
4594
  var extractZone = (timezoneOffset) => {
4608
4595
  // Why inverse sign?
4609
4596
  // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
4610
- var sign = timezoneOffset >= 0 ? "-" : "+";
4597
+ var sign = timezoneOffset >= 0 ? '-' : '+';
4611
4598
 
4612
4599
  var absOffset = Math.abs(timezoneOffset)
4613
- var hours = String(Math.floor(absOffset / 60)).padStart(2, "0");
4614
- var minutes = String(absOffset % 60).padStart(2, "0");
4600
+ var hours = String(Math.floor(absOffset / 60)).padStart(2, '0');
4601
+ var minutes = String(absOffset % 60).padStart(2, '0');
4615
4602
 
4616
4603
  return `UTC${sign}${hours}${minutes}`;
4617
4604
  }
@@ -4639,6 +4626,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4639
4626
 
4640
4627
  var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3;
4641
4628
 
4629
+
4642
4630
  function _clock_time_get(clk_id, ignored_precision, ptime) {
4643
4631
  ignored_precision = bigintToI53Checked(ignored_precision);
4644
4632
 
@@ -4663,6 +4651,13 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4663
4651
  }
4664
4652
 
4665
4653
  var readEmAsmArgsArray = [];
4654
+
4655
+
4656
+
4657
+
4658
+ /** @type {!Float64Array} */
4659
+ var HEAPF64;
4660
+
4666
4661
  var readEmAsmArgs = (sigPtr, buf) => {
4667
4662
  // Nobody should have mutated _readEmAsmArgsArray underneath us to be something else than an array.
4668
4663
  assert(Array.isArray(readEmAsmArgsArray));
@@ -4728,9 +4723,10 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4728
4723
  } catch(e) {
4729
4724
  err(`growMemory: Attempted to grow heap from ${oldHeapSize} bytes to ${size} bytes, but got error: ${e}`);
4730
4725
  }
4731
- // implicit 0 return to save code size (caller will cast "undefined" into 0
4726
+ // implicit 0 return to save code size (caller will cast 'undefined' into 0
4732
4727
  // anyhow)
4733
4728
  };
4729
+
4734
4730
  var _emscripten_resize_heap = (requestedSize) => {
4735
4731
  var oldSize = HEAPU8.length;
4736
4732
  // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned.
@@ -4818,6 +4814,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4818
4814
  return getEnvStrings.strings;
4819
4815
  };
4820
4816
 
4817
+
4821
4818
  var _environ_get = (__environ, environ_buf) => {
4822
4819
  var bufSize = 0;
4823
4820
  var envp = 0;
@@ -4831,6 +4828,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4831
4828
  };
4832
4829
 
4833
4830
 
4831
+
4834
4832
  var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
4835
4833
  var strings = getEnvStrings();
4836
4834
  HEAPU32[((penviron_count)>>2)] = strings.length;
@@ -4883,6 +4881,9 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4883
4881
  }
4884
4882
 
4885
4883
 
4884
+
4885
+
4886
+
4886
4887
  function _fd_fdstat_get(fd, pbuf) {
4887
4888
  try {
4888
4889
 
@@ -4910,6 +4911,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4910
4911
  }
4911
4912
 
4912
4913
 
4914
+
4913
4915
  /** @param {number=} offset */
4914
4916
  var doReadv = (stream, iov, iovcnt, offset) => {
4915
4917
  var ret = 0;
@@ -4940,6 +4942,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4940
4942
  };
4941
4943
 
4942
4944
 
4945
+
4943
4946
  function _fd_pread(fd, iov, iovcnt, offset, pnum) {
4944
4947
  offset = bigintToI53Checked(offset);
4945
4948
 
@@ -4958,6 +4961,8 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4958
4961
  ;
4959
4962
  }
4960
4963
 
4964
+
4965
+
4961
4966
  /** @param {number=} offset */
4962
4967
  var doWritev = (stream, iov, iovcnt, offset) => {
4963
4968
  // Gather all iovecs into one contiguous buffer and issue a single
@@ -4984,6 +4989,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
4984
4989
  };
4985
4990
 
4986
4991
 
4992
+
4987
4993
  function _fd_pwrite(fd, iov, iovcnt, offset, pnum) {
4988
4994
  offset = bigintToI53Checked(offset);
4989
4995
 
@@ -5003,6 +5009,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5003
5009
  }
5004
5010
 
5005
5011
 
5012
+
5006
5013
  function _fd_read(fd, iov, iovcnt, pnum) {
5007
5014
  try {
5008
5015
 
@@ -5018,6 +5025,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5018
5025
 
5019
5026
 
5020
5027
 
5028
+
5021
5029
  function _fd_seek(fd, offset, whence, newOffset) {
5022
5030
  offset = bigintToI53Checked(offset);
5023
5031
 
@@ -5028,7 +5036,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5028
5036
  var stream = SYSCALLS.getStreamFromFD(fd);
5029
5037
  FS.llseek(stream, offset, whence);
5030
5038
  HEAP64[((newOffset)>>3)] = BigInt(stream.position);
5031
- if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state
5039
+ if (stream.getdents && !offset && whence === 0) stream.getdents = null; // reset readdir state
5032
5040
  return 0;
5033
5041
  } catch (e) {
5034
5042
  if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e;
@@ -5051,6 +5059,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5051
5059
 
5052
5060
 
5053
5061
 
5062
+
5054
5063
  function _fd_write(fd, iov, iovcnt, pnum) {
5055
5064
  try {
5056
5065
 
@@ -5067,6 +5076,74 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5067
5076
 
5068
5077
 
5069
5078
 
5079
+
5080
+
5081
+
5082
+
5083
+
5084
+
5085
+
5086
+
5087
+
5088
+
5089
+
5090
+
5091
+
5092
+
5093
+
5094
+
5095
+
5096
+
5097
+
5098
+
5099
+
5100
+
5101
+
5102
+
5103
+
5104
+
5105
+
5106
+
5107
+
5108
+
5109
+
5110
+
5111
+
5112
+
5113
+
5114
+
5115
+
5116
+
5117
+
5118
+ /** @type {!Uint16Array} */
5119
+ var HEAPU16;
5120
+
5121
+
5122
+
5123
+ /** @type {!Float32Array} */
5124
+ var HEAPF32;
5125
+
5126
+
5127
+
5128
+ /** not-@type {!BigUint64Array} */
5129
+ var HEAPU64;
5130
+
5131
+
5132
+
5133
+
5134
+
5135
+
5136
+
5137
+
5138
+
5139
+
5140
+
5141
+
5142
+
5143
+
5144
+
5145
+
5146
+
5070
5147
  var getCFunc = (ident) => {
5071
5148
  var func = Module['_' + ident]; // closure exported function
5072
5149
  assert(func, `Cannot call unknown function ${ident}, make sure it is exported`);
@@ -5131,7 +5208,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5131
5208
  for (var i = 0; i < args.length; i++) {
5132
5209
  var converter = toC[argTypes[i]];
5133
5210
  if (converter) {
5134
- if (stack === 0) stack = stackSave();
5211
+ if (!stack) stack = stackSave();
5135
5212
  cArgs[i] = converter(args[i]);
5136
5213
  } else {
5137
5214
  cArgs[i] = args[i];
@@ -5140,7 +5217,7 @@ var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => {
5140
5217
  }
5141
5218
  var ret = func(...cArgs);
5142
5219
  function onDone(ret) {
5143
- if (stack !== 0) stackRestore(stack);
5220
+ if (stack) stackRestore(stack);
5144
5221
  return convertReturnValue(ret);
5145
5222
  }
5146
5223
 
@@ -5269,6 +5346,8 @@ if (Module['printErr']) err = Module['printErr'];
5269
5346
  'getFunctionAddress',
5270
5347
  'addFunction',
5271
5348
  'removeFunction',
5349
+ 'setValue',
5350
+ 'getValue',
5272
5351
  'intArrayToString',
5273
5352
  'AsciiToString',
5274
5353
  'stringToAscii',
@@ -5337,10 +5416,6 @@ if (Module['printErr']) err = Module['printErr'];
5337
5416
  'addPromise',
5338
5417
  'idsToPromises',
5339
5418
  'makePromiseCallback',
5340
- 'ExceptionInfo',
5341
- 'findMatchingCatch',
5342
- 'incrementUncaughtExceptionCount',
5343
- 'decrementUncaughtExceptionCount',
5344
5419
  'Browser_asyncPrepareDataCounter',
5345
5420
  'arraySum',
5346
5421
  'addDays',
@@ -5371,14 +5446,10 @@ if (Module['printErr']) err = Module['printErr'];
5371
5446
  'writeGLArray',
5372
5447
  'registerWebGlEventCallback',
5373
5448
  'runAndAbortIfError',
5374
- 'ALLOC_NORMAL',
5375
- 'ALLOC_STACK',
5376
- 'allocate',
5377
5449
  'writeStringToMemory',
5378
5450
  'writeAsciiToMemory',
5379
5451
  'allocateUTF8',
5380
5452
  'allocateUTF8OnStack',
5381
- 'demangle',
5382
5453
  'stackTrace',
5383
5454
  'getNativeTypeSize',
5384
5455
  ];
@@ -5414,6 +5485,7 @@ missingLibrarySymbols.forEach(missingLibrarySymbol)
5414
5485
  'getHeapMax',
5415
5486
  'growMemory',
5416
5487
  'ENV',
5488
+ 'setStackLimits',
5417
5489
  'ERRNO_CODES',
5418
5490
  'strError',
5419
5491
  'DNS',
@@ -5439,8 +5511,6 @@ missingLibrarySymbols.forEach(missingLibrarySymbol)
5439
5511
  'addOnPostRun',
5440
5512
  'freeTableIndexes',
5441
5513
  'functionsInTableMap',
5442
- 'setValue',
5443
- 'getValue',
5444
5514
  'PATH',
5445
5515
  'PATH_FS',
5446
5516
  'UTF8Decoder',
@@ -5466,11 +5536,8 @@ missingLibrarySymbols.forEach(missingLibrarySymbol)
5466
5536
  'emClearImmediate_deps',
5467
5537
  'emClearImmediate',
5468
5538
  'promiseMap',
5469
- 'uncaughtExceptionCount',
5470
- 'exceptionCaught',
5471
5539
  'Browser',
5472
5540
  'requestFullscreen',
5473
- 'requestFullScreen',
5474
5541
  'setCanvasSize',
5475
5542
  'getUserMedia',
5476
5543
  'createContext',
@@ -5658,20 +5725,20 @@ function checkIncomingModuleAPI() {
5658
5725
  ignoredModuleProp('wasmBinary');
5659
5726
  }
5660
5727
  var ASM_CONSTS = {
5661
- 2651478: ($0) => { globalThis.picorubyRefs[$0] = null; },
5662
- 2651518: ($0) => { globalThis.picorubyRefs[$0] = true; },
5663
- 2651558: ($0) => { globalThis.picorubyRefs[$0] = false; },
5664
- 2651599: ($0, $1) => { globalThis.picorubyRefs[$0] = $1; },
5665
- 2651637: ($0, $1) => { globalThis.picorubyRefs[$0] = $1; },
5666
- 2651675: ($0, $1, $2) => { const str = UTF8ToString($1, $2); globalThis.picorubyRefs[$0] = str; },
5667
- 2651748: ($0, $1) => { const arr = globalThis.picorubyRefs[$0]; const elem = globalThis.picorubyRefs[$1]; arr.push(elem); delete globalThis.picorubyRefs[$1]; },
5668
- 2651887: ($0, $1, $2) => { const obj = globalThis.picorubyRefs[$0]; const key = UTF8ToString($1); const val = globalThis.picorubyRefs[$2]; obj[key] = val; delete globalThis.picorubyRefs[$2]; }
5728
+ 2846285: ($0) => { globalThis.picorubyRefs[$0] = null; },
5729
+ 2846325: ($0) => { globalThis.picorubyRefs[$0] = true; },
5730
+ 2846365: ($0) => { globalThis.picorubyRefs[$0] = false; },
5731
+ 2846406: ($0, $1) => { globalThis.picorubyRefs[$0] = $1; },
5732
+ 2846444: ($0, $1) => { globalThis.picorubyRefs[$0] = $1; },
5733
+ 2846482: ($0, $1, $2) => { const str = UTF8ToString($1, $2); globalThis.picorubyRefs[$0] = str; },
5734
+ 2846555: ($0, $1) => { const arr = globalThis.picorubyRefs[$0]; const elem = globalThis.picorubyRefs[$1]; arr.push(elem); delete globalThis.picorubyRefs[$1]; },
5735
+ 2846694: ($0, $1, $2) => { const obj = globalThis.picorubyRefs[$0]; const key = UTF8ToString($1); const val = globalThis.picorubyRefs[$2]; obj[key] = val; delete globalThis.picorubyRefs[$2]; }
5669
5736
  };
5670
5737
  function ble_dataview_length(ref_id) { try { const dv = globalThis.picorubyRefs[ref_id]; if (dv && dv.byteLength !== undefined) { return dv.byteLength; } return 0; } catch(e) { console.error('ble_dataview_length failed:', e); return 0; } }
5671
5738
  function ble_dataview_read(ref_id,out_buf,max_len) { try { const dv = globalThis.picorubyRefs[ref_id]; if (!dv) return 0; const len = Math.min(dv.byteLength, max_len); for (let i = 0; i < len; i++) { HEAPU8[out_buf + i] = dv.getUint8(i); } return len; } catch(e) { console.error('ble_dataview_read failed:', e); return 0; } }
5672
5739
  function ble_create_uint8array(data,length) { try { const buffer = new Uint8Array(HEAPU8.buffer, data, length); const copy = new Uint8Array(buffer); const refId = globalThis.picorubyRefs.push(copy) - 1; return refId; } catch(e) { console.error('ble_create_uint8array failed:', e); return -1; } }
5673
- function ble_set_notify_handler(char_ref_id,callback_id) { try { const char_obj = globalThis.picorubyRefs[char_ref_id]; char_obj.addEventListener('characteristicvaluechanged', (event) => { const dataview = event.target.value; const len = dataview.byteLength; const ptr = _malloc(len); for (let i = 0; i < len; i++) { HEAPU8[ptr + i] = dataview.getUint8(i); } ccall( 'ble_notify_callback', 'void', ['number', 'number', 'number'], [callback_id, ptr, len] ); _free(ptr); }); } catch(e) { console.error('ble_set_notify_handler failed:', e); } }
5674
- function init_js_refs() { if (typeof globalThis.picorubyRefs === 'undefined') { globalThis.picorubyRefs = []; const rootObject = typeof window !== 'undefined' ? window : globalThis; globalThis.picorubyRefs.push(rootObject); } if (typeof window !== 'undefined' && typeof window._js_remove_event_listener_wrapper === 'undefined') { window._js_remove_event_listener_wrapper = function(callback_id) { if (!globalThis.picorubyEventHandlers) return false; const info = globalThis.picorubyEventHandlers[callback_id]; if (!info) return false; info.target.removeEventListener(info.type, info.handler); delete globalThis.picorubyEventHandlers[callback_id]; return true; }; } }
5740
+ function ble_set_notify_handler(char_ref_id,callback_id) { try { const char_obj = globalThis.picorubyRefs[char_ref_id]; if (char_obj.__picorbNotifyListener) { char_obj.removeEventListener('characteristicvaluechanged', char_obj.__picorbNotifyListener); } const listener = (event) => { const dataview = event.target.value; const len = dataview.byteLength; const ptr = _malloc(len); for (let i = 0; i < len; i++) { HEAPU8[ptr + i] = dataview.getUint8(i); } ccall( 'ble_notify_callback', 'void', ['number', 'number', 'number'], [callback_id, ptr, len] ); _free(ptr); }; char_obj.__picorbNotifyListener = listener; char_obj.addEventListener('characteristicvaluechanged', listener); } catch(e) { console.error('ble_set_notify_handler failed:', e); } }
5741
+ function init_js_refs() { if (typeof globalThis.picorubyRefs === 'undefined') { globalThis.picorubyRefs = []; const rootObject = typeof window !== 'undefined' ? window : globalThis; globalThis.picorubyRefs.push(rootObject); } if (typeof window !== 'undefined' && typeof window._js_remove_event_listener_wrapper === 'undefined') { window._js_remove_event_listener_wrapper = function(callback_id) { if (!globalThis.picorubyEventHandlers) return false; const info = globalThis.picorubyEventHandlers[callback_id]; if (!info) return false; info.target.removeEventListener(info.type, info.handler, !!info.capture); delete globalThis.picorubyEventHandlers[callback_id]; return true; }; } }
5675
5742
  function js_last_error_length() { const message = globalThis.picorubyLastError; return message ? lengthBytesUTF8(message) : 0; }
5676
5743
  function js_copy_last_error(buffer,buffer_size) { const message = globalThis.picorubyLastError; if (!message) { globalThis.picorubyLastError = null; return; } stringToUTF8(message, buffer, buffer_size); globalThis.picorubyLastError = null; }
5677
5744
  function is_array_like(ref_id) { const obj = globalThis.picorubyRefs[ref_id]; const isNodeList = typeof NodeList !== 'undefined' && obj instanceof NodeList; const isHTMLCollection = typeof HTMLCollection !== 'undefined' && obj instanceof HTMLCollection; return isNodeList || isHTMLCollection || (typeof obj === 'object' && obj !== null && 'length' in obj && typeof obj.length === 'number'); }
@@ -5705,12 +5772,12 @@ function call_constructor_with_args(ref_id,args_json,args_json_len) { globalThis
5705
5772
  function js_function_apply_args(func_ref_id,args_json,args_json_len) { globalThis.picorubyLastError = null; try { const fn = globalThis.picorubyRefs[func_ref_id]; if (typeof fn !== 'function') { console.error('js_function_apply_args: not a function'); return -1; } const argsData = JSON.parse(UTF8ToString(args_json, args_json_len)); if (!Array.isArray(argsData)) { console.error('js_function_apply_args: args_json must be a JSON array'); return -1; } const args = argsData.map(arg => { switch (arg.type) { case 'string': case 'integer': case 'float': case 'boolean': return arg.value; case 'ref': return globalThis.picorubyRefs[arg.value]; case 'nil': return null; default: return null; } }); const result = fn(...args); const newRefId = globalThis.picorubyRefs.length; globalThis.picorubyRefs.push(result); return newRefId; } catch(e) { globalThis.picorubyLastError = e && typeof e.message === 'string' ? e.message : String(e); return -1; } }
5706
5773
  function call_fetch_with_json_options(ref_id,url,options_json) { globalThis.picorubyLastError = null; try { const obj = globalThis.picorubyRefs[ref_id]; const urlStr = UTF8ToString(url); const optionsStr = UTF8ToString(options_json); const options = JSON.parse(optionsStr); const result = obj.fetch(urlStr, options); const newRefId = globalThis.picorubyRefs.length; globalThis.picorubyRefs.push(result); return newRefId; } catch(e) { globalThis.picorubyLastError = e && typeof e.message === 'string' ? e.message : String(e); return -1; } }
5707
5774
  function setup_promise_handler(promise_id,callback_id,mrb_ptr,task_ptr) { const promise = globalThis.picorubyRefs[promise_id]; promise.then( (result) => { const resultId = globalThis.picorubyRefs.length; globalThis.picorubyRefs.push(result); ccall( 'resume_promise_task', 'void', ['number', 'number', 'number', 'number'], [mrb_ptr, task_ptr, callback_id, resultId] ); } ).catch( (error) => { const message = error && typeof error.message === 'string' ? error.message : String(error); const size = lengthBytesUTF8(message) + 1; const errorPtr = _malloc(size); stringToUTF8(message, errorPtr, size); ccall( 'resume_promise_error_task', 'void', ['number', 'number', 'number', 'number'], [mrb_ptr, task_ptr, callback_id, errorPtr] ); } ); }
5708
- function js_add_event_listener(ref_id,callback_id,event_type) { const target = globalThis.picorubyRefs[ref_id]; const type = UTF8ToString(event_type); const handler = (event) => { if (!globalThis.picorubyEventHandlers || !globalThis.picorubyEventHandlers[callback_id]) { return; } if (type === 'submit' || (type === 'click' && target.tagName === 'A')) { event.preventDefault(); } const eventRefId = globalThis.picorubyRefs.push(event) - 1; ccall( 'call_ruby_callback', 'void', ['number', 'number'], [callback_id, eventRefId] ); }; target.addEventListener(type, handler); if (!globalThis.picorubyEventHandlers) { globalThis.picorubyEventHandlers = {}; } globalThis.picorubyEventHandlers[callback_id] = { target, type, handler }; }
5775
+ function js_add_event_listener(ref_id,callback_id,event_type,sync,capture,once,passive) { const target = globalThis.picorubyRefs[ref_id]; const type = UTF8ToString(event_type); const isSync = !!sync; const isOnce = !!once; const isCapture = !!capture; let options = undefined; if (isCapture || isOnce || passive >= 0) { options = { capture: isCapture, once: isOnce }; if (passive >= 0) options.passive = (passive === 1); } const handler = (event) => { if (!globalThis.picorubyEventHandlers || !globalThis.picorubyEventHandlers[callback_id]) { return; } if (isOnce) { delete globalThis.picorubyEventHandlers[callback_id]; } if (!isSync && passive !== 1 && (type === 'submit' || (type === 'click' && target.tagName === 'A'))) { event.preventDefault(); } const eventRefId = globalThis.picorubyRefs.push(event) - 1; if (isSync) { try { ccall( 'call_ruby_callback_sync_event', 'void', ['number', 'number', 'number'], [callback_id, eventRefId, isOnce ? 1 : 0] ); } finally { delete globalThis.picorubyRefs[eventRefId]; } } else { ccall( isOnce ? 'call_ruby_callback_oneshot' : 'call_ruby_callback', 'void', ['number', 'number'], [callback_id, eventRefId] ); } }; if (options) { target.addEventListener(type, handler, options); } else { target.addEventListener(type, handler); } if (!globalThis.picorubyEventHandlers) { globalThis.picorubyEventHandlers = {}; } globalThis.picorubyEventHandlers[callback_id] = { target, type, handler, capture: isCapture }; }
5709
5776
  function js_register_generic_callback(callback_id,callback_name) { const name = UTF8ToString(callback_name); if (!globalThis.picorubyGenericCallbacks) { globalThis.picorubyGenericCallbacks = {}; } globalThis.picorubyGenericCallbacks[name] = function(...args) { const argRefIds = args.map(arg => { const refId = globalThis.picorubyRefs.push(arg) - 1; return refId; }); const argRefIdsPtr = _malloc(argRefIds.length * 4); for (let i = 0; i < argRefIds.length; i++) { HEAP32[(argRefIdsPtr >> 2) + i] = argRefIds[i]; } const resultRefId = ccall( 'call_ruby_callback_sync_generic', 'number', ['number', 'number', 'number'], [callback_id, argRefIdsPtr, argRefIds.length] ); _free(argRefIdsPtr); if (resultRefId >= 0 && resultRefId < globalThis.picorubyRefs.length) { return globalThis.picorubyRefs[resultRefId]; } return undefined; }; }
5710
5777
  function js_create_callback_function(callback_id) { try { const fn = function(...args) { const argRefIds = args.map(arg => globalThis.picorubyRefs.push(arg) - 1); const argRefIdsPtr = _malloc(argRefIds.length * 4); for (let i = 0; i < argRefIds.length; i++) { HEAP32[(argRefIdsPtr >> 2) + i] = argRefIds[i]; } const resultRefId = ccall( 'call_ruby_callback_sync_generic', 'number', ['number', 'number', 'number'], [callback_id, argRefIdsPtr, argRefIds.length] ); _free(argRefIdsPtr); if (resultRefId >= 0 && resultRefId < globalThis.picorubyRefs.length) { return globalThis.picorubyRefs[resultRefId]; } return undefined; }; return globalThis.picorubyRefs.push(fn) - 1; } catch (e) { console.error('js_create_callback_function failed:', e); return -1; } }
5711
5778
  function js_set_timeout(callback_id,delay_ms) { const timerId = setTimeout(function() { if (!globalThis.picorubyTimeoutHandlers || !globalThis.picorubyTimeoutHandlers[callback_id]) { return; } ccall( 'call_ruby_callback_oneshot', 'void', ['number', 'number'], [callback_id, -1] ); delete globalThis.picorubyTimeoutHandlers[callback_id]; }, delay_ms); if (!globalThis.picorubyTimeoutHandlers) { globalThis.picorubyTimeoutHandlers = {}; } globalThis.picorubyTimeoutHandlers[callback_id] = timerId; return timerId; }
5712
5779
  function js_clear_timeout(callback_id) { try { if (!globalThis.picorubyTimeoutHandlers) return false; const timerId = globalThis.picorubyTimeoutHandlers[callback_id]; if (timerId === undefined) return false; clearTimeout(timerId); delete globalThis.picorubyTimeoutHandlers[callback_id]; return true; } catch(e) { console.error('Error in js_clear_timeout:', e); return false; } }
5713
- function js_remove_event_listener(callback_id) { try { if (!globalThis.picorubyEventHandlers) return false; const info = globalThis.picorubyEventHandlers[callback_id]; if (!info) return false; info.target.removeEventListener(info.type, info.handler); delete globalThis.picorubyEventHandlers[callback_id]; return true; } catch(e) { console.error('Error in js_remove_event_listener:', e); return false; } }
5780
+ function js_remove_event_listener(callback_id) { try { if (!globalThis.picorubyEventHandlers) return false; const info = globalThis.picorubyEventHandlers[callback_id]; if (!info) return false; info.target.removeEventListener(info.type, info.handler, !!info.capture); delete globalThis.picorubyEventHandlers[callback_id]; return true; } catch(e) { console.error('Error in js_remove_event_listener:', e); return false; } }
5714
5781
  function js_create_element(tag_name) { try { const element = document.createElement(UTF8ToString(tag_name)); const refId = globalThis.picorubyRefs.push(element) - 1; return refId; } catch(e) { console.error('Error in js_create_element:', e); return -1; } }
5715
5782
  function js_create_text_node(text) { try { const node = document.createTextNode(UTF8ToString(text)); const refId = globalThis.picorubyRefs.push(node) - 1; return refId; } catch(e) { console.error('Error in js_create_text_node:', e); return -1; } }
5716
5783
  function js_create_object() { try { const obj = {}; const refId = globalThis.picorubyRefs.push(obj) - 1; return refId; } catch(e) { console.error('Error in js_create_object:', e); return -1; } }
@@ -5721,7 +5788,7 @@ function js_replace_child(parent_ref_id,new_child_ref_id,old_child_ref_id) { try
5721
5788
  function js_insert_before(parent_ref_id,new_child_ref_id,ref_child_ref_id) { try { const parent = globalThis.picorubyRefs[parent_ref_id]; const newChild = globalThis.picorubyRefs[new_child_ref_id]; const refChild = globalThis.picorubyRefs[ref_child_ref_id]; if (!parent || !newChild) return false; parent.insertBefore(newChild, refChild); return true; } catch(e) { console.error('Error in js_insert_before:', e); return false; } }
5722
5789
  function js_set_attribute(ref_id,name,value) { try { const element = globalThis.picorubyRefs[ref_id]; if (!element || !element.setAttribute) return false; element.setAttribute(UTF8ToString(name), UTF8ToString(value)); return true; } catch(e) { console.error('Error in js_set_attribute:', e); return false; } }
5723
5790
  function js_remove_attribute(ref_id,name) { try { const element = globalThis.picorubyRefs[ref_id]; if (!element || !element.removeAttribute) return false; element.removeAttribute(UTF8ToString(name)); return true; } catch(e) { console.error('Error in js_remove_attribute:', e); return false; } }
5724
- function setup_binary_handler(ref_id,mrb_ptr,task_ptr,callback_id) { const response = globalThis.picorubyRefs[ref_id]; if (!response || typeof response.arrayBuffer !== 'function') { console.error('Invalid response object:', response); return 0; } response.arrayBuffer().then(arrayBuffer => { const uint8Array = new Uint8Array(arrayBuffer); const ptr = _malloc(uint8Array.length); const heapBytes = new Uint8Array(HEAPU8.buffer, ptr, uint8Array.length); heapBytes.set(uint8Array); ccall( 'resume_binary_task', 'void', ['number', 'number', 'number', 'number', 'number'], [mrb_ptr, task_ptr, callback_id, ptr, uint8Array.length] ); }).catch(error => { console.error('Error in arrayBuffer processing:', error); }); return 0; }
5791
+ function setup_binary_handler(ref_id,mrb_ptr,task_ptr,callback_id) { const object = globalThis.picorubyRefs[ref_id]; const reportError = (error) => { const message = error && typeof error.message === 'string' ? error.message : String(error); const size = lengthBytesUTF8(message) + 1; const errorPtr = _malloc(size); stringToUTF8(message, errorPtr, size); ccall( 'resume_promise_error_task', 'void', ['number', 'number', 'number', 'number'], [mrb_ptr, task_ptr, callback_id, errorPtr] ); }; Promise.resolve().then(() => { if (!object || typeof object.arrayBuffer !== 'function') { throw new TypeError('JS object does not implement arrayBuffer()'); } return object.arrayBuffer(); }).then(arrayBuffer => { const uint8Array = new Uint8Array(arrayBuffer); const ptr = _malloc(uint8Array.length); const heapBytes = new Uint8Array(HEAPU8.buffer, ptr, uint8Array.length); heapBytes.set(uint8Array); ccall( 'resume_binary_task', 'void', ['number', 'number', 'number', 'number', 'number'], [mrb_ptr, task_ptr, callback_id, ptr, uint8Array.length] ); }).catch(reportError); }
5725
5792
  function init_js_type_offsets(type_offset,value_offset,is_integer_offset,string_value_offset) { globalThis.JS_TYPE_INFO_OFFSETS = { type: type_offset, value: value_offset, is_integer: is_integer_offset, string_value: string_value_offset }; }
5726
5793
  function js_get_type_info(ref_id,info) { const value = globalThis.picorubyRefs[ref_id]; const offsets = globalThis.JS_TYPE_INFO_OFFSETS; let type = typeof value; if (value === null) { HEAP32[info + offsets.type >> 2] = 1; HEAP32[info + offsets.string_value >> 2] = 0; } else if (Array.isArray(value)) { HEAP32[info + offsets.type >> 2] = 7; HEAP32[info + offsets.value >> 2] = value.length; HEAP32[info + offsets.string_value >> 2] = 0; } else { switch(type) { case "undefined": HEAP32[info + offsets.type >> 2] = 0; HEAP32[info + offsets.string_value >> 2] = 0; break; case "boolean": HEAP32[info + offsets.type >> 2] = 2; HEAPU8[info + offsets.value] = value ? 1 : 0; HEAP32[info + offsets.string_value >> 2] = 0; break; case "number": HEAP32[info + offsets.type >> 2] = 3; HEAPF64[info + offsets.value >> 3] = value; HEAPU8[info + offsets.is_integer] = Number.isInteger(value) ? 1 : 0; HEAP32[info + offsets.string_value >> 2] = 0; break; case "bigint": case "string": case "symbol": { HEAP32[info + offsets.type >> 2] = type === "bigint" ? 4 : type === "string" ? 5 : 6; const str = type === "symbol" ? (value.description || "") : value.toString(); const length = lengthBytesUTF8(str) + 1; const ptr = _malloc(length); stringToUTF8(str, ptr, length); HEAP32[info + offsets.string_value >> 2] = ptr; break; } case "object": HEAP32[info + offsets.type >> 2] = 8; HEAP32[info + offsets.string_value >> 2] = 0; break; case "function": HEAP32[info + offsets.type >> 2] = 9; HEAP32[info + offsets.string_value >> 2] = 0; break; } } }
5727
5794
  function js_eval(script) { try { var result = (0, eval)(UTF8ToString(script)); if (result === undefined || result === null) return -1; var refId = globalThis.picorubyRefs.length; globalThis.picorubyRefs.push(result); return refId; } catch(e) { console.error('JS.eval error:', e); return -1; } }
@@ -5766,9 +5833,9 @@ function ws_set_onopen(ref_id,callback_id) { const ws = globalThis.picorubyRefs[
5766
5833
  function ws_set_onmessage(ref_id,callback_id) { const ws = globalThis.picorubyRefs[ref_id]; ws.onmessage = (event) => { let data = event.data; if (data instanceof ArrayBuffer) { const uint8Array = new Uint8Array(data); const length = uint8Array.length; const ptr = _malloc(length); HEAPU8.set(uint8Array, ptr); ccall( 'call_ruby_callback_with_binary_data', 'void', ['number', 'number', 'number'], [callback_id, ptr, length] ); } else { const eventRefId = globalThis.picorubyRefs.push(event) - 1; ccall( 'call_ruby_callback', 'void', ['number', 'number'], [callback_id, eventRefId] ); } }; }
5767
5834
  function ws_set_onerror(ref_id,callback_id) { const ws = globalThis.picorubyRefs[ref_id]; ws.onerror = (event) => { const eventRefId = globalThis.picorubyRefs.push(event) - 1; ccall( 'call_ruby_callback_oneshot', 'void', ['number', 'number'], [callback_id, eventRefId] ); }; }
5768
5835
  function ws_set_onclose(ref_id,callback_id) { const ws = globalThis.picorubyRefs[ref_id]; ws.onclose = (event) => { const eventRefId = globalThis.picorubyRefs.push(event) - 1; ccall( 'call_ruby_callback_oneshot', 'void', ['number', 'number'], [callback_id, eventRefId] ); }; }
5769
- function idb_request_to_promise(req_ref_id) { try { const req = globalThis.picorubyRefs[req_ref_id]; if (!req) { console.error('idb_request_to_promise: invalid ref_id', req_ref_id); return -1; } const promise = new Promise((resolve, reject) => { req.onsuccess = () => { resolve(req.result); }; req.onerror = () => { const msg = (req.error && req.error.message) || 'IDB request failed'; reject(new Error(msg)); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_request_to_promise failed:', e); return -1; } }
5770
- function idb_open_with_upgrade(name_ptr,version,callback_id) { try { const name = UTF8ToString(name_ptr); const idb = globalThis.indexedDB; if (!idb) { console.error('idb_open_with_upgrade: indexedDB unavailable'); return -1; } const req = (version > 0) ? idb.open(name, version) : idb.open(name); req.onupgradeneeded = (event) => { if (callback_id === 0) return; const db = req.result; const oldV = event.oldVersion; const newV = event.newVersion; const dbRef = globalThis.picorubyRefs.push(db) - 1; const oldRef = globalThis.picorubyRefs.push(oldV) - 1; const newRef = globalThis.picorubyRefs.push(newV) - 1; const argRefIds = [dbRef, oldRef, newRef]; const argRefIdsPtr = _malloc(argRefIds.length * 4); for (let i = 0; i < argRefIds.length; i++) { HEAP32[(argRefIdsPtr >> 2) + i] = argRefIds[i]; } try { ccall( 'call_ruby_callback_sync_generic', 'number', ['number', 'number', 'number'], [callback_id, argRefIdsPtr, argRefIds.length] ); } catch (e) { console.error('idb upgrade callback threw:', e); } finally { _free(argRefIdsPtr); } }; const promise = new Promise((resolve, reject) => { req.onsuccess = () => { resolve(req.result); }; req.onerror = () => { const msg = (req.error && req.error.message) || 'IDB open failed'; reject(new Error(msg)); }; req.onblocked = () => { reject(new Error('IDB open blocked: another connection holds an older version')); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_open_with_upgrade failed:', e); return -1; } }
5771
- function idb_transaction_to_promise(tx_ref_id) { try { const tx = globalThis.picorubyRefs[tx_ref_id]; if (!tx) { console.error('idb_transaction_to_promise: invalid ref_id', tx_ref_id); return -1; } const promise = new Promise((resolve, reject) => { tx.oncomplete = () => { resolve(true); }; tx.onerror = () => { const msg = (tx.error && tx.error.message) || 'IDB transaction error'; reject(new Error(msg)); }; tx.onabort = () => { const msg = (tx.error && tx.error.message) || 'IDB transaction aborted'; reject(new Error(msg)); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_transaction_to_promise failed:', e); return -1; } }
5836
+ function idb_request_to_promise(req_ref_id) { try { const req = globalThis.picorubyRefs[req_ref_id]; if (!req) { console.error('idb_request_to_promise: invalid ref_id', req_ref_id); return -1; } const promise = new Promise((resolve) => { req.onsuccess = () => { resolve({ ok: true, value: req.result }); }; req.onerror = () => { resolve({ ok: false, name: (req.error && req.error.name) || 'UnknownError', message: (req.error && req.error.message) || 'IDB request failed' }); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_request_to_promise failed:', e); return -1; } }
5837
+ function idb_open_with_upgrade(name_ptr,version,callback_id,blocked_timeout_ms) { try { const name = UTF8ToString(name_ptr); const idb = globalThis.indexedDB; if (!idb) { console.error('idb_open_with_upgrade: indexedDB unavailable'); return -1; } let req; try { req = (version > 0) ? idb.open(name, version) : idb.open(name); } catch (e) { const promise = Promise.resolve({ ok: false, name: (e && e.name) || 'UnknownError', message: (e && e.message) || 'IDB open failed' }); return globalThis.picorubyRefs.push(promise) - 1; } let settled = false; let timedOut = false; let blockedTimer = null; req.onupgradeneeded = (event) => { if (timedOut) { try { if (req.transaction) req.transaction.abort(); } catch (e) { console.error('failed to abort late IDB upgrade:', e); } return; } if (callback_id === 0) return; const db = req.result; const oldV = event.oldVersion; const newV = event.newVersion; const dbRef = globalThis.picorubyRefs.push(db) - 1; const oldRef = globalThis.picorubyRefs.push(oldV) - 1; const newRef = globalThis.picorubyRefs.push(newV) - 1; const argRefIds = [dbRef, oldRef, newRef]; const argRefIdsPtr = _malloc(argRefIds.length * 4); for (let i = 0; i < argRefIds.length; i++) { HEAP32[(argRefIdsPtr >> 2) + i] = argRefIds[i]; } try { ccall( 'call_ruby_callback_sync_generic', 'number', ['number', 'number', 'number'], [callback_id, argRefIdsPtr, argRefIds.length] ); } catch (e) { console.error('idb upgrade callback threw:', e); } finally { _free(argRefIdsPtr); } }; const promise = new Promise((resolve) => { const settle = (result) => { if (settled) return; settled = true; if (blockedTimer) { clearTimeout(blockedTimer); blockedTimer = null; } resolve(result); }; req.onsuccess = () => { if (settled) { try { req.result.close(); } catch (e) {} return; } settle({ ok: true, value: req.result }); }; req.onerror = () => { settle({ ok: false, name: (req.error && req.error.name) || 'UnknownError', message: (req.error && req.error.message) || 'IDB open failed' }); }; req.onblocked = () => { if (settled || blockedTimer) return; blockedTimer = setTimeout(() => { timedOut = true; settle({ ok: false, name: 'PicoRubyBlockedTimeout', message: 'IDB open blocked: another connection held an older version past the timeout' }); }, blocked_timeout_ms); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_open_with_upgrade failed:', e); return -1; } }
5838
+ function idb_transaction_to_promise(tx_ref_id) { try { const tx = globalThis.picorubyRefs[tx_ref_id]; if (!tx) { console.error('idb_transaction_to_promise: invalid ref_id', tx_ref_id); return -1; } const promise = new Promise((resolve) => { tx.oncomplete = () => { resolve({ ok: true, value: true }); }; tx.onerror = () => { resolve({ ok: false, name: (tx.error && tx.error.name) || 'UnknownError', message: (tx.error && tx.error.message) || 'IDB transaction error' }); }; tx.onabort = () => { resolve({ ok: false, name: (tx.error && tx.error.name) || 'AbortError', message: (tx.error && tx.error.message) || 'IDB transaction aborted' }); }; }); return globalThis.picorubyRefs.push(promise) - 1; } catch (e) { console.error('idb_transaction_to_promise failed:', e); return -1; } }
5772
5839
  function emscripten_date_now() { return Date.now(); }
5773
5840
 
5774
5841
  // Imports from the Wasm binary.
@@ -5786,6 +5853,7 @@ var _mrb_debug_next = Module['_mrb_debug_next'] = makeInvalidEarlyAccess('_mrb_d
5786
5853
  var _mrb_debug_get_callstack = Module['_mrb_debug_get_callstack'] = makeInvalidEarlyAccess('_mrb_debug_get_callstack');
5787
5854
  var _call_ruby_callback = Module['_call_ruby_callback'] = makeInvalidEarlyAccess('_call_ruby_callback');
5788
5855
  var _call_ruby_callback_oneshot = Module['_call_ruby_callback_oneshot'] = makeInvalidEarlyAccess('_call_ruby_callback_oneshot');
5856
+ var _call_ruby_callback_sync_event = Module['_call_ruby_callback_sync_event'] = makeInvalidEarlyAccess('_call_ruby_callback_sync_event');
5789
5857
  var _resume_promise_task = Module['_resume_promise_task'] = makeInvalidEarlyAccess('_resume_promise_task');
5790
5858
  var _resume_promise_error_task = Module['_resume_promise_error_task'] = makeInvalidEarlyAccess('_resume_promise_error_task');
5791
5859
  var _resume_binary_task = Module['_resume_binary_task'] = makeInvalidEarlyAccess('_resume_binary_task');
@@ -5814,6 +5882,7 @@ var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_en
5814
5882
  var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore');
5815
5883
  var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc');
5816
5884
  var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current');
5885
+ var ___set_stack_limits = Module['___set_stack_limits'] = makeInvalidEarlyAccess('___set_stack_limits');
5817
5886
  var memory = makeInvalidEarlyAccess('memory');
5818
5887
  var __indirect_function_table = makeInvalidEarlyAccess('__indirect_function_table');
5819
5888
  var wasmMemory = makeInvalidEarlyAccess('wasmMemory');
@@ -5834,6 +5903,7 @@ function assignWasmExports(wasmExports) {
5834
5903
  assert(typeof wasmExports['mrb_debug_get_callstack'] != 'undefined', 'missing Wasm export: mrb_debug_get_callstack');
5835
5904
  assert(typeof wasmExports['call_ruby_callback'] != 'undefined', 'missing Wasm export: call_ruby_callback');
5836
5905
  assert(typeof wasmExports['call_ruby_callback_oneshot'] != 'undefined', 'missing Wasm export: call_ruby_callback_oneshot');
5906
+ assert(typeof wasmExports['call_ruby_callback_sync_event'] != 'undefined', 'missing Wasm export: call_ruby_callback_sync_event');
5837
5907
  assert(typeof wasmExports['resume_promise_task'] != 'undefined', 'missing Wasm export: resume_promise_task');
5838
5908
  assert(typeof wasmExports['resume_promise_error_task'] != 'undefined', 'missing Wasm export: resume_promise_error_task');
5839
5909
  assert(typeof wasmExports['resume_binary_task'] != 'undefined', 'missing Wasm export: resume_binary_task');
@@ -5862,6 +5932,7 @@ function assignWasmExports(wasmExports) {
5862
5932
  assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore');
5863
5933
  assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc');
5864
5934
  assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current');
5935
+ assert(typeof wasmExports['__set_stack_limits'] != 'undefined', 'missing Wasm export: __set_stack_limits');
5865
5936
  assert(typeof wasmExports['memory'] != 'undefined', 'missing Wasm export: memory');
5866
5937
  assert(typeof wasmExports['__indirect_function_table'] != 'undefined', 'missing Wasm export: __indirect_function_table');
5867
5938
  _ble_notify_callback = Module['_ble_notify_callback'] = createExportWrapper('ble_notify_callback', wasmExports['ble_notify_callback'], 3);
@@ -5878,6 +5949,7 @@ function assignWasmExports(wasmExports) {
5878
5949
  _mrb_debug_get_callstack = Module['_mrb_debug_get_callstack'] = createExportWrapper('mrb_debug_get_callstack', wasmExports['mrb_debug_get_callstack'], 0);
5879
5950
  _call_ruby_callback = Module['_call_ruby_callback'] = createExportWrapper('call_ruby_callback', wasmExports['call_ruby_callback'], 2);
5880
5951
  _call_ruby_callback_oneshot = Module['_call_ruby_callback_oneshot'] = createExportWrapper('call_ruby_callback_oneshot', wasmExports['call_ruby_callback_oneshot'], 2);
5952
+ _call_ruby_callback_sync_event = Module['_call_ruby_callback_sync_event'] = createExportWrapper('call_ruby_callback_sync_event', wasmExports['call_ruby_callback_sync_event'], 3);
5881
5953
  _resume_promise_task = Module['_resume_promise_task'] = createExportWrapper('resume_promise_task', wasmExports['resume_promise_task'], 4);
5882
5954
  _resume_promise_error_task = Module['_resume_promise_error_task'] = createExportWrapper('resume_promise_error_task', wasmExports['resume_promise_error_task'], 4);
5883
5955
  _resume_binary_task = Module['_resume_binary_task'] = createExportWrapper('resume_binary_task', wasmExports['resume_binary_task'], 5);
@@ -5906,6 +5978,7 @@ function assignWasmExports(wasmExports) {
5906
5978
  __emscripten_stack_restore = wasmExports['_emscripten_stack_restore'];
5907
5979
  __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc'];
5908
5980
  _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'];
5981
+ ___set_stack_limits = Module['___set_stack_limits'] = createExportWrapper('__set_stack_limits', wasmExports['__set_stack_limits'], 2);
5909
5982
  memory = wasmMemory = wasmExports['memory'];
5910
5983
  __indirect_function_table = wasmTable = wasmExports['__indirect_function_table'];
5911
5984
  }
@@ -5916,6 +5989,8 @@ var wasmImports = {
5916
5989
  /** @export */
5917
5990
  __call_sighandler: ___call_sighandler,
5918
5991
  /** @export */
5992
+ __handle_stack_overflow: ___handle_stack_overflow,
5993
+ /** @export */
5919
5994
  __syscall_chdir: ___syscall_chdir,
5920
5995
  /** @export */
5921
5996
  __syscall_chmod: ___syscall_chmod,
@@ -6072,6 +6147,8 @@ var wasmImports = {
6072
6147
  /** @export */
6073
6148
  invoke_ddd,
6074
6149
  /** @export */
6150
+ invoke_ddj,
6151
+ /** @export */
6075
6152
  invoke_ii,
6076
6153
  /** @export */
6077
6154
  invoke_iii,
@@ -6084,10 +6161,14 @@ var wasmImports = {
6084
6161
  /** @export */
6085
6162
  invoke_iijiiiiii,
6086
6163
  /** @export */
6164
+ invoke_ijj,
6165
+ /** @export */
6087
6166
  invoke_ji,
6088
6167
  /** @export */
6089
6168
  invoke_jii,
6090
6169
  /** @export */
6170
+ invoke_jjd,
6171
+ /** @export */
6091
6172
  invoke_vi,
6092
6173
  /** @export */
6093
6174
  invoke_vii,
@@ -6098,7 +6179,7 @@ var wasmImports = {
6098
6179
  /** @export */
6099
6180
  invoke_viiiii,
6100
6181
  /** @export */
6101
- invoke_viiiiiii,
6182
+ invoke_viiiiii,
6102
6183
  /** @export */
6103
6184
  invoke_viiiij,
6104
6185
  /** @export */
@@ -6365,10 +6446,10 @@ function invoke_viiiii(index,a1,a2,a3,a4,a5) {
6365
6446
  }
6366
6447
  }
6367
6448
 
6368
- function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {
6449
+ function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {
6369
6450
  var sp = stackSave();
6370
6451
  try {
6371
- getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7);
6452
+ getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6);
6372
6453
  } catch(e) {
6373
6454
  stackRestore(sp);
6374
6455
  if (!(e instanceof EmscriptenEH)) throw e;
@@ -6475,6 +6556,29 @@ function invoke_viiji(index,a1,a2,a3,a4) {
6475
6556
  }
6476
6557
  }
6477
6558
 
6559
+ function invoke_jjd(index,a1,a2) {
6560
+ var sp = stackSave();
6561
+ try {
6562
+ return getWasmTableEntry(index)(a1,a2);
6563
+ } catch(e) {
6564
+ stackRestore(sp);
6565
+ if (!(e instanceof EmscriptenEH)) throw e;
6566
+ _setThrew(1, 0);
6567
+ return 0n;
6568
+ }
6569
+ }
6570
+
6571
+ function invoke_ijj(index,a1,a2) {
6572
+ var sp = stackSave();
6573
+ try {
6574
+ return getWasmTableEntry(index)(a1,a2);
6575
+ } catch(e) {
6576
+ stackRestore(sp);
6577
+ if (!(e instanceof EmscriptenEH)) throw e;
6578
+ _setThrew(1, 0);
6579
+ }
6580
+ }
6581
+
6478
6582
  function invoke_viijj(index,a1,a2,a3,a4) {
6479
6583
  var sp = stackSave();
6480
6584
  try {
@@ -6497,6 +6601,17 @@ function invoke_ddd(index,a1,a2) {
6497
6601
  }
6498
6602
  }
6499
6603
 
6604
+ function invoke_ddj(index,a1,a2) {
6605
+ var sp = stackSave();
6606
+ try {
6607
+ return getWasmTableEntry(index)(a1,a2);
6608
+ } catch(e) {
6609
+ stackRestore(sp);
6610
+ if (!(e instanceof EmscriptenEH)) throw e;
6611
+ _setThrew(1, 0);
6612
+ }
6613
+ }
6614
+
6500
6615
  function invoke_iij(index,a1,a2) {
6501
6616
  var sp = stackSave();
6502
6617
  try {