opera-devtools-mcp 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/build/src/McpContext.js +78 -41
  2. package/build/src/McpPage.js +5 -1
  3. package/build/src/ToolHandler.js +45 -74
  4. package/build/src/bin/chrome-devtools-mcp-main.js +4 -4
  5. package/build/src/bin/chrome-devtools.js +29 -30
  6. package/build/src/bin/opera-devtools-cli-options.js +1 -1
  7. package/build/src/bin/opera-devtools-mcp-cli-options.js +1 -1
  8. package/build/src/browser.js +5 -16
  9. package/build/src/config/browser-options.js +126 -0
  10. package/build/src/config/category-options.js +81 -0
  11. package/build/src/{bin/chrome-devtools-cli-options.js → config/cli-options.js} +392 -26
  12. package/build/src/{bin/chrome-devtools-mcp-cli-options.js → config/mcp-options.js} +143 -164
  13. package/build/src/daemon/client.js +9 -0
  14. package/build/src/daemon/utils.js +6 -0
  15. package/build/src/devtools/DevtoolsUtils.js +27 -21
  16. package/build/src/formatters/NetworkFormatter.js +5 -2
  17. package/build/src/index.js +166 -100
  18. package/build/src/processors/HeapSnapshotManager.js +12 -0
  19. package/build/src/telemetry/ClearcutLogger.js +19 -6
  20. package/build/src/telemetry/transformation.js +4 -0
  21. package/build/src/telemetry/types.js +4 -0
  22. package/build/src/third_party/THIRD_PARTY_NOTICES +5 -5
  23. package/build/src/third_party/bundled-packages.json +3 -3
  24. package/build/src/third_party/devtools-formatter-worker.js +22 -0
  25. package/build/src/third_party/devtools-heap-snapshot-worker.js +100 -20
  26. package/build/src/third_party/index.js +15459 -14256
  27. package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsBlockedByConnectionAllowlist.md +1 -0
  28. package/build/src/third_party/issue-descriptions/federatedAuthRequestConfigBlockedByConnectionAllowlist.md +1 -0
  29. package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenBlockedByConnectionAllowlist.md +1 -0
  30. package/build/src/third_party/issue-descriptions/federatedAuthRequestWellKnownBlockedByConnectionAllowlist.md +1 -0
  31. package/build/src/tools/ToolDefinition.js +15 -0
  32. package/build/src/tools/categories.js +0 -6
  33. package/build/src/tools/comments.js +90 -0
  34. package/build/src/tools/console.js +1 -1
  35. package/build/src/tools/emulation.js +1 -1
  36. package/build/src/tools/extensions.js +1 -1
  37. package/build/src/tools/memory.js +60 -6
  38. package/build/src/tools/network.js +2 -2
  39. package/build/src/tools/pages.js +26 -15
  40. package/build/src/tools/performance.js +4 -3
  41. package/build/src/tools/screencast.js +3 -2
  42. package/build/src/tools/screenshot.js +39 -8
  43. package/build/src/tools/script.js +17 -4
  44. package/build/src/tools/slim/tools.js +41 -33
  45. package/build/src/tools/snapshot.js +1 -1
  46. package/build/src/tools/tools.js +2 -0
  47. package/build/src/utils/WaitForHelper.js +12 -1
  48. package/build/src/utils/bytes.js +105 -0
  49. package/build/src/utils/url.js +73 -0
  50. package/build/src/version.js +1 -1
  51. package/package.json +23 -4
@@ -1001,6 +1001,16 @@ class ColorConverter {
1001
1001
  const rgbOutput = NAMED_GAMUTS.displayP3_INVERSE.multiply(xyzInput);
1002
1002
  return applyTransferFns(NAMED_TRANSFER_FN.sRGB_INVERSE, rgbOutput.values[0], rgbOutput.values[1], rgbOutput.values[2]);
1003
1003
  }
1004
+ static displayP3LinearToXyzd50(r, g, b) {
1005
+ const rgbInput = new Vector3([r, g, b]);
1006
+ const xyzOutput = NAMED_GAMUTS.displayP3.multiply(rgbInput);
1007
+ return xyzOutput.values;
1008
+ }
1009
+ static xyzd50ToDisplayP3Linear(x, y, z) {
1010
+ const xyzInput = new Vector3([x, y, z]);
1011
+ const rgbResult = NAMED_GAMUTS.displayP3_INVERSE.multiply(xyzInput);
1012
+ return rgbResult.values;
1013
+ }
1004
1014
  static proPhotoToXyzd50(r, g, b) {
1005
1015
  const [mappedR, mappedG, mappedB] = applyTransferFns(NAMED_TRANSFER_FN.proPhotoRGB, r, g, b);
1006
1016
  const rgbInput = new Vector3([mappedR, mappedG, mappedB]);
@@ -1200,6 +1210,8 @@ function getColorSpace(colorSpaceText) {
1200
1210
  return "srgb-linear" ;
1201
1211
  case "display-p3" :
1202
1212
  return "display-p3" ;
1213
+ case "display-p3-linear" :
1214
+ return "display-p3-linear" ;
1203
1215
  case "a98-rgb" :
1204
1216
  return "a98-rgb" ;
1205
1217
  case "prophoto-rgb" :
@@ -1418,6 +1430,7 @@ class Lab {
1418
1430
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
1419
1431
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
1420
1432
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
1433
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
1421
1434
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
1422
1435
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
1423
1436
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -1534,6 +1547,7 @@ class LCH {
1534
1547
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
1535
1548
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
1536
1549
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
1550
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
1537
1551
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
1538
1552
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
1539
1553
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -1652,6 +1666,7 @@ class Oklab {
1652
1666
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
1653
1667
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
1654
1668
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
1669
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
1655
1670
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
1656
1671
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
1657
1672
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -1768,6 +1783,7 @@ class Oklch {
1768
1783
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
1769
1784
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
1770
1785
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
1786
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
1771
1787
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
1772
1788
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
1773
1789
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -1887,6 +1903,7 @@ class ColorFunction {
1887
1903
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
1888
1904
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
1889
1905
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
1906
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
1890
1907
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
1891
1908
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
1892
1909
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -1903,6 +1920,8 @@ class ColorFunction {
1903
1920
  return ColorConverter.srgbLinearToXyzd50(p0, p1, p2);
1904
1921
  case "display-p3" :
1905
1922
  return ColorConverter.displayP3ToXyzd50(p0, p1, p2);
1923
+ case "display-p3-linear" :
1924
+ return ColorConverter.displayP3LinearToXyzd50(p0, p1, p2);
1906
1925
  case "a98-rgb" :
1907
1926
  return ColorConverter.adobeRGBToXyzd50(p0, p1, p2);
1908
1927
  case "prophoto-rgb" :
@@ -2058,6 +2077,7 @@ class HSL {
2058
2077
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
2059
2078
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
2060
2079
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
2080
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
2061
2081
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
2062
2082
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
2063
2083
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -2185,6 +2205,7 @@ class HWB {
2185
2205
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
2186
2206
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
2187
2207
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
2208
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
2188
2209
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
2189
2210
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
2190
2211
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -2413,6 +2434,7 @@ class Legacy {
2413
2434
  ["srgb" ]: (self) => new ColorFunction("srgb" , ...ColorConverter.xyzd50ToSrgb(...self.#toXyzd50()), self.alpha),
2414
2435
  ["srgb-linear" ]: (self) => new ColorFunction("srgb-linear" , ...ColorConverter.xyzd50TosRGBLinear(...self.#toXyzd50()), self.alpha),
2415
2436
  ["display-p3" ]: (self) => new ColorFunction("display-p3" , ...ColorConverter.xyzd50ToDisplayP3(...self.#toXyzd50()), self.alpha),
2437
+ ["display-p3-linear" ]: (self) => new ColorFunction("display-p3-linear" , ...ColorConverter.xyzd50ToDisplayP3Linear(...self.#toXyzd50()), self.alpha),
2416
2438
  ["a98-rgb" ]: (self) => new ColorFunction("a98-rgb" , ...ColorConverter.xyzd50ToAdobeRGB(...self.#toXyzd50()), self.alpha),
2417
2439
  ["prophoto-rgb" ]: (self) => new ColorFunction("prophoto-rgb" , ...ColorConverter.xyzd50ToProPhoto(...self.#toXyzd50()), self.alpha),
2418
2440
  ["rec2020" ]: (self) => new ColorFunction("rec2020" , ...ColorConverter.xyzd50ToRec2020(...self.#toXyzd50()), self.alpha),
@@ -5661,15 +5683,21 @@ class HeapSnapshotWorkerProxy extends ObjectWrapper {
5661
5683
  }
5662
5684
  evaluateForTest(script, callback) {
5663
5685
  const callId = this.nextCallId++;
5664
- this.callbacks.set(callId, callback);
5686
+ this.callbacks.set(callId, (error, result) => {
5687
+ callback(error, result);
5688
+ });
5665
5689
  this.postMessage({ callId, disposition: 'evaluateForTest', source: script });
5666
5690
  }
5667
5691
  callFactoryMethod(callback, objectId, methodName, proxyConstructor, transfer, ...methodArguments) {
5668
5692
  const callId = this.nextCallId++;
5669
5693
  const newObjectId = this.nextObjectId++;
5670
5694
  if (callback) {
5671
- this.callbacks.set(callId, remoteResult => {
5672
- callback(remoteResult ? new proxyConstructor(this, newObjectId) : null);
5695
+ this.callbacks.set(callId, (error, remoteResult) => {
5696
+ if (error) {
5697
+ callback(error);
5698
+ return;
5699
+ }
5700
+ callback(undefined, remoteResult ? new proxyConstructor(this, newObjectId) : undefined);
5673
5701
  });
5674
5702
  this.postMessage({
5675
5703
  callId,
@@ -5694,7 +5722,9 @@ class HeapSnapshotWorkerProxy extends ObjectWrapper {
5694
5722
  callMethod(callback, objectId, methodName, ...methodArguments) {
5695
5723
  const callId = this.nextCallId++;
5696
5724
  if (callback) {
5697
- this.callbacks.set(callId, callback);
5725
+ this.callbacks.set(callId, (error, result) => {
5726
+ callback(error, result);
5727
+ });
5698
5728
  }
5699
5729
  this.postMessage({
5700
5730
  callId,
@@ -5725,8 +5755,15 @@ class HeapSnapshotWorkerProxy extends ObjectWrapper {
5725
5755
  }
5726
5756
  setupForSecondaryInit(port) {
5727
5757
  const callId = this.nextCallId++;
5728
- const done = new Promise(resolve => {
5729
- this.callbacks.set(callId, resolve);
5758
+ const done = new Promise((resolve, reject) => {
5759
+ this.callbacks.set(callId, error => {
5760
+ if (error) {
5761
+ reject(new Error(error));
5762
+ }
5763
+ else {
5764
+ resolve();
5765
+ }
5766
+ });
5730
5767
  });
5731
5768
  this.postMessage({
5732
5769
  callId,
@@ -5746,15 +5783,17 @@ class HeapSnapshotWorkerProxy extends ObjectWrapper {
5746
5783
  if (data.error) {
5747
5784
  this.#console.error(`An error occurred when a call to method '${data.errorMethodName}' was requested`);
5748
5785
  this.#console.error(data['errorCallStack']);
5749
- this.callbacks.delete(data.callId);
5750
- return;
5751
5786
  }
5752
5787
  const callback = this.callbacks.get(data.callId);
5753
5788
  if (!callback) {
5754
5789
  return;
5755
5790
  }
5756
5791
  this.callbacks.delete(data.callId);
5757
- callback(data.result);
5792
+ if (data.error) {
5793
+ callback(data.error);
5794
+ return;
5795
+ }
5796
+ callback(undefined, data.result);
5758
5797
  }
5759
5798
  postMessage(message, transfer) {
5760
5799
  this.worker.postMessage(message, transfer);
@@ -5774,10 +5813,27 @@ class HeapSnapshotProxyObject {
5774
5813
  return this.worker.callFactoryMethod(null, String(this.objectId), methodName, proxyConstructor, [], ...args);
5775
5814
  }
5776
5815
  callFactoryMethodPromise(methodName, proxyConstructor, transfer, ...args) {
5777
- return new Promise(resolve => this.worker.callFactoryMethod(resolve, String(this.objectId), methodName, proxyConstructor, transfer, ...args));
5816
+ return new Promise((resolve, reject) => this.worker.callFactoryMethod((error, result) => {
5817
+ if (error) {
5818
+ reject(new Error(error));
5819
+ }
5820
+ else if (result) {
5821
+ resolve(result);
5822
+ }
5823
+ else {
5824
+ reject(new Error(`Failed to create ${proxyConstructor.name}`));
5825
+ }
5826
+ }, String(this.objectId), methodName, proxyConstructor, transfer, ...args));
5778
5827
  }
5779
5828
  callMethodPromise(methodName, ...args) {
5780
- return new Promise(resolve => this.worker.callMethod(resolve, String(this.objectId), methodName, ...args));
5829
+ return new Promise((resolve, reject) => this.worker.callMethod((error, result) => {
5830
+ if (error) {
5831
+ reject(new Error(error));
5832
+ }
5833
+ else {
5834
+ resolve(result);
5835
+ }
5836
+ }, String(this.objectId), methodName, ...args));
5781
5837
  }
5782
5838
  }
5783
5839
  class HeapSnapshotLoaderProxy extends HeapSnapshotProxyObject {
@@ -5796,12 +5852,16 @@ class HeapSnapshotLoaderProxy extends HeapSnapshotProxyObject {
5796
5852
  const secondWorker = new HeapSnapshotWorkerProxy(() => { }, this.worker.console, this.worker.workerUrl);
5797
5853
  const channel = new MessageChannel();
5798
5854
  await secondWorker.setupForSecondaryInit(channel.port2);
5799
- const snapshotProxy = await this.callFactoryMethodPromise('buildSnapshot', HeapSnapshotProxy, [channel.port1]);
5800
- secondWorker.dispose();
5801
- this.dispose();
5802
- snapshotProxy.setProfileUid(this.profileUid);
5803
- await snapshotProxy.updateStaticData();
5804
- this.snapshotReceivedCallback(snapshotProxy);
5855
+ try {
5856
+ const snapshotProxy = await this.callFactoryMethodPromise('buildSnapshot', HeapSnapshotProxy, [channel.port1]);
5857
+ snapshotProxy.setProfileUid(this.profileUid);
5858
+ await snapshotProxy.updateStaticData();
5859
+ this.snapshotReceivedCallback(snapshotProxy);
5860
+ }
5861
+ finally {
5862
+ secondWorker.dispose();
5863
+ this.dispose();
5864
+ }
5805
5865
  }
5806
5866
  }
5807
5867
  class HeapSnapshotProxy extends HeapSnapshotProxyObject {
@@ -10069,6 +10129,7 @@ class HeapSnapshotLoader {
10069
10129
  this.#dataCallback = null;
10070
10130
  this.#done = false;
10071
10131
  this.parsingComplete = this.#parseInput();
10132
+ this.parsingComplete.catch(() => { });
10072
10133
  }
10073
10134
  dispose() {
10074
10135
  this.#reset();
@@ -10081,6 +10142,7 @@ class HeapSnapshotLoader {
10081
10142
  this.#done = true;
10082
10143
  if (this.#dataCallback) {
10083
10144
  this.#dataCallback('');
10145
+ this.#dataCallback = null;
10084
10146
  }
10085
10147
  }
10086
10148
  async buildSnapshot(secondWorker) {
@@ -10148,6 +10210,9 @@ class HeapSnapshotLoader {
10148
10210
  this.#snapshot.strings = JSON.parse(this.#json);
10149
10211
  }
10150
10212
  write(chunk) {
10213
+ if (!chunk) {
10214
+ return;
10215
+ }
10151
10216
  this.#buffer.push(chunk);
10152
10217
  if (!this.#dataCallback) {
10153
10218
  return;
@@ -10159,6 +10224,9 @@ class HeapSnapshotLoader {
10159
10224
  if (this.#buffer.length > 0) {
10160
10225
  return Promise.resolve(this.#buffer.shift());
10161
10226
  }
10227
+ if (this.#done) {
10228
+ return Promise.resolve('');
10229
+ }
10162
10230
  const { promise, resolve } = Promise.withResolvers();
10163
10231
  this.#dataCallback = resolve;
10164
10232
  return promise;
@@ -10170,7 +10238,11 @@ class HeapSnapshotLoader {
10170
10238
  return pos;
10171
10239
  }
10172
10240
  startIndex = this.#json.length - token.length + 1;
10173
- this.#json += await this.#fetchChunk();
10241
+ const chunk = await this.#fetchChunk();
10242
+ if (!chunk) {
10243
+ throw new Error(`Token ${token} not found (unexpected end of input)`);
10244
+ }
10245
+ this.#json += chunk;
10174
10246
  }
10175
10247
  }
10176
10248
  async #parseArray(name, title, length) {
@@ -10187,7 +10259,11 @@ class HeapSnapshotLoader {
10187
10259
  else {
10188
10260
  this.#progress.updateStatus(title);
10189
10261
  }
10190
- this.#json += await this.#fetchChunk();
10262
+ const chunk = await this.#fetchChunk();
10263
+ if (!chunk) {
10264
+ throw new Error(`Unexpected end of input while ${title}`);
10265
+ }
10266
+ this.#json += chunk;
10191
10267
  }
10192
10268
  const result = this.#array;
10193
10269
  this.#array = null;
@@ -10210,7 +10286,11 @@ class HeapSnapshotLoader {
10210
10286
  });
10211
10287
  jsonTokenizer.write(json);
10212
10288
  while (!jsonTokenizerDone) {
10213
- jsonTokenizer.write(await this.#fetchChunk());
10289
+ const chunk = await this.#fetchChunk();
10290
+ if (!chunk) {
10291
+ throw new Error('Unexpected end of input while loading snapshot info');
10292
+ }
10293
+ jsonTokenizer.write(chunk);
10214
10294
  }
10215
10295
  this.#snapshot = this.#snapshot || {};
10216
10296
  const nodes = await this.#parseArray('"nodes"', 'Loading nodes… {PH1}%', this.#snapshot.snapshot.meta.node_fields.length * this.#snapshot.snapshot.node_count);