Skip to content

Commit f6f4aa1

Browse files
committed
Adjustments to return types and popup state management
1 parent 20add31 commit f6f4aa1

File tree

1 file changed

+80
-33
lines changed

1 file changed

+80
-33
lines changed

src/index.ts

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { logMessage } from './Logger';
22
import { Popup, PopupConfiguration } from './Popup';
33
import {
44
AuthenticationConfig,
5-
BearerToken,
5+
Token,
66
computeAuthorizationUrl,
77
pollOauthSession,
88
retrieveAccessToken,
@@ -12,45 +12,86 @@ import {
1212

1313
const DOMAIN_WINDOW_DEFAULT_URL = 'https://dev.frontify.test/finder';
1414
const POPUP_DEFAULT_TITLE = 'Authorize Frontify';
15+
const POPUP_STATE = {
16+
open: false,
17+
retry: false
18+
}
19+
20+
let popup: Popup;
1521

1622
export async function authorize(
1723
configuration: AuthenticationConfig,
1824
popupConfiguration?: PopupConfiguration,
19-
): Promise<BearerToken> {
20-
const popUp = createPopUp(
21-
popupConfiguration ?? {
22-
width: 800,
23-
height: 600,
24-
top: 50,
25-
left: 50,
26-
title: POPUP_DEFAULT_TITLE,
27-
},
28-
);
25+
): Promise<Token | void | null>{
26+
let token = null;
2927

30-
if (!configuration.domain) {
31-
await awaitUserDomain(popUp).then(() => {
32-
let domainInput = popUp.getDomain();
28+
if (POPUP_STATE.open) {
29+
console.log('popup is already open!');
30+
return;
31+
}
3332

34-
if (domainInput) {
35-
configuration.domain = domainInput;
36-
}
33+
POPUP_STATE.open = true;
34+
35+
if (!POPUP_STATE.retry) {
36+
popup = createPopUp(
37+
popupConfiguration ?? {
38+
width: 800,
39+
height: 600,
40+
top: 50,
41+
left: 50,
42+
title: POPUP_DEFAULT_TITLE,
43+
},
44+
);
45+
}
46+
47+
if (!configuration.domain) {
48+
await openDomainPopUp(popup).then(() => {
49+
configuration.domain = popup.getDomain();
50+
POPUP_STATE.retry = false;
51+
token = authenticate(configuration, popup).catch(() => {
52+
delete(configuration.domain);
53+
POPUP_STATE.retry = true;
54+
authorize(configuration, popupConfiguration);
55+
});
56+
});
57+
} else {
58+
POPUP_STATE.retry = false;
59+
token = authenticate(configuration, popup).catch(() => {
60+
delete(configuration.domain);
61+
POPUP_STATE.retry = true;
62+
authorize(configuration, popupConfiguration);
3763
});
3864
}
3965

40-
const { authorizationUrl, codeVerifier, sessionId } = await computeAuthorizationUrl(configuration);
41-
await awaitUserAuthorization(authorizationUrl, popUp);
42-
const authorizationCode = await pollOauthSession(configuration, sessionId);
43-
return retrieveAccessToken(configuration, authorizationCode, codeVerifier);
66+
return token;
4467

4568
}
4669

47-
export async function refresh(config: AuthenticationConfig, bearerToken: BearerToken): Promise<BearerToken> {
48-
return await refreshToken(config, bearerToken.refreshToken);
70+
async function authenticate(configuration: AuthenticationConfig, popUp: Popup): Promise<Token> {
71+
try {
72+
const { authorizationUrl, codeVerifier, sessionId } = await computeAuthorizationUrl(configuration);
73+
await awaitUserAuthorization(authorizationUrl, popUp);
74+
const authorizationCode = await pollOauthSession(configuration, sessionId);
75+
return retrieveAccessToken(configuration, authorizationCode, codeVerifier);
76+
} catch (error) {
77+
const errorMessage = `Error generating session. Make sure the inserted domain ${configuration.domain} is a valid and secure Frontify instance`;
78+
delete(configuration.domain);
79+
popUp.popUp?.postMessage({domainError: errorMessage}, '*');
80+
logMessage('error', {
81+
code: 'ERR_AUTH_FAILED',
82+
message: errorMessage
83+
});
84+
throw new Error(errorMessage);
85+
}
86+
}
87+
88+
export async function refresh(token: Token): Promise<Token> {
89+
return await refreshToken(token.bearerToken.domain, token.bearerToken.refreshToken, token.clientId, token.scopes);
4990
}
5091

51-
export async function revoke(bearerToken: BearerToken): Promise<BearerToken> {
52-
await revokeToken(bearerToken.domain, bearerToken.accessToken)
53-
return bearerToken;
92+
export async function revoke(token: Token): Promise<Token> {
93+
await revokeToken(token.bearerToken.domain, token.bearerToken.accessToken)
94+
return token;
5495
}
5596

5697
async function awaitUserAuthorization(authorizationUrl: string, popUp: Popup) {
@@ -63,6 +104,7 @@ async function awaitUserAuthorization(authorizationUrl: string, popUp: Popup) {
63104

64105
return new Promise((resolve, reject) => {
65106
const timeout = setTimeout(() => {
107+
POPUP_STATE.open = false;
66108
popUp.close();
67109
reject();
68110
logMessage('error', {
@@ -72,6 +114,7 @@ async function awaitUserAuthorization(authorizationUrl: string, popUp: Popup) {
72114
}, 5 * 60 * 1000);
73115

74116
popUp.onSuccess(() => {
117+
POPUP_STATE.open = false;
75118
clearTimeout(timeout);
76119
popUp.close();
77120
resolve(null);
@@ -82,6 +125,7 @@ async function awaitUserAuthorization(authorizationUrl: string, popUp: Popup) {
82125
});
83126

84127
popUp.onCancelled(() => {
128+
POPUP_STATE.open = false;
85129
clearTimeout(timeout);
86130
popUp.close();
87131
reject();
@@ -93,16 +137,18 @@ async function awaitUserAuthorization(authorizationUrl: string, popUp: Popup) {
93137
});
94138
}
95139

96-
async function awaitUserDomain(popUp: Popup): Promise<void> {
97-
popUp.navigateToUrl(DOMAIN_WINDOW_DEFAULT_URL);
98-
99-
logMessage('warning', {
100-
code: 'WARN_DOMAIN_OPEN',
101-
message: 'Domain window opened!'
102-
});
140+
function openDomainPopUp(popUp: Popup): Promise<void> {
141+
if (!POPUP_STATE.retry) {
142+
popUp.navigateToUrl(DOMAIN_WINDOW_DEFAULT_URL);
143+
logMessage('warning', {
144+
code: 'WARN_DOMAIN_OPEN',
145+
message: 'Domain window opened!'
146+
});
147+
}
103148

104149
return new Promise((resolve, reject) => {
105150
const timeout = setTimeout(() => {
151+
POPUP_STATE.open = false;
106152
popUp.close();
107153
reject();
108154
logMessage('error', {
@@ -121,6 +167,7 @@ async function awaitUserDomain(popUp: Popup): Promise<void> {
121167
});
122168

123169
popUp.onAborted(() => {
170+
POPUP_STATE.open = false;
124171
clearTimeout(timeout);
125172
popUp.close();
126173
reject();

0 commit comments

Comments
 (0)