; (function (global) {
    /**
    * 流式资源加载 
    * @param {string} url 资源链接
    * @param {object} callbacks 回调集合：{onBuffer,onDone,onError}
    */
    class StreamingFetcher {
        constructor(url, callbacks) {
            this.url = url;
            this._isDone = false;
            this._error = null;
            this._abortController = new AbortController();
            this._callbacks = callbacks ?? {};
        }
        /**
         * Test Only
         */
        testCallback() {
            console.log("Hello!");
            this._callbacks.onDone();
            this._callbacks.onBuffer(new Uint8Array([1, 2, 3]));
            this._callbacks.onError("1234545");
        }
        /**
         * 停止加载
         */
        stop() {
            var isRunning = this._isDone === false && this._error == null;
            if (isRunning) {
                this._abortController.abort();
            }
        }
        /**
         * 开始加载
         */
        start() {
            var that = this;
            fetch(this.url, {
                signal: this._abortController.signal,
                keepalive: true,
                headers: {
                    'Accept-Ranges': 'bytes',
                    'Range': 'bytes=0-',
                    'Connection': 'keep-alive'
                }
            }).then(response => {
                const reader = response.body.getReader();
                function read() {
                    reader.read().then(({ done, value }) => {
                        if (done) {
                            var onDone = that._callbacks.onDone;
                            onDone && onDone();
                            return;
                        }

                        var onBuffer = that._callbacks.onBuffer;
                        onBuffer && onBuffer(value);

                        // 读取下一个数据
                        read();
                    })
                }
                read();
            }).catch((error) => {
                that._error = error;
                var onError = that._callbacks.onError;
                onError && onError(error.message);
            });
        }
    }
    global.StreamingFetcher = StreamingFetcher;
})(window);