@@ -2,7 +2,7 @@ import { logMessage } from './Logger';
22import { Popup , PopupConfiguration } from './Popup' ;
33import {
44 AuthenticationConfig ,
5- BearerToken ,
5+ Token ,
66 computeAuthorizationUrl ,
77 pollOauthSession ,
88 retrieveAccessToken ,
@@ -12,45 +12,86 @@ import {
1212
1313const DOMAIN_WINDOW_DEFAULT_URL = 'https://dev.frontify.test/finder' ;
1414const POPUP_DEFAULT_TITLE = 'Authorize Frontify' ;
15+ const POPUP_STATE = {
16+ open : false ,
17+ retry : false
18+ }
19+
20+ let popup : Popup ;
1521
1622export 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
5697async 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