UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

1 lines 38.5 kB
{"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"]}