提交 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) {
return loginService.manuallyProvideToken();
}));
vscode.authentication.registerAuthenticationProvider({
context.subscriptions.push(vscode.authentication.registerAuthenticationProvider({
id: 'github',
label: 'GitHub',
supportsMultipleAccounts: false,
......@@ -70,7 +70,7 @@ export async function activate(context: vscode.ExtensionContext) {
throw e;
}
}
});
}));
return;
}
......
......@@ -432,24 +432,46 @@ export class AuthenticationService extends Disposable implements IAuthentication
}
}
async getSessions(id: string): Promise<ReadonlyArray<AuthenticationSession>> {
await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(id));
private async tryActivateProvider(providerId: string): Promise<MainThreadAuthenticationProvider> {
await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(providerId));
let provider = this._authenticationProviders.get(providerId);
if (provider) {
return provider;
}
const authProvider = this._authenticationProviders.get(id);
if (authProvider) {
// When activate has completed, the extension has made the call to `registerAuthenticationProvider`.
// 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();
} else {
} catch (_) {
throw new Error(`No authentication provider '${id}' is currently registered.`);
}
}
async login(id: string, scopes: string[]): Promise<AuthenticationSession> {
await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(id));
const authProvider = this._authenticationProviders.get(id);
if (authProvider) {
return authProvider.login(scopes);
} else {
try {
const authProvider = this._authenticationProviders.get(id) || await this.tryActivateProvider(id);
return await authProvider.login(scopes);
} catch (_) {
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.
先完成此消息的编辑!
想要评论请 注册