Skip to content

Commit edda475

Browse files
authored
vscode cursor ws and oauth support (#506)
* vscode cursor ws and oauth support * rebase axios update
1 parent 238ad3c commit edda475

6 files changed

+40
-9
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "swdc-vscode",
33
"displayName": "Code Time",
4-
"version": "2.8.0",
4+
"version": "2.8.1",
55
"publisher": "softwaredotcom",
66
"description": "Code Time is an open source plugin that provides programming metrics right in Visual Studio Code.",
77
"author": {

src/DataController.ts

+11
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,14 @@ import {
1212
import {initializeWebsockets} from './websockets';
1313
import {SummaryManager} from './managers/SummaryManager';
1414
import { updateFlowModeStatus } from './managers/FlowManager';
15+
import { AuthProvider } from './auth/AuthProvider';
1516

1617
let currentUser: any | null = null;
18+
let authProvider: AuthProvider | null = null;
19+
20+
export function initializeAuthProvider(provider: AuthProvider) {
21+
authProvider = provider;
22+
}
1723

1824
export async function getCachedSlackIntegrations() {
1925
currentUser = await getCachedUser();
@@ -66,6 +72,11 @@ export async function authenticationCompleteHandler(user: any, override_jwt: any
6672
setItem('name', user.email);
6773
setItem('updatedAt', new Date().getTime());
6874

75+
setItem('logging_in', false);
76+
// ensure the session is updated
77+
if (authProvider) {
78+
authProvider.updateSession(getItem('jwt'), user);
79+
}
6980
// update the login status
7081
showInformationMessage('Successfully logged on to Code Time');
7182

src/auth/AuthProvider.ts

+26-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "vscode";
66
import { v4 as uuid } from 'uuid';
77
import { app_url } from "../Constants";
8-
import { getAuthQueryObject, logIt } from "../Util";
8+
import { getAuthQueryObject, getBooleanItem, logIt, setItem } from "../Util";
99
import { authenticationCompleteHandler, getUser } from "../DataController";
1010

1111
export const AUTH_TYPE = 'codetime_auth';
@@ -33,7 +33,6 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
3333
private _pendingStates: string[] = [];
3434
private _codeExchangePromises = new Map<string, { promise: Promise<string>; cancel: EventEmitter<void> }>();
3535
private _uriHandler = new UriEventHandler();
36-
private _authenticating = false;
3736

3837
constructor(private readonly context: ExtensionContext) {
3938
this._disposable = Disposable.from(
@@ -68,7 +67,7 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
6867
return [];
6968
}
7069

71-
public async updateSession(jwtToken: string): Promise<AuthenticationSession> {
70+
public async updateSession(jwtToken: string, user: any = null): Promise<AuthenticationSession> {
7271
let session: AuthenticationSession = {
7372
id: uuid(),
7473
accessToken: jwtToken,
@@ -79,9 +78,11 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
7978
scopes: []
8079
}
8180
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+
}
8586

8687
session = {
8788
id: uuid(),
@@ -95,7 +96,11 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
9596

9697
await this.context.secrets.store(SESSIONS_KEY, JSON.stringify([session]))
9798

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+
}
99104
} catch (e: any) {
100105
if (e.message) {
101106
logIt(`Error creating session: ${e?.message}`);
@@ -153,6 +158,7 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
153158
title: "Signing in to Software.com...",
154159
cancellable: true
155160
}, async (_, token) => {
161+
setItem('logging_in', true);
156162
const stateId = uuid();
157163

158164
this._pendingStates.push(stateId);
@@ -175,13 +181,26 @@ export class AuthProvider implements AuthenticationProvider, Disposable {
175181
try {
176182
return await Promise.race([
177183
codeExchangePromise.promise,
184+
// 2 minute timeout
178185
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
179196
promiseFromEvent<any, any>(token.onCancellationRequested, (_, __, reject) => { reject('Login Cancelled'); }).promise
180197
]);
181198
} finally {
182199
this._pendingStates = this._pendingStates.filter(n => n !== stateId);
183200
codeExchangePromise?.cancel.fire();
184201
this._codeExchangePromises.delete(scopeString);
202+
// reset logging_in flag
203+
setItem('logging_in', false);
185204
}
186205
});
187206
}

src/extension.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// The module 'vscode' contains the VS Code extensibility API
44
// Import the module and reference it with the alias vscode in your code below
55
import {window, ExtensionContext, commands, authentication} from 'vscode';
6-
import {getUser} from './DataController';
6+
import {getUser, initializeAuthProvider} from './DataController';
77
import {onboardInit} from './user/OnboardManager';
88
import {
99
getVersion,
@@ -69,6 +69,7 @@ export async function activate(ctx: ExtensionContext) {
6969
const authProvider:AuthProvider = new AuthProvider(ctx);
7070
storageManager = LocalStorageManager.getInstance(ctx);
7171
initializeSession(storageManager);
72+
initializeAuthProvider(authProvider);
7273

7374
// add the code time commands
7475
ctx.subscriptions.push(createCommands(ctx, kpmController, storageManager));

swdc-vscode-2.8.0.vsix

125 Bytes
Binary file not shown.

swdc-vscode-2.8.1.vsix

588 KB
Binary file not shown.

0 commit comments

Comments
 (0)