{"version":3,"sources":["../../../packages/core/diagnostics/error-monitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA6B,MAAM,WAAW,CAAC;AAKjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yDAAyD,CAAC;AAE7F,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC;;GAEG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IAEtC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,+BAA+B,CAAkC;IACzE,OAAO,CAAC,+BAA+B,CAAkC;IACzE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,KAAK,CAAkD;IAE/D;;OAEG;IACH,WAAkB,OAAO,IAAI,YAAY,CAOxC;IAED;;;;OAIG;IACI,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAMtE;;OAEG;IACI,aAAa,IAAI,IAAI;IAK5B;;OAEG;IACI,IAAI,IAAI,IAAI;IAMnB;;;;OAIG;IACI,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IA6BlC;;;;OAIG;IACI,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAqBlD;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAmBnD;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,YAAY;CAWvB","file":"error-monitor.d.ts","sourcesContent":["import { of, throwError } from 'rxjs';\r\nimport { AjaxError, AjaxRequest, AjaxResponse } from 'rxjs/ajax';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { Http } from '../data/http';\r\nimport { Net } from '../data/net';\r\nimport { RpcObservableErrorMonitorClient } from '../rpc/error-monitor/rpc-observable-error-monitor-client';\r\nimport { ErrorMonitorRecord } from '../rpc/error-monitor/rpc-observable-error-monitor-model';\r\nimport { RpcObservableErrorMonitorServer } from '../rpc/error-monitor/rpc-observable-error-monitor-server';\r\nimport { Rpc } from '../rpc/rpc';\r\n\r\n/**\r\n * Error Monitor class.\r\n */\r\nexport class ErrorMonitor {\r\n    private static monitorName = 'ErrorMonitor';\r\n    private static instance: ErrorMonitor;\r\n\r\n    private rpc: Rpc;\r\n    private rpcObservableErrorMonitorClient: RpcObservableErrorMonitorClient;\r\n    private rpcObservableErrorMonitorServer: RpcObservableErrorMonitorServer;\r\n    private enabled = false;\r\n    private shellVersionChecked = false;\r\n    private check: (record: ErrorMonitorRecord) => void = () => {};\r\n\r\n    /**\r\n     * Gets the current ErrorMonitor instance.\r\n     */\r\n    public static get current(): ErrorMonitor {\r\n        if (ErrorMonitor.instance) {\r\n            return ErrorMonitor.instance;\r\n        }\r\n\r\n        ErrorMonitor.instance = new ErrorMonitor();\r\n        return ErrorMonitor.instance;\r\n    }\r\n\r\n    /**\r\n     * Start and register the check function on shell.\r\n     *\r\n     * @param check the check function.\r\n     */\r\n    public startOnShell(check: (record: ErrorMonitorRecord) => void): void {\r\n        this.enabled = true;\r\n        this.check = check;\r\n        this.updateMonitor();\r\n    }\r\n\r\n    /**\r\n     * Start error monitoring if it was stopped once.\r\n     */\r\n    public startOnModule(): void {\r\n        this.enabled = true;\r\n        this.updateMonitor();\r\n    }\r\n\r\n    /**\r\n     * Stop error monitoring if it's started. This works on both shell and module.\r\n     */\r\n    public stop(): void {\r\n        this.enabled = false;\r\n        this.check = () => {};\r\n        this.updateMonitor();\r\n    }\r\n\r\n    /**\r\n     * Register rpc and start error monitoring.\r\n     *\r\n     * @param rpc the rpc.\r\n     */\r\n    public registerRpc(rpc: Rpc): void {\r\n        if (!this.rpc) {\r\n            this.rpc = rpc;\r\n            if (MsftSme.isShell()) {\r\n                rpc.stateChanged\r\n                    .pipe(\r\n                        filter(active => active),\r\n                        take(1))\r\n                    .subscribe(() => {\r\n                        this.rpcObservableErrorMonitorServer = new RpcObservableErrorMonitorServer(rpc);\r\n                        this.rpcObservableErrorMonitorServer.register(\r\n                            request => {\r\n                                this.check(request);\r\n                                return of(null);\r\n                            });\r\n                    });\r\n            } else {\r\n                rpc.stateChanged\r\n                    .pipe(\r\n                        filter(active => active),\r\n                        take(1))\r\n                    .subscribe(() => this.rpcObservableErrorMonitorClient = new RpcObservableErrorMonitorClient(rpc));\r\n            }\r\n\r\n            this.enabled = true;\r\n            this.updateMonitor();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Report the error from the ajax error object.\r\n     *\r\n     * @param error the ajax error object.\r\n     */\r\n    public reportErrorFromAjax(error: AjaxError): void {\r\n        if (!error || !error.request || !error.request.url) {\r\n            return;\r\n        }\r\n\r\n        const forbidden = error.xhr && error.xhr.response && error.xhr.response.error && error.xhr.response.error.forbidden;\r\n        const statusCode = error.status;\r\n        const request = error.request;\r\n        const url = request.url;\r\n        const method = request.method;\r\n        const message = Net.getErrorMessage(error);\r\n        let code = null;\r\n        let action = null;\r\n        if (error && error.xhr && error.xhr.response && error.xhr.response.error) {\r\n            code = error.xhr.response.error.code || error.xhr.response.error.errorCode;\r\n            action = error.xhr.response.error.actionCode;\r\n        }\r\n\r\n        this.reportError({ httpError: { url, method, statusCode, message, code, action, forbidden } });\r\n    }\r\n\r\n    /**\r\n     * Report the error to shell.\r\n     *\r\n     * @param error the error monitor record.\r\n     */\r\n    public reportError(error: ErrorMonitorRecord): void {\r\n        if (!this.enabled) {\r\n            return;\r\n        }\r\n\r\n        const self = MsftSme.self();\r\n        const record: ErrorMonitorRecord = {\r\n            ...error,\r\n            ...{ sessionId: self.Init.sessionId, timestamp: Date.now(), moduleName: self.Init.moduleName }\r\n        };\r\n\r\n        if (this.rpc && this.rpc.stateActive && this.rpcObservableErrorMonitorClient) {\r\n            // send to shell.\r\n            this.rpcObservableErrorMonitorClient.report(record).subscribe();\r\n        } else {\r\n            this.check(record);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Update the monitoring state.\r\n     */\r\n    private updateMonitor(): void {\r\n        if (this.enabled) {\r\n            this.registerHttp();\r\n        } else {\r\n            Http.unregisterMonitors(ErrorMonitor.monitorName);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Register Http monitoring.\r\n     */\r\n    private registerHttp(): void {\r\n        Http.registerMonitorSet({\r\n            name: ErrorMonitor.monitorName,\r\n            preMonitor: (request: AjaxRequest) => of(request),\r\n            successMonitor: (response: AjaxResponse<any>) => of(response),\r\n            errorMonitor: (error: AjaxError) => {\r\n                this.reportErrorFromAjax(error);\r\n                return throwError(() => error);\r\n            }\r\n        });\r\n    }\r\n}\r\n"]}