Thenable -> Promise in OE Service (#11594)

* Thenable -> Promise in OE Service

* Remove more thens
This commit is contained in:
Charles Gagnon
2020-07-31 13:00:03 -07:00
committed by GitHub
parent 9c1168ba3b
commit 13008cc2b9
2 changed files with 99 additions and 129 deletions

View File

@@ -53,23 +53,23 @@ export interface IServerTreeView {
export interface IObjectExplorerService { export interface IObjectExplorerService {
_serviceBrand: undefined; _serviceBrand: undefined;
createNewSession(providerId: string, connection: ConnectionProfile): Thenable<azdata.ObjectExplorerSessionResponse>; createNewSession(providerId: string, connection: ConnectionProfile): Promise<azdata.ObjectExplorerSessionResponse>;
closeSession(providerId: string, session: azdata.ObjectExplorerSession): Thenable<azdata.ObjectExplorerCloseSessionResponse>; closeSession(providerId: string, session: azdata.ObjectExplorerSession): Promise<azdata.ObjectExplorerCloseSessionResponse>;
expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo>; expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo>;
refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo>; refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo>;
resolveTreeNodeChildren(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Thenable<TreeNode[]>; resolveTreeNodeChildren(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Promise<TreeNode[]>;
refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Thenable<TreeNode[]>; refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Promise<TreeNode[]>;
onSessionCreated(handle: number, sessionResponse: azdata.ObjectExplorerSession); onSessionCreated(handle: number, sessionResponse: azdata.ObjectExplorerSession): void;
onSessionDisconnected(handle: number, sessionResponse: azdata.ObjectExplorerSession); onSessionDisconnected(handle: number, sessionResponse: azdata.ObjectExplorerSession): void;
onNodeExpanded(sessionResponse: NodeExpandInfoWithProviderId); onNodeExpanded(sessionResponse: NodeExpandInfoWithProviderId): void;
/** /**
* Register a ObjectExplorer provider * Register a ObjectExplorer provider
@@ -96,18 +96,18 @@ export interface IObjectExplorerService {
getServerTreeView(): IServerTreeView; getServerTreeView(): IServerTreeView;
findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Thenable<azdata.NodeInfo[]>; findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Promise<azdata.NodeInfo[]>;
getActiveConnectionNodes(): TreeNode[]; getActiveConnectionNodes(): TreeNode[];
getTreeNode(connectionId: string, nodePath: string): Thenable<TreeNode>; getTreeNode(connectionId: string, nodePath: string): Promise<TreeNode>;
refreshNodeInView(connectionId: string, nodePath: string): Thenable<TreeNode>; refreshNodeInView(connectionId: string, nodePath: string): Promise<TreeNode>;
/** /**
* For Testing purpose only. Get the context menu actions for an object explorer node. * For Testing purpose only. Get the context menu actions for an object explorer node.
*/ */
getNodeActions(connectionId: string, nodePath: string): Thenable<string[]>; getNodeActions(connectionId: string, nodePath: string): Promise<string[]>;
getSessionConnectionProfile(sessionId: string): azdata.IConnectionProfile; getSessionConnectionProfile(sessionId: string): azdata.IConnectionProfile;
@@ -201,24 +201,20 @@ export class ObjectExplorerService implements IObjectExplorerService {
return this._onSelectionOrFocusChange.event; return this._onSelectionOrFocusChange.event;
} }
public updateObjectExplorerNodes(connection: IConnectionProfile): Promise<void> { public async updateObjectExplorerNodes(connection: IConnectionProfile): Promise<void> {
return this._connectionManagementService.addSavedPassword(connection).then(withPassword => { const withPassword = await this._connectionManagementService.addSavedPassword(connection);
let connectionProfile = ConnectionProfile.fromIConnectionProfile(this._capabilitiesService, withPassword); let connectionProfile = ConnectionProfile.fromIConnectionProfile(this._capabilitiesService, withPassword);
return this.updateNewObjectExplorerNode(connectionProfile); return this.updateNewObjectExplorerNode(connectionProfile);
});
} }
public deleteObjectExplorerNode(connection: IConnectionProfile): Promise<void> { public async deleteObjectExplorerNode(connection: IConnectionProfile): Promise<void> {
let self = this;
let connectionUri = connection.id; let connectionUri = connection.id;
let nodeTree = this._activeObjectExplorerNodes[connectionUri]; let nodeTree = this._activeObjectExplorerNodes[connectionUri];
if (nodeTree) { if (nodeTree) {
return self.closeSession(connection.providerName, nodeTree.getSession()).then(() => { await this.closeSession(connection.providerName, nodeTree.getSession());
delete self._activeObjectExplorerNodes[connectionUri]; delete this._activeObjectExplorerNodes[connectionUri];
delete self._sessions[nodeTree.getSession().sessionId]; delete this._sessions[nodeTree.getSession().sessionId];
});
} }
return Promise.resolve();
} }
/** /**
@@ -276,7 +272,7 @@ export class ObjectExplorerService implements IObjectExplorerService {
// Send on session created about the session to all node providers so they can prepare for node expansion // Send on session created about the session to all node providers so they can prepare for node expansion
let nodeProviders = this._nodeProviders[connection.providerName]; let nodeProviders = this._nodeProviders[connection.providerName];
if (nodeProviders) { if (nodeProviders) {
let promises: Thenable<boolean>[] = nodeProviders.map(p => p.handleSessionOpen(session)); const promises = nodeProviders.map(p => p.handleSessionOpen(session));
await Promise.all(promises); await Promise.all(promises);
} }
} catch (error) { } catch (error) {
@@ -293,7 +289,7 @@ export class ObjectExplorerService implements IObjectExplorerService {
/** /**
* Gets called when session is disconnected * Gets called when session is disconnected
*/ */
public onSessionDisconnected(handle: number, session: azdata.ObjectExplorerSession) { public onSessionDisconnected(handle: number, session: azdata.ObjectExplorerSession): void {
if (this._sessions[session.sessionId]) { if (this._sessions[session.sessionId]) {
let connection: ConnectionProfile = this._sessions[session.sessionId].connection; let connection: ConnectionProfile = this._sessions[session.sessionId].connection;
if (connection && this._connectionManagementService.isProfileConnected(connection)) { if (connection && this._connectionManagementService.isProfileConnected(connection)) {
@@ -321,22 +317,17 @@ export class ObjectExplorerService implements IObjectExplorerService {
this._onUpdateObjectExplorerNodes.fire(eventArgs); this._onUpdateObjectExplorerNodes.fire(eventArgs);
} }
private updateNewObjectExplorerNode(connection: ConnectionProfile): Promise<void> { private async updateNewObjectExplorerNode(connection: ConnectionProfile): Promise<void> {
let self = this; if (this._activeObjectExplorerNodes[connection.id]) {
return new Promise<void>((resolve, reject) => { this.sendUpdateNodeEvent(connection);
if (self._activeObjectExplorerNodes[connection.id]) { } else {
this.sendUpdateNodeEvent(connection); try {
resolve(); await this.createNewSession(connection.providerName, connection);
} else { } catch (err) {
// Create session will send the event or reject the promise this.sendUpdateNodeEvent(connection, err);
this.createNewSession(connection.providerName, connection).then(response => { throw err;
resolve();
}, error => {
this.sendUpdateNodeEvent(connection, error);
reject(error);
});
} }
}); }
} }
public getObjectExplorerNode(connection: IConnectionProfile): TreeNode { public getObjectExplorerNode(connection: IConnectionProfile): TreeNode {
@@ -344,46 +335,34 @@ export class ObjectExplorerService implements IObjectExplorerService {
} }
public async createNewSession(providerId: string, connection: ConnectionProfile): Promise<azdata.ObjectExplorerSessionResponse> { public async createNewSession(providerId: string, connection: ConnectionProfile): Promise<azdata.ObjectExplorerSessionResponse> {
let self = this; const provider = this._providers[providerId];
return new Promise<azdata.ObjectExplorerSessionResponse>((resolve, reject) => { if (provider) {
let provider = this._providers[providerId]; const result = await provider.createNewSession(connection.toConnectionInfo());
if (provider) { this._sessions[result.sessionId] = {
provider.createNewSession(connection.toConnectionInfo()).then(result => { connection: connection,
self._sessions[result.sessionId] = { nodes: {}
connection: connection, };
nodes: {} return result;
}; } else {
resolve(result); throw new Error(`Provider doesn't exist. id: ${providerId}`);
}, error => { }
reject(error);
});
} else {
reject(`Provider doesn't exist. id: ${providerId}`);
}
});
} }
public expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo> { public async expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo> {
return new Promise<azdata.ObjectExplorerExpandInfo>((resolve, reject) => { const provider = this._providers[providerId];
let provider = this._providers[providerId]; if (provider) {
if (provider) { this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.ObjectExplorerExpand)
this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.ObjectExplorerExpand) .withAdditionalProperties({
.withAdditionalProperties({ refresh: false,
refresh: false, provider: providerId
provider: providerId }).send();
}).send(); return await this.expandOrRefreshNode(providerId, session, nodePath);
this.expandOrRefreshNode(providerId, session, nodePath).then(result => { } else {
resolve(result); throw new Error(`Provider doesn't exist. id: ${providerId}`);
}, error => { }
reject(error);
});
} else {
reject(`Provider doesn't exist. id: ${providerId}`);
}
});
} }
private callExpandOrRefreshFromProvider(provider: azdata.ObjectExplorerProviderBase, nodeInfo: azdata.ExpandNodeInfo, refresh: boolean = false) { private async callExpandOrRefreshFromProvider(provider: azdata.ObjectExplorerProviderBase, nodeInfo: azdata.ExpandNodeInfo, refresh: boolean = false): Promise<boolean> {
if (refresh) { if (refresh) {
return provider.refreshNode(nodeInfo); return provider.refreshNode(nodeInfo);
} else { } else {
@@ -395,7 +374,7 @@ export class ObjectExplorerService implements IObjectExplorerService {
providerId: string, providerId: string,
session: azdata.ObjectExplorerSession, session: azdata.ObjectExplorerSession,
nodePath: string, nodePath: string,
refresh: boolean = false): Thenable<azdata.ObjectExplorerExpandInfo> { refresh: boolean = false): Promise<azdata.ObjectExplorerExpandInfo> {
let self = this; let self = this;
return new Promise<azdata.ObjectExplorerExpandInfo>((resolve, reject) => { return new Promise<azdata.ObjectExplorerExpandInfo>((resolve, reject) => {
if (session.sessionId in self._sessions && self._sessions[session.sessionId]) { if (session.sessionId in self._sessions && self._sessions[session.sessionId]) {
@@ -506,7 +485,7 @@ export class ObjectExplorerService implements IObjectExplorerService {
return finalResult; return finalResult;
} }
public refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo> { public refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo> {
let provider = this._providers[providerId]; let provider = this._providers[providerId];
if (provider) { if (provider) {
this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.ObjectExplorerExpand) this._telemetryService.createActionEvent(TelemetryKeys.TelemetryView.Shell, TelemetryKeys.ObjectExplorerExpand)
@@ -573,11 +552,11 @@ export class ObjectExplorerService implements IObjectExplorerService {
return this.expandOrRefreshTreeNode(session, parentTree, needsRefresh); return this.expandOrRefreshTreeNode(session, parentTree, needsRefresh);
} }
public refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Thenable<TreeNode[]> { public refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Promise<TreeNode[]> {
return this.expandOrRefreshTreeNode(session, parentTree, true); return this.expandOrRefreshTreeNode(session, parentTree, true);
} }
private callExpandOrRefreshFromService(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string, refresh: boolean = false): Thenable<azdata.ObjectExplorerExpandInfo> { private callExpandOrRefreshFromService(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string, refresh: boolean = false): Promise<azdata.ObjectExplorerExpandInfo> {
if (refresh) { if (refresh) {
return this.refreshNode(providerId, session, nodePath); return this.refreshNode(providerId, session, nodePath);
} else { } else {
@@ -585,26 +564,20 @@ export class ObjectExplorerService implements IObjectExplorerService {
} }
} }
private expandOrRefreshTreeNode( private async expandOrRefreshTreeNode(
session: azdata.ObjectExplorerSession, session: azdata.ObjectExplorerSession,
parentTree: TreeNode, parentTree: TreeNode,
refresh: boolean = false): Promise<TreeNode[]> { refresh: boolean = false): Promise<TreeNode[]> {
return new Promise<TreeNode[]>((resolve, reject) => { const expandResult = await this.callExpandOrRefreshFromService(parentTree.getConnectionProfile().providerName, session, parentTree.nodePath, refresh);
this.callExpandOrRefreshFromService(parentTree.getConnectionProfile().providerName, session, parentTree.nodePath, refresh).then(expandResult => { if (expandResult && expandResult.nodes) {
let children: TreeNode[] = []; const children = expandResult.nodes.map(node => {
if (expandResult && expandResult.nodes) { return this.toTreeNode(node, parentTree);
children = expandResult.nodes.map(node => {
return this.toTreeNode(node, parentTree);
});
parentTree.children = children.filter(c => c !== undefined);
resolve(children);
} else {
reject(expandResult && expandResult.errorMessage ? expandResult.errorMessage : 'Failed to expand node');
}
}, error => {
reject(error);
}); });
}); parentTree.children = children.filter(c => c !== undefined);
return children;
} else {
throw new Error(expandResult?.errorMessage ? expandResult.errorMessage : 'Failed to expand node');
}
} }
private toTreeNode(nodeInfo: azdata.NodeInfo, parent: TreeNode): TreeNode { private toTreeNode(nodeInfo: azdata.NodeInfo, parent: TreeNode): TreeNode {
@@ -679,22 +652,21 @@ export class ObjectExplorerService implements IObjectExplorerService {
return this._serverTreeView; return this._serverTreeView;
} }
public findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Thenable<azdata.NodeInfo[]> { public async findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Promise<azdata.NodeInfo[]> {
let rootNode = this._activeObjectExplorerNodes[connectionId]; let rootNode = this._activeObjectExplorerNodes[connectionId];
if (!rootNode) { if (!rootNode) {
return Promise.resolve([]); return [];
} }
let sessionId = rootNode.session.sessionId; let sessionId = rootNode.session.sessionId;
return this._providers[this._sessions[sessionId].connection.providerName].findNodes({ const response = await this._providers[this._sessions[sessionId].connection.providerName].findNodes({
type: type, type: type,
name: name, name: name,
schema: schema, schema: schema,
database: database, database: database,
parentObjectNames: parentObjectNames, parentObjectNames: parentObjectNames,
sessionId: sessionId sessionId: sessionId
}).then(response => {
return response.nodes;
}); });
return response.nodes;
} }
public getActiveConnectionNodes(): TreeNode[] { public getActiveConnectionNodes(): TreeNode[] {
@@ -704,11 +676,10 @@ export class ObjectExplorerService implements IObjectExplorerService {
/** /**
* For Testing purpose only. Get the context menu actions for an object explorer node * For Testing purpose only. Get the context menu actions for an object explorer node
*/ */
public getNodeActions(connectionId: string, nodePath: string): Thenable<string[]> { public async getNodeActions(connectionId: string, nodePath: string): Promise<string[]> {
return this.getTreeNode(connectionId, nodePath).then(node => { const node = await this.getTreeNode(connectionId, nodePath);
let actions = this._serverTreeView.treeActionProvider.getActions(this._serverTreeView.tree, this.getTreeItem(node)); let actions = this._serverTreeView.treeActionProvider.getActions(this._serverTreeView.tree, this.getTreeItem(node));
return actions.filter(action => action.label).map(action => action.label); return actions.filter(action => action.label).map(action => action.label);
});
} }
public async refreshNodeInView(connectionId: string, nodePath: string): Promise<TreeNode> { public async refreshNodeInView(connectionId: string, nodePath: string): Promise<TreeNode> {
@@ -791,14 +762,13 @@ export class ObjectExplorerService implements IObjectExplorerService {
return treeNode; return treeNode;
} }
private getUpdatedTreeNode(treeNode: TreeNode): Promise<TreeNode> { private async getUpdatedTreeNode(treeNode: TreeNode): Promise<TreeNode | undefined> {
return this.getTreeNode(treeNode.getConnectionProfile().id, treeNode.nodePath).then(treeNode => { const newTreeNode = await this.getTreeNode(treeNode.getConnectionProfile().id, treeNode.nodePath);
if (!treeNode) { if (!newTreeNode) {
// throw new Error(nls.localize('treeNodeNoLongerExists', "The given tree node no longer exists")); // throw new Error(nls.localize('treeNodeNoLongerExists', "The given tree node no longer exists"));
return undefined; return undefined;
} }
return treeNode; return newTreeNode;
});
} }
public async getTreeNode(connectionId: string, nodePath: string): Promise<TreeNode> { public async getTreeNode(connectionId: string, nodePath: string): Promise<TreeNode> {

View File

@@ -57,33 +57,33 @@ export class TestObjectExplorerService implements IObjectExplorerService {
public get onSelectionOrFocusChange(): Event<void> { return undefined; } public get onSelectionOrFocusChange(): Event<void> { return undefined; }
public updateObjectExplorerNodes(connection: IConnectionProfile): Promise<void> { return Promise.resolve(); } public async updateObjectExplorerNodes(connection: IConnectionProfile): Promise<void> { }
public deleteObjectExplorerNode(connection: IConnectionProfile): Promise<void> { return Promise.resolve(); } public async deleteObjectExplorerNode(connection: IConnectionProfile): Promise<void> { }
public onNodeExpanded(expandResponse: NodeExpandInfoWithProviderId) { } public onNodeExpanded(expandResponse: NodeExpandInfoWithProviderId): void { }
public onSessionCreated(handle: number, session: azdata.ObjectExplorerSession): void { } public onSessionCreated(handle: number, session: azdata.ObjectExplorerSession): void { }
public onSessionDisconnected(handle: number, session: azdata.ObjectExplorerSession) { } public async onSessionDisconnected(handle: number, session: azdata.ObjectExplorerSession): Promise<void> { }
public getObjectExplorerNode(connection: IConnectionProfile): TreeNode { return undefined; } public getObjectExplorerNode(connection: IConnectionProfile): TreeNode { return undefined; }
public async createNewSession(providerId: string, connection: ConnectionProfile): Promise<azdata.ObjectExplorerSessionResponse> { return undefined; } public async createNewSession(providerId: string, connection: ConnectionProfile): Promise<azdata.ObjectExplorerSessionResponse> { return undefined; }
public expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo> { return Promise.resolve(undefined); } public async expandNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo> { return undefined; }
public refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Thenable<azdata.ObjectExplorerExpandInfo> { return Promise.resolve(undefined); } public async refreshNode(providerId: string, session: azdata.ObjectExplorerSession, nodePath: string): Promise<azdata.ObjectExplorerExpandInfo> { return undefined; }
public closeSession(providerId: string, session: azdata.ObjectExplorerSession): Thenable<azdata.ObjectExplorerCloseSessionResponse> { return Promise.resolve(undefined); } public async closeSession(providerId: string, session: azdata.ObjectExplorerSession): Promise<azdata.ObjectExplorerCloseSessionResponse> { return undefined; }
public registerProvider(providerId: string, provider: azdata.ObjectExplorerProvider): void { } public registerProvider(providerId: string, provider: azdata.ObjectExplorerProvider): void { }
public registerNodeProvider(nodeProvider: azdata.ObjectExplorerNodeProvider): void { } public registerNodeProvider(nodeProvider: azdata.ObjectExplorerNodeProvider): void { }
public resolveTreeNodeChildren(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Thenable<TreeNode[]> { return Promise.resolve(undefined); } public async resolveTreeNodeChildren(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Promise<TreeNode[]> { return undefined; }
public refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Thenable<TreeNode[]> { return Promise.resolve(undefined); } public async refreshTreeNode(session: azdata.ObjectExplorerSession, parentTree: TreeNode): Promise<TreeNode[]> { return undefined; }
public registerServerTreeView(view: IServerTreeView): void { } public registerServerTreeView(view: IServerTreeView): void { }
@@ -93,15 +93,15 @@ export class TestObjectExplorerService implements IObjectExplorerService {
public getServerTreeView(): IServerTreeView { return undefined; } public getServerTreeView(): IServerTreeView { return undefined; }
public findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Thenable<azdata.NodeInfo[]> { return Promise.resolve(undefined); } public async findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames?: string[]): Promise<azdata.NodeInfo[]> { return undefined; }
public getActiveConnectionNodes(): TreeNode[] { return undefined; } public getActiveConnectionNodes(): TreeNode[] { return undefined; }
public getNodeActions(connectionId: string, nodePath: string): Thenable<string[]> { return Promise.resolve(undefined); } public async getNodeActions(connectionId: string, nodePath: string): Promise<string[]> { return undefined; }
public async refreshNodeInView(connectionId: string, nodePath: string): Promise<TreeNode> { return Promise.resolve(undefined); } public async refreshNodeInView(connectionId: string, nodePath: string): Promise<TreeNode> { return undefined; }
public getSessionConnectionProfile(sessionId: string): azdata.IConnectionProfile { return undefined; } public getSessionConnectionProfile(sessionId: string): azdata.IConnectionProfile { return undefined; }
public async getTreeNode(connectionId: string, nodePath: string): Promise<TreeNode> { return Promise.resolve(undefined); } public async getTreeNode(connectionId: string, nodePath: string): Promise<TreeNode> { return undefined; }
} }