UNPKG

botframework-streaming

Version:

Streaming library for the Microsoft Bot Framework

87 lines (78 loc) 3.81 kB
/** * @module botframework-streaming */ /** * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ import { IHeader } from '../interfaces'; import { SubscribableStream } from '../subscribableStream'; import { PayloadAssembler } from '../assemblers/payloadAssembler'; /** * Orchestrates and manages streams. */ export class StreamManager { private readonly activeAssemblers = []; /** * Initializes a new instance of the [StreamManager](xref:botframework-streaming.StreamManager) class. * * @param onCancelStream Function to trigger if the managed stream is cancelled. */ constructor(private readonly onCancelStream: (contentStreamAssembler: PayloadAssembler) => void) {} /** * Retrieves a [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) with the given ID if one exists, otherwise a new instance is created and assigned the given ID. * * @param id The ID of the [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) to retrieve or create. * @returns The [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) with the given ID. */ getPayloadAssembler(id: string): PayloadAssembler { if (!this.activeAssemblers[id]) { // A new id has come in, kick off the process of tracking it. const assembler = new PayloadAssembler(this, { id }); this.activeAssemblers[id] = assembler; return assembler; } else { return this.activeAssemblers[id]; } } /** * Retrieves the [SubscribableStream](xref:botframework-streaming.SubscribableStream) from the [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) this manager manages. * * @param header The Header of the [SubscribableStream](xref:botframework-streaming.SubscribableStream) to retrieve. * @returns The [SubscribableStream](xref:botframework-streaming.SubscribableStream) with the given header. */ getPayloadStream(header: IHeader): SubscribableStream { const assembler = this.getPayloadAssembler(header.id); return assembler.getPayloadStream(); } /** * Used to set the behavior of the managed [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) when data is received. * * @param header The Header of the stream. * @param contentStream The [SubscribableStream](xref:botframework-streaming.SubscribableStream) to write incoming data to. * @param contentLength The amount of data to write to the contentStream. */ onReceive(header: IHeader, contentStream: SubscribableStream, contentLength: number): void { if (!this.activeAssemblers[header.id]) { return; } this.activeAssemblers[header.id].onReceive(header, contentStream, contentLength); } /** * Closes the [PayloadAssembler](xref:botframework-streaming.PayloadAssembler) assigned to the [SubscribableStream](xref:botframework-streaming.SubscribableStream) with the given ID. * * @param id The ID of the [SubscribableStream](xref:botframework-streaming.SubscribableStream) to close. */ closeStream(id: string): void { if (!this.activeAssemblers[id]) { return; } else { const assembler: PayloadAssembler = this.activeAssemblers[id]; this.activeAssemblers.splice(this.activeAssemblers.indexOf(id), 1); const targetStream = assembler.getPayloadStream(); if ((assembler.contentLength && targetStream.length < assembler.contentLength) || !assembler.end) { this.onCancelStream(assembler); } } } }