@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
212 lines (210 loc) • 8.01 kB
JavaScript
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