Add OpenID token request flow to WidgetApi

As per MSC1960.
This commit is contained in:
Jason Robinson 2020-09-08 12:59:05 +03:00
parent 4b43e39d2a
commit c19336591e

View file

@ -65,6 +65,13 @@ export interface FromWidgetRequest extends WidgetRequest {
response: any; response: any;
} }
export interface OpenIDCredentials {
accessToken: string;
tokenType: string;
matrixServerName: string;
expiresIn: number;
}
/** /**
* Handles Element <--> Widget interactions for embedded/standalone widgets. * 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 inFlightRequests: { [requestId: string]: (reply: FromWidgetRequest) => void } = {};
private readyPromise: Promise<any>; private readyPromise: Promise<any>;
private readyPromiseResolve: () => void; 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). * 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 // Acknowledge that we're shut down now
this.replyToRequest(<ToWidgetRequest>payload, {}); this.replyToRequest(<ToWidgetRequest>payload, {});
}); });
} else if (payload.action === KnownWidgetActions.ReceiveOpenIDCredentials) {
// Save OpenID credentials
this.setOpenIDCredentials(<ToWidgetRequest>payload);
this.replyToRequest(<ToWidgetRequest>payload, {});
} else { } else {
console.warn(`[WidgetAPI] Got unexpected action: ${payload.action}`); 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> { public waitReady(): Promise<any> {
return this.readyPromise; return this.readyPromise;
} }