message: Add OpenID token request flow to WidgetApi
  As per MSC1960.
diff: @@ -65,6 +65,13 @@ export interface FromWidgetRequest extends WidgetRequest {
  response: any;
  }
  +export interface OpenIDCredentials {
  + accessToken: string;
  + tokenType: string;
  + matrixServerName: string;
  + expiresIn: number;
  +}
  +
  /**
  * Handles Element <--> Widget interactions for embedded/standalone widgets.
  *
  @@ -78,6 +85,8 @@ export class WidgetApi extends EventEmitter {
  private inFlightRequests: { [requestId: string]: (reply: FromWidgetRequest) => void } = {};
  private readyPromise: Promise<any>;
  private readyPromiseResolve: () => void;
  + private openIDCredentialsCallback: () => void;
  + public openIDCredentials: OpenIDCredentials;
  /**
  * Set this to true if your widget is expecting a ready message from the client. False otherwise (default).
  @@ -121,6 +130,10 @@ export class WidgetApi extends EventEmitter {
  // Acknowledge that we're shut down now
  this.replyToRequest(<ToWidgetRequest>payload, {});
  });
  + } else if (payload.action === KnownWidgetActions.ReceiveOpenIDCredentials) {
  + // Save OpenID credentials
  + this.setOpenIDCredentials(<ToWidgetRequest>payload);
  + this.replyToRequest(<ToWidgetRequest>payload, {});
  } else {
  console.warn(`[WidgetAPI] Got unexpected action: ${payload.action}`);
  }
  @@ -135,6 +148,32 @@ export class WidgetApi extends EventEmitter {
  });
  }
  + public setOpenIDCredentials(value: WidgetRequest) {
  + const data = value.data;
  + if (data.state === 'allowed') {
  + this.openIDCredentials = {
  + accessToken: data.access_token,
  + tokenType: data.token_type,
  + matrixServerName: data.matrix_server_name,
  + expiresIn: data.expires_in,
  + }
  + } else if (data.state === 'blocked') {
  + this.openIDCredentials = null;
  + }
  + if (['allowed', 'blocked'].includes(data.state) && this.openIDCredentialsCallback) {
  + this.openIDCredentialsCallback()
  + }
  + }
  +
  + public requestOpenIDCredentials(credentialsResponseCallback: () => void) {
  + this.openIDCredentialsCallback = credentialsResponseCallback;
  + this.callAction(
  + KnownWidgetActions.GetOpenIDCredentials,
  + {},
  + this.setOpenIDCredentials,
  + );
  + }
  +
  public waitReady(): Promise<any> {
  return this.readyPromise;
  }
  