"use strict"; // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. Object.defineProperty(exports, "__esModule", { value: true }); exports.BuilderTransform = exports.builderThroughDOMStream = void 0; const tslib_1 = require("tslib"); const factories_js_1 = require("../../factories.js"); /** @ignore */ function builderThroughDOMStream(options) { return new BuilderTransform(options); } exports.builderThroughDOMStream = builderThroughDOMStream; /** @ignore */ class BuilderTransform { constructor(options) { // Access properties by string indexers to defeat closure compiler this._numChunks = 0; this._finished = false; this._bufferedSize = 0; const { ['readableStrategy']: readableStrategy, ['writableStrategy']: writableStrategy, ['queueingStrategy']: queueingStrategy = 'count' } = options, builderOptions = tslib_1.__rest(options, ['readableStrategy', 'writableStrategy', 'queueingStrategy']); this._controller = null; this._builder = (0, factories_js_1.makeBuilder)(builderOptions); this._getSize = queueingStrategy !== 'bytes' ? chunkLength : chunkByteLength; const { ['highWaterMark']: readableHighWaterMark = queueingStrategy === 'bytes' ? Math.pow(2, 14) : 1000 } = Object.assign({}, readableStrategy); const { ['highWaterMark']: writableHighWaterMark = queueingStrategy === 'bytes' ? Math.pow(2, 14) : 1000 } = Object.assign({}, writableStrategy); this['readable'] = new ReadableStream({ ['cancel']: () => { this._builder.clear(); }, ['pull']: (c) => { this._maybeFlush(this._builder, this._controller = c); }, ['start']: (c) => { this._maybeFlush(this._builder, this._controller = c); }, }, { 'highWaterMark': readableHighWaterMark, 'size': queueingStrategy !== 'bytes' ? chunkLength : chunkByteLength, }); this['writable'] = new WritableStream({ ['abort']: () => { this._builder.clear(); }, ['write']: () => { this._maybeFlush(this._builder, this._controller); }, ['close']: () => { this._maybeFlush(this._builder.finish(), this._controller); }, }, { 'highWaterMark': writableHighWaterMark, 'size': (value) => this._writeValueAndReturnChunkSize(value), }); } _writeValueAndReturnChunkSize(value) { const bufferedSize = this._bufferedSize; this._bufferedSize = this._getSize(this._builder.append(value)); return this._bufferedSize - bufferedSize; } _maybeFlush(builder, controller) { if (controller == null) { return; } if (this._bufferedSize >= controller.desiredSize) { ++this._numChunks && this._enqueue(controller, builder.toVector()); } if (builder.finished) { if (builder.length > 0 || this._numChunks === 0) { ++this._numChunks && this._enqueue(controller, builder.toVector()); } if (!this._finished && (this._finished = true)) { this._enqueue(controller, null); } } } _enqueue(controller, chunk) { this._bufferedSize = 0; this._controller = null; chunk == null ? controller.close() : controller.enqueue(chunk); } } exports.BuilderTransform = BuilderTransform; /** @ignore */ const chunkLength = (chunk) => { var _a; return (_a = chunk === null || chunk === void 0 ? void 0 : chunk.length) !== null && _a !== void 0 ? _a : 0; }; /** @ignore */ const chunkByteLength = (chunk) => { var _a; return (_a = chunk === null || chunk === void 0 ? void 0 : chunk.byteLength) !== null && _a !== void 0 ? _a : 0; }; //# sourceMappingURL=builder.js.map