@poe-platform/safe-bash 0.1.11 → 0.1.13

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.
@@ -13728,19 +13728,54 @@ ${prefix2} line ${offset + line}: \`${source.split("\n")[line - 1] ?? ""}'
13728
13728
 
13729
13729
  // packages/safe-bash/src/shell/input.ts
13730
13730
  async function fileInput(fs, path, maxBytes, signal) {
13731
- if (!fs.readStream || fs.capabilities.streamingRead === false) {
13731
+ signal.throwIfAborted();
13732
+ async function bufferedInput() {
13733
+ signal.throwIfAborted();
13732
13734
  const bytes = await interruptible(fs.readFile(path, { signal, maxBytes }), signal);
13733
13735
  signal.throwIfAborted();
13734
13736
  if (bytes.byteLength > maxBytes) throw new FsError("EFBIG", { syscall: "readFile", path });
13735
13737
  return toByteSource(bytes);
13736
13738
  }
13737
- const iterator = fs.readStream(path, { signal })[Symbol.asyncIterator]();
13739
+ const readStream = fs.readStream;
13740
+ if (!readStream || fs.capabilities.streamingRead === false) return bufferedInput();
13741
+ let iterator;
13742
+ try {
13743
+ iterator = readStream.call(fs, path, { signal })[Symbol.asyncIterator]();
13744
+ } catch (error) {
13745
+ signal.throwIfAborted();
13746
+ if (!(error instanceof FsError) || error.code !== "ENOTSUP") throw error;
13747
+ return bufferedInput();
13748
+ }
13738
13749
  let size = 0;
13750
+ let buffered = false;
13751
+ let closed = false;
13752
+ let returned;
13753
+ function closeIterator() {
13754
+ returned ??= Promise.resolve().then(() => iterator.return?.() ?? { done: true, value: void 0 });
13755
+ return returned;
13756
+ }
13739
13757
  return {
13740
13758
  [Symbol.asyncIterator]: () => ({
13741
13759
  async next() {
13742
13760
  signal.throwIfAborted();
13743
- const result = await interruptible(Promise.resolve(iterator.next()), signal);
13761
+ if (closed) return { done: true, value: void 0 };
13762
+ let result;
13763
+ try {
13764
+ result = await interruptible(Promise.resolve(iterator.next()), signal);
13765
+ } catch (error) {
13766
+ signal.throwIfAborted();
13767
+ if (buffered || size > 0 || !(error instanceof FsError) || error.code !== "ENOTSUP") throw error;
13768
+ await interruptible(closeIterator(), signal);
13769
+ signal.throwIfAborted();
13770
+ if (closed) return { done: true, value: void 0 };
13771
+ const source = await bufferedInput();
13772
+ if (closed) return { done: true, value: void 0 };
13773
+ iterator = source[Symbol.asyncIterator]();
13774
+ buffered = true;
13775
+ returned = void 0;
13776
+ result = await iterator.next();
13777
+ }
13778
+ signal.throwIfAborted();
13744
13779
  if (!result.done) {
13745
13780
  if (!(result.value instanceof Uint8Array)) throw new TypeError("Shell stdin must yield Uint8Array");
13746
13781
  if (result.value.byteLength > maxBytes - size) throw new FsError("EFBIG", { syscall: "readFile", path });
@@ -13748,7 +13783,10 @@ async function fileInput(fs, path, maxBytes, signal) {
13748
13783
  }
13749
13784
  return result;
13750
13785
  },
13751
- ...iterator.return ? { return: iterator.return.bind(iterator) } : {}
13786
+ return() {
13787
+ closed = true;
13788
+ return closeIterator();
13789
+ }
13752
13790
  })
13753
13791
  };
13754
13792
  }