{"version":3,"sources":["../../../packages/core/data/cim-stream.ts"],"names":[],"mappings":"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","file":"cim-stream.d.ts","sourcesContent":["import { Observable, Observer, throwError } from 'rxjs';\r\nimport { catchError, filter, mergeMap, switchMap, take } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport { AuthorizationManager } from '../security/authorization-manager';\r\nimport { CimKeyProperties, CimMultiple, CimResult, CimSingle } from './cim';\r\nimport { NodeCimOutput, NodeRequestOptions } from './node-connection';\r\nimport { PowerShellAlternate } from './powershell-alternate';\r\nimport { PowerShellStream } from './powershell-stream';\r\nimport {\r\n    WebsocketStream,\r\n    WebsocketStreamConnectionState,\r\n    WebsocketStreamDataRequestState,\r\n    WebsocketStreamDataState,\r\n    WebsocketStreamDataTarget,\r\n    WebsocketStreamHandler,\r\n    WebsocketStreamName,\r\n    WebsocketStreamProcessor\r\n} from './websocket-stream';\r\n\r\n/**\r\n * Cim result format.\r\n */\r\nexport enum CimResultFormat {\r\n    /**\r\n     * Single instance result.\r\n     */\r\n    Single,\r\n\r\n    /**\r\n     * Multiple instances result.\r\n     */\r\n    Multiple,\r\n\r\n    /**\r\n     * Mixed data result.\r\n     */\r\n    Result\r\n}\r\n\r\n/**\r\n * Cim Stream options.\r\n */\r\nexport interface CimStreamOptions extends NodeRequestOptions {\r\n    /**\r\n     * Partial data response. By default, it responses back with completed data.\r\n     */\r\n    partial?: boolean;\r\n\r\n    /**\r\n     * Override Query ID so it can request cancel.\r\n     */\r\n    queryId?: string;\r\n\r\n    /**\r\n     * Buffering time period by milliseconds.\r\n     */\r\n    bufferTime?: number;\r\n\r\n    /**\r\n     * Buffering count.\r\n     */\r\n    bufferCount?: number;\r\n}\r\n\r\n/**\r\n * CIM Get instance multiple.\r\n */\r\nexport interface CimGetInstanceMultiple {\r\n    name: 'CimGetInstanceMultiple';\r\n    namespace: string;\r\n    className: string;\r\n}\r\n\r\n/**\r\n * Cim Get instance single.\r\n */\r\nexport interface CimGetInstanceSingle {\r\n    name: 'CimGetInstanceSingle';\r\n    namespace: string;\r\n    className: string;\r\n    keyProperties: CimKeyProperties;\r\n}\r\n\r\n/**\r\n * Cim Invoke method instance.\r\n */\r\nexport interface CimInvokeMethodInstance {\r\n    name: 'CimInvokeMethodInstance';\r\n    namespace: string;\r\n    className: string;\r\n    methodName: string;\r\n    keyProperties: CimKeyProperties;\r\n    data?: any;\r\n}\r\n\r\n/**\r\n * Cim Invoke method static.\r\n */\r\nexport interface CimInvokeMethodStatic {\r\n    name: 'CimInvokeMethodStatic';\r\n    namespace: string;\r\n    className: string;\r\n    methodName: string;\r\n    data?: any;\r\n}\r\n\r\n/**\r\n * Cim Set instance.\r\n */\r\nexport interface CimSetInstance {\r\n    name: 'CimSetInstance';\r\n    namespace: string;\r\n    className: string;\r\n    keyProperties: CimKeyProperties;\r\n    data: any;\r\n}\r\n\r\n/**\r\n * Cim Modify instance.\r\n */\r\nexport interface CimModifyInstance {\r\n    name: 'CimModifyInstance';\r\n    namespace: string;\r\n    className: string;\r\n    keyProperties: CimKeyProperties;\r\n    data: any;\r\n}\r\n\r\n/**\r\n * Cim Delete instance.\r\n */\r\nexport interface CimDeleteInstance {\r\n    name: 'CimDeleteInstance';\r\n    namespace: string;\r\n    className: string;\r\n    keyProperties: CimKeyProperties;\r\n}\r\n\r\n/**\r\n * Cim Get instance query.\r\n */\r\nexport interface CimGetInstanceQuery {\r\n    name: 'CimGetInstanceQuery';\r\n    namespace: string;\r\n    query: string;\r\n}\r\n\r\n/**\r\n * Cim Stream request data.\r\n */\r\nexport type CimStreamRequestData =\r\n    CimGetInstanceMultiple\r\n    | CimGetInstanceSingle\r\n    | CimInvokeMethodInstance\r\n    | CimInvokeMethodStatic\r\n    | CimSetInstance\r\n    | CimModifyInstance\r\n    | CimDeleteInstance\r\n    | CimGetInstanceQuery;\r\n\r\n/**\r\n * The request packet of Cim Stream to the gateway.\r\n */\r\nexport interface CimStreamRequest {\r\n    /**\r\n     * The identification string (auto generated or supplied as queryId option.)\r\n     */\r\n    id: string;\r\n\r\n    /**\r\n     * The stream target.\r\n     */\r\n    target: WebsocketStreamDataTarget;\r\n\r\n    /**\r\n     * The date request state.\r\n     */\r\n    requestState: WebsocketStreamDataRequestState;\r\n\r\n    /**\r\n     * The request data.\r\n     */\r\n    request: CimStreamRequestData;\r\n\r\n    /**\r\n     * The Cim stream options.\r\n     */\r\n    options?: CimStreamOptions;\r\n}\r\n\r\n/**\r\n * Cim stream response.\r\n */\r\nexport interface CimStreamResponse {\r\n    /**\r\n     * Request ID from client.\r\n     */\r\n    id: string;\r\n\r\n    /**\r\n     * The state of response data.\r\n     */\r\n    state: WebsocketStreamDataState;\r\n\r\n    /**\r\n     * The index number of response data.\r\n     */\r\n    index: number;\r\n\r\n    /**\r\n     * The response data.\r\n     */\r\n    response: any;\r\n}\r\n\r\n/**\r\n * Cim Processor interface. Each Cim query creates new observable.\r\n */\r\nclass CimProcessor extends WebsocketStreamProcessor<CimSingle | CimMultiple | CimResult, CimStreamOptions> {\r\n    /**\r\n     * Holding result if waitCompleted option is specified for multiple instances.\r\n     */\r\n    declare public response?: any;\r\n\r\n    /**\r\n     * Initializes a new instance of the CimProcessor class.\r\n     * @param observer Observer to send back result to caller.\r\n     * @param target Stream Target object.\r\n     * @param format CIM result format.\r\n     * @param options Options for Cim stream query.\r\n     */\r\n    constructor(\r\n        observer: Observer<CimSingle | CimMultiple | CimResult>,\r\n        target: WebsocketStreamDataTarget,\r\n        public format: CimResultFormat,\r\n        options: CimStreamOptions) {\r\n        super(observer, target, options);\r\n    }\r\n}\r\n\r\nexport interface CimStreamMonitorSetContext<T> {\r\n    nodeName: string;\r\n    requestState: WebsocketStreamDataRequestState;\r\n    request: CimStreamRequestData;\r\n    format: CimResultFormat;\r\n    options?: CimStreamOptions;\r\n    data: T;\r\n}\r\n\r\n/**\r\n * Set of monitors for pre and post process of cim stream.\r\n */\r\nexport interface CimStreamMonitorSet<T> {\r\n    name: string;\r\n    preMonitor: (\r\n        nodeName: string,\r\n        requestState: WebsocketStreamDataRequestState,\r\n        request: CimStreamRequestData,\r\n        format: CimResultFormat,\r\n        options?: CimStreamOptions) =>\r\n            Observable<CimStreamMonitorSetContext<any>>;\r\n    successMonitor: (result: T, context: CimStreamMonitorSetContext<any>) => Observable<T>;\r\n    errorMonitor: (error: any, context: CimStreamMonitorSetContext<any>) => Observable<T>;\r\n}\r\n\r\n/**\r\n * The CIM stream class.\r\n */\r\nexport class CimStream implements WebsocketStreamHandler {\r\n    private static readonly logSourceName = 'CimStream';\r\n    /**\r\n     * The collection of set of monitors.\r\n     */\r\n    private static monitorSets: CimStreamMonitorSet<any>[] = [];\r\n    private processors: Map<string /* id */, CimProcessor> = new Map();\r\n    private strings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.WebsocketStream.CimStream;\r\n\r\n    /**\r\n     * Register the set of monitors.\r\n     *\r\n     * @param monitorSet The set of monitors.\r\n     */\r\n    public static registerMonitorSet(monitorSet: CimStreamMonitorSet<any>): void {\r\n        const found = CimStream.monitorSets.find(monitors => monitors.name === monitorSet.name);\r\n        if (found) {\r\n            return;\r\n        }\r\n\r\n        CimStream.monitorSets.push(monitorSet);\r\n    }\r\n\r\n    /**\r\n     * Unregister the set of monitors.\r\n     *\r\n     * @param name The name of set of monitors.\r\n     * @returns boolean true if unregistered the named set.\r\n     */\r\n    public static unregisterMonitors(name: string): boolean {\r\n        const found = CimStream.monitorSets.find(monitors => monitors.name === name);\r\n        if (found) {\r\n            CimStream.monitorSets.remove(found);\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Initializes a new instance of the CimStream class.\r\n     *\r\n     * @param websocketStream the websocket stream object.\r\n     * @param powerShellStream the PowerShell steam object.\r\n     * @param authorizationManager the authorization manager object.\r\n     */\r\n    constructor(\r\n        private websocketStream: WebsocketStream,\r\n        private powerShellStream: PowerShellStream,\r\n        private authorizationManager: AuthorizationManager) {\r\n        websocketStream.registerProcessor(WebsocketStreamName.CimStreamName, this);\r\n    }\r\n\r\n    /**\r\n     * CIM Get MultipleInstances\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param options the options for this request.\r\n     * @return Observable<CimResult> the query observable.\r\n     */\r\n    public getInstanceMultiple(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            options?: CimStreamOptions): Observable<CimMultiple> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Multiple);\r\n        const observable = PowerShellAlternate.createStream<CimMultiple>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimGetInstanceMultiple';\r\n        const request = <CimGetInstanceMultiple>{ name, namespace, className };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Multiple, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Get SingleInstance\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param keyProperties the key properties object.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public getInstanceSingle(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            keyProperties: CimKeyProperties,\r\n            options?: CimStreamOptions): Observable<CimSingle> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Multiple, keyProperties);\r\n        const observable = PowerShellAlternate.createStream<CimSingle>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimGetInstanceSingle';\r\n        const request = <CimGetInstanceSingle>{ name, namespace, className, keyProperties };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Single, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Invoke InstanceMethod\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param methodName the method name.\r\n     * @param keyProperties the key properties object.\r\n     * @param data the method input data.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public invokeMethodInstance(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            methodName: string,\r\n            keyProperties: any,\r\n            data?: any,\r\n            options?: CimStreamOptions): Observable<CimResult> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Multiple, keyProperties, data && data.parameters);\r\n        const observable = PowerShellAlternate.createStream<CimResult>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimInvokeMethodInstance';\r\n        const request = <CimInvokeMethodInstance>{ name, namespace, className, methodName, keyProperties, data };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Result, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Invoke StaticMethod\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param methodName the method name.\r\n     * @param data the method input data.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public invokeMethodStatic(\r\n        nodeName: string,\r\n        namespace: string,\r\n        className: string,\r\n        methodName: string,\r\n        data?: any,\r\n        options?: CimStreamOptions): Observable<CimResult> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Result, data && data.parameters);\r\n        const observable = PowerShellAlternate.createStream<CimResult>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimInvokeMethodStatic';\r\n        const request = <CimInvokeMethodStatic>{ name, namespace, className, methodName, data };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Result, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Set SingleInstance\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param keyProperties the key properties object.\r\n     * @param data the method input data.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public setInstance(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            keyProperties: any,\r\n            data: any,\r\n            options?: CimStreamOptions): Observable<CimSingle> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Single, keyProperties, data && data.properties);\r\n        const observable = PowerShellAlternate.createStream<CimSingle>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimSetInstance';\r\n        const request = <CimSetInstance>{ name, namespace, className, keyProperties, data };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Single, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Modify SingleInstance\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param keyProperties the key properties object.\r\n     * @param data the method input data.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public modifyInstance(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            keyProperties: any,\r\n            data: any,\r\n            options?: CimStreamOptions): Observable<CimSingle> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Single, keyProperties, data && data.properties);\r\n        const observable = PowerShellAlternate.createStream<CimSingle>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimModifyInstance';\r\n        const request = <CimModifyInstance>{ name, namespace, className, keyProperties, data };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Single, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Delete SingleInstance\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param className the class name.\r\n     * @param keyProperties the key properties object.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public deleteInstance(\r\n            nodeName: string,\r\n            namespace: string,\r\n            className: string,\r\n            keyProperties: any,\r\n            options?: CimStreamOptions): Observable<CimSingle> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Single, keyProperties);\r\n        const observable = PowerShellAlternate.createStream<CimSingle>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimDeleteInstance';\r\n        const request = <CimDeleteInstance>{ name, namespace, className, keyProperties };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Single, options);\r\n    }\r\n\r\n    /**\r\n     * CIM Submit WqlQuery\r\n     *\r\n     * @param nodeName the name of the node to use for this request\r\n     * @param namespace the cim namespace.\r\n     * @param query the WQL string.\r\n     * @param options the options for this request.\r\n     * @return Observable<any> the query observable.\r\n     */\r\n    public getInstanceQuery(\r\n            nodeName: string,\r\n            namespace: string,\r\n            query: string,\r\n            options?: CimStreamOptions): Observable<CimResult> {\r\n        this.setPowerShellParameters(nodeName, options, NodeCimOutput.Query, options && options.powerShellParameters);\r\n        const observable = PowerShellAlternate.createStream<CimResult>(this.powerShellStream, nodeName, options);\r\n        if (observable) {\r\n            return observable;\r\n        }\r\n\r\n        const name = 'CimGetInstanceQuery';\r\n        const request = <CimGetInstanceQuery>{ name, namespace, query };\r\n        const requestState = WebsocketStreamDataRequestState.Normal;\r\n        return this.monitorCreateRequest(nodeName, requestState, request, CimResultFormat.Multiple, options);\r\n    }\r\n\r\n    /**\r\n     * Cancel active CIM query.\r\n     * Result response comes back to the original query to end.\r\n     *\r\n     * @param nodeName the node name.\r\n     * @param id the id of original request specified as options.queryId.\r\n     */\r\n    public cancel(nodeName: string, id: string): void {\r\n        const target = this.websocketStream.getTarget(this.authorizationManager, nodeName);\r\n        const requestState = WebsocketStreamDataRequestState.Cancel;\r\n        const request = <CimStreamRequest>{ id, target, requestState, request: null };\r\n        this.websocketStream.sendNext(WebsocketStreamName.CimStreamName, request);\r\n    }\r\n\r\n    /**\r\n     * Reset data for connection cleanup.\r\n     */\r\n    public reset(): void {\r\n        Logging.log({ level: LogLevel.Warning, message: this.strings.ResetError.message, source: CimStream.logSourceName });\r\n        const processors: CimProcessor[] = [];\r\n        this.processors.forEach((value) => processors.push(value));\r\n        this.processors.clear();\r\n        processors.forEach((processor) => {\r\n            processor.error(new Error(this.strings.ResetError.message));\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Process the socket message.\r\n     *\r\n     * @param message the socket message.\r\n     */\r\n    public process(message: CimStreamResponse): void {\r\n        if (!message) {\r\n            throw new Error(this.strings.NoContentError.message);\r\n        }\r\n\r\n        const processor = this.processors.get(message.id);\r\n        if (!processor) {\r\n            Logging.log({ level: LogLevel.Warning, message: this.strings.UnexpectedReceivedError.message, source: CimStream.logSourceName });\r\n            return;\r\n        }\r\n\r\n        switch (message.state) {\r\n            case WebsocketStreamDataState.Data:\r\n                this.operationNext(processor, message.response);\r\n                break;\r\n\r\n            case WebsocketStreamDataState.Completed:\r\n                this.operationComplete(processor, message.response);\r\n                this.operationEnd(message.id);\r\n                break;\r\n\r\n            case WebsocketStreamDataState.Error:\r\n                this.operationError(processor, { xhr: message });\r\n                this.operationEnd(message.id);\r\n                break;\r\n\r\n            case WebsocketStreamDataState.Noop:\r\n                break;\r\n        }\r\n    }\r\n\r\n    private operationNext(processor: CimProcessor, response: any): boolean {\r\n        const partial = processor.options && processor.options.partial;\r\n        if (!response) {\r\n            return !partial;\r\n        }\r\n\r\n        // buffering result.\r\n        if (!partial) {\r\n            if (processor.format === CimResultFormat.Single) {\r\n                // expecting - { response: any }\r\n                processor.response = response;\r\n            } else if (processor.format === CimResultFormat.Multiple) {\r\n                // expecting - { response: { value: any[]; } } format.\r\n                if (!response || !response.value) {\r\n                    Logging.log(\r\n                        { level: LogLevel.Error, message: this.strings.UnexpectedMultipleError.message, source: CimStream.logSourceName });\r\n                } else {\r\n                    if (!processor.response) {\r\n                        processor.response = response;\r\n                    } else {\r\n                        response.value.forEach(value => processor.response.value.push(value));\r\n                    }\r\n                }\r\n            } else if (processor.format === CimResultFormat.Result) {\r\n                // expecting - { response: { results: any[] }, <name1>: <value1>, <name2>: <value2> } format.\r\n                if (!processor.response) {\r\n                    processor.response = response;\r\n                } else {\r\n                    if (response.results) {\r\n                        if (processor.response.results) {\r\n                            response.results.forEach(value => processor.response.results.push(value));\r\n                            response.results = undefined;\r\n                        }\r\n                    }\r\n\r\n                    // merge other properties.\r\n                    processor.response = { ...processor.response, ...response };\r\n                }\r\n            }\r\n        } else {\r\n            processor.next(response);\r\n        }\r\n\r\n        return !partial;\r\n    }\r\n\r\n    private operationComplete(processor: CimProcessor, response: CimSingle | CimMultiple | CimResult): void {\r\n        if (this.operationNext(processor, response)) {\r\n            // complete mode to send all result once.\r\n            processor.next(processor.response);\r\n        }\r\n\r\n        if (!processor.sendOnce) {\r\n            // send null if no result was produced but success.\r\n            processor.next(null);\r\n        }\r\n\r\n        processor.complete();\r\n    }\r\n\r\n    private operationError(processor: CimProcessor, error: any): void {\r\n        processor.error(error);\r\n    }\r\n\r\n    private operationEnd(id: string): void {\r\n        this.processors.delete(id);\r\n    }\r\n\r\n    private createRequest<T>(\r\n        nodeName: string,\r\n        requestState: WebsocketStreamDataRequestState,\r\n        request: CimStreamRequestData,\r\n        format: CimResultFormat,\r\n        options?: CimStreamOptions): Observable<T> {\r\n        // publish object is created two ways.\r\n        // 1) socket is connected so submit the request immediately with simple observable.\r\n        //   (if-block and this is the most of cases.)\r\n        // 2) socket is not connected so wait for the socket to ready and submit request with\r\n        //    complex observable. Initial connect and re-connection takes this observable.\r\n        //   (else-block and this is a few cases.)\r\n        let publish: Observable<T>;\r\n        if (this.websocketStream.socketStateRaw === WebsocketStreamConnectionState.Connected) {\r\n            publish = this.createRequestSimple(nodeName, requestState, request, format, options);\r\n        } else {\r\n            publish = this.websocketStream.socketState\r\n                .pipe(\r\n                    filter(state => state === WebsocketStreamConnectionState.Connected\r\n                        || state === WebsocketStreamConnectionState.Failed\r\n                        || state === WebsocketStreamConnectionState.NotConfigured),\r\n                    take(1),\r\n                    mergeMap(state => {\r\n                        if (state === WebsocketStreamConnectionState.Connected) {\r\n                            return this.createRequestSimple<T>(nodeName, requestState, request, format, options);\r\n                        }\r\n\r\n                        return throwError(() => new Error(this.strings.ConnectionError.message));\r\n                    }));\r\n        }\r\n\r\n        return publish\r\n            .pipe(\r\n                catchError((error) => {\r\n                    // retry if reset connection of socket was observed.\r\n                    if (error && error.message === this.strings.ResetError.message) {\r\n                        return <Observable<T>>this.monitorCreateRequest(nodeName, requestState, request, format, options);\r\n                    }\r\n\r\n                    if ((!options || options.noAuth !== true)\r\n                        && !this.authorizationManager.signOnManager.isSignOnTokenEnabled\r\n                        && this.authorizationManager.canHandleStreamFailure(error.xhr)) {\r\n                        return this.authorizationManager.handleStreamFailure(nodeName, options, error.xhr)\r\n                            .pipe(switchMap(updatedOptions =>\r\n                                <Observable<T>>this.monitorCreateRequest(nodeName, requestState, request, format, updatedOptions)));\r\n                    }\r\n\r\n                    if (this.authorizationManager.signOnManager.isSignOnTokenEnabled\r\n                        && this.authorizationManager.signOnManager.canHandleStreamUnauthorizedLogin(error.xhr)) {\r\n                        return this.authorizationManager.signOnManager.handleStreamUnauthorizedLogin(options, error.xhr)\r\n                            .pipe(switchMap(updatedOptions =>\r\n                                <Observable<T>>this.monitorCreateRequest(nodeName, requestState, request, format, updatedOptions)));\r\n                    }\r\n\r\n                    return throwError(() => error);\r\n                }));\r\n    }\r\n\r\n    private createRequestSimple<T>(\r\n        nodeName: string,\r\n        requestState: WebsocketStreamDataRequestState,\r\n        request: CimStreamRequestData,\r\n        format: CimResultFormat,\r\n        options?: CimStreamOptions): Observable<T> {\r\n        return new Observable(observer => {\r\n            const target = this.websocketStream.getTarget(this.authorizationManager, nodeName);\r\n            const id = this.sendRequest(observer, target, requestState, request, format, options);\r\n            return () => {\r\n                const processor = this.processors.get(id);\r\n                if (processor) {\r\n                    processor.end = true;\r\n                    if (!processor.closed && !processor.closing) {\r\n                        this.cancel(processor.target.nodeName, id);\r\n                    }\r\n                }\r\n            };\r\n        });\r\n    }\r\n\r\n    private sendRequest(\r\n        observer: Observer<any>,\r\n        target: WebsocketStreamDataTarget,\r\n        requestState: WebsocketStreamDataRequestState,\r\n        request: CimStreamRequestData,\r\n        format: CimResultFormat,\r\n        options?: CimStreamOptions): string {\r\n        const id = (options && options.queryId) || MsftSme.getUniqueId();\r\n        const processor = new CimProcessor(observer, target, format, options);\r\n        this.processors.set(id, processor);\r\n        this.websocketStream.sendNext(WebsocketStreamName.CimStreamName, <CimStreamRequest>{ id, target, requestState, request, options });\r\n        return id;\r\n    }\r\n\r\n    /**\r\n     * Set PowerShell parameters to the options object.\r\n     *\r\n     * @param options The node request options.\r\n     * @param outputType The output data type.\r\n     * @param keys The key data.\r\n     * @param data The arguments data.\r\n     */\r\n    private setPowerShellParameters(\r\n            nodeName: string,\r\n            options: NodeRequestOptions,\r\n            cimOutput: NodeCimOutput,\r\n            keys?: any,\r\n            data?: any): void {\r\n        if (options == null || options.powerShell == null) {\r\n            return;\r\n        }\r\n\r\n        options.powerShellContext = {\r\n            cimOutput,\r\n            parameters: { ...(keys || {}), ...(data || {}) }\r\n        };\r\n\r\n        options.powerShellEndpoint = this.authorizationManager.getJeaEndpoint(nodeName);\r\n    }\r\n\r\n    private monitorCreateRequest<T>(\r\n        nodeName: string,\r\n        requestState: WebsocketStreamDataRequestState,\r\n        request: CimStreamRequestData,\r\n        format: CimResultFormat,\r\n        options?: CimStreamOptions): Observable<T> {\r\n        let monitored: (\r\n            nodeName: string,\r\n            requestState: WebsocketStreamDataRequestState,\r\n            request: CimStreamRequestData,\r\n            format: CimResultFormat,\r\n            options?: CimStreamOptions) => Observable<T> =\r\n                (nodeName1: string,\r\n                requestState1: WebsocketStreamDataRequestState,\r\n                request1: CimStreamRequestData,\r\n                format1: CimResultFormat,\r\n                options1?: CimStreamOptions) => this.createRequest(nodeName1, requestState1, request1, format1, options1);\r\n        for (const monitorSet of CimStream.monitorSets) {\r\n            monitored = this.monitor<T>(monitored, monitorSet);\r\n        }\r\n\r\n        return monitored(nodeName, requestState, request, format, options);\r\n    }\r\n\r\n    private monitor<T>(\r\n        target: (\r\n            nodeName: string,\r\n            requestState: WebsocketStreamDataRequestState,\r\n            request: CimStreamRequestData,\r\n            format: CimResultFormat,\r\n            options?: CimStreamOptions) => Observable<T>,\r\n        monitorSet: CimStreamMonitorSet<T>): (\r\n            nodeName: string,\r\n            requestState: WebsocketStreamDataRequestState,\r\n            request: CimStreamRequestData,\r\n            format: CimResultFormat,\r\n            options?: CimStreamOptions) => Observable<T> {\r\n\r\n        return function(\r\n            nodeName: string,\r\n            requestState: WebsocketStreamDataRequestState,\r\n            request: CimStreamRequestData,\r\n            format: CimResultFormat,\r\n            options?: CimStreamOptions): Observable<T> {\r\n            let context: CimStreamMonitorSetContext<any>;\r\n            return monitorSet.preMonitor(nodeName, requestState, request, format, options)\r\n                .pipe(\r\n                    switchMap(packet => {\r\n                        context = packet;\r\n                        return target(packet.nodeName, packet.requestState, packet.request, packet.format, packet.options);\r\n                    }),\r\n                    catchError((error: any) => monitorSet.errorMonitor(error, context)),\r\n                    switchMap(response => monitorSet.successMonitor(response, context))\r\n                );\r\n        };\r\n    }\r\n}\r\n"]}