{"version":3,"sources":["src/common/Stream.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY,CAAC,OAAO;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,MAAM,CAAC,OAAO;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAA+B;gBAEnC,QAAQ,CAAC,EAAE,MAAM;IAKpC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,EAAE,IAAI,MAAM,CAEtB;IAEM,KAAK,IAAI,IAAI;IAWb,gBAAgB,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAW1D,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAetC,SAAS,IAAI,IAAI;IAOxB,OAAO,CAAC,aAAa;CAKxB","file":"Stream.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport { InvalidOperationError } from \"./Error.js\";\nimport { createNoDashGuid } from \"./Guid.js\";\nimport { Queue } from \"./Queue.js\";\n\nexport interface IStreamChunk<TBuffer> {\n    isEnd: boolean;\n    buffer: TBuffer;\n    timeReceived: number;\n}\n\nexport class Stream<TBuffer> {\n    private privId: string;\n    private privIsWriteEnded: boolean = false;\n    private privIsReadEnded: boolean = false;\n    private privReaderQueue: Queue<IStreamChunk<TBuffer>>;\n\n    public constructor(streamId?: string) {\n        this.privId = streamId ? streamId : createNoDashGuid();\n        this.privReaderQueue = new Queue<IStreamChunk<TBuffer>>();\n    }\n\n    public get isClosed(): boolean {\n        return this.privIsWriteEnded;\n    }\n\n    public get isReadEnded(): boolean {\n        return this.privIsReadEnded;\n    }\n\n    public get id(): string {\n        return this.privId;\n    }\n\n    public close(): void {\n        if (!this.privIsWriteEnded) {\n            this.writeStreamChunk({\n                buffer: null,\n                isEnd: true,\n                timeReceived: Date.now(),\n            });\n            this.privIsWriteEnded = true;\n        }\n    }\n\n    public writeStreamChunk(streamChunk: IStreamChunk<TBuffer>): void {\n        this.throwIfClosed();\n        if (!this.privReaderQueue.isDisposed()) {\n            try {\n                this.privReaderQueue.enqueue(streamChunk);\n            } catch (e) {\n                // Do nothing\n            }\n        }\n    }\n\n    public read(): Promise<IStreamChunk<TBuffer>> {\n        if (this.privIsReadEnded) {\n            throw new InvalidOperationError(\"Stream read has already finished\");\n        }\n\n        return this.privReaderQueue\n            .dequeue()\n            .then(async (streamChunk: IStreamChunk<TBuffer>): Promise<IStreamChunk<TBuffer>> => {\n                if (streamChunk === undefined || streamChunk.isEnd) {\n                    await this.privReaderQueue.dispose(\"End of stream reached\");\n                }\n\n                return streamChunk;\n            });\n    }\n    public readEnded(): void {\n        if (!this.privIsReadEnded) {\n            this.privIsReadEnded = true;\n            this.privReaderQueue = new Queue<IStreamChunk<TBuffer>>();\n        }\n    }\n\n    private throwIfClosed(): void {\n        if (this.privIsWriteEnded) {\n            throw new InvalidOperationError(\"Stream closed\");\n        }\n    }\n}\n"]}