UNPKG

zip-iterator

Version:

Extract contents from zip archive type using an iterator API using streams or paths. Use stream interface and pipe transforms to add decompression algorithms

88 lines 3.23 kB
/** * EntryEmitter - Entry stream creation and lifecycle management * * Handles creating PassThrough streams for entries and manages the * deferred error emission pattern for race conditions. */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: Object.getOwnPropertyDescriptor(all, name).get }); } _export(exports, { get PassThrough () { return _extractbaseiterator.PassThrough; }, get createEntryStream () { return createEntryStream; }, get emitErrorToStream () { return emitErrorToStream; }, get emitStreamError () { return emitStreamError; }, get endEntryStream () { return endEntryStream; } }); var _extractbaseiterator = require("extract-base-iterator"); function createEntryStream() { var stream = new _extractbaseiterator.PassThrough(); // Pause the output stream so data events aren't lost before consumer attaches listeners // Consumer should call resume() or attach listeners which will auto-resume if (typeof stream.pause === 'function') { stream.pause(); } return stream; } function emitErrorToStream(stream, err) { // Check if there are already error listeners var hasListeners = stream.listeners && stream.listeners('error').length > 0; if (hasListeners) { // Emit immediately if listeners exist stream.emit('error', err); } else { // Defer emission: patch on/addListener to emit when listener is attached // Store error on stream object for deferred emission var streamWithError = stream; streamWithError._deferredError = err; // Wrap the on/addListener methods to check for deferred error var origOn = stream.on; var patchedOn = function patchedOn(event, listener) { var _this = this; var result = origOn.call(this, event, listener); // If attaching error listener and we have a deferred error, emit it if (event === 'error' && this._deferredError) { var deferredErr = this._deferredError; this._deferredError = undefined; // Emit asynchronously to ensure listener is fully attached setTimeout(function() { _this.emit('error', deferredErr); }, 0); } return result; }; stream.on = patchedOn; stream.addListener = patchedOn; } } function emitStreamError(stream, err) { if (!stream) return; var listeners = stream.listeners && stream.listeners('error'); if (listeners && listeners.length > 0) { stream.emit('error', err); } else { emitErrorToStream(stream, err); } } function endEntryStream(stream) { if (stream) { stream.end(); } } /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }