{"version":3,"sources":["../../../packages/core/data/sme-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAW,MAAM,MAAM,CAAC;AAGjD,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACH,qBAAqB,EACrB,4BAA4B,EAM5B,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EAC5B,MAAM,8CAA8C,CAAC;AAGtD;;GAEG;AACH,qBAAa,YAAY;IAkBT,OAAO,CAAC,GAAG;IAjBvB;;OAEG;IACH,OAAO,CAAC,OAAO,CAAsE;IAErF;;OAEG;IACH,OAAO,KAAK,aAAa,GAExB;IAED;;;;OAIG;gBACiB,GAAG,EAAE,GAAG;IAK5B;;;;OAIG;IACI,sBAAsB,IAAI,UAAU,CAAC,aAAa,CAAC;IAQ1D;;;;OAIG;IACI,sBAAsB,IAAI,UAAU,CAAC,aAAa,CAAC;IAQ1D;;;;OAIG;IACI,gBAAgB,IAAI,UAAU,CAAC,aAAa,CAAC;IAQpD;;;;;OAKG;IACI,gBAAgB,CAAC,MAAM,EAAE,4BAA4B,GAAG,UAAU,CAAC,aAAa,CAAC;IAUxF;;;;OAIG;IACI,eAAe,IAAI,UAAU,CAAC,qBAAqB,CAAC;IAS3D;;;;OAIG;IACI,wBAAwB,CAAC,aAAa,EAAE,yBAAyB,GAAG,UAAU,CAAC,mBAAmB,CAAC;IAU1G;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;OAKG;IACH,OAAO,CAAC,8BAA8B;IAqBtC;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAqBpC;;;;;OAKG;IACH,OAAO,CAAC,iCAAiC;IAmCzC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CAIxB","file":"sme-extension.d.ts","sourcesContent":["import { from, Observable, Subject } from 'rxjs';\r\nimport { filter, map, mergeMap, take } from 'rxjs/operators';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Rpc } from '../rpc/rpc';\r\nimport {\r\n    ExtensionUpdateStatus,\r\n    RpcSmeExtensionConfiguration,\r\n    RpcSmeExtensionRequest,\r\n    RpcSmeExtensionRequestResult,\r\n    RpcSmeExtensionRequestType,\r\n    RpcSmeExtensionResponseKey,\r\n    RpcSmeExtensionUpdateStatus,\r\n    SmeExtensionEntries,\r\n    SmeExtensions,\r\n    SmeExtensionSearchOptions\r\n} from '../rpc/sme-extension/rpc-sme-extension-model';\r\nimport { RpcSmeExtensionRequestClient } from '../rpc/sme-extension/rpc-sme-extension-request-client';\r\n\r\n/**\r\n * Sme Extension Module Side Service.\r\n */\r\nexport class SmeExtension {\r\n    /**\r\n     * Subject for tracking RPC responses from the extension host.\r\n     */\r\n    private watcher: Subject<RpcSmeExtensionRequestResult | RpcSmeExtensionUpdateStatus>;\r\n\r\n    /**\r\n     * The source name to use when logging about this service.\r\n     */\r\n    private get logSourceName() {\r\n        return 'Extensions';\r\n    }\r\n\r\n    /**\r\n     * Initializes a new instance of the Extension Manager class.\r\n     *\r\n     * @param rpc the rpc to forward auth requests to a parent window.\r\n     */\r\n    constructor(private rpc: Rpc) {\r\n        this.watcher = new Subject<RpcSmeExtensionRequestResult | RpcSmeExtensionUpdateStatus>();\r\n        this.rpc.register(RpcSmeExtensionResponseKey.command, this.onRpcResponse.bind(this));\r\n    }\r\n\r\n    /**\r\n     * Get available extension request.\r\n     *\r\n     * @returns an observable for the response message from the extension host.\r\n     */\r\n    public getAvailableExtensions(): Observable<SmeExtensions> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.Available\r\n        };\r\n        return this.handleRpcRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Get installed extension request.\r\n     *\r\n     * @returns an observable for the response message from the extension host.\r\n     */\r\n    public getInstalledExtensions(): Observable<SmeExtensions> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.Installed\r\n        };\r\n        return this.handleRpcRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Get all extensions (available + installed) request.\r\n     *\r\n     * @returns an observable for the response message from the extension host.\r\n     */\r\n    public getAllExtensions(): Observable<SmeExtensions> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.All\r\n        };\r\n        return this.handleRpcRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Install the extension.\r\n     *\r\n     * @param config the configuration.\r\n     * @returns an observable for installed result of extension.\r\n     */\r\n    public installExtension(config: RpcSmeExtensionConfiguration): Observable<SmeExtensions> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.InstallExtension,\r\n            extensionConfiguration: config\r\n        };\r\n\r\n        return this.handleRpcExtensionWriteRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Gets the update status of extensions.\r\n     *\r\n     * @returns An observable for update status of extension availability.\r\n     */\r\n    public getUpdateStatus(): Observable<ExtensionUpdateStatus> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.UpdateStatus\r\n        };\r\n\r\n        return this.handleRpcUpdateStatusRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Search the entry points that meet the search options.\r\n     *\r\n     * @param searchOptions the search options\r\n     */\r\n    public searchEntriesByCondition(searchOptions: SmeExtensionSearchOptions): Observable<SmeExtensionEntries> {\r\n        const request: RpcSmeExtensionRequest = {\r\n            requestId: MsftSme.newGuid(),\r\n            requestType: RpcSmeExtensionRequestType.SearchEntryPoints,\r\n            extensionSearchOptions: searchOptions\r\n        };\r\n\r\n        return this.handleRpcSearchEntryPointsRequest(request);\r\n    }\r\n\r\n    /**\r\n     * Internal method handles rpc request.\r\n     *\r\n     * @param request the result object\r\n     * @returns an observable for installed and available extensions.\r\n     */\r\n    private handleRpcRequest(request: RpcSmeExtensionRequest): Observable<SmeExtensions> {\r\n        Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request)));\r\n        return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request))\r\n            .pipe(\r\n                mergeMap(() => this.watcher),\r\n                filter((result) => result.requestId === request.requestId),\r\n                take(1),\r\n                map((result) => {\r\n                    if (result) {\r\n                        const extensionsResult = <RpcSmeExtensionRequestResult>result;\r\n                        if (extensionsResult.error) {\r\n                            throw result.error;\r\n                        }\r\n\r\n                        return extensionsResult.extensions;\r\n                    }\r\n\r\n                    throw new Error('Unexpected Response from Extension RPC Request');\r\n                }));\r\n    }\r\n\r\n    /**\r\n     * Handles the installation request of extension.\r\n     *\r\n     * @param request the request object.\r\n     * @returns an observable for installed result.\r\n     */\r\n    private handleRpcExtensionWriteRequest(request: RpcSmeExtensionRequest): Observable<SmeExtensions> {\r\n        Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request)));\r\n        return from(RpcSmeExtensionRequestClient.installExtension(this.rpc, request))\r\n            .pipe(\r\n                mergeMap(() => this.watcher),\r\n                filter((result) => result.requestId === request.requestId),\r\n                take(1),\r\n                map((result) => {\r\n                    if (result) {\r\n                        const extensionsResult = <RpcSmeExtensionRequestResult>result;\r\n                        if (extensionsResult.error) {\r\n                            throw extensionsResult.error;\r\n                        }\r\n\r\n                        return extensionsResult.extensions;\r\n                    }\r\n\r\n                    throw new Error('Unexpected Response from Extension RPC Request');\r\n                }));\r\n    }\r\n\r\n    /**\r\n     * Handles rpc request of extension update status.\r\n     *\r\n     * @param request the result object\r\n     * @returns an observable for update status of extension availability.\r\n     */\r\n    private handleRpcUpdateStatusRequest(request: RpcSmeExtensionRequest): Observable<ExtensionUpdateStatus> {\r\n        Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request)));\r\n        return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request))\r\n            .pipe(\r\n                mergeMap(() => this.watcher),\r\n                filter(result => result.requestId === request.requestId),\r\n                take(1),\r\n                map(result => {\r\n                    if (result) {\r\n                        const statusResult = <RpcSmeExtensionUpdateStatus>result;\r\n                        if (statusResult.error) {\r\n                            throw statusResult.error;\r\n                        }\r\n\r\n                        return statusResult.status;\r\n                    }\r\n\r\n                    throw new Error('Unexpected Response from Extension RPC Request');\r\n                }));\r\n    }\r\n\r\n    /**\r\n     * Handles rpc request of extension search entry points.\r\n     *\r\n     * @param request the result object\r\n     * @returns an observable for extension entries.\r\n     */\r\n    private handleRpcSearchEntryPointsRequest(request: RpcSmeExtensionRequest): Observable<SmeExtensionEntries> {\r\n        Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request)));\r\n        return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request))\r\n            .pipe(\r\n                mergeMap(() => this.watcher),\r\n                filter(result => result.requestId === request.requestId),\r\n                take(1),\r\n                map(result => {\r\n                    if (!result || !(<RpcSmeExtensionRequestResult>result).findResult) {\r\n                        throw new Error('Unexpected Response from Extension RPC Request');\r\n                    }\r\n\r\n                    const response = <RpcSmeExtensionRequestResult>result;\r\n                    if (response.error) {\r\n                        throw new Error(response.error);\r\n                    }\r\n\r\n                    const entries: SmeExtensionEntries = <SmeExtensionEntries>{};\r\n                    const findResult = response.findResult;\r\n                    entries.conditionValidated = request.extensionSearchOptions.condition.validationRequired;\r\n                    entries.installed = !!findResult.installed;\r\n                    entries.upgradable = !!findResult.upgradable;\r\n                    entries.entryPoints = [];\r\n                    entries.entryPointsUpgradeable = undefined;\r\n                    if (findResult.found) {\r\n                        entries.entryPoints = findResult.entryPoints;\r\n                        if (findResult.upgradable && findResult.entryPointsUpgradeable) {\r\n                            entries.entryPointsUpgradeable = findResult.entryPointsUpgradeable;\r\n                        }\r\n                    }\r\n\r\n                    return entries;\r\n                }));\r\n    }\r\n\r\n    /**\r\n     * Handles rpc response messages from the extension host.\r\n     *\r\n     * @param data the result of the extension host request.\r\n     * @returns the promise of RPC response.\r\n     */\r\n    private onRpcResponse(data: RpcSmeExtensionRequestResult): Promise<any> {\r\n        this.watcher.next(data);\r\n        return Promise.resolve();\r\n    }\r\n}\r\n"]}