提交 8eb9cdab 编写于 作者: R Rachel Macfarlane

Fix #105955, make sure auth provider registration completes when getSession is called

上级 355fbca8
...@@ -22,7 +22,7 @@ export async function activate(context: vscode.ExtensionContext) { ...@@ -22,7 +22,7 @@ export async function activate(context: vscode.ExtensionContext) {
return loginService.manuallyProvideToken(); return loginService.manuallyProvideToken();
})); }));
vscode.authentication.registerAuthenticationProvider({ context.subscriptions.push(vscode.authentication.registerAuthenticationProvider({
id: 'github', id: 'github',
label: 'GitHub', label: 'GitHub',
supportsMultipleAccounts: false, supportsMultipleAccounts: false,
...@@ -70,7 +70,7 @@ export async function activate(context: vscode.ExtensionContext) { ...@@ -70,7 +70,7 @@ export async function activate(context: vscode.ExtensionContext) {
throw e; throw e;
} }
} }
}); }));
return; return;
} }
......
...@@ -432,24 +432,46 @@ export class AuthenticationService extends Disposable implements IAuthentication ...@@ -432,24 +432,46 @@ export class AuthenticationService extends Disposable implements IAuthentication
} }
} }
async getSessions(id: string): Promise<ReadonlyArray<AuthenticationSession>> { private async tryActivateProvider(providerId: string): Promise<MainThreadAuthenticationProvider> {
await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(id)); await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(providerId));
let provider = this._authenticationProviders.get(providerId);
if (provider) {
return provider;
}
const authProvider = this._authenticationProviders.get(id); // When activate has completed, the extension has made the call to `registerAuthenticationProvider`.
if (authProvider) { // However, activate cannot block on this, so the renderer may not have gotten the event yet.
const didRegister: Promise<MainThreadAuthenticationProvider> = new Promise((resolve, _) => {
this.onDidRegisterAuthenticationProvider(e => {
if (e.id === providerId) {
resolve(this._authenticationProviders.get(providerId));
}
});
});
const didTimeout: Promise<MainThreadAuthenticationProvider> = new Promise((_, reject) => {
setTimeout(() => {
reject();
}, 2000);
});
return Promise.race([didRegister, didTimeout]);
}
async getSessions(id: string): Promise<ReadonlyArray<AuthenticationSession>> {
try {
const authProvider = this._authenticationProviders.get(id) || await this.tryActivateProvider(id);
return await authProvider.getSessions(); return await authProvider.getSessions();
} else { } catch (_) {
throw new Error(`No authentication provider '${id}' is currently registered.`); throw new Error(`No authentication provider '${id}' is currently registered.`);
} }
} }
async login(id: string, scopes: string[]): Promise<AuthenticationSession> { async login(id: string, scopes: string[]): Promise<AuthenticationSession> {
await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(id)); try {
const authProvider = this._authenticationProviders.get(id) || await this.tryActivateProvider(id);
const authProvider = this._authenticationProviders.get(id); return await authProvider.login(scopes);
if (authProvider) { } catch (_) {
return authProvider.login(scopes);
} else {
throw new Error(`No authentication provider '${id}' is currently registered.`); throw new Error(`No authentication provider '${id}' is currently registered.`);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册