Skip to content

Commit d474593

Browse files
committed
refactor(davinci-app): replace legacy javascript-sdk with oidc-client
TokenManager.getTokens → oidcClient.token.exchange FRUser.logout → oidcClient.user.logout Config.setAsync removed (oidc-client manages its own config) This removes the last dependency on the legacy SDK from the davinci e2e app.
1 parent 8793d8c commit d474593

7 files changed

Lines changed: 147 additions & 48 deletions

File tree

e2e/davinci-app/main.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
*/
77
import './style.css';
88

9-
import { Config, FRUser, TokenManager } from '@forgerock/javascript-sdk';
109
import { davinci } from '@forgerock/davinci-client';
10+
import { oidc } from '@forgerock/oidc-client';
11+
import type { OidcConfig } from '@forgerock/oidc-client/types';
1112
import type {
1213
CustomLogger,
1314
DaVinciConfig,
@@ -85,6 +86,11 @@ const urlParams = new URLSearchParams(window.location.search);
8586

8687
(async () => {
8788
const davinciClient: DavinciClient = await davinci({ config, logger, requestMiddleware });
89+
const oidcResult = await oidc({ config: config as OidcConfig });
90+
if ('error' in oidcResult) {
91+
throw new Error(`Failed to initialize oidc client: ${oidcResult.error}`);
92+
}
93+
const oidcClient = oidcResult;
8894
const protectApi = protect({ envId: '02fb4743-189a-4bc7-9d6c-a919edfe6447' });
8995
const continueToken = urlParams.get('continueToken');
9096
const formEl = document.getElementById('form') as HTMLFormElement;
@@ -98,10 +104,6 @@ const urlParams = new URLSearchParams(window.location.search);
98104

99105
if (continueToken) {
100106
resumed = await davinciClient.resume({ continueToken });
101-
} else {
102-
// the current davinci-config has a slightly
103-
// different middleware type than the old legacy config
104-
await Config.setAsync(config as any);
105107
}
106108

107109
function renderComplete() {
@@ -140,25 +142,26 @@ const urlParams = new URLSearchParams(window.location.search);
140142

141143
const tokenBtn = document.getElementById('tokensButton') as HTMLButtonElement;
142144
tokenBtn.addEventListener('click', async () => {
143-
tokens = await TokenManager.getTokens({ query: { code, state } });
145+
tokens = await oidcClient.token.exchange(code, state);
144146

145147
console.log(tokens);
146148

149+
const accessTokenValue = tokens && 'accessToken' in tokens ? tokens.accessToken : '';
147150
const tokenPreEl = document.getElementById('accessTokenContainer') as HTMLPreElement;
148151
tokenPreEl.innerHTML = `
149152
<pre
150153
data-testid="access-token"
151154
id="accessTokenValue"
152155
style="display: block; max-width: 400px; text-wrap: wrap; overflow-wrap: anywhere;"
153-
>${tokens?.accessToken}</pre>
156+
>${accessTokenValue}</pre>
154157
`;
155158
});
156159

157160
const loginBtn = document.getElementById('logoutButton') as HTMLButtonElement;
158161
loginBtn.addEventListener('click', async () => {
159-
await FRUser.logout({ logoutRedirectUri: `${window.location.origin}/` });
162+
await oidcClient.user.logout();
160163

161-
//window.location.reload();
164+
window.location.reload();
162165
});
163166
}
164167

e2e/davinci-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"dependencies": {
1414
"@forgerock/davinci-client": "workspace:*",
15-
"@forgerock/javascript-sdk": "4.7.0",
15+
"@forgerock/oidc-client": "workspace:*",
1616
"@forgerock/protect": "workspace:*",
1717
"@forgerock/sdk-logger": "workspace:*"
1818
},

e2e/davinci-app/tsconfig.app.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
{
1919
"path": "../../packages/protect/tsconfig.lib.json"
2020
},
21+
{
22+
"path": "../../packages/oidc-client/tsconfig.lib.json"
23+
},
2124
{
2225
"path": "../../packages/davinci-client/tsconfig.lib.json"
2326
}

e2e/davinci-suites/src/basic.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,8 @@ test('Test happy paths on test page', async ({ page }) => {
4040
return true;
4141
}
4242
});
43-
const signoff = page.waitForResponse((response) => {
44-
if (response.url().includes('/signoff') && response.status() === 302) {
45-
return true;
46-
}
47-
});
4843
await logoutButton.click();
4944
await revokeCall;
50-
await signoff;
5145
await expect(page.getByText('Username/Password Form')).toBeVisible();
5246
});
5347
test('ensure query params passed to start are sent off in authorize call', async ({ page }) => {

packages/davinci-client/api-report/davinci-client.api.md

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ export interface CollectorErrors {
178178
}
179179

180180
// @public (undocumented)
181-
export type Collectors = FlowCollector | PasswordCollector | TextCollector | SingleSelectCollector | IdpCollector | SubmitCollector | ActionCollector<'ActionCollector'> | SingleValueCollector<'SingleValueCollector'> | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | ReadOnlyCollector | ValidatedTextCollector | ProtectCollector | PollingCollector | FidoRegistrationCollector | FidoAuthenticationCollector | QrCodeCollector | AgreementCollector | UnknownCollector;
181+
export type Collectors = FlowCollector | PasswordCollector | TextCollector | SingleSelectCollector | IdpCollector | SubmitCollector | ActionCollector<'ActionCollector'> | SingleValueCollector<'SingleValueCollector'> | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | PhoneNumberExtensionCollector | ReadOnlyCollector | ValidatedTextCollector | ProtectCollector | PollingCollector | FidoRegistrationCollector | FidoAuthenticationCollector | QrCodeCollector | AgreementCollector | UnknownCollector;
182182

183183
// @public
184184
export type CollectorValueType<T> = T extends {
@@ -212,7 +212,7 @@ export type CollectorValueType<T> = T extends {
212212
} ? string[] : string | string[] | PhoneNumberInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
213213

214214
// @public (undocumented)
215-
export type ComplexValueFields = DeviceAuthenticationField | DeviceRegistrationField | PhoneNumberField | FidoRegistrationField | FidoAuthenticationField | PollingField;
215+
export type ComplexValueFields = DeviceAuthenticationField | DeviceRegistrationField | PhoneNumberField | PhoneNumberExtensionField | FidoRegistrationField | FidoAuthenticationField | PollingField;
216216

217217
// @public (undocumented)
218218
export interface ContinueNode {
@@ -1035,7 +1035,7 @@ export type InferNoValueCollectorType<T extends NoValueCollectorTypes> = T exten
10351035
export type InferSingleValueCollectorType<T extends SingleValueCollectorTypes> = T extends 'TextCollector' ? TextCollector : T extends 'SingleSelectCollector' ? SingleSelectCollector : T extends 'ValidatedTextCollector' ? ValidatedTextCollector : T extends 'PasswordCollector' ? PasswordCollector : SingleValueCollectorWithValue<'SingleValueCollector'> | SingleValueCollectorNoValue<'SingleValueCollector'>;
10361036

10371037
// @public (undocumented)
1038-
export type InferValueObjectCollectorType<T extends ObjectValueCollectorTypes> = T extends 'DeviceAuthenticationCollector' ? DeviceAuthenticationCollector : T extends 'DeviceRegistrationCollector' ? DeviceRegistrationCollector : T extends 'PhoneNumberCollector' ? PhoneNumberCollector : ObjectOptionsCollectorWithObjectValue<'ObjectValueCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectValueCollector'>;
1038+
export type InferValueObjectCollectorType<T extends ObjectValueCollectorTypes> = T extends 'DeviceAuthenticationCollector' ? DeviceAuthenticationCollector : T extends 'DeviceRegistrationCollector' ? DeviceRegistrationCollector : T extends 'PhoneNumberCollector' ? PhoneNumberCollector : T extends 'PhoneNumberExtensionCollector' ? PhoneNumberExtensionCollector : ObjectOptionsCollectorWithObjectValue<'ObjectValueCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectValueCollector'>;
10391039

10401040
// @public (undocumented)
10411041
export type InitFlow = () => Promise<FlowNode | InternalErrorResponse>;
@@ -1170,8 +1170,8 @@ value: Record<string, unknown>;
11701170
}, string>;
11711171

11721172
// @public
1173-
export const nodeCollectorReducer: Reducer<(TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollectorBase | AgreementCollector | ReadOnlyCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[]> & {
1174-
getInitialState: () => (TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollectorBase | AgreementCollector | ReadOnlyCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[];
1173+
export const nodeCollectorReducer: Reducer<(TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | PhoneNumberExtensionCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollectorBase | AgreementCollector | ReadOnlyCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[]> & {
1174+
getInitialState: () => (TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | PhoneNumberExtensionCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollectorBase | AgreementCollector | ReadOnlyCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[];
11751175
};
11761176

11771177
// @public (undocumented)
@@ -1283,10 +1283,10 @@ export type ObjectValueAutoCollectorTypes = 'ObjectValueAutoCollector' | 'FidoRe
12831283
export type ObjectValueCollector<T extends ObjectValueCollectorTypes> = ObjectOptionsCollectorWithObjectValue<T> | ObjectOptionsCollectorWithStringValue<T> | ObjectValueCollectorWithObjectValue<T>;
12841284

12851285
// @public (undocumented)
1286-
export type ObjectValueCollectors = DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | ObjectOptionsCollectorWithObjectValue<'ObjectSelectCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectSelectCollector'>;
1286+
export type ObjectValueCollectors = DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | PhoneNumberExtensionCollector | ObjectOptionsCollectorWithObjectValue<'ObjectSelectCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectSelectCollector'>;
12871287

12881288
// @public
1289-
export type ObjectValueCollectorTypes = 'DeviceAuthenticationCollector' | 'DeviceRegistrationCollector' | 'PhoneNumberCollector' | 'ObjectOptionsCollector' | 'ObjectValueCollector' | 'ObjectSelectCollector';
1289+
export type ObjectValueCollectorTypes = 'DeviceAuthenticationCollector' | 'DeviceRegistrationCollector' | 'PhoneNumberCollector' | 'PhoneNumberExtensionCollector' | 'ObjectOptionsCollector' | 'ObjectValueCollector' | 'ObjectSelectCollector';
12901290

12911291
// @public (undocumented)
12921292
export interface ObjectValueCollectorWithObjectValue<T extends ObjectValueCollectorTypes, IV = Record<string, string>, OV = Record<string, string>> {
@@ -1328,13 +1328,68 @@ export type PasswordCollector = SingleValueCollectorNoValue<'PasswordCollector'>
13281328
// @public (undocumented)
13291329
export type PhoneNumberCollector = ObjectValueCollectorWithObjectValue<'PhoneNumberCollector', PhoneNumberInputValue, PhoneNumberOutputValue>;
13301330

1331+
// @public (undocumented)
1332+
export interface PhoneNumberExtensionCollector {
1333+
// (undocumented)
1334+
category: 'ObjectValueCollector';
1335+
// (undocumented)
1336+
error: string | null;
1337+
// (undocumented)
1338+
id: string;
1339+
// (undocumented)
1340+
input: {
1341+
key: string;
1342+
value: PhoneNumberExtensionInputValue;
1343+
type: string;
1344+
validation: (ValidationRequired | ValidationPhoneNumber)[] | null;
1345+
};
1346+
// (undocumented)
1347+
name: string;
1348+
// (undocumented)
1349+
output: {
1350+
key: string;
1351+
label: string;
1352+
type: string;
1353+
extensionLabel: string;
1354+
value: PhoneNumberExtensionOutputValue;
1355+
};
1356+
// (undocumented)
1357+
type: 'PhoneNumberExtensionCollector';
1358+
}
1359+
1360+
// @public (undocumented)
1361+
export type PhoneNumberExtensionField = PhoneNumberField & {
1362+
showExtension: boolean;
1363+
extensionLabel: string;
1364+
};
1365+
1366+
// @public (undocumented)
1367+
export interface PhoneNumberExtensionInputValue {
1368+
// (undocumented)
1369+
countryCode: string;
1370+
// (undocumented)
1371+
extension: string;
1372+
// (undocumented)
1373+
phoneNumber: string;
1374+
}
1375+
1376+
// @public (undocumented)
1377+
export interface PhoneNumberExtensionOutputValue {
1378+
// (undocumented)
1379+
countryCode?: string;
1380+
// (undocumented)
1381+
extension?: string;
1382+
// (undocumented)
1383+
phoneNumber?: string;
1384+
}
1385+
13311386
// @public (undocumented)
13321387
export type PhoneNumberField = {
13331388
type: 'PHONE_NUMBER';
13341389
key: string;
13351390
label: string;
1336-
defaultCountryCode: string | null;
13371391
required: boolean;
1392+
defaultCountryCode: string | null;
13381393
validatePhoneNumber: boolean;
13391394
};
13401395

@@ -1724,7 +1779,7 @@ export type UnknownField = Record<string, unknown>;
17241779
// @public (undocumented)
17251780
export const updateCollectorValues: ActionCreatorWithPayload< {
17261781
id: string;
1727-
value: string | string[] | PhoneNumberInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
1782+
value: string | string[] | PhoneNumberInputValue | PhoneNumberExtensionInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
17281783
index?: number;
17291784
}, string>;
17301785

0 commit comments

Comments
 (0)