UNPKG

@nevis-security/nevis-mobile-authentication-sdk-react

Version:

React Native plugin for Nevis Mobile Authentication SDK. Supports only mobile.

236 lines (234 loc) 10.9 kB
"use strict"; /** * Copyright © 2023-2024 Nevis Security AG. All rights reserved. */ import { NativeEventEmitter, NativeModules, Platform } from 'react-native'; import { UserInteractionPlatformOperation } from '../cache/operation/UserInteractionPlatformOperation'; import { PlatformOperationCache } from '../cache/PlatformOperationCache'; import { AuthenticatorExtension } from '../extensions/AuthenticatorExtension'; import { OnValidCredentialsProvidedMessage } from '../model/messages/in/OnValidCredentialsProvidedMessage'; import { PasswordChangerMessage } from '../model/messages/in/PasswordChangerMessage'; import { PasswordEnrollerMessage } from '../model/messages/in/PasswordEnrollerMessage'; import { PasswordValidationMessage } from '../model/messages/in/PasswordValidationMessage'; import { PinChangerMessage } from '../model/messages/in/PinChangerMessage'; import { PinEnrollerMessage } from '../model/messages/in/PinEnrollerMessage'; import { PinValidationMessage } from '../model/messages/in/PinValidationMessage'; import { SelectAccountMessage } from '../model/messages/in/SelectAccountMessage'; import { SelectAuthenticatorMessage } from '../model/messages/in/SelectAuthenticatorMessage'; import { VerifyUserMessage } from '../model/messages/in/VerifyUserMessage'; var EventType = /*#__PURE__*/function (EventType) { EventType["SelectAccount"] = "selectAccount"; EventType["SelectAuthenticator"] = "selectAuthenticator"; EventType["PinEnroll"] = "pinEnroll"; EventType["PasswordEnroll"] = "passwordEnroll"; EventType["PinChange"] = "pinChange"; EventType["PasswordChange"] = "passwordChange"; EventType["PinValidateForEnrollment"] = "pinValidateForEnrollment"; EventType["PasswordValidateForEnrollment"] = "passwordValidateForEnrollment"; EventType["PinValidateForPinChange"] = "pinValidateForPinChange"; EventType["PasswordValidateForPasswordChange"] = "passwordValidateForPasswordChange"; EventType["VerifyUser"] = "verifyUser"; EventType["OnValidCredentialsProvided"] = "onValidCredentialsProvided"; return EventType; }(EventType || {}); export class NativeEventListener { _ongoingOperations = new Set(); constructor() { this._eventEmitter = new NativeEventEmitter(NativeModules.RNEventEmitter); } static getInstance() { if (!NativeEventListener.instance) { NativeEventListener.instance = new NativeEventListener(); } return NativeEventListener.instance; } start(operationId) { this._ongoingOperations.add(operationId); this.startListeningForEvents(); } stop(operationId) { this._ongoingOperations.delete(operationId); if (this._ongoingOperations.size == 0) { this.stopListeningForEvents(); } } startListeningForEvents() { this.listenToSelectAccount(); this.listenToSelectAuthenticator(); this.listenToPinEnroll(); this.listenToPasswordEnroll(); this.listenToPinChange(); this.listenToPasswordChange(); this.listenToPinValidateForEnrollment(); this.listenToPasswordValidateForEnrollment(); this.listenToPinValidateForPinChange(); this.listenToPasswordValidateForPasswordChange(); this.listenToVerifyUser(); this.listenToOnValidCredentialsProvided(); } stopListeningForEvents() { this._selectAccount?.remove(); this._selectAccount = undefined; this._selectAuthenticator?.remove(); this._selectAuthenticator = undefined; this._pinEnroll?.remove(); this._pinEnroll = undefined; this._passwordEnroll?.remove(); this._passwordEnroll = undefined; this._pinChange?.remove(); this._pinChange = undefined; this._passwordChange?.remove(); this._passwordChange = undefined; this._pinValidateForEnrollment?.remove(); this._pinValidateForEnrollment = undefined; this._passwordValidateForEnrollment?.remove(); this._passwordValidateForEnrollment = undefined; this._pinValidateForPinChange?.remove(); this._pinValidateForPinChange = undefined; this._passwordValidateForPasswordChange?.remove(); this._passwordValidateForPasswordChange = undefined; this._verifyUser?.remove(); this._verifyUser = undefined; this._onValidCredentialsProvided?.remove(); this._onValidCredentialsProvided = undefined; } listenToSelectAccount() { if (this._selectAccount) { return; // Already listening } this._selectAccount = this._eventEmitter.addListener(EventType.SelectAccount, data => { const message = SelectAccountMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during account selection.'); operation.selectAccount(message.context); }); } listenToSelectAuthenticator() { if (this._selectAuthenticator) { return; // Already listening } this._selectAuthenticator = this._eventEmitter.addListener(EventType.SelectAuthenticator, data => { const message = SelectAuthenticatorMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during authenticator selection.'); operation.selectAuthenticator(message.context); }); } listenToPinEnroll() { if (this._pinEnroll) { return; // Already listening } this._pinEnroll = this._eventEmitter.addListener(EventType.PinEnroll, data => { const message = PinEnrollerMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during PIN enrollment.'); operation.enrollPin(message.context); }); } listenToPasswordEnroll() { if (this._passwordEnroll) { return; // Already listening } this._passwordEnroll = this._eventEmitter.addListener(EventType.PasswordEnroll, data => { const message = PasswordEnrollerMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during password enrollment.'); operation.enrollPassword(message.context); }); } listenToPinChange() { if (this._pinChange) { return; // Already listening } this._pinChange = this._eventEmitter.addListener(EventType.PinChange, data => { const message = PinChangerMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during PIN change.'); operation.changePin(message.context); }); } listenToPasswordChange() { if (this._passwordChange) { return; // Already listening } this._passwordChange = this._eventEmitter.addListener(EventType.PasswordChange, data => { const message = PasswordChangerMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during password change.'); operation.changePassword(message.context); }); } listenToPinValidateForEnrollment() { if (this._pinValidateForEnrollment) { return; // Already listening } this._pinValidateForEnrollment = this._eventEmitter.addListener(EventType.PinValidateForEnrollment, data => { const message = PinValidationMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during PIN validation for enrollment.'); operation.validatePinForEnrollment(message.pin); }); } listenToPasswordValidateForEnrollment() { if (this._passwordValidateForEnrollment) { return; // Already listening } this._passwordValidateForEnrollment = this._eventEmitter.addListener(EventType.PasswordValidateForEnrollment, data => { const message = PasswordValidationMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during password validation for enrollment.'); operation.validatePasswordForEnrollment(message.password); }); } listenToPinValidateForPinChange() { if (this._pinValidateForPinChange) { return; // Already listening } this._pinValidateForPinChange = this._eventEmitter.addListener(EventType.PinValidateForPinChange, data => { const message = PinValidationMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during PIN validation for PIN change.'); operation.validatePinForPinChange(message.pin); }); } listenToPasswordValidateForPasswordChange() { if (this._passwordValidateForPasswordChange) { return; // Already listening } this._passwordValidateForPasswordChange = this._eventEmitter.addListener(EventType.PasswordValidateForPasswordChange, data => { const message = PasswordValidationMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during password validation for password change.'); operation.validatePasswordForPasswordChange(message.password); }); } listenToVerifyUser() { if (this._verifyUser) { return; // Already listening } this._verifyUser = this._eventEmitter.addListener(EventType.VerifyUser, data => { const message = VerifyUserMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during user verification.'); const handler = AuthenticatorExtension.handlerByAuthenticator(message.context.authenticator.aaid, message.operationId); operation.userVerificationHandler = handler; PlatformOperationCache.getInstance().update(operation); (async () => { await operation.verifyUser(message.context, handler); })(); }); } listenToOnValidCredentialsProvided() { // listenToOnValidCredentialsProvided is only supported on an Android platform if (Platform.OS !== 'android') { return; } if (this._onValidCredentialsProvided) { return; // Already listening } this._onValidCredentialsProvided = this._eventEmitter.addListener(EventType.OnValidCredentialsProvided, data => { const message = OnValidCredentialsProvidedMessage.fromJson(data); const operation = this.getUserInteractionPlatformOperation(message.operationId, 'Operation not found during providing valid credentials.'); operation.userVerificationHandler = undefined; PlatformOperationCache.getInstance().update(operation); operation.onValidCredentialsProvided(message.authenticator); }); } getUserInteractionPlatformOperation(operationId, errorMessage) { const operation = PlatformOperationCache.getInstance().read(operationId); if (operation instanceof UserInteractionPlatformOperation) { return operation; } throw new Error(errorMessage); } } //# sourceMappingURL=NativeEventListener.js.map