packages/web-ide/src/AuthPortChannelController.ts (41 lines of code) (raw):

import type { Disposable } from '@gitlab/web-ide-types'; import type { PortChannel } from '@gitlab/cross-origin-channel'; import type { OAuthClient } from '@gitlab/oauth-client'; import { setupAutoRefresh } from '@gitlab/oauth-client'; interface AuthPortChannelControllerConstructorOptions { oauthClient: OAuthClient; authPort: PortChannel; } export class AuthPortChannelController implements Disposable { readonly #oauthClient: OAuthClient; readonly #authPort: PortChannel; readonly #disposable: Disposable; constructor({ oauthClient, authPort }: AuthPortChannelControllerConstructorOptions) { this.#oauthClient = oauthClient; this.#authPort = authPort; const tokenRequestDisposable = this.#authPort.addMessageListener( 'authentication-token-request', async () => { this.#authPort.postMessage({ key: 'authentication-token-response', params: { token: (await this.#oauthClient.getToken()).accessToken }, }); }, ); const disposeOnTokenChange = this.#oauthClient.onTokenChange(() => { this.#authPort.postMessage({ key: 'authentication-token-changed' }); }); const disposeAutoRefresh = setupAutoRefresh(this.#oauthClient); this.#disposable = { dispose: () => { tokenRequestDisposable.dispose(); disposeOnTokenChange(); disposeAutoRefresh(); }, }; this.#authPort.start(); } dispose() { this.#disposable.dispose(); } }