5
5
} from "vscode" ;
6
6
import { v4 as uuid } from 'uuid' ;
7
7
import { app_url } from "../Constants" ;
8
- import { getAuthQueryObject , logIt } from "../Util" ;
8
+ import { getAuthQueryObject , getBooleanItem , logIt , setItem } from "../Util" ;
9
9
import { authenticationCompleteHandler , getUser } from "../DataController" ;
10
10
11
11
export const AUTH_TYPE = 'codetime_auth' ;
@@ -33,7 +33,6 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
33
33
private _pendingStates : string [ ] = [ ] ;
34
34
private _codeExchangePromises = new Map < string , { promise : Promise < string > ; cancel : EventEmitter < void > } > ( ) ;
35
35
private _uriHandler = new UriEventHandler ( ) ;
36
- private _authenticating = false ;
37
36
38
37
constructor ( private readonly context : ExtensionContext ) {
39
38
this . _disposable = Disposable . from (
@@ -68,7 +67,7 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
68
67
return [ ] ;
69
68
}
70
69
71
- public async updateSession ( jwtToken : string ) : Promise < AuthenticationSession > {
70
+ public async updateSession ( jwtToken : string , user : any = null ) : Promise < AuthenticationSession > {
72
71
let session : AuthenticationSession = {
73
72
id : uuid ( ) ,
74
73
accessToken : jwtToken ,
@@ -79,9 +78,11 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
79
78
scopes : [ ]
80
79
}
81
80
try {
82
- // const userinfo: { name: string, email: string } = await this.getUserInfo(token);
83
- const user = await getUser ( jwtToken ) ;
84
- await authenticationCompleteHandler ( user , jwtToken ) ;
81
+ const sessionUpdate = ! ! user
82
+ if ( ! user ) {
83
+ user = await getUser ( jwtToken ) ;
84
+ await authenticationCompleteHandler ( user , jwtToken ) ;
85
+ }
85
86
86
87
session = {
87
88
id : uuid ( ) ,
@@ -95,7 +96,11 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
95
96
96
97
await this . context . secrets . store ( SESSIONS_KEY , JSON . stringify ( [ session ] ) )
97
98
98
- this . _sessionChangeEmitter . fire ( { added : [ session ] , removed : [ ] , changed : [ ] } ) ;
99
+ if ( sessionUpdate ) {
100
+ this . _sessionChangeEmitter . fire ( { added : [ ] , removed : [ ] , changed : [ session ] } ) ;
101
+ } else {
102
+ this . _sessionChangeEmitter . fire ( { added : [ session ] , removed : [ ] , changed : [ ] } ) ;
103
+ }
99
104
} catch ( e : any ) {
100
105
if ( e . message ) {
101
106
logIt ( `Error creating session: ${ e ?. message } ` ) ;
@@ -153,6 +158,7 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
153
158
title : "Signing in to Software.com..." ,
154
159
cancellable : true
155
160
} , async ( _ , token ) => {
161
+ setItem ( 'logging_in' , true ) ;
156
162
const stateId = uuid ( ) ;
157
163
158
164
this . _pendingStates . push ( stateId ) ;
@@ -175,13 +181,26 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
175
181
try {
176
182
return await Promise . race ( [
177
183
codeExchangePromise . promise ,
184
+ // 2 minute timeout
178
185
new Promise < string > ( ( _ , reject ) => setTimeout ( ( ) => reject ( 'Cancelled' ) , 120000 ) ) ,
186
+ // websocket login check
187
+ new Promise < string > ( ( _ , reject ) => {
188
+ const interval = setInterval ( async ( ) => {
189
+ if ( getBooleanItem ( 'logging_in' ) === false ) {
190
+ clearInterval ( interval ) ;
191
+ reject ( 'Cancelled' ) ;
192
+ }
193
+ } , 1500 ) ;
194
+ } ) ,
195
+ // cancel button
179
196
promiseFromEvent < any , any > ( token . onCancellationRequested , ( _ , __ , reject ) => { reject ( 'Login Cancelled' ) ; } ) . promise
180
197
] ) ;
181
198
} finally {
182
199
this . _pendingStates = this . _pendingStates . filter ( n => n !== stateId ) ;
183
200
codeExchangePromise ?. cancel . fire ( ) ;
184
201
this . _codeExchangePromises . delete ( scopeString ) ;
202
+ // reset logging_in flag
203
+ setItem ( 'logging_in' , false ) ;
185
204
}
186
205
} ) ;
187
206
}
0 commit comments