Skip to content

Commit bad28fd

Browse files
committed
Update process lifetime for connect
1 parent 2103664 commit bad28fd

File tree

3 files changed

+82
-51
lines changed

3 files changed

+82
-51
lines changed

packages/web-core/src/models/connect/connectProcess.ts

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,89 +6,111 @@ export class ConnectProcess {
66
readonly id: string;
77
readonly projectId: string;
88
readonly frontendApiUrl: string;
9-
readonly expiresAt: number;
109
readonly loginData: ConnectLoginInitData | null;
1110
readonly appendData: ConnectAppendInitData | null;
1211
readonly manageData: ConnectManageInitData | null;
1312

1413
constructor(
1514
id: string,
1615
projectId: string,
17-
expiresAt: number,
1816
frontendApiUrl: string,
1917
loginData: ConnectLoginInitData | null,
2018
appendData: ConnectAppendInitData | null,
2119
manageData: ConnectManageInitData | null,
2220
) {
2321
this.id = id;
2422
this.projectId = projectId;
25-
this.expiresAt = expiresAt;
2623
this.frontendApiUrl = frontendApiUrl;
2724
this.loginData = loginData;
2825
this.appendData = appendData;
2926
this.manageData = manageData;
3027
}
3128

3229
isValid(): boolean {
33-
return this.expiresAt > Date.now() / 1000 + 10;
30+
return true;
3431
}
3532

3633
resetLoginData(): ConnectProcess {
37-
return new ConnectProcess(
38-
this.id,
39-
this.projectId,
40-
this.expiresAt,
41-
this.frontendApiUrl,
42-
null,
43-
this.appendData,
44-
this.manageData,
45-
);
34+
return new ConnectProcess(this.id, this.projectId, this.frontendApiUrl, null, this.appendData, this.manageData);
4635
}
4736

48-
copyWithLoginData(loginData: ConnectLoginInitData, expiresAt: number): ConnectProcess {
37+
copyWithLoginData(loginData: ConnectLoginInitData): ConnectProcess {
4938
return new ConnectProcess(
5039
this.id,
5140
this.projectId,
52-
expiresAt,
5341
this.frontendApiUrl,
5442
loginData,
5543
this.appendData,
5644
this.manageData,
5745
);
5846
}
5947

60-
copyWithAppendData(appendData: ConnectAppendInitData, expiresAt: number): ConnectProcess {
48+
copyWithAppendData(appendData: ConnectAppendInitData): ConnectProcess {
6149
return new ConnectProcess(
6250
this.id,
6351
this.projectId,
64-
expiresAt,
6552
this.frontendApiUrl,
6653
this.loginData,
6754
appendData,
6855
this.manageData,
6956
);
7057
}
7158

72-
copyWithManageData(manageData: ConnectManageInitData, expiresAt: number): ConnectProcess {
59+
copyWithManageData(manageData: ConnectManageInitData): ConnectProcess {
7360
return new ConnectProcess(
7461
this.id,
7562
this.projectId,
76-
expiresAt,
7763
this.frontendApiUrl,
7864
this.loginData,
7965
this.appendData,
8066
manageData,
8167
);
8268
}
8369

70+
getValidLoginData(): ConnectLoginInitData | undefined {
71+
if (!this.loginData || !this.loginData.expiresAt) {
72+
return;
73+
}
74+
75+
if (this.loginData.expiresAt < Date.now()) {
76+
return;
77+
}
78+
79+
return this.loginData;
80+
}
81+
82+
getValidAppendData(): ConnectAppendInitData | undefined {
83+
if (!this.appendData || !this.appendData.expiresAt) {
84+
return;
85+
}
86+
87+
if (this.appendData.expiresAt < Date.now()) {
88+
return;
89+
}
90+
91+
return this.appendData;
92+
}
93+
94+
getValidManageData(): ConnectManageInitData | undefined {
95+
if (!this.manageData || !this.manageData.expiresAt) {
96+
return;
97+
}
98+
99+
if (this.manageData.expiresAt < Date.now()) {
100+
return;
101+
}
102+
103+
return this.manageData;
104+
}
105+
84106
static loadFromStorage(projectId: string): ConnectProcess | undefined {
85107
const serialized = localStorage.getItem(getStorageKey(projectId));
86108
if (!serialized) {
87109
return undefined;
88110
}
89111

90-
const { id, expiresAt, frontendApiUrl, loginData, appendData, manageData } = JSON.parse(serialized);
91-
const process = new ConnectProcess(id, projectId, expiresAt, frontendApiUrl, loginData, appendData, manageData);
112+
const { id, frontendApiUrl, loginData, appendData, manageData } = JSON.parse(serialized);
113+
const process = new ConnectProcess(id, projectId, frontendApiUrl, loginData, appendData, manageData);
92114
if (!process.isValid()) {
93115
return undefined;
94116
}
@@ -101,7 +123,6 @@ export class ConnectProcess {
101123
getStorageKey(this.projectId),
102124
JSON.stringify({
103125
id: this.id,
104-
expiresAt: this.expiresAt,
105126
frontendApiUrl: this.frontendApiUrl,
106127
loginData: this.loginData,
107128
appendData: this.appendData,

packages/web-core/src/models/connect/login.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ export type ConnectLoginInitData = {
44
loginAllowed: boolean;
55
conditionalUIChallenge: string | null;
66
flags: Record<string, string>;
7+
expiresAt?: number;
78
};
89

910
export interface ConnectAppendInitData {
1011
appendAllowed: boolean;
1112
flags: Record<string, string>;
13+
expiresAt?: number;
1214
}
1315

1416
export interface ConnectManageInitData {
1517
manageAllowed: boolean;
1618
flags: Record<string, string>;
19+
expiresAt?: number;
1720
}
1821

1922
export interface ConnectManageListData {

packages/web-core/src/services/ConnectService.ts

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import type {
2222
ConnectManageListRsp,
2323
} from '../api/v2';
2424
import { CorbadoConnectApi, PasskeyEventType } from '../api/v2';
25-
import type { AuthProcess } from '../models/authProcess';
2625
import { ConnectFlags } from '../models/connect/connectFlags';
2726
import { ConnectInvitation } from '../models/connect/connectInvitation';
2827
import { ConnectLastLogin } from '../models/connect/connectLastLogin';
@@ -93,7 +92,7 @@ export class ConnectService {
9392
return out;
9493
}
9594

96-
#setApisV2(process?: AuthProcess): void {
95+
#setApisV2(process?: ConnectProcess): void {
9796
let frontendApiUrl = this.#getDefaultFrontendApiUrl();
9897
if (process?.frontendApiUrl && process?.frontendApiUrl.length > 0) {
9998
frontendApiUrl = process.frontendApiUrl;
@@ -124,9 +123,11 @@ export class ConnectService {
124123

125124
async loginInit(abortController: AbortController): Promise<Result<ConnectLoginInitData, CorbadoError>> {
126125
const existingProcess = ConnectProcess.loadFromStorage(this.#projectId);
126+
const maybeLoginData = existingProcess?.getValidLoginData();
127127
if (
128-
existingProcess?.loginData &&
129-
!existingProcess?.loginData.loginAllowed &&
128+
existingProcess &&
129+
maybeLoginData &&
130+
!maybeLoginData.loginAllowed &&
130131
ConnectInvitation.loadFromStorage()?.token
131132
) {
132133
existingProcess.resetLoginData().persistToStorage();
@@ -135,8 +136,8 @@ export class ConnectService {
135136
this.#setApisV2(existingProcess);
136137

137138
// process has already been initialized
138-
if (existingProcess?.loginData) {
139-
return Ok(existingProcess.loginData);
139+
if (maybeLoginData) {
140+
return Ok(maybeLoginData);
140141
}
141142
}
142143

@@ -168,20 +169,24 @@ export class ConnectService {
168169
loginAllowed: res.val.loginAllowed,
169170
conditionalUIChallenge: res.val.conditionalUIChallenge ?? null,
170171
flags: flags.getItemsObject(),
172+
expiresAt: res.val.expiresAt,
171173
};
172174

173-
// update local state
174-
const newProcess = new ConnectProcess(
175-
res.val.token,
176-
this.#projectId,
177-
res.val.expiresAt,
178-
res.val.frontendApiUrl,
179-
loginData,
180-
null,
181-
null,
182-
);
183-
this.#setApisV2(newProcess);
184-
newProcess.persistToStorage();
175+
if (existingProcess && existingProcess.id === res.val.token) {
176+
const p = existingProcess.copyWithLoginData(loginData);
177+
p.persistToStorage();
178+
} else {
179+
const newProcess = new ConnectProcess(
180+
res.val.token,
181+
this.#projectId,
182+
res.val.frontendApiUrl,
183+
loginData,
184+
null,
185+
null,
186+
);
187+
this.#setApisV2(newProcess);
188+
newProcess.persistToStorage();
189+
}
185190

186191
// persist flags
187192
flags.persistToStorage(this.#projectId);
@@ -192,7 +197,7 @@ export class ConnectService {
192197
async #getExistingProcess(generator: () => Promise<Result<unknown, CorbadoError>>): Promise<ConnectProcess | null> {
193198
const existingProcess = ConnectProcess.loadFromStorage(this.#projectId);
194199
if (existingProcess) {
195-
log.debug('process found', existingProcess.expiresAt);
200+
log.debug('process found');
196201
return existingProcess;
197202
}
198203

@@ -287,8 +292,9 @@ export class ConnectService {
287292
this.#setApisV2(existingProcess);
288293

289294
// process has already been initialized
290-
if (existingProcess?.appendData) {
291-
return Ok(existingProcess.appendData);
295+
const maybeAppendData = existingProcess?.getValidAppendData();
296+
if (maybeAppendData) {
297+
return Ok(maybeAppendData);
292298
}
293299
}
294300

@@ -311,17 +317,17 @@ export class ConnectService {
311317
const appendData: ConnectAppendInitData = {
312318
appendAllowed: res.val.appendAllowed,
313319
flags: flags.getItemsObject(),
320+
expiresAt: res.val.expiresAt,
314321
};
315322

316323
// update local state with process
317-
if (existingProcess) {
318-
const p = existingProcess.copyWithAppendData(appendData, res.val.expiresAt);
324+
if (existingProcess && existingProcess.id === res.val.processID) {
325+
const p = existingProcess.copyWithAppendData(appendData);
319326
p.persistToStorage();
320327
} else {
321328
const newProcess = new ConnectProcess(
322329
res.val.processID,
323330
this.#projectId,
324-
res.val.expiresAt,
325331
res.val.frontendApiUrl,
326332
null,
327333
appendData,
@@ -435,8 +441,9 @@ export class ConnectService {
435441
this.#setApisV2(existingProcess);
436442

437443
// process has already been initialized
438-
if (existingProcess?.manageData) {
439-
return Ok(existingProcess.manageData);
444+
const maybeManageData = existingProcess?.getValidManageData();
445+
if (maybeManageData) {
446+
return Ok(maybeManageData);
440447
}
441448
}
442449

@@ -459,17 +466,17 @@ export class ConnectService {
459466
const manageData: ConnectManageInitData = {
460467
manageAllowed: res.val.manageAllowed,
461468
flags: flags.getItemsObject(),
469+
expiresAt: res.val.expiresAt,
462470
};
463471

464472
// update local state with process
465-
if (existingProcess) {
466-
const p = existingProcess.copyWithManageData(manageData, res.val.expiresAt);
473+
if (existingProcess && existingProcess.id === res.val.processID) {
474+
const p = existingProcess.copyWithManageData(manageData);
467475
p.persistToStorage();
468476
} else {
469477
const newProcess = new ConnectProcess(
470478
res.val.processID,
471479
this.#projectId,
472-
res.val.expiresAt,
473480
res.val.frontendApiUrl,
474481
null,
475482
null,

0 commit comments

Comments
 (0)