Skip to content

Commit 8a68bfe

Browse files
committed
fix(WaspClient): Proper session refreshing
assuming you have a refresh token from wasp-launcher, your session should be properly refreshed every 5 mins now
1 parent 07ef7c7 commit 8a68bfe

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

utils/waspclient.simba

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,35 @@ type
2626
RefreshToken: String;
2727
end;
2828

29+
Lock: TLock;
2930
IsSetup: Boolean;
3031
end;
3132

32-
3333
procedure TWaspClient.Free();
3434
begin
35-
if not Self.IsSetup then Exit;
36-
Async.ScheduleStop('WaspClient-RefreshToken');
3735
Self.IsSetup := False;
36+
Async.ScheduleStop('WaspClient-RefreshToken');
3837
end;
3938

4039
procedure TWaspClient.RefreshSession();
4140
var
4241
payload, response: String;
4342
json: TJSONParser;
4443
begin
44+
if not Self.Lock.TryEnter() then Exit;
45+
if not Self.IsSetup then Exit;
46+
4547
payload := '{"refresh_token": "' + Self.User.RefreshToken + '"}';
4648

47-
WriteLn Self.Client = nil;
48-
WriteLn Self.Server + 'auth/v1/token?grant_type=refresh_token';
49-
WriteLn payload;
5049
response := Self.Client.Post(
5150
Self.Server + 'auth/v1/token?grant_type=refresh_token', payload
5251
);
5352

5453
if Self.Client.ResponseStatus <> EHTTPStatus.OK then
5554
begin
56-
Self.Free();
55+
WriteLn GetDebugLn('WaspClient', response);
56+
Self.IsSetup := False;
57+
Self.Lock.Leave();
5758
Exit;
5859
end;
5960

@@ -62,19 +63,21 @@ begin
6263

6364
Self.Client.RequestHeader['Authorization'] := 'Bearer ' + json.Item['access_token'].AsString;
6465
Self.User.RefreshToken := json.Item['refresh_token'].AsString;
66+
6567
{$IFDEF WASP_REFRESH_TOKEN}
6668
WriteLn GetDebugLn('WaspClient', 'Refresh token was refreshed: ' + Self.User.RefreshToken);
6769
{$ENDIF}
70+
6871
with json.Item['user'] do
6972
begin
7073
Self.User.ID := Item['id'].AsString;
7174
Self.User.Username := Item['user_metadata'].Item['custom_claims'].Item['global_name'].AsString;
7275
end;
76+
Self.Lock.Leave();
7377
end;
7478

7579
procedure TWaspClient.Setup();
7680
begin
77-
Exit;
7881
Self.Server := 'https://db.waspscripts.dev/';
7982
Self.APIKey := 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc1MTA0MTIwMCwiZXhwIjo0OTA2NzE0ODAwLCJyb2xlIjoiYW5vbiJ9.C_KW5x45BpIyOQrnZc7CKYKjHe0yxB4l-fTSC4z_kYY';
8083

@@ -102,36 +105,36 @@ begin
102105

103106
if Self.User.RefreshToken = '' then Exit;
104107

105-
Async.ScheduleEvery('WaspClient-RefreshToken', @Self.RefreshSession, 5 * ONE_MINUTE);
108+
Self.Lock := TLock.Create();
106109
Self.IsSetup := True;
110+
Async.ScheduleEvery('WaspClient-RefreshToken', @Self.RefreshSession, 5 * ONE_MINUTE);
107111
AddOnTerminate(@Self.Free);
112+
AddOnTerminate(@Self.Lock.Free);
108113
end;
109114

110-
procedure TWaspClient.SetSchema(schema: String = 'public');
115+
function TWaspClient.SetSchema(schema: String = 'public'): Boolean;
111116
begin
117+
if not Self.Lock.TryEnter() then Exit;
112118
if schema = 'public' then
113119
Self.Client.RequestHeader['Accept-Profile'] := ''
114120
else
115121
Self.Client.RequestHeader['Accept-Profile'] := schema;
116-
end;
117-
118-
procedure TWaspClient.WaitSetup();
119-
begin
120-
while Self.Client = nil do
121-
Sleep(50);
122+
Self.Lock.Leave();
123+
Result := True;
122124
end;
123125

124126
function TWaspClient.CheckScriptAccess(): Boolean;
125127
var
126128
url: String;
127129
begin
128-
if not Self.Script.ID.IsUUID() then
129-
Exit;
130+
if not Self.Lock.TryEnter() then Exit;
131+
if not Self.Script.ID.IsUUID() then Exit;
130132

131133
url := Self.Server + 'storage/v1/object/authenticated/scripts/' +
132134
Self.Script.ID + '/000000001/script.simba';
133135

134136
Result := Self.Client.Head(url) = EHTTPStatus.OK;
137+
Self.Lock.Leave();
135138
end;
136139

137140
var

0 commit comments

Comments
 (0)