2626 RefreshToken: String;
2727 end;
2828
29+ Lock: TLock;
2930 IsSetup: Boolean;
3031 end;
3132
32-
3333procedure TWaspClient.Free();
3434begin
35- if not Self.IsSetup then Exit;
36- Async.ScheduleStop('WaspClient-RefreshToken');
3735 Self.IsSetup := False;
36+ Async.ScheduleStop('WaspClient-RefreshToken');
3837end;
3938
4039procedure TWaspClient.RefreshSession();
4140var
4241 payload, response: String;
4342 json: TJSONParser;
4443begin
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();
7377end;
7478
7579procedure TWaspClient.Setup();
7680begin
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);
108113end;
109114
110- procedure TWaspClient.SetSchema(schema: String = 'public');
115+ function TWaspClient.SetSchema(schema: String = 'public'): Boolean ;
111116begin
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;
122124end;
123125
124126function TWaspClient.CheckScriptAccess(): Boolean;
125127var
126128 url: String;
127129begin
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();
135138end;
136139
137140var
0 commit comments