Skip to content

Commit f7a5c17

Browse files
authored
Support v2 device experiments (#547)
1 parent 19921c5 commit f7a5c17

File tree

6 files changed

+26
-10
lines changed

6 files changed

+26
-10
lines changed

packages/connect-react/src/components/append/AppendAfterErrorScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const AppendAfterErrorScreen = ({ attestationOptions }: { attestationOptions: st
6363
void handleErrorSoft(situationCode, true, true, error);
6464
break;
6565
case AppendSituationCode.ClientExcludeCredentialsMatch:
66-
void handleCredentialExistsError(error);
66+
void handleCredentialExistsError(attestationOptions, error);
6767
break;
6868
case AppendSituationCode.ExplicitSkipByUser:
6969
void handleSkip(situationCode, true);

packages/connect-react/src/components/append/AppendInitScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ const AppendInitScreen = () => {
244244
setAppendLoading(false);
245245
break;
246246
case AppendSituationCode.ClientExcludeCredentialsMatch:
247-
void handleCredentialExistsError(error);
247+
void handleCredentialExistsError(attestationOptions, error);
248248
setAppendLoading(false);
249249
break;
250250
case AppendSituationCode.DeniedByPartialRollout:

packages/connect-react/src/components/passkeyList/PasskeyListScreen.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ const PasskeyListScreen = () => {
137137
}
138138

139139
if (res.val.type === ConnectErrorType.ExcludeCredentialsMatch) {
140-
return handleSituation(PasskeyListSituationCode.ClientExcludeCredentialsMatch, res.val);
140+
return handleSituation(
141+
PasskeyListSituationCode.ClientExcludeCredentialsMatch,
142+
res.val,
143+
startAppendRes.val.attestationOptions,
144+
);
141145
}
142146

143147
return handleSituation(PasskeyListSituationCode.CboApiNotAvailablePostAuthenticator, res.val);
@@ -171,15 +175,22 @@ const PasskeyListScreen = () => {
171175
statefulLoader.current.finish();
172176
};
173177

174-
const handleSituation = (situationCode: PasskeyListSituationCode, error?: ConnectError) => {
178+
const handleSituation = (
179+
situationCode: PasskeyListSituationCode,
180+
error?: ConnectError,
181+
attestationOptions?: string,
182+
) => {
175183
const messageCode = `situation: ${situationCode}`;
176184
log.debug(messageCode);
177185

178186
const message = getPasskeyListErrorMessage(situationCode);
179187
switch (situationCode) {
180188
case PasskeyListSituationCode.ClientExcludeCredentialsMatch:
181189
setAppendLoading(false);
182-
void getConnectService().recordEventAppendCredentialExistsError(`${messageCode} ${error?.track()}`);
190+
void getConnectService().recordEventAppendCredentialExistsError(
191+
attestationOptions ?? '',
192+
`${messageCode} ${error?.track()}`,
193+
);
183194
show(<AlreadyExistingModal hide={hide} />);
184195
break;
185196
case PasskeyListSituationCode.CboApiPasskeysNotSupportedLight:

packages/connect-react/src/contexts/AppendProcessContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface AppendProcessContextProps {
2222
error?: ConnectError,
2323
) => Promise<void>;
2424
handleErrorHard: (situation: AppendSituationCode, expected: boolean, error?: ConnectError) => Promise<void>;
25-
handleCredentialExistsError: (error?: ConnectError) => Promise<void>;
25+
handleCredentialExistsError: (attestationOptions: string, error?: ConnectError) => Promise<void>;
2626
handleSkip: (situation: AppendSituationCode, explicit?: boolean) => Promise<void>;
2727
onReadMoreClick: () => Promise<void>;
2828
flags: Flags | undefined;

packages/connect-react/src/contexts/AppendProcessProvider.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ export const AppendProcessProvider: FC<PropsWithChildren<Props>> = ({ children,
7474
}, [getConnectService, config]);
7575

7676
const handleCredentialExistsError = useCallback(
77-
async (error?: ConnectError) => {
77+
async (attestationOptions: string, error?: ConnectError) => {
7878
log.debug('error (credential-exists)');
7979

80-
await getConnectService().recordEventAppendCredentialExistsError(error?.track() ?? '');
80+
await getConnectService().recordEventAppendCredentialExistsError(error?.track() ?? '', attestationOptions);
8181
void config.onComplete('complete-noop', getConnectService().encodeClientState());
8282
},
8383
[getConnectService, config],

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,13 @@ export class ConnectService {
644644
return this.#recordEvent(PasskeyEventType.UserAppendAfterLoginErrorBlacklisted);
645645
}
646646

647-
recordEventAppendCredentialExistsError(messageCode: string) {
648-
return this.#recordEvent(PasskeyEventType.AppendCredentialExists, messageCode);
647+
recordEventAppendCredentialExistsError(messageCode: string, attestationOptions: string) {
648+
let challenge;
649+
if (attestationOptions) {
650+
challenge = WebAuthnService.challengeFromAttestationOptions(attestationOptions);
651+
}
652+
653+
return this.#recordEvent(PasskeyEventType.AppendCredentialExists, messageCode, challenge);
649654
}
650655

651656
recordEventAppendError() {

0 commit comments

Comments
 (0)