UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

212 lines (210 loc) 8.01 kB
import { from, Subject } from 'rxjs'; import { filter, map, mergeMap, take } from 'rxjs/operators'; import { Logging } from '../diagnostics/logging'; import { RpcSmeExtensionRequestType, RpcSmeExtensionResponseKey } from '../rpc/sme-extension/rpc-sme-extension-model'; import { RpcSmeExtensionRequestClient } from '../rpc/sme-extension/rpc-sme-extension-request-client'; /** * Sme Extension Module Side Service. */ export class SmeExtension { rpc; /** * Subject for tracking RPC responses from the extension host. */ watcher; /** * The source name to use when logging about this service. */ get logSourceName() { return 'Extensions'; } /** * Initializes a new instance of the Extension Manager class. * * @param rpc the rpc to forward auth requests to a parent window. */ constructor(rpc) { this.rpc = rpc; this.watcher = new Subject(); this.rpc.register(RpcSmeExtensionResponseKey.command, this.onRpcResponse.bind(this)); } /** * Get available extension request. * * @returns an observable for the response message from the extension host. */ getAvailableExtensions() { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.Available }; return this.handleRpcRequest(request); } /** * Get installed extension request. * * @returns an observable for the response message from the extension host. */ getInstalledExtensions() { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.Installed }; return this.handleRpcRequest(request); } /** * Get all extensions (available + installed) request. * * @returns an observable for the response message from the extension host. */ getAllExtensions() { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.All }; return this.handleRpcRequest(request); } /** * Install the extension. * * @param config the configuration. * @returns an observable for installed result of extension. */ installExtension(config) { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.InstallExtension, extensionConfiguration: config }; return this.handleRpcExtensionWriteRequest(request); } /** * Gets the update status of extensions. * * @returns An observable for update status of extension availability. */ getUpdateStatus() { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.UpdateStatus }; return this.handleRpcUpdateStatusRequest(request); } /** * Search the entry points that meet the search options. * * @param searchOptions the search options */ searchEntriesByCondition(searchOptions) { const request = { requestId: MsftSme.newGuid(), requestType: RpcSmeExtensionRequestType.SearchEntryPoints, extensionSearchOptions: searchOptions }; return this.handleRpcSearchEntryPointsRequest(request); } /** * Internal method handles rpc request. * * @param request the result object * @returns an observable for installed and available extensions. */ handleRpcRequest(request) { Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request))); return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request)) .pipe(mergeMap(() => this.watcher), filter((result) => result.requestId === request.requestId), take(1), map((result) => { if (result) { const extensionsResult = result; if (extensionsResult.error) { throw result.error; } return extensionsResult.extensions; } throw new Error('Unexpected Response from Extension RPC Request'); })); } /** * Handles the installation request of extension. * * @param request the request object. * @returns an observable for installed result. */ handleRpcExtensionWriteRequest(request) { Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request))); return from(RpcSmeExtensionRequestClient.installExtension(this.rpc, request)) .pipe(mergeMap(() => this.watcher), filter((result) => result.requestId === request.requestId), take(1), map((result) => { if (result) { const extensionsResult = result; if (extensionsResult.error) { throw extensionsResult.error; } return extensionsResult.extensions; } throw new Error('Unexpected Response from Extension RPC Request'); })); } /** * Handles rpc request of extension update status. * * @param request the result object * @returns an observable for update status of extension availability. */ handleRpcUpdateStatusRequest(request) { Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request))); return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request)) .pipe(mergeMap(() => this.watcher), filter(result => result.requestId === request.requestId), take(1), map(result => { if (result) { const statusResult = result; if (statusResult.error) { throw statusResult.error; } return statusResult.status; } throw new Error('Unexpected Response from Extension RPC Request'); })); } /** * Handles rpc request of extension search entry points. * * @param request the result object * @returns an observable for extension entries. */ handleRpcSearchEntryPointsRequest(request) { Logging.logDebug(this.logSourceName, 'Incoming RPC request: {0}'.format(JSON.stringify(request))); return from(RpcSmeExtensionRequestClient.getExtensionsRequest(this.rpc, request)) .pipe(mergeMap(() => this.watcher), filter(result => result.requestId === request.requestId), take(1), map(result => { if (!result || !result.findResult) { throw new Error('Unexpected Response from Extension RPC Request'); } const response = result; if (response.error) { throw new Error(response.error); } const entries = {}; const findResult = response.findResult; entries.conditionValidated = request.extensionSearchOptions.condition.validationRequired; entries.installed = !!findResult.installed; entries.upgradable = !!findResult.upgradable; entries.entryPoints = []; entries.entryPointsUpgradeable = undefined; if (findResult.found) { entries.entryPoints = findResult.entryPoints; if (findResult.upgradable && findResult.entryPointsUpgradeable) { entries.entryPointsUpgradeable = findResult.entryPointsUpgradeable; } } return entries; })); } /** * Handles rpc response messages from the extension host. * * @param data the result of the extension host request. * @returns the promise of RPC response. */ onRpcResponse(data) { this.watcher.next(data); return Promise.resolve(); } } //# sourceMappingURL=sme-extension.js.map