@bitblit/ratchet-warden-common 4.0.353-alpha → 4.0.355-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/lib/index.mjs +1 -1
  2. package/lib/types.d.ts +372 -0
  3. package/package.json +5 -5
  4. package/lib/build/ratchet-warden-common-info.d.ts +0 -5
  5. package/lib/client/provider/warden-client-abstract-recent-login-provider.d.ts +0 -13
  6. package/lib/client/provider/warden-client-current-logged-in-jwt-token-provider.d.ts +0 -3
  7. package/lib/client/provider/warden-client-local-storage-logged-in-user-provider.d.ts +0 -9
  8. package/lib/client/provider/warden-client-local-storage-recent-login-provider.d.ts +0 -8
  9. package/lib/client/provider/warden-client-recent-login-provider.d.ts +0 -10
  10. package/lib/client/provider/warden-client-transient-memory-logged-in-user-provider.d.ts +0 -8
  11. package/lib/client/provider/warden-client-transient-memory-recent-login-provider.d.ts +0 -7
  12. package/lib/client/provider/warden-command-exchange-provider.d.ts +0 -3
  13. package/lib/client/provider/warden-logged-in-user-provider.d.ts +0 -6
  14. package/lib/client/provider/warden-logged-in-user-wrapper.d.ts +0 -6
  15. package/lib/client/provider/warden-recent-login-descriptor.d.ts +0 -5
  16. package/lib/client/provider/warden-user-service-event-processing-provider.d.ts +0 -8
  17. package/lib/client/provider/warden-user-service-options.d.ts +0 -15
  18. package/lib/client/warden-client.d.ts +0 -32
  19. package/lib/client/warden-client.spec.d.ts +0 -1
  20. package/lib/client/warden-delegating-current-user-providing-user-service-event-processing-provider.d.ts +0 -17
  21. package/lib/client/warden-user-service.d.ts +0 -41
  22. package/lib/client/warden-user-service.spec.d.ts +0 -1
  23. package/lib/common/command/add-web-authn-registration-to-logged-in-user.d.ts +0 -6
  24. package/lib/common/command/create-account.d.ts +0 -7
  25. package/lib/common/command/remove-web-authn-registration.d.ts +0 -4
  26. package/lib/common/command/send-magic-link.d.ts +0 -12
  27. package/lib/common/command/warden-command-response.d.ts +0 -18
  28. package/lib/common/command/warden-command.d.ts +0 -20
  29. package/lib/common/command/warden-contact-lookup.d.ts +0 -5
  30. package/lib/common/command/warden-custom-template-descriptor.d.ts +0 -7
  31. package/lib/common/command/web-authn-object-wrapper.d.ts +0 -3
  32. package/lib/common/model/warden-contact-type.d.ts +0 -4
  33. package/lib/common/model/warden-contact.d.ts +0 -5
  34. package/lib/common/model/warden-customer-message-type.d.ts +0 -5
  35. package/lib/common/model/warden-entry-summary.d.ts +0 -8
  36. package/lib/common/model/warden-entry.d.ts +0 -11
  37. package/lib/common/model/warden-jwt-token.d.ts +0 -5
  38. package/lib/common/model/warden-login-request.d.ts +0 -10
  39. package/lib/common/model/warden-login-results.d.ts +0 -7
  40. package/lib/common/model/warden-store-registration-response-type.d.ts +0 -5
  41. package/lib/common/model/warden-store-registration-response.d.ts +0 -8
  42. package/lib/common/model/warden-team-role.d.ts +0 -4
  43. package/lib/common/model/warden-user-decoration.d.ts +0 -6
  44. package/lib/common/model/warden-web-authn-entry-summary.d.ts +0 -6
  45. package/lib/common/model/warden-web-authn-entry.d.ts +0 -12
  46. package/lib/common/model/warden-web-authn-transport-future-type.d.ts +0 -8
  47. package/lib/common/util/warden-utils.d.ts +0 -26
  48. package/lib/common/util/warden-utils.spec.d.ts +0 -1
  49. package/lib/index.d.ts +0 -42
  50. package/lib/index.mjs.map +0 -1
package/lib/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{RequireRatchet as e,ErrorRatchet as t,Logger as n,StringRatchet as r,JwtRatchet as o}from"@bitblit/ratchet-common";import{BehaviorSubject as s,timer as i}from"rxjs";import{startRegistration as a,startAuthentication as c}from"@simplewebauthn/browser";class l{constructor(){}static buildInformation(){return{version:"353",hash:"2c20656162db96c96be797b086872b1406c7d521",branch:"alpha-2024-05-12-16",tag:"alpha-2024-05-12-16",timeBuiltISO:"2024-05-12T23:05:35-0700",notes:"No notes"}}}class g{commandSender;jwtProvider;constructor(t,n){this.commandSender=t,this.jwtProvider=n,e.notNullOrUndefined(t,"commandSender"),e.notNullOrUndefined(n,"jwtProvider")}async exchangeCommand(e,n){const r=JSON.stringify(e),o=await this.commandSender.sendCommand(r,this.jwtProvider.fetchCurrentLoggedInJwtToken()),s=JSON.parse(o);return s?.error&&!n&&t.throwFormattedErr("%s",s.error),s}async createAccount(e,t,n,r){const o={createAccount:{contact:e,sendCode:t,label:n,tags:r}};return(await this.exchangeCommand(o)).createAccount}async sendMagicLinkRaw(e){if(e){const t={sendMagicLink:e};return(await this.exchangeCommand(t)).sendMagicLink}return n.warn("Skipping magic link command - none supplied"),!1}async sendMagicLinkByUserId(e,t,n,r){const o={contactLookup:{userId:e,contactType:n},landingUrl:t,meta:r};return this.sendMagicLinkRaw(o)}async sendMagicLink(e,t,n){const r={contact:e,landingUrl:t,meta:n};return this.sendMagicLinkRaw(r)}async generateWebAuthnAuthenticationChallengeForUserId(e){const t={generateWebAuthnAuthenticationChallengeForUserId:e},n=await this.exchangeCommand(t);return JSON.parse(n.generateWebAuthnAuthenticationChallengeForUserId.dataAsJson)}async generateWebAuthnRegistrationChallengeForLoggedInUser(){const e=await this.exchangeCommand({generateWebAuthnRegistrationChallengeForLoggedInUser:!0});return JSON.parse(e.generateWebAuthnRegistrationChallengeForLoggedInUser.dataAsJson)}async removeWebAuthnRegistration(e,t){const n={removeWebAuthnRegistration:{userId:e,credentialId:t}};return(await this.exchangeCommand(n)).removeWebAuthnRegistration}async removeWebAuthnRegistrationFromLoggedInUser(e){const t={removeWebAuthnRegistrationFromLoggedInUser:e};return(await this.exchangeCommand(t)).removeWebAuthnRegistrationFromLoggedInUser}async removeContactFromLoggedInUser(e){const t={removeContactFromLoggedInUser:e};return(await this.exchangeCommand(t)).removeContactFromLoggedInUser}async sendExpiringValidationToken(e){const t={sendExpiringValidationToken:e};return(await this.exchangeCommand(t)).sendExpiringValidationToken}async addContactToLoggedInUser(e){const t={addContactToLoggedInUser:e};return(await this.exchangeCommand(t)).addContactToLoggedInUser}async addWebAuthnRegistrationToLoggedInUser(e,t,n){const r={addWebAuthnRegistrationToLoggedInUser:{webAuthn:{dataAsJson:JSON.stringify(n)},applicationName:e,deviceLabel:t}};return(await this.exchangeCommand(r)).addWebAuthnRegistrationToLoggedInUser}async performLoginCmd(e){const t={performLogin:e};return(await this.exchangeCommand(t)).performLogin}async refreshJwtToken(e){let t=null;if(r.trimToNull(e))try{t=(await this.exchangeCommand({refreshJwtToken:e})).refreshJwtToken}catch(e){n.error("JwtRefresh Failed : %s",e)}return t}async executeExpiringTokenBasedLogin(e,t){let r=null;try{const n={contact:e,expiringToken:t};r=await this.performLoginCmd(n)}catch(e){n.error("ExpiringToken login Failed : %s",e)}return r}}var d,u,h,p;!function(e){e.TextCapablePhoneNumber="TextCapablePhoneNumber",e.EmailAddress="EmailAddress"}(d||(d={}));class m{constructor(){}static extractContactsOfType(e,t){let n=null;return e?.contactMethods&&(n=e.contactMethods.filter((e=>e.type===t)).map((e=>e.value))),n}static validLoginRequest(e){let t=!1;return e&&(r.trimToNull(e.userId)||m.validContact(e.contact))&&(r.trimToNull(e.expiringToken)||r.trimToNull(e.jwtTokenToRefresh)||e.webAuthn)&&(t=!0),t}static stringToWardenContact(e){let t=null;const r=m.stringToContactType(e);return r?t={type:r,value:e}:n.error("Failed to convert a string to a contact type",e),t}static teamRolesToRoles(e){return e?.length?e.map((e=>m.teamRoleToRoleString(e))):[]}static roleStringsToTeamRoles(e){return e?.length?e.map((e=>m.roleStringToTeamRole(e))):[]}static roleStringToTeamRole(e){let t=null;if(e&&e.indexOf("_/_")>=0){const n=e.split("_/_");t={team:n[0],role:n[1]}}return t}static teamRoleToRoleString(e){let t=null;return e?.role&&e?.team&&(t=e.team+"_/_"+e.role),t}static stringToContactType(e){let t=null;return r.trimToNull(e)&&(t=m.stringIsEmailAddress(e)?d.EmailAddress:null,t=!t&&m.stringIsPhoneNumber(e)?d.TextCapablePhoneNumber:t),t}static validContact(e){let t=!1;if(e?.type&&r.trimToNull(e?.value))switch(e.type){case d.EmailAddress:t=m.stringIsEmailAddress(e.value);break;case d.TextCapablePhoneNumber:t=m.stringIsPhoneNumber(e.value);break;default:t=!1}return t}static stringIsEmailAddress(e){return!!e.match(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)}static stringIsPhoneNumber(e){return!!e.match(/^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/im)}static stripWardenEntryToSummary(e){return e?{userId:e.userId,userLabel:e.userLabel,contactMethods:e.contactMethods,webAuthnAuthenticatorSummaries:(e.webAuthnAuthenticators||[]).map((e=>m.stripWardenWebAuthnEntryToSummary(e)))}:null}static stripWardenWebAuthnEntryToSummary(e){return e?{origin:e.origin,applicationName:e.applicationName,deviceLabel:e.deviceLabel,credentialIdBase64:e.credentialIdBase64}:null}static wrapperIsExpired(e){return e?.userObject?.exp&&e.expirationEpochSeconds<Date.now()/1e3}}class L{wrapped;serveExpiredCredentials;_currentUserSubject=new s(null);constructor(e,t=!1){this.wrapped=e,this.serveExpiredCredentials=t}fetchCurrentLoggedInJwtToken(){let e=this?._currentUserSubject?.getValue();return!this.serveExpiredCredentials&&e&&m.wrapperIsExpired(e)&&(n.info("Current wrapper in the subject is expired - autostripping"),this.currentUserSubject.next(null),e=null),e?.jwtToken}get currentUserSubject(){return this._currentUserSubject}onAutomaticLogout(){this.wrapped&&this.wrapped.onAutomaticLogout()}onAutomaticTokenRefresh(e){this?.wrapped?.onAutomaticTokenRefresh&&this.wrapped.onAutomaticTokenRefresh(e)}onLoginFailure(e){this?.wrapped?.onLoginFailure&&this.wrapped.onLoginFailure(e)}onLogout(){this?.wrapped?.onLogout&&this.wrapped.onLogout(),this.currentUserSubject.next(null)}onSuccessfulLogin(e){this?.wrapped?.onSuccessfulLogin&&this.wrapped.onSuccessfulLogin(e),this.currentUserSubject.next(e)}}class f{options;loggedInTimerSubscription;_autoRefreshEnabled=!1;constructor(e){this.options=e,n.info("Initializing user service");const t=this.options.loggedInUserProvider.fetchLoggedInUserWrapper();m.wrapperIsExpired(t)?(n.info("Stored token is expired, removing it"),this.options.loggedInUserProvider.logOutUser()):this.options.eventProcessor.onSuccessfulLogin(t);const r=this.options.loginCheckTimerPingSeconds||2.5;this.loggedInTimerSubscription=i(0,1e3*r).subscribe((e=>this.checkForAutoLogoutOrRefresh(e)))}cleanShutDown(){this.loggedInTimerSubscription&&this.loggedInTimerSubscription.unsubscribe()}get serviceOptions(){return this.options}async createAccount(e,t,n,o){const s=await this.options.wardenClient.createAccount(e,t,n,o);return this.options.recentLoginProvider&&r.trimToNull(s)&&this.options.recentLoginProvider.saveNewUser(s,n,e),s}async addContactToLoggedInUser(e){return this.options.wardenClient.addContactToLoggedInUser(e)}get autoRefreshEnabled(){return this._autoRefreshEnabled}set autoRefreshEnabled(e){if(e){if(!this.options.allowAutoRefresh)throw new Error("Cannot enable auto-refresh - this is disabled in the user service options");this._autoRefreshEnabled=!0}else this._autoRefreshEnabled=!1}async checkForAutoLogoutOrRefresh(e){n.debug("Checking for auto-logout or refresh : %s",e);const t=this.fetchLoggedInUserWrapper();if(t){const e=this.options.autoLoginHandlingThresholdSeconds||10;if(t.expirationEpochSeconds-Math.floor(Date.now()/1e3)<e)if(this.autoRefreshEnabled){n.info("Under threshold, initiating auto-refresh");const e=await this.refreshToken();this.options.eventProcessor.onAutomaticTokenRefresh(e)}else n.info("Under threshold, initiating auto-logout"),this.logout()}}logout(){this.options.loggedInUserProvider.logOutUser(),this.options.eventProcessor.onLogout()}fetchLoggedInUserWrapper(){let e=this.options.loggedInUserProvider.fetchLoggedInUserWrapper();return e&&m.wrapperIsExpired(e)&&(n.info("Token is expired - auto logout triggered"),this.logout(),e=null),e}loggedInUserHasRole(e){let t=!1;if(r.trimToNull(e)){const n=this.fetchLoggedInUserWrapper(),r=e.toLowerCase();t=n?.userObject?.roles&&!!n.userObject.roles.find((e=>e.toLowerCase()===r))}return t}isLoggedIn(){return!!this.fetchLoggedInUserWrapper()}fetchLoggedInUserJwtObject(){const e=this.fetchLoggedInUserWrapper();return e?e.userObject:null}fetchLoggedInUserJwtToken(){const e=this.fetchLoggedInUserWrapper();return e?e.jwtToken:null}fetchLoggedInUserObject(){const e=this.fetchLoggedInUserJwtObject();return e?e.user:null}fetchLoggedInUserExpirationEpochSeconds(){const e=this.fetchLoggedInUserJwtObject();return e?e.exp:null}fetchLoggedInUserRemainingSeconds(){const e=this.fetchLoggedInUserJwtObject();return e?e.exp-Math.floor(Date.now()/1e3):null}updateLoggedInUserFromTokenString(e){let t=null;if(r.trimToNull(e)){n.info("updateLoggedInUserFromTokenString : %s",e);const r=o.decodeTokenNoVerify(e);r?(t={userObject:r,jwtToken:e,expirationEpochSeconds:r.exp},this.options.loggedInUserProvider.setLoggedInUserWrapper(t),this.updateRecentLoginsFromWardenEntrySummary(r.loginData),this.options.eventProcessor.onSuccessfulLogin(t)):(n.warn("Failed to parse token %s - ignoring login and triggering failure"),this.options.eventProcessor.onLoginFailure("Could not parse token string"))}else n.info("Called updateLoggedInUserFromTokenString with empty string - logging out"),this.logout();return t}async refreshToken(){let e=null;const t=this.fetchLoggedInUserWrapper();if(t){const n=await this.options.wardenClient.refreshJwtToken(t.jwtToken);e=this.updateLoggedInUserFromTokenString(n)}else n.info("Could not refresh - no token available");return e}async sendExpiringCode(e){return this.options.wardenClient.sendExpiringValidationToken(e)}async processWardenLoginResults(e){let t=null;return e?(n.info("Warden: response : %j ",e),e.jwtToken?(n.info("Applying login"),t=this.updateLoggedInUserFromTokenString(e.jwtToken)):e.error?this.options.eventProcessor.onLoginFailure(e.error):(n.error("Response contained neither token nor error"),this.options.eventProcessor.onLoginFailure("Response contained neither token nor error"))):(n.error("Login call failed"),this.options.eventProcessor.onLoginFailure("Login call returned null")),t}updateRecentLoginsFromWardenEntrySummary(e){this.options.recentLoginProvider&&e?(n.info("UserService : Saving recent login %j",e),this.options.recentLoginProvider.saveRecentLogin(e)):n.info("Not saving recent login - no storage configured or no data passed")}updateRecentLoginsFromLoggedInUserWrapper(e){this.updateRecentLoginsFromWardenEntrySummary(e?.userObject?.loginData)}async executeWebAuthnBasedLogin(e){const t=await this.executeWebAuthnLoginToWardenLoginResults(e),n=await this.processWardenLoginResults(t);return this.updateRecentLoginsFromLoggedInUserWrapper(n),n}async removeWebAuthnRegistrationFromLoggedInUser(e){return await this.options.wardenClient.removeWebAuthnRegistrationFromLoggedInUser(e)}async removeContactFromLoggedInUser(e){return await this.options.wardenClient.removeContactFromLoggedInUser(e)}async executeValidationTokenBasedLogin(e,t,r){n.info("Warden: executeValidationTokenBasedLogin : %j : %s : %s",e,t,r);const o=await this.options.wardenClient.performLoginCmd({contact:e,expiringToken:t,createUserIfMissing:r}),s=await this.processWardenLoginResults(o);return this.updateRecentLoginsFromLoggedInUserWrapper(s),s}async saveCurrentDeviceAsWebAuthnForCurrentUser(){const e=await this.options.wardenClient.generateWebAuthnRegistrationChallengeForLoggedInUser(),t=await a(e),n=r.trimToEmpty(this.options?.deviceLabelGenerator?this.options.deviceLabelGenerator():this.defaultDeviceLabelGenerator()),o=await this.options.wardenClient.addWebAuthnRegistrationToLoggedInUser(this.options.applicationName,n,t);return this.updateRecentLoginsFromWardenEntrySummary(o),o}defaultDeviceLabelGenerator(){let e="";return navigator?(e=navigator.userAgentData&&navigator.userAgentData.brands&&navigator.userAgentData.brands[1]&&navigator.userAgentData.brands[1].brand?navigator.userAgentData.brands[1].brand:navigator.userAgent,navigator.platform&&(e+=" on "+navigator.platform)):e="Unknown device",e}async executeWebAuthnLoginToWardenLoginResults(e){let t=null;try{const r=await this.options.wardenClient.generateWebAuthnAuthenticationChallengeForUserId(e);n.info("Got login challenge : %s",r);const o=await c(r);n.info("Got creds: %j",o);const s={userId:e,webAuthn:o};t=await this.options.wardenClient.performLoginCmd(s)}catch(e){n.error("WebauthN Failed : %s",e)}return t}}class w{saveRecentLogin(e){if(e?.userId){n.info("Saving recent login : %j",e);let t=this.fetchCache();t=t.filter((t=>t.user.userId!==e.userId)),t.push({user:e,lastLoginEpochMS:Date.now()}),this.updateCache(t)}else n.warn("Cannot save recent login - no login provided : %s",e)}saveNewUser(e,t,o){r.trimToNull(e)&&m.validContact(o)?this.saveRecentLogin({userId:e,contactMethods:[o],webAuthnAuthenticatorSummaries:[],userLabel:t}):n.warn("Cannot save new user - invalid data : %s : %j",e,o)}removeUser(e){let t=this.fetchCache();t=t.filter((t=>t.user.userId!==e)),this.updateCache(t)}fetchAllLogins(){return Object.assign([],this.fetchCache())}clearAllLogins(){this.updateCache([])}}class b{localStorageKey;constructor(n){this.localStorageKey=n,e.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey,"localStorageKey"),localStorage||t.throwFormattedErr("Local storage not available on this platform")}fetchLoggedInUserWrapper(){const e=localStorage.getItem(this.localStorageKey);return r.trimToNull(e)?JSON.parse(e):null}logOutUser(){this.setLoggedInUserWrapper(null)}setLoggedInUserWrapper(e){e?localStorage.setItem(this.localStorageKey,JSON.stringify(e)):localStorage.removeItem(this.localStorageKey)}}class I extends w{localStorageKey;constructor(n){super(),this.localStorageKey=n,e.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey,"localStorageKey"),localStorage||t.throwFormattedErr("Local storage not available on this platform")}fetchCache(){const e=r.trimToNull(localStorage.getItem(r.trimToNull(this.localStorageKey)));return e?JSON.parse(e):[]}updateCache(e){const t=e?JSON.stringify(e):"[]";localStorage.setItem(r.trimToNull(this.localStorageKey),t)}}class C{wrapper;fetchLoggedInUserWrapper(){return this.wrapper}logOutUser(){this.wrapper=null}setLoggedInUserWrapper(e){this.wrapper=e}}class T extends w{_cache=[];fetchCache(){return this._cache}updateCache(e){this._cache=e}}!function(e){e.ExpiringCode="ExpiringCode",e.MagicLink="MagicLink",e.Custom="Custom"}(u||(u={})),function(e){e.Verified="Verified",e.Failed="Failed",e.Error="Error"}(h||(h={})),function(e){e.ble="ble",e.internal="internal",e.nfc="nfc",e.usb="usb",e.cable="cable",e.hybrid="hybrid"}(p||(p={}));export{l as RatchetWardenCommonInfo,g as WardenClient,w as WardenClientAbstractRecentLoginProvider,b as WardenClientLocalStorageLoggedInUserProvider,I as WardenClientLocalStorageRecentLoginProvider,C as WardenClientTransientMemoryLoggedInUserProvider,T as WardenClientTransientMemoryRecentLoginProvider,d as WardenContactType,u as WardenCustomerMessageType,L as WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider,h as WardenStoreRegistrationResponseType,f as WardenUserService,m as WardenUtils,p as WardenWebAuthnTransportFutureType};
1
+ import{RequireRatchet as e,ErrorRatchet as t,Logger as n,StringRatchet as r,JwtRatchet as o}from"@bitblit/ratchet-common";import{BehaviorSubject as s,timer as i}from"rxjs";import{startRegistration as a,startAuthentication as c}from"@simplewebauthn/browser";class l{constructor(){}static buildInformation(){return{version:"355",hash:"c2b3df5c6ecad573d661cbd4a241da9d002d184c",branch:"alpha-2024-05-13-2",tag:"alpha-2024-05-13-2",timeBuiltISO:"2024-05-13T10:52:10-0700",notes:"No notes"}}}class g{commandSender;jwtProvider;constructor(t,n){this.commandSender=t,this.jwtProvider=n,e.notNullOrUndefined(t,"commandSender"),e.notNullOrUndefined(n,"jwtProvider")}async exchangeCommand(e,n){const r=JSON.stringify(e),o=await this.commandSender.sendCommand(r,this.jwtProvider.fetchCurrentLoggedInJwtToken()),s=JSON.parse(o);return s?.error&&!n&&t.throwFormattedErr("%s",s.error),s}async createAccount(e,t,n,r){const o={createAccount:{contact:e,sendCode:t,label:n,tags:r}};return(await this.exchangeCommand(o)).createAccount}async sendMagicLinkRaw(e){if(e){const t={sendMagicLink:e};return(await this.exchangeCommand(t)).sendMagicLink}return n.warn("Skipping magic link command - none supplied"),!1}async sendMagicLinkByUserId(e,t,n,r){const o={contactLookup:{userId:e,contactType:n},landingUrl:t,meta:r};return this.sendMagicLinkRaw(o)}async sendMagicLink(e,t,n){const r={contact:e,landingUrl:t,meta:n};return this.sendMagicLinkRaw(r)}async generateWebAuthnAuthenticationChallengeForUserId(e){const t={generateWebAuthnAuthenticationChallengeForUserId:e},n=await this.exchangeCommand(t);return JSON.parse(n.generateWebAuthnAuthenticationChallengeForUserId.dataAsJson)}async generateWebAuthnRegistrationChallengeForLoggedInUser(){const e=await this.exchangeCommand({generateWebAuthnRegistrationChallengeForLoggedInUser:!0});return JSON.parse(e.generateWebAuthnRegistrationChallengeForLoggedInUser.dataAsJson)}async removeWebAuthnRegistration(e,t){const n={removeWebAuthnRegistration:{userId:e,credentialId:t}};return(await this.exchangeCommand(n)).removeWebAuthnRegistration}async removeWebAuthnRegistrationFromLoggedInUser(e){const t={removeWebAuthnRegistrationFromLoggedInUser:e};return(await this.exchangeCommand(t)).removeWebAuthnRegistrationFromLoggedInUser}async removeContactFromLoggedInUser(e){const t={removeContactFromLoggedInUser:e};return(await this.exchangeCommand(t)).removeContactFromLoggedInUser}async sendExpiringValidationToken(e){const t={sendExpiringValidationToken:e};return(await this.exchangeCommand(t)).sendExpiringValidationToken}async addContactToLoggedInUser(e){const t={addContactToLoggedInUser:e};return(await this.exchangeCommand(t)).addContactToLoggedInUser}async addWebAuthnRegistrationToLoggedInUser(e,t,n){const r={addWebAuthnRegistrationToLoggedInUser:{webAuthn:{dataAsJson:JSON.stringify(n)},applicationName:e,deviceLabel:t}};return(await this.exchangeCommand(r)).addWebAuthnRegistrationToLoggedInUser}async performLoginCmd(e){const t={performLogin:e};return(await this.exchangeCommand(t)).performLogin}async refreshJwtToken(e){let t=null;if(r.trimToNull(e))try{t=(await this.exchangeCommand({refreshJwtToken:e})).refreshJwtToken}catch(e){n.error("JwtRefresh Failed : %s",e)}return t}async executeExpiringTokenBasedLogin(e,t){let r=null;try{const n={contact:e,expiringToken:t};r=await this.performLoginCmd(n)}catch(e){n.error("ExpiringToken login Failed : %s",e)}return r}}var d,u,h,p;!function(e){e.TextCapablePhoneNumber="TextCapablePhoneNumber",e.EmailAddress="EmailAddress"}(d||(d={}));class m{constructor(){}static extractContactsOfType(e,t){let n=null;return e?.contactMethods&&(n=e.contactMethods.filter((e=>e.type===t)).map((e=>e.value))),n}static validLoginRequest(e){let t=!1;return e&&(r.trimToNull(e.userId)||m.validContact(e.contact))&&(r.trimToNull(e.expiringToken)||r.trimToNull(e.jwtTokenToRefresh)||e.webAuthn)&&(t=!0),t}static stringToWardenContact(e){let t=null;const r=m.stringToContactType(e);return r?t={type:r,value:e}:n.error("Failed to convert a string to a contact type",e),t}static teamRolesToRoles(e){return e?.length?e.map((e=>m.teamRoleToRoleString(e))):[]}static roleStringsToTeamRoles(e){return e?.length?e.map((e=>m.roleStringToTeamRole(e))):[]}static roleStringToTeamRole(e){let t=null;if(e&&e.indexOf("_/_")>=0){const n=e.split("_/_");t={team:n[0],role:n[1]}}return t}static teamRoleToRoleString(e){let t=null;return e?.role&&e?.team&&(t=e.team+"_/_"+e.role),t}static stringToContactType(e){let t=null;return r.trimToNull(e)&&(t=m.stringIsEmailAddress(e)?d.EmailAddress:null,t=!t&&m.stringIsPhoneNumber(e)?d.TextCapablePhoneNumber:t),t}static validContact(e){let t=!1;if(e?.type&&r.trimToNull(e?.value))switch(e.type){case d.EmailAddress:t=m.stringIsEmailAddress(e.value);break;case d.TextCapablePhoneNumber:t=m.stringIsPhoneNumber(e.value);break;default:t=!1}return t}static stringIsEmailAddress(e){return!!e.match(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/)}static stringIsPhoneNumber(e){return!!e.match(/^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/im)}static stripWardenEntryToSummary(e){return e?{userId:e.userId,userLabel:e.userLabel,contactMethods:e.contactMethods,webAuthnAuthenticatorSummaries:(e.webAuthnAuthenticators||[]).map((e=>m.stripWardenWebAuthnEntryToSummary(e)))}:null}static stripWardenWebAuthnEntryToSummary(e){return e?{origin:e.origin,applicationName:e.applicationName,deviceLabel:e.deviceLabel,credentialIdBase64:e.credentialIdBase64}:null}static wrapperIsExpired(e){return e?.userObject?.exp&&e.expirationEpochSeconds<Date.now()/1e3}}class L{wrapped;serveExpiredCredentials;_currentUserSubject=new s(null);constructor(e,t=!1){this.wrapped=e,this.serveExpiredCredentials=t}fetchCurrentLoggedInJwtToken(){let e=this?._currentUserSubject?.getValue();return!this.serveExpiredCredentials&&e&&m.wrapperIsExpired(e)&&(n.info("Current wrapper in the subject is expired - autostripping"),this.currentUserSubject.next(null),e=null),e?.jwtToken}get currentUserSubject(){return this._currentUserSubject}onAutomaticLogout(){this.wrapped&&this.wrapped.onAutomaticLogout()}onAutomaticTokenRefresh(e){this?.wrapped?.onAutomaticTokenRefresh&&this.wrapped.onAutomaticTokenRefresh(e)}onLoginFailure(e){this?.wrapped?.onLoginFailure&&this.wrapped.onLoginFailure(e)}onLogout(){this?.wrapped?.onLogout&&this.wrapped.onLogout(),this.currentUserSubject.next(null)}onSuccessfulLogin(e){this?.wrapped?.onSuccessfulLogin&&this.wrapped.onSuccessfulLogin(e),this.currentUserSubject.next(e)}}class f{options;loggedInTimerSubscription;_autoRefreshEnabled=!1;constructor(e){this.options=e,n.info("Initializing user service");const t=this.options.loggedInUserProvider.fetchLoggedInUserWrapper();m.wrapperIsExpired(t)?(n.info("Stored token is expired, removing it"),this.options.loggedInUserProvider.logOutUser()):this.options.eventProcessor.onSuccessfulLogin(t);const r=this.options.loginCheckTimerPingSeconds||2.5;this.loggedInTimerSubscription=i(0,1e3*r).subscribe((e=>this.checkForAutoLogoutOrRefresh(e)))}cleanShutDown(){this.loggedInTimerSubscription&&this.loggedInTimerSubscription.unsubscribe()}get serviceOptions(){return this.options}async createAccount(e,t,n,o){const s=await this.options.wardenClient.createAccount(e,t,n,o);return this.options.recentLoginProvider&&r.trimToNull(s)&&this.options.recentLoginProvider.saveNewUser(s,n,e),s}async addContactToLoggedInUser(e){return this.options.wardenClient.addContactToLoggedInUser(e)}get autoRefreshEnabled(){return this._autoRefreshEnabled}set autoRefreshEnabled(e){if(e){if(!this.options.allowAutoRefresh)throw new Error("Cannot enable auto-refresh - this is disabled in the user service options");this._autoRefreshEnabled=!0}else this._autoRefreshEnabled=!1}async checkForAutoLogoutOrRefresh(e){n.debug("Checking for auto-logout or refresh : %s",e);const t=this.fetchLoggedInUserWrapper();if(t){const e=this.options.autoLoginHandlingThresholdSeconds||10;if(t.expirationEpochSeconds-Math.floor(Date.now()/1e3)<e)if(this.autoRefreshEnabled){n.info("Under threshold, initiating auto-refresh");const e=await this.refreshToken();this.options.eventProcessor.onAutomaticTokenRefresh(e)}else n.info("Under threshold, initiating auto-logout"),this.logout()}}logout(){this.options.loggedInUserProvider.logOutUser(),this.options.eventProcessor.onLogout()}fetchLoggedInUserWrapper(){let e=this.options.loggedInUserProvider.fetchLoggedInUserWrapper();return e&&m.wrapperIsExpired(e)&&(n.info("Token is expired - auto logout triggered"),this.logout(),e=null),e}loggedInUserHasRole(e){let t=!1;if(r.trimToNull(e)){const n=this.fetchLoggedInUserWrapper(),r=e.toLowerCase();t=n?.userObject?.roles&&!!n.userObject.roles.find((e=>e.toLowerCase()===r))}return t}isLoggedIn(){return!!this.fetchLoggedInUserWrapper()}fetchLoggedInUserJwtObject(){const e=this.fetchLoggedInUserWrapper();return e?e.userObject:null}fetchLoggedInUserJwtToken(){const e=this.fetchLoggedInUserWrapper();return e?e.jwtToken:null}fetchLoggedInUserObject(){const e=this.fetchLoggedInUserJwtObject();return e?e.user:null}fetchLoggedInUserExpirationEpochSeconds(){const e=this.fetchLoggedInUserJwtObject();return e?e.exp:null}fetchLoggedInUserRemainingSeconds(){const e=this.fetchLoggedInUserJwtObject();return e?e.exp-Math.floor(Date.now()/1e3):null}updateLoggedInUserFromTokenString(e){let t=null;if(r.trimToNull(e)){n.info("updateLoggedInUserFromTokenString : %s",e);const r=o.decodeTokenNoVerify(e);r?(t={userObject:r,jwtToken:e,expirationEpochSeconds:r.exp},this.options.loggedInUserProvider.setLoggedInUserWrapper(t),this.updateRecentLoginsFromWardenEntrySummary(r.loginData),this.options.eventProcessor.onSuccessfulLogin(t)):(n.warn("Failed to parse token %s - ignoring login and triggering failure"),this.options.eventProcessor.onLoginFailure("Could not parse token string"))}else n.info("Called updateLoggedInUserFromTokenString with empty string - logging out"),this.logout();return t}async refreshToken(){let e=null;const t=this.fetchLoggedInUserWrapper();if(t){const n=await this.options.wardenClient.refreshJwtToken(t.jwtToken);e=this.updateLoggedInUserFromTokenString(n)}else n.info("Could not refresh - no token available");return e}async sendExpiringCode(e){return this.options.wardenClient.sendExpiringValidationToken(e)}async processWardenLoginResults(e){let t=null;return e?(n.info("Warden: response : %j ",e),e.jwtToken?(n.info("Applying login"),t=this.updateLoggedInUserFromTokenString(e.jwtToken)):e.error?this.options.eventProcessor.onLoginFailure(e.error):(n.error("Response contained neither token nor error"),this.options.eventProcessor.onLoginFailure("Response contained neither token nor error"))):(n.error("Login call failed"),this.options.eventProcessor.onLoginFailure("Login call returned null")),t}updateRecentLoginsFromWardenEntrySummary(e){this.options.recentLoginProvider&&e?(n.info("UserService : Saving recent login %j",e),this.options.recentLoginProvider.saveRecentLogin(e)):n.info("Not saving recent login - no storage configured or no data passed")}updateRecentLoginsFromLoggedInUserWrapper(e){this.updateRecentLoginsFromWardenEntrySummary(e?.userObject?.loginData)}async executeWebAuthnBasedLogin(e){const t=await this.executeWebAuthnLoginToWardenLoginResults(e),n=await this.processWardenLoginResults(t);return this.updateRecentLoginsFromLoggedInUserWrapper(n),n}async removeWebAuthnRegistrationFromLoggedInUser(e){return await this.options.wardenClient.removeWebAuthnRegistrationFromLoggedInUser(e)}async removeContactFromLoggedInUser(e){return await this.options.wardenClient.removeContactFromLoggedInUser(e)}async executeValidationTokenBasedLogin(e,t,r){n.info("Warden: executeValidationTokenBasedLogin : %j : %s : %s",e,t,r);const o=await this.options.wardenClient.performLoginCmd({contact:e,expiringToken:t,createUserIfMissing:r}),s=await this.processWardenLoginResults(o);return this.updateRecentLoginsFromLoggedInUserWrapper(s),s}async saveCurrentDeviceAsWebAuthnForCurrentUser(){const e=await this.options.wardenClient.generateWebAuthnRegistrationChallengeForLoggedInUser(),t=await a(e),n=r.trimToEmpty(this.options?.deviceLabelGenerator?this.options.deviceLabelGenerator():this.defaultDeviceLabelGenerator()),o=await this.options.wardenClient.addWebAuthnRegistrationToLoggedInUser(this.options.applicationName,n,t);return this.updateRecentLoginsFromWardenEntrySummary(o),o}defaultDeviceLabelGenerator(){let e="";return navigator?(e=navigator.userAgentData&&navigator.userAgentData.brands&&navigator.userAgentData.brands[1]&&navigator.userAgentData.brands[1].brand?navigator.userAgentData.brands[1].brand:navigator.userAgent,navigator.platform&&(e+=" on "+navigator.platform)):e="Unknown device",e}async executeWebAuthnLoginToWardenLoginResults(e){let t=null;try{const r=await this.options.wardenClient.generateWebAuthnAuthenticationChallengeForUserId(e);n.info("Got login challenge : %s",r);const o=await c(r);n.info("Got creds: %j",o);const s={userId:e,webAuthn:o};t=await this.options.wardenClient.performLoginCmd(s)}catch(e){n.error("WebauthN Failed : %s",e)}return t}}class w{saveRecentLogin(e){if(e?.userId){n.info("Saving recent login : %j",e);let t=this.fetchCache();t=t.filter((t=>t.user.userId!==e.userId)),t.push({user:e,lastLoginEpochMS:Date.now()}),this.updateCache(t)}else n.warn("Cannot save recent login - no login provided : %s",e)}saveNewUser(e,t,o){r.trimToNull(e)&&m.validContact(o)?this.saveRecentLogin({userId:e,contactMethods:[o],webAuthnAuthenticatorSummaries:[],userLabel:t}):n.warn("Cannot save new user - invalid data : %s : %j",e,o)}removeUser(e){let t=this.fetchCache();t=t.filter((t=>t.user.userId!==e)),this.updateCache(t)}fetchAllLogins(){return Object.assign([],this.fetchCache())}clearAllLogins(){this.updateCache([])}}class b{localStorageKey;constructor(n){this.localStorageKey=n,e.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey,"localStorageKey"),localStorage||t.throwFormattedErr("Local storage not available on this platform")}fetchLoggedInUserWrapper(){const e=localStorage.getItem(this.localStorageKey);return r.trimToNull(e)?JSON.parse(e):null}logOutUser(){this.setLoggedInUserWrapper(null)}setLoggedInUserWrapper(e){e?localStorage.setItem(this.localStorageKey,JSON.stringify(e)):localStorage.removeItem(this.localStorageKey)}}class I extends w{localStorageKey;constructor(n){super(),this.localStorageKey=n,e.notNullUndefinedOrOnlyWhitespaceString(this.localStorageKey,"localStorageKey"),localStorage||t.throwFormattedErr("Local storage not available on this platform")}fetchCache(){const e=r.trimToNull(localStorage.getItem(r.trimToNull(this.localStorageKey)));return e?JSON.parse(e):[]}updateCache(e){const t=e?JSON.stringify(e):"[]";localStorage.setItem(r.trimToNull(this.localStorageKey),t)}}class C{wrapper;fetchLoggedInUserWrapper(){return this.wrapper}logOutUser(){this.wrapper=null}setLoggedInUserWrapper(e){this.wrapper=e}}class T extends w{_cache=[];fetchCache(){return this._cache}updateCache(e){this._cache=e}}!function(e){e.ExpiringCode="ExpiringCode",e.MagicLink="MagicLink",e.Custom="Custom"}(u||(u={})),function(e){e.Verified="Verified",e.Failed="Failed",e.Error="Error"}(h||(h={})),function(e){e.ble="ble",e.internal="internal",e.nfc="nfc",e.usb="usb",e.cable="cable",e.hybrid="hybrid"}(p||(p={}));export{l as RatchetWardenCommonInfo,g as WardenClient,w as WardenClientAbstractRecentLoginProvider,b as WardenClientLocalStorageLoggedInUserProvider,I as WardenClientLocalStorageRecentLoginProvider,C as WardenClientTransientMemoryLoggedInUserProvider,T as WardenClientTransientMemoryRecentLoginProvider,d as WardenContactType,u as WardenCustomerMessageType,L as WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider,h as WardenStoreRegistrationResponseType,f as WardenUserService,m as WardenUtils,p as WardenWebAuthnTransportFutureType};
2
2
  //# sourceMappingURL=index.mjs.map
package/lib/types.d.ts ADDED
@@ -0,0 +1,372 @@
1
+ import { BuildInformation, CommonJwtToken } from '@bitblit/ratchet-common';
2
+ import { AuthenticationResponseJSON, PublicKeyCredentialRequestOptionsJSON, PublicKeyCredentialCreationOptionsJSON, RegistrationResponseJSON } from '@simplewebauthn/types';
3
+ import { BehaviorSubject } from 'rxjs';
4
+
5
+ declare class RatchetWardenCommonInfo {
6
+ private constructor();
7
+ static buildInformation(): BuildInformation;
8
+ }
9
+
10
+ declare enum WardenContactType {
11
+ TextCapablePhoneNumber = "TextCapablePhoneNumber",
12
+ EmailAddress = "EmailAddress"
13
+ }
14
+
15
+ interface WardenContact {
16
+ value: string;
17
+ type: WardenContactType;
18
+ }
19
+
20
+ interface CreateAccount {
21
+ contact: WardenContact;
22
+ sendCode?: boolean;
23
+ label?: string;
24
+ tags?: string[];
25
+ }
26
+
27
+ interface RemoveWebAuthnRegistration {
28
+ userId: string;
29
+ credentialId: string;
30
+ }
31
+
32
+ interface WardenLoginRequest {
33
+ userId?: string;
34
+ contact?: WardenContact;
35
+ webAuthn?: AuthenticationResponseJSON;
36
+ expiringToken?: string;
37
+ jwtTokenToRefresh?: string;
38
+ createUserIfMissing?: boolean;
39
+ }
40
+
41
+ interface WardenContactLookup {
42
+ userId?: string;
43
+ contactType?: WardenContactType;
44
+ }
45
+
46
+ interface WardenCustomTemplateDescriptor {
47
+ textVersion?: string;
48
+ htmlVersion?: string;
49
+ baseLayout?: string;
50
+ subjectLine?: string;
51
+ meta?: Record<string, string>;
52
+ }
53
+
54
+ interface SendMagicLink {
55
+ overrideDestinationContact?: WardenContact;
56
+ contactLookup?: WardenContactLookup;
57
+ contact?: WardenContact;
58
+ landingUrl: string;
59
+ meta?: Record<string, string>;
60
+ ttlSeconds?: number;
61
+ customTemplate?: WardenCustomTemplateDescriptor;
62
+ }
63
+
64
+ interface WebAuthnObjectWrapper {
65
+ dataAsJson: string;
66
+ }
67
+
68
+ interface AddWebAuthnRegistrationToLoggedInUser {
69
+ webAuthn: WebAuthnObjectWrapper;
70
+ applicationName: string;
71
+ deviceLabel: string;
72
+ }
73
+
74
+ interface WardenCommand {
75
+ createAccount?: CreateAccount;
76
+ sendMagicLink?: SendMagicLink;
77
+ generateWebAuthnAuthenticationChallengeForUserId?: string;
78
+ generateWebAuthnRegistrationChallengeForLoggedInUser?: boolean;
79
+ sendExpiringValidationToken?: WardenContact;
80
+ addWebAuthnRegistrationToLoggedInUser?: AddWebAuthnRegistrationToLoggedInUser;
81
+ addContactToLoggedInUser?: WardenContact;
82
+ removeWebAuthnRegistrationFromLoggedInUser?: string;
83
+ removeContactFromLoggedInUser?: WardenContact;
84
+ removeWebAuthnRegistration?: RemoveWebAuthnRegistration;
85
+ performLogin?: WardenLoginRequest;
86
+ refreshJwtToken?: string;
87
+ }
88
+
89
+ interface WardenCommandExchangeProvider {
90
+ sendCommand(cmdString: string, jwtToken: string): Promise<string>;
91
+ }
92
+
93
+ interface WardenLoginResults {
94
+ request: WardenLoginRequest;
95
+ userId?: string;
96
+ jwtToken?: string;
97
+ error?: string;
98
+ }
99
+
100
+ interface WardenWebAuthnEntrySummary {
101
+ origin: string;
102
+ applicationName: string;
103
+ deviceLabel: string;
104
+ credentialIdBase64: string;
105
+ }
106
+
107
+ interface WardenEntrySummary {
108
+ userId: string;
109
+ userLabel: string;
110
+ contactMethods: WardenContact[];
111
+ webAuthnAuthenticatorSummaries: WardenWebAuthnEntrySummary[];
112
+ }
113
+
114
+ interface WardenCommandResponse {
115
+ createAccount?: string;
116
+ sendMagicLink?: boolean;
117
+ generateWebAuthnAuthenticationChallengeForUserId?: WebAuthnObjectWrapper;
118
+ generateWebAuthnRegistrationChallengeForLoggedInUser?: WebAuthnObjectWrapper;
119
+ removeWebAuthnRegistration?: WardenEntrySummary;
120
+ sendExpiringValidationToken?: boolean;
121
+ addWebAuthnRegistrationToLoggedInUser?: WardenEntrySummary;
122
+ addContactToLoggedInUser?: boolean;
123
+ performLogin?: WardenLoginResults;
124
+ refreshJwtToken?: string;
125
+ removeWebAuthnRegistrationFromLoggedInUser?: WardenEntrySummary;
126
+ removeContactFromLoggedInUser?: WardenEntrySummary;
127
+ error?: string;
128
+ }
129
+
130
+ interface WardenClientCurrentLoggedInJwtTokenProvider {
131
+ fetchCurrentLoggedInJwtToken(): string;
132
+ }
133
+
134
+ declare class WardenClient {
135
+ private commandSender;
136
+ private jwtProvider;
137
+ constructor(commandSender: WardenCommandExchangeProvider, jwtProvider: WardenClientCurrentLoggedInJwtTokenProvider);
138
+ exchangeCommand(cmd: WardenCommand, returnErrors?: boolean): Promise<WardenCommandResponse>;
139
+ createAccount(contact: WardenContact, sendCode?: boolean, label?: string, tags?: string[]): Promise<string>;
140
+ sendMagicLinkRaw(smlCmd: SendMagicLink): Promise<boolean>;
141
+ sendMagicLinkByUserId(userId: string, landingUrl: string, contactType?: WardenContactType, meta?: Record<string, string>): Promise<boolean>;
142
+ sendMagicLink(contact: WardenContact, landingUrl: string, meta?: Record<string, string>): Promise<boolean>;
143
+ generateWebAuthnAuthenticationChallengeForUserId(userId: string): Promise<PublicKeyCredentialRequestOptionsJSON>;
144
+ generateWebAuthnRegistrationChallengeForLoggedInUser(): Promise<PublicKeyCredentialCreationOptionsJSON>;
145
+ removeWebAuthnRegistration(userId: string, credId: string): Promise<WardenEntrySummary>;
146
+ removeWebAuthnRegistrationFromLoggedInUser(input: string): Promise<WardenEntrySummary>;
147
+ removeContactFromLoggedInUser(input: WardenContact): Promise<WardenEntrySummary>;
148
+ sendExpiringValidationToken(contact: WardenContact): Promise<boolean>;
149
+ addContactToLoggedInUser(contact: WardenContact): Promise<boolean>;
150
+ addWebAuthnRegistrationToLoggedInUser(applicationName: string, deviceLabel: string, data: RegistrationResponseJSON): Promise<WardenEntrySummary>;
151
+ performLoginCmd(login: WardenLoginRequest): Promise<WardenLoginResults>;
152
+ refreshJwtToken(oldJwtToken: string): Promise<string>;
153
+ executeExpiringTokenBasedLogin(contact: WardenContact, expiringToken: string): Promise<WardenLoginResults>;
154
+ }
155
+
156
+ interface WardenJwtToken<T> extends CommonJwtToken<T> {
157
+ loginData: WardenEntrySummary;
158
+ }
159
+
160
+ interface WardenLoggedInUserWrapper<T> {
161
+ userObject: WardenJwtToken<T>;
162
+ jwtToken: string;
163
+ expirationEpochSeconds: number;
164
+ }
165
+
166
+ interface WardenUserServiceEventProcessingProvider<T> {
167
+ onLogout(): void;
168
+ onSuccessfulLogin(newUser: WardenLoggedInUserWrapper<T>): void;
169
+ onLoginFailure(reason: string): void;
170
+ onAutomaticTokenRefresh(refreshUser: WardenLoggedInUserWrapper<T>): void;
171
+ onAutomaticLogout(): void;
172
+ }
173
+
174
+ declare class WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider<T> implements WardenUserServiceEventProcessingProvider<T>, WardenClientCurrentLoggedInJwtTokenProvider {
175
+ private wrapped?;
176
+ private serveExpiredCredentials;
177
+ private _currentUserSubject;
178
+ constructor(wrapped?: Partial<WardenUserServiceEventProcessingProvider<T>>, serveExpiredCredentials?: boolean);
179
+ fetchCurrentLoggedInJwtToken(): string;
180
+ get currentUserSubject(): BehaviorSubject<WardenLoggedInUserWrapper<T>>;
181
+ onAutomaticLogout(): void;
182
+ onAutomaticTokenRefresh(refreshUser: WardenLoggedInUserWrapper<T>): void;
183
+ onLoginFailure(reason: string): void;
184
+ onLogout(): void;
185
+ onSuccessfulLogin(newUser: WardenLoggedInUserWrapper<T>): void;
186
+ }
187
+
188
+ interface WardenLoggedInUserProvider<T> {
189
+ fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
190
+ setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): any;
191
+ logOutUser(): void;
192
+ }
193
+
194
+ interface WardenRecentLoginDescriptor {
195
+ user: WardenEntrySummary;
196
+ lastLoginEpochMS: number;
197
+ }
198
+
199
+ interface WardenClientRecentLoginProvider {
200
+ saveRecentLogin(entry: WardenEntrySummary): void;
201
+ saveNewUser(userId: string, label: string, contact: WardenContact): void;
202
+ removeUser(userId: string): void;
203
+ fetchAllLogins(): WardenRecentLoginDescriptor[];
204
+ clearAllLogins(): void;
205
+ }
206
+
207
+ interface WardenUserServiceOptions<T> {
208
+ recentLoginProvider?: WardenClientRecentLoginProvider;
209
+ loggedInUserProvider: WardenLoggedInUserProvider<T>;
210
+ wardenClient: WardenClient;
211
+ eventProcessor: WardenUserServiceEventProcessingProvider<T>;
212
+ loginCheckTimerPingSeconds?: number;
213
+ autoLoginHandlingThresholdSeconds?: number;
214
+ allowAutoRefresh?: boolean;
215
+ applicationName: string;
216
+ deviceLabelGenerator?: () => string;
217
+ }
218
+
219
+ declare class WardenUserService<T> {
220
+ private options;
221
+ private loggedInTimerSubscription;
222
+ private _autoRefreshEnabled;
223
+ constructor(options: WardenUserServiceOptions<T>);
224
+ cleanShutDown(): void;
225
+ get serviceOptions(): WardenUserServiceOptions<T>;
226
+ createAccount(contact: WardenContact, sendCode?: boolean, label?: string, tags?: string[]): Promise<string>;
227
+ addContactToLoggedInUser(contact: WardenContact): Promise<boolean>;
228
+ get autoRefreshEnabled(): boolean;
229
+ set autoRefreshEnabled(newValue: boolean);
230
+ checkForAutoLogoutOrRefresh(t: number): Promise<void>;
231
+ logout(): void;
232
+ fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
233
+ loggedInUserHasRole(role: string): boolean;
234
+ isLoggedIn(): boolean;
235
+ fetchLoggedInUserJwtObject(): WardenJwtToken<T>;
236
+ fetchLoggedInUserJwtToken(): string;
237
+ fetchLoggedInUserObject(): T;
238
+ fetchLoggedInUserExpirationEpochSeconds(): number;
239
+ fetchLoggedInUserRemainingSeconds(): number;
240
+ private updateLoggedInUserFromTokenString;
241
+ refreshToken(): Promise<WardenLoggedInUserWrapper<T>>;
242
+ sendExpiringCode(contact: WardenContact): Promise<boolean>;
243
+ private processWardenLoginResults;
244
+ private updateRecentLoginsFromWardenEntrySummary;
245
+ private updateRecentLoginsFromLoggedInUserWrapper;
246
+ executeWebAuthnBasedLogin(userId: string): Promise<WardenLoggedInUserWrapper<T>>;
247
+ removeWebAuthnRegistrationFromLoggedInUser(input: string): Promise<WardenEntrySummary>;
248
+ removeContactFromLoggedInUser(input: WardenContact): Promise<WardenEntrySummary>;
249
+ executeValidationTokenBasedLogin(contact: WardenContact, token: string, createUserIfMissing?: boolean): Promise<WardenLoggedInUserWrapper<T>>;
250
+ saveCurrentDeviceAsWebAuthnForCurrentUser(): Promise<WardenEntrySummary>;
251
+ private defaultDeviceLabelGenerator;
252
+ executeWebAuthnLoginToWardenLoginResults(userId: string): Promise<WardenLoginResults>;
253
+ }
254
+
255
+ declare abstract class WardenClientAbstractRecentLoginProvider implements WardenClientRecentLoginProvider {
256
+ abstract fetchCache(): WardenRecentLoginDescriptor[];
257
+ abstract updateCache(newValue: WardenRecentLoginDescriptor[]): any;
258
+ saveRecentLogin(entry: WardenEntrySummary): void;
259
+ saveNewUser(userId: string, label: string, contact: WardenContact): void;
260
+ removeUser(userId: string): void;
261
+ fetchAllLogins(): WardenRecentLoginDescriptor[];
262
+ clearAllLogins(): void;
263
+ }
264
+
265
+ declare class WardenClientLocalStorageLoggedInUserProvider<T> implements WardenLoggedInUserProvider<T> {
266
+ private localStorageKey;
267
+ constructor(localStorageKey: string);
268
+ fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
269
+ logOutUser(): void;
270
+ setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): void;
271
+ }
272
+
273
+ declare class WardenClientLocalStorageRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
274
+ private localStorageKey;
275
+ constructor(localStorageKey: string);
276
+ fetchCache(): WardenRecentLoginDescriptor[];
277
+ updateCache(newValue: WardenRecentLoginDescriptor[]): void;
278
+ }
279
+
280
+ declare class WardenClientTransientMemoryLoggedInUserProvider<T> implements WardenLoggedInUserProvider<T> {
281
+ private wrapper;
282
+ fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
283
+ logOutUser(): void;
284
+ setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): void;
285
+ }
286
+
287
+ declare class WardenClientTransientMemoryRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
288
+ private _cache;
289
+ fetchCache(): WardenRecentLoginDescriptor[];
290
+ updateCache(newValue: WardenRecentLoginDescriptor[]): void;
291
+ }
292
+
293
+ declare enum WardenCustomerMessageType {
294
+ ExpiringCode = "ExpiringCode",
295
+ MagicLink = "MagicLink",
296
+ Custom = "Custom"
297
+ }
298
+
299
+ declare enum WardenWebAuthnTransportFutureType {
300
+ ble = "ble",
301
+ internal = "internal",
302
+ nfc = "nfc",
303
+ usb = "usb",
304
+ cable = "cable",
305
+ hybrid = "hybrid"
306
+ }
307
+
308
+ interface WardenWebAuthnEntry {
309
+ origin: string;
310
+ applicationName: string;
311
+ deviceLabel: string;
312
+ credentialIdBase64: string;
313
+ credentialPublicKeyBase64: string;
314
+ counter: number;
315
+ credentialBackedUp: boolean;
316
+ credentialDeviceType: string;
317
+ transports?: WardenWebAuthnTransportFutureType[];
318
+ }
319
+
320
+ interface WardenEntry {
321
+ userId: string;
322
+ userLabel: string;
323
+ contactMethods: WardenContact[];
324
+ tags: string[];
325
+ webAuthnAuthenticators: WardenWebAuthnEntry[];
326
+ createdEpochMS: number;
327
+ updatedEpochMS: number;
328
+ }
329
+
330
+ declare enum WardenStoreRegistrationResponseType {
331
+ Verified = "Verified",
332
+ Failed = "Failed",
333
+ Error = "Error"
334
+ }
335
+
336
+ interface WardenStoreRegistrationResponse {
337
+ updatedEntry?: WardenEntry;
338
+ registrationResponseId: string;
339
+ result: WardenStoreRegistrationResponseType;
340
+ error?: string;
341
+ }
342
+
343
+ interface WardenTeamRole {
344
+ team: string;
345
+ role: string;
346
+ }
347
+
348
+ interface WardenUserDecoration<T> {
349
+ userTokenData: T;
350
+ userTokenExpirationSeconds: number;
351
+ userTeamRoles: WardenTeamRole[];
352
+ }
353
+
354
+ declare class WardenUtils {
355
+ constructor();
356
+ static extractContactsOfType(req: WardenEntry | WardenEntrySummary, type: WardenContactType): string[];
357
+ static validLoginRequest(req: WardenLoginRequest): boolean;
358
+ static stringToWardenContact(input: string): WardenContact;
359
+ static teamRolesToRoles(teamRoles: WardenTeamRole[]): string[];
360
+ static roleStringsToTeamRoles(roles: string[]): WardenTeamRole[];
361
+ static roleStringToTeamRole(role: string): WardenTeamRole;
362
+ static teamRoleToRoleString(tr: WardenTeamRole): string;
363
+ static stringToContactType(input: string): WardenContactType;
364
+ static validContact(contact: WardenContact): boolean;
365
+ static stringIsEmailAddress(value: string): boolean;
366
+ static stringIsPhoneNumber(value: string): boolean;
367
+ static stripWardenEntryToSummary(we: WardenEntry): WardenEntrySummary;
368
+ static stripWardenWebAuthnEntryToSummary(we: WardenWebAuthnEntry): WardenWebAuthnEntrySummary;
369
+ static wrapperIsExpired(value: WardenLoggedInUserWrapper<any>): boolean;
370
+ }
371
+
372
+ export { type AddWebAuthnRegistrationToLoggedInUser, type CreateAccount, RatchetWardenCommonInfo, type RemoveWebAuthnRegistration, type SendMagicLink, WardenClient, WardenClientAbstractRecentLoginProvider, type WardenClientCurrentLoggedInJwtTokenProvider, WardenClientLocalStorageLoggedInUserProvider, WardenClientLocalStorageRecentLoginProvider, type WardenClientRecentLoginProvider, WardenClientTransientMemoryLoggedInUserProvider, WardenClientTransientMemoryRecentLoginProvider, type WardenCommand, type WardenCommandExchangeProvider, type WardenCommandResponse, type WardenContact, type WardenContactLookup, WardenContactType, type WardenCustomTemplateDescriptor, WardenCustomerMessageType, WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider, type WardenEntry, type WardenEntrySummary, type WardenJwtToken, type WardenLoggedInUserProvider, type WardenLoggedInUserWrapper, type WardenLoginRequest, type WardenLoginResults, type WardenRecentLoginDescriptor, type WardenStoreRegistrationResponse, WardenStoreRegistrationResponseType, type WardenTeamRole, type WardenUserDecoration, WardenUserService, type WardenUserServiceEventProcessingProvider, type WardenUserServiceOptions, WardenUtils, type WardenWebAuthnEntry, type WardenWebAuthnEntrySummary, WardenWebAuthnTransportFutureType, type WebAuthnObjectWrapper };
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-warden-common",
3
- "version": "4.0.353-alpha",
3
+ "version": "4.0.355-alpha",
4
4
  "description": "Typescript library to simplify using simplewebauthn and secondary auth methods over GraphQL",
5
5
  "sideEffects": false,
6
6
  "type": "module",
7
7
  "module": "./lib/index.mjs",
8
- "types": "./lib/index.d.ts",
8
+ "types": "./lib/types.d.ts",
9
9
  "files": [
10
10
  "lib/**",
11
11
  "bin/**"
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
15
- "types": "./lib/index.d.ts",
15
+ "types": "./lib/types.d.ts",
16
16
  "import": "./lib/index.mjs"
17
17
  }
18
18
  },
@@ -47,12 +47,12 @@
47
47
  },
48
48
  "license": "Apache-2.0",
49
49
  "dependencies": {
50
- "@bitblit/ratchet-common": "4.0.353-alpha",
50
+ "@bitblit/ratchet-common": "4.0.355-alpha",
51
51
  "@simplewebauthn/browser": "10.0.0",
52
52
  "jwt-decode": "4.0.0"
53
53
  },
54
54
  "peerDependencies": {
55
- "@bitblit/ratchet-common": "^4.0.353-alpha",
55
+ "@bitblit/ratchet-common": "^4.0.355-alpha",
56
56
  "@simplewebauthn/browser": "^10.0.0",
57
57
  "@simplewebauthn/types": "^10.0.0",
58
58
  "jwt-decode": "^4.0.0"
@@ -1,5 +0,0 @@
1
- import { BuildInformation } from '@bitblit/ratchet-common';
2
- export declare class RatchetWardenCommonInfo {
3
- private constructor();
4
- static buildInformation(): BuildInformation;
5
- }
@@ -1,13 +0,0 @@
1
- import { WardenClientRecentLoginProvider } from './warden-client-recent-login-provider.js';
2
- import { WardenRecentLoginDescriptor } from './warden-recent-login-descriptor.js';
3
- import { WardenEntrySummary } from '../../common/model/warden-entry-summary.js';
4
- import { WardenContact } from '../../common/model/warden-contact.js';
5
- export declare abstract class WardenClientAbstractRecentLoginProvider implements WardenClientRecentLoginProvider {
6
- abstract fetchCache(): WardenRecentLoginDescriptor[];
7
- abstract updateCache(newValue: WardenRecentLoginDescriptor[]): any;
8
- saveRecentLogin(entry: WardenEntrySummary): void;
9
- saveNewUser(userId: string, label: string, contact: WardenContact): void;
10
- removeUser(userId: string): void;
11
- fetchAllLogins(): WardenRecentLoginDescriptor[];
12
- clearAllLogins(): void;
13
- }
@@ -1,3 +0,0 @@
1
- export interface WardenClientCurrentLoggedInJwtTokenProvider {
2
- fetchCurrentLoggedInJwtToken(): string;
3
- }
@@ -1,9 +0,0 @@
1
- import { WardenLoggedInUserProvider } from './warden-logged-in-user-provider.js';
2
- import { WardenLoggedInUserWrapper } from './warden-logged-in-user-wrapper.js';
3
- export declare class WardenClientLocalStorageLoggedInUserProvider<T> implements WardenLoggedInUserProvider<T> {
4
- private localStorageKey;
5
- constructor(localStorageKey: string);
6
- fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
7
- logOutUser(): void;
8
- setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): void;
9
- }
@@ -1,8 +0,0 @@
1
- import { WardenRecentLoginDescriptor } from './warden-recent-login-descriptor.js';
2
- import { WardenClientAbstractRecentLoginProvider } from './warden-client-abstract-recent-login-provider.js';
3
- export declare class WardenClientLocalStorageRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
4
- private localStorageKey;
5
- constructor(localStorageKey: string);
6
- fetchCache(): WardenRecentLoginDescriptor[];
7
- updateCache(newValue: WardenRecentLoginDescriptor[]): void;
8
- }
@@ -1,10 +0,0 @@
1
- import { WardenRecentLoginDescriptor } from './warden-recent-login-descriptor.js';
2
- import { WardenEntrySummary } from '../../common/model/warden-entry-summary.js';
3
- import { WardenContact } from '../../common/model/warden-contact.js';
4
- export interface WardenClientRecentLoginProvider {
5
- saveRecentLogin(entry: WardenEntrySummary): void;
6
- saveNewUser(userId: string, label: string, contact: WardenContact): void;
7
- removeUser(userId: string): void;
8
- fetchAllLogins(): WardenRecentLoginDescriptor[];
9
- clearAllLogins(): void;
10
- }
@@ -1,8 +0,0 @@
1
- import { WardenLoggedInUserProvider } from './warden-logged-in-user-provider.js';
2
- import { WardenLoggedInUserWrapper } from './warden-logged-in-user-wrapper.js';
3
- export declare class WardenClientTransientMemoryLoggedInUserProvider<T> implements WardenLoggedInUserProvider<T> {
4
- private wrapper;
5
- fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
6
- logOutUser(): void;
7
- setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): void;
8
- }
@@ -1,7 +0,0 @@
1
- import { WardenRecentLoginDescriptor } from './warden-recent-login-descriptor.js';
2
- import { WardenClientAbstractRecentLoginProvider } from './warden-client-abstract-recent-login-provider.js';
3
- export declare class WardenClientTransientMemoryRecentLoginProvider extends WardenClientAbstractRecentLoginProvider {
4
- private _cache;
5
- fetchCache(): WardenRecentLoginDescriptor[];
6
- updateCache(newValue: WardenRecentLoginDescriptor[]): void;
7
- }
@@ -1,3 +0,0 @@
1
- export interface WardenCommandExchangeProvider {
2
- sendCommand(cmdString: string, jwtToken: string): Promise<string>;
3
- }
@@ -1,6 +0,0 @@
1
- import { WardenLoggedInUserWrapper } from './warden-logged-in-user-wrapper.js';
2
- export interface WardenLoggedInUserProvider<T> {
3
- fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
4
- setLoggedInUserWrapper(wrapper: WardenLoggedInUserWrapper<T>): any;
5
- logOutUser(): void;
6
- }
@@ -1,6 +0,0 @@
1
- import { WardenJwtToken } from '../../common/model/warden-jwt-token.js';
2
- export interface WardenLoggedInUserWrapper<T> {
3
- userObject: WardenJwtToken<T>;
4
- jwtToken: string;
5
- expirationEpochSeconds: number;
6
- }
@@ -1,5 +0,0 @@
1
- import { WardenEntrySummary } from '../../common/model/warden-entry-summary.js';
2
- export interface WardenRecentLoginDescriptor {
3
- user: WardenEntrySummary;
4
- lastLoginEpochMS: number;
5
- }
@@ -1,8 +0,0 @@
1
- import { WardenLoggedInUserWrapper } from './warden-logged-in-user-wrapper.js';
2
- export interface WardenUserServiceEventProcessingProvider<T> {
3
- onLogout(): void;
4
- onSuccessfulLogin(newUser: WardenLoggedInUserWrapper<T>): void;
5
- onLoginFailure(reason: string): void;
6
- onAutomaticTokenRefresh(refreshUser: WardenLoggedInUserWrapper<T>): void;
7
- onAutomaticLogout(): void;
8
- }
@@ -1,15 +0,0 @@
1
- import { WardenLoggedInUserProvider } from './warden-logged-in-user-provider.js';
2
- import { WardenClient } from '../warden-client.js';
3
- import { WardenUserServiceEventProcessingProvider } from './warden-user-service-event-processing-provider.js';
4
- import { WardenClientRecentLoginProvider } from './warden-client-recent-login-provider.js';
5
- export interface WardenUserServiceOptions<T> {
6
- recentLoginProvider?: WardenClientRecentLoginProvider;
7
- loggedInUserProvider: WardenLoggedInUserProvider<T>;
8
- wardenClient: WardenClient;
9
- eventProcessor: WardenUserServiceEventProcessingProvider<T>;
10
- loginCheckTimerPingSeconds?: number;
11
- autoLoginHandlingThresholdSeconds?: number;
12
- allowAutoRefresh?: boolean;
13
- applicationName: string;
14
- deviceLabelGenerator?: () => string;
15
- }
@@ -1,32 +0,0 @@
1
- import { WardenCommand } from '../common/command/warden-command.js';
2
- import { WardenContact } from '../common/model/warden-contact.js';
3
- import { WardenCommandExchangeProvider } from './provider/warden-command-exchange-provider.js';
4
- import { WardenCommandResponse } from '../common/command/warden-command-response.js';
5
- import { PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from '@simplewebauthn/types';
6
- import { WardenLoginResults } from '../common/model/warden-login-results.js';
7
- import { WardenLoginRequest } from '../common/model/warden-login-request.js';
8
- import { WardenClientCurrentLoggedInJwtTokenProvider } from './provider/warden-client-current-logged-in-jwt-token-provider.js';
9
- import { WardenEntrySummary } from '../common/model/warden-entry-summary.js';
10
- import { WardenContactType } from '../common/model/warden-contact-type.js';
11
- import { SendMagicLink } from '../common/command/send-magic-link';
12
- export declare class WardenClient {
13
- private commandSender;
14
- private jwtProvider;
15
- constructor(commandSender: WardenCommandExchangeProvider, jwtProvider: WardenClientCurrentLoggedInJwtTokenProvider);
16
- exchangeCommand(cmd: WardenCommand, returnErrors?: boolean): Promise<WardenCommandResponse>;
17
- createAccount(contact: WardenContact, sendCode?: boolean, label?: string, tags?: string[]): Promise<string>;
18
- sendMagicLinkRaw(smlCmd: SendMagicLink): Promise<boolean>;
19
- sendMagicLinkByUserId(userId: string, landingUrl: string, contactType?: WardenContactType, meta?: Record<string, string>): Promise<boolean>;
20
- sendMagicLink(contact: WardenContact, landingUrl: string, meta?: Record<string, string>): Promise<boolean>;
21
- generateWebAuthnAuthenticationChallengeForUserId(userId: string): Promise<PublicKeyCredentialRequestOptionsJSON>;
22
- generateWebAuthnRegistrationChallengeForLoggedInUser(): Promise<PublicKeyCredentialCreationOptionsJSON>;
23
- removeWebAuthnRegistration(userId: string, credId: string): Promise<WardenEntrySummary>;
24
- removeWebAuthnRegistrationFromLoggedInUser(input: string): Promise<WardenEntrySummary>;
25
- removeContactFromLoggedInUser(input: WardenContact): Promise<WardenEntrySummary>;
26
- sendExpiringValidationToken(contact: WardenContact): Promise<boolean>;
27
- addContactToLoggedInUser(contact: WardenContact): Promise<boolean>;
28
- addWebAuthnRegistrationToLoggedInUser(applicationName: string, deviceLabel: string, data: RegistrationResponseJSON): Promise<WardenEntrySummary>;
29
- performLoginCmd(login: WardenLoginRequest): Promise<WardenLoginResults>;
30
- refreshJwtToken(oldJwtToken: string): Promise<string>;
31
- executeExpiringTokenBasedLogin(contact: WardenContact, expiringToken: string): Promise<WardenLoginResults>;
32
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- import { WardenUserServiceEventProcessingProvider } from './provider/warden-user-service-event-processing-provider.js';
2
- import { WardenLoggedInUserWrapper } from './provider/warden-logged-in-user-wrapper.js';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { WardenClientCurrentLoggedInJwtTokenProvider } from './provider/warden-client-current-logged-in-jwt-token-provider.js';
5
- export declare class WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider<T> implements WardenUserServiceEventProcessingProvider<T>, WardenClientCurrentLoggedInJwtTokenProvider {
6
- private wrapped?;
7
- private serveExpiredCredentials;
8
- private _currentUserSubject;
9
- constructor(wrapped?: Partial<WardenUserServiceEventProcessingProvider<T>>, serveExpiredCredentials?: boolean);
10
- fetchCurrentLoggedInJwtToken(): string;
11
- get currentUserSubject(): BehaviorSubject<WardenLoggedInUserWrapper<T>>;
12
- onAutomaticLogout(): void;
13
- onAutomaticTokenRefresh(refreshUser: WardenLoggedInUserWrapper<T>): void;
14
- onLoginFailure(reason: string): void;
15
- onLogout(): void;
16
- onSuccessfulLogin(newUser: WardenLoggedInUserWrapper<T>): void;
17
- }
@@ -1,41 +0,0 @@
1
- import { WardenUserServiceOptions } from './provider/warden-user-service-options.js';
2
- import { WardenLoggedInUserWrapper } from './provider/warden-logged-in-user-wrapper.js';
3
- import { WardenContact } from '../common/model/warden-contact.js';
4
- import { WardenJwtToken } from '../common/model/warden-jwt-token.js';
5
- import { WardenLoginResults } from '../common/model/warden-login-results.js';
6
- import { WardenEntrySummary } from '../common/model/warden-entry-summary.js';
7
- export declare class WardenUserService<T> {
8
- private options;
9
- private loggedInTimerSubscription;
10
- private _autoRefreshEnabled;
11
- constructor(options: WardenUserServiceOptions<T>);
12
- cleanShutDown(): void;
13
- get serviceOptions(): WardenUserServiceOptions<T>;
14
- createAccount(contact: WardenContact, sendCode?: boolean, label?: string, tags?: string[]): Promise<string>;
15
- addContactToLoggedInUser(contact: WardenContact): Promise<boolean>;
16
- get autoRefreshEnabled(): boolean;
17
- set autoRefreshEnabled(newValue: boolean);
18
- checkForAutoLogoutOrRefresh(t: number): Promise<void>;
19
- logout(): void;
20
- fetchLoggedInUserWrapper(): WardenLoggedInUserWrapper<T>;
21
- loggedInUserHasRole(role: string): boolean;
22
- isLoggedIn(): boolean;
23
- fetchLoggedInUserJwtObject(): WardenJwtToken<T>;
24
- fetchLoggedInUserJwtToken(): string;
25
- fetchLoggedInUserObject(): T;
26
- fetchLoggedInUserExpirationEpochSeconds(): number;
27
- fetchLoggedInUserRemainingSeconds(): number;
28
- private updateLoggedInUserFromTokenString;
29
- refreshToken(): Promise<WardenLoggedInUserWrapper<T>>;
30
- sendExpiringCode(contact: WardenContact): Promise<boolean>;
31
- private processWardenLoginResults;
32
- private updateRecentLoginsFromWardenEntrySummary;
33
- private updateRecentLoginsFromLoggedInUserWrapper;
34
- executeWebAuthnBasedLogin(userId: string): Promise<WardenLoggedInUserWrapper<T>>;
35
- removeWebAuthnRegistrationFromLoggedInUser(input: string): Promise<WardenEntrySummary>;
36
- removeContactFromLoggedInUser(input: WardenContact): Promise<WardenEntrySummary>;
37
- executeValidationTokenBasedLogin(contact: WardenContact, token: string, createUserIfMissing?: boolean): Promise<WardenLoggedInUserWrapper<T>>;
38
- saveCurrentDeviceAsWebAuthnForCurrentUser(): Promise<WardenEntrySummary>;
39
- private defaultDeviceLabelGenerator;
40
- executeWebAuthnLoginToWardenLoginResults(userId: string): Promise<WardenLoginResults>;
41
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,6 +0,0 @@
1
- import { WebAuthnObjectWrapper } from './web-authn-object-wrapper';
2
- export interface AddWebAuthnRegistrationToLoggedInUser {
3
- webAuthn: WebAuthnObjectWrapper;
4
- applicationName: string;
5
- deviceLabel: string;
6
- }
@@ -1,7 +0,0 @@
1
- import { WardenContact } from '../model/warden-contact.js';
2
- export interface CreateAccount {
3
- contact: WardenContact;
4
- sendCode?: boolean;
5
- label?: string;
6
- tags?: string[];
7
- }
@@ -1,4 +0,0 @@
1
- export interface RemoveWebAuthnRegistration {
2
- userId: string;
3
- credentialId: string;
4
- }
@@ -1,12 +0,0 @@
1
- import { WardenContact } from '../model/warden-contact.js';
2
- import { WardenContactLookup } from './warden-contact-lookup.js';
3
- import { WardenCustomTemplateDescriptor } from './warden-custom-template-descriptor';
4
- export interface SendMagicLink {
5
- overrideDestinationContact?: WardenContact;
6
- contactLookup?: WardenContactLookup;
7
- contact?: WardenContact;
8
- landingUrl: string;
9
- meta?: Record<string, string>;
10
- ttlSeconds?: number;
11
- customTemplate?: WardenCustomTemplateDescriptor;
12
- }
@@ -1,18 +0,0 @@
1
- import { WebAuthnObjectWrapper } from './web-authn-object-wrapper.js';
2
- import { WardenLoginResults } from '../model/warden-login-results.js';
3
- import { WardenEntrySummary } from '../model/warden-entry-summary.js';
4
- export interface WardenCommandResponse {
5
- createAccount?: string;
6
- sendMagicLink?: boolean;
7
- generateWebAuthnAuthenticationChallengeForUserId?: WebAuthnObjectWrapper;
8
- generateWebAuthnRegistrationChallengeForLoggedInUser?: WebAuthnObjectWrapper;
9
- removeWebAuthnRegistration?: WardenEntrySummary;
10
- sendExpiringValidationToken?: boolean;
11
- addWebAuthnRegistrationToLoggedInUser?: WardenEntrySummary;
12
- addContactToLoggedInUser?: boolean;
13
- performLogin?: WardenLoginResults;
14
- refreshJwtToken?: string;
15
- removeWebAuthnRegistrationFromLoggedInUser?: WardenEntrySummary;
16
- removeContactFromLoggedInUser?: WardenEntrySummary;
17
- error?: string;
18
- }
@@ -1,20 +0,0 @@
1
- import { CreateAccount } from './create-account.js';
2
- import { WardenContact } from '../model/warden-contact.js';
3
- import { RemoveWebAuthnRegistration } from './remove-web-authn-registration.js';
4
- import { WardenLoginRequest } from '../model/warden-login-request.js';
5
- import { SendMagicLink } from './send-magic-link.js';
6
- import { AddWebAuthnRegistrationToLoggedInUser } from './add-web-authn-registration-to-logged-in-user.js';
7
- export interface WardenCommand {
8
- createAccount?: CreateAccount;
9
- sendMagicLink?: SendMagicLink;
10
- generateWebAuthnAuthenticationChallengeForUserId?: string;
11
- generateWebAuthnRegistrationChallengeForLoggedInUser?: boolean;
12
- sendExpiringValidationToken?: WardenContact;
13
- addWebAuthnRegistrationToLoggedInUser?: AddWebAuthnRegistrationToLoggedInUser;
14
- addContactToLoggedInUser?: WardenContact;
15
- removeWebAuthnRegistrationFromLoggedInUser?: string;
16
- removeContactFromLoggedInUser?: WardenContact;
17
- removeWebAuthnRegistration?: RemoveWebAuthnRegistration;
18
- performLogin?: WardenLoginRequest;
19
- refreshJwtToken?: string;
20
- }
@@ -1,5 +0,0 @@
1
- import { WardenContactType } from '../model/warden-contact-type.js';
2
- export interface WardenContactLookup {
3
- userId?: string;
4
- contactType?: WardenContactType;
5
- }
@@ -1,7 +0,0 @@
1
- export interface WardenCustomTemplateDescriptor {
2
- textVersion?: string;
3
- htmlVersion?: string;
4
- baseLayout?: string;
5
- subjectLine?: string;
6
- meta?: Record<string, string>;
7
- }
@@ -1,3 +0,0 @@
1
- export interface WebAuthnObjectWrapper {
2
- dataAsJson: string;
3
- }
@@ -1,4 +0,0 @@
1
- export declare enum WardenContactType {
2
- TextCapablePhoneNumber = "TextCapablePhoneNumber",
3
- EmailAddress = "EmailAddress"
4
- }
@@ -1,5 +0,0 @@
1
- import { WardenContactType } from './warden-contact-type.js';
2
- export interface WardenContact {
3
- value: string;
4
- type: WardenContactType;
5
- }
@@ -1,5 +0,0 @@
1
- export declare enum WardenCustomerMessageType {
2
- ExpiringCode = "ExpiringCode",
3
- MagicLink = "MagicLink",
4
- Custom = "Custom"
5
- }
@@ -1,8 +0,0 @@
1
- import { WardenContact } from './warden-contact.js';
2
- import { WardenWebAuthnEntrySummary } from './warden-web-authn-entry-summary.js';
3
- export interface WardenEntrySummary {
4
- userId: string;
5
- userLabel: string;
6
- contactMethods: WardenContact[];
7
- webAuthnAuthenticatorSummaries: WardenWebAuthnEntrySummary[];
8
- }
@@ -1,11 +0,0 @@
1
- import { WardenWebAuthnEntry } from './warden-web-authn-entry.js';
2
- import { WardenContact } from './warden-contact.js';
3
- export interface WardenEntry {
4
- userId: string;
5
- userLabel: string;
6
- contactMethods: WardenContact[];
7
- tags: string[];
8
- webAuthnAuthenticators: WardenWebAuthnEntry[];
9
- createdEpochMS: number;
10
- updatedEpochMS: number;
11
- }
@@ -1,5 +0,0 @@
1
- import { CommonJwtToken } from '@bitblit/ratchet-common';
2
- import { WardenEntrySummary } from './warden-entry-summary.js';
3
- export interface WardenJwtToken<T> extends CommonJwtToken<T> {
4
- loginData: WardenEntrySummary;
5
- }
@@ -1,10 +0,0 @@
1
- import { WardenContact } from './warden-contact.js';
2
- import { AuthenticationResponseJSON } from '@simplewebauthn/types';
3
- export interface WardenLoginRequest {
4
- userId?: string;
5
- contact?: WardenContact;
6
- webAuthn?: AuthenticationResponseJSON;
7
- expiringToken?: string;
8
- jwtTokenToRefresh?: string;
9
- createUserIfMissing?: boolean;
10
- }
@@ -1,7 +0,0 @@
1
- import { WardenLoginRequest } from './warden-login-request.js';
2
- export interface WardenLoginResults {
3
- request: WardenLoginRequest;
4
- userId?: string;
5
- jwtToken?: string;
6
- error?: string;
7
- }
@@ -1,5 +0,0 @@
1
- export declare enum WardenStoreRegistrationResponseType {
2
- Verified = "Verified",
3
- Failed = "Failed",
4
- Error = "Error"
5
- }
@@ -1,8 +0,0 @@
1
- import { WardenStoreRegistrationResponseType } from './warden-store-registration-response-type.js';
2
- import { WardenEntry } from './warden-entry.js';
3
- export interface WardenStoreRegistrationResponse {
4
- updatedEntry?: WardenEntry;
5
- registrationResponseId: string;
6
- result: WardenStoreRegistrationResponseType;
7
- error?: string;
8
- }
@@ -1,4 +0,0 @@
1
- export interface WardenTeamRole {
2
- team: string;
3
- role: string;
4
- }
@@ -1,6 +0,0 @@
1
- import { WardenTeamRole } from './warden-team-role.js';
2
- export interface WardenUserDecoration<T> {
3
- userTokenData: T;
4
- userTokenExpirationSeconds: number;
5
- userTeamRoles: WardenTeamRole[];
6
- }
@@ -1,6 +0,0 @@
1
- export interface WardenWebAuthnEntrySummary {
2
- origin: string;
3
- applicationName: string;
4
- deviceLabel: string;
5
- credentialIdBase64: string;
6
- }
@@ -1,12 +0,0 @@
1
- import { WardenWebAuthnTransportFutureType } from './warden-web-authn-transport-future-type.js';
2
- export interface WardenWebAuthnEntry {
3
- origin: string;
4
- applicationName: string;
5
- deviceLabel: string;
6
- credentialIdBase64: string;
7
- credentialPublicKeyBase64: string;
8
- counter: number;
9
- credentialBackedUp: boolean;
10
- credentialDeviceType: string;
11
- transports?: WardenWebAuthnTransportFutureType[];
12
- }
@@ -1,8 +0,0 @@
1
- export declare enum WardenWebAuthnTransportFutureType {
2
- ble = "ble",
3
- internal = "internal",
4
- nfc = "nfc",
5
- usb = "usb",
6
- cable = "cable",
7
- hybrid = "hybrid"
8
- }
@@ -1,26 +0,0 @@
1
- import { WardenContact } from '../model/warden-contact.js';
2
- import { WardenContactType } from '../model/warden-contact-type.js';
3
- import { WardenEntrySummary } from '../model/warden-entry-summary.js';
4
- import { WardenEntry } from '../model/warden-entry.js';
5
- import { WardenLoginRequest } from '../model/warden-login-request.js';
6
- import { WardenTeamRole } from '../model/warden-team-role.js';
7
- import { WardenWebAuthnEntry } from '../model/warden-web-authn-entry';
8
- import { WardenWebAuthnEntrySummary } from '../model/warden-web-authn-entry-summary';
9
- import { WardenLoggedInUserWrapper } from '../../client/provider/warden-logged-in-user-wrapper';
10
- export declare class WardenUtils {
11
- constructor();
12
- static extractContactsOfType(req: WardenEntry | WardenEntrySummary, type: WardenContactType): string[];
13
- static validLoginRequest(req: WardenLoginRequest): boolean;
14
- static stringToWardenContact(input: string): WardenContact;
15
- static teamRolesToRoles(teamRoles: WardenTeamRole[]): string[];
16
- static roleStringsToTeamRoles(roles: string[]): WardenTeamRole[];
17
- static roleStringToTeamRole(role: string): WardenTeamRole;
18
- static teamRoleToRoleString(tr: WardenTeamRole): string;
19
- static stringToContactType(input: string): WardenContactType;
20
- static validContact(contact: WardenContact): boolean;
21
- static stringIsEmailAddress(value: string): boolean;
22
- static stringIsPhoneNumber(value: string): boolean;
23
- static stripWardenEntryToSummary(we: WardenEntry): WardenEntrySummary;
24
- static stripWardenWebAuthnEntryToSummary(we: WardenWebAuthnEntry): WardenWebAuthnEntrySummary;
25
- static wrapperIsExpired(value: WardenLoggedInUserWrapper<any>): boolean;
26
- }
@@ -1 +0,0 @@
1
- export {};
package/lib/index.d.ts DELETED
@@ -1,42 +0,0 @@
1
- export * from './build/ratchet-warden-common-info.js';
2
- export * from './client/warden-client.js';
3
- export * from './client/warden-delegating-current-user-providing-user-service-event-processing-provider.js';
4
- export * from './client/warden-user-service.js';
5
- export * from './client/provider/warden-client-abstract-recent-login-provider.js';
6
- export * from './client/provider/warden-client-current-logged-in-jwt-token-provider.js';
7
- export * from './client/provider/warden-client-local-storage-logged-in-user-provider.js';
8
- export * from './client/provider/warden-client-local-storage-recent-login-provider.js';
9
- export * from './client/provider/warden-client-recent-login-provider.js';
10
- export * from './client/provider/warden-client-transient-memory-logged-in-user-provider.js';
11
- export * from './client/provider/warden-client-transient-memory-recent-login-provider.js';
12
- export * from './client/provider/warden-command-exchange-provider.js';
13
- export * from './client/provider/warden-logged-in-user-provider.js';
14
- export * from './client/provider/warden-logged-in-user-wrapper.js';
15
- export * from './client/provider/warden-recent-login-descriptor.js';
16
- export * from './client/provider/warden-user-service-event-processing-provider.js';
17
- export * from './client/provider/warden-user-service-options.js';
18
- export * from './common/command/add-web-authn-registration-to-logged-in-user.js';
19
- export * from './common/command/create-account.js';
20
- export * from './common/command/remove-web-authn-registration.js';
21
- export * from './common/command/send-magic-link.js';
22
- export * from './common/command/warden-command-response.js';
23
- export * from './common/command/warden-command.js';
24
- export * from './common/command/warden-contact-lookup.js';
25
- export * from './common/command/warden-custom-template-descriptor.js';
26
- export * from './common/command/web-authn-object-wrapper.js';
27
- export * from './common/model/warden-contact-type.js';
28
- export * from './common/model/warden-contact.js';
29
- export * from './common/model/warden-customer-message-type.js';
30
- export * from './common/model/warden-entry-summary.js';
31
- export * from './common/model/warden-entry.js';
32
- export * from './common/model/warden-jwt-token.js';
33
- export * from './common/model/warden-login-request.js';
34
- export * from './common/model/warden-login-results.js';
35
- export * from './common/model/warden-store-registration-response-type.js';
36
- export * from './common/model/warden-store-registration-response.js';
37
- export * from './common/model/warden-team-role.js';
38
- export * from './common/model/warden-user-decoration.js';
39
- export * from './common/model/warden-web-authn-entry-summary.js';
40
- export * from './common/model/warden-web-authn-entry.js';
41
- export * from './common/model/warden-web-authn-transport-future-type.js';
42
- export * from './common/util/warden-utils.js';
package/lib/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/build/ratchet-warden-common-info.ts","../src/client/warden-client.ts","../src/common/model/warden-contact-type.ts","../src/common/model/warden-customer-message-type.ts","../src/common/model/warden-store-registration-response-type.ts","../src/common/model/warden-web-authn-transport-future-type.ts","../src/common/util/warden-utils.ts","../src/client/warden-delegating-current-user-providing-user-service-event-processing-provider.ts","../src/client/warden-user-service.ts","../src/client/provider/warden-client-abstract-recent-login-provider.ts","../src/client/provider/warden-client-local-storage-logged-in-user-provider.ts","../src/client/provider/warden-client-local-storage-recent-login-provider.ts","../src/client/provider/warden-client-transient-memory-logged-in-user-provider.ts","../src/client/provider/warden-client-transient-memory-recent-login-provider.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["RatchetWardenCommonInfo","constructor","buildInformation","version","hash","branch","tag","timeBuiltISO","notes","WardenClient","commandSender","jwtProvider","this","RequireRatchet","notNullOrUndefined","exchangeCommand","cmd","returnErrors","asString","JSON","stringify","resp","sendCommand","fetchCurrentLoggedInJwtToken","parsed","parse","error","ErrorRatchet","throwFormattedErr","createAccount","contact","sendCode","label","tags","sendMagicLinkRaw","smlCmd","sendMagicLink","Logger","warn","sendMagicLinkByUserId","userId","landingUrl","contactType","meta","contactLookup","generateWebAuthnAuthenticationChallengeForUserId","rval","dataAsJson","generateWebAuthnRegistrationChallengeForLoggedInUser","removeWebAuthnRegistration","credId","credentialId","removeWebAuthnRegistrationFromLoggedInUser","input","removeContactFromLoggedInUser","sendExpiringValidationToken","addContactToLoggedInUser","addWebAuthnRegistrationToLoggedInUser","applicationName","deviceLabel","data","webAuthn","performLoginCmd","login","loginCmd","performLogin","refreshJwtToken","oldJwtToken","StringRatchet","trimToNull","err","executeExpiringTokenBasedLogin","expiringToken","WardenContactType","WardenCustomerMessageType","WardenStoreRegistrationResponseType","WardenWebAuthnTransportFutureType","WardenUtils","extractContactsOfType","req","type","contactMethods","filter","s","map","value","validLoginRequest","validContact","jwtTokenToRefresh","stringToWardenContact","stringToContactType","teamRolesToRoles","teamRoles","length","t","teamRoleToRoleString","roleStringsToTeamRoles","roles","roleStringToTeamRole","role","indexOf","sp","split","team","tr","stringIsEmailAddress","EmailAddress","stringIsPhoneNumber","TextCapablePhoneNumber","match","stripWardenEntryToSummary","we","userLabel","webAuthnAuthenticatorSummaries","webAuthnAuthenticators","stripWardenWebAuthnEntryToSummary","origin","credentialIdBase64","wrapperIsExpired","userObject","exp","expirationEpochSeconds","Date","now","WardenDelegatingCurrentUserProvidingUserServiceEventProcessingProvider","wrapped","serveExpiredCredentials","_currentUserSubject","BehaviorSubject","val","getValue","info","currentUserSubject","next","jwtToken","onAutomaticLogout","onAutomaticTokenRefresh","refreshUser","onLoginFailure","reason","onLogout","onSuccessfulLogin","newUser","WardenUserService","options","loggedInTimerSubscription","_autoRefreshEnabled","stored","loggedInUserProvider","fetchLoggedInUserWrapper","logOutUser","eventProcessor","timerSeconds","loginCheckTimerPingSeconds","timer","subscribe","checkForAutoLogoutOrRefresh","cleanShutDown","unsubscribe","serviceOptions","wardenClient","recentLoginProvider","saveNewUser","autoRefreshEnabled","newValue","allowAutoRefresh","Error","debug","current","thresholdSeconds","autoLoginHandlingThresholdSeconds","Math","floor","result","refreshToken","logout","tmp","loggedInUserHasRole","testRole","toLowerCase","find","r","isLoggedIn","fetchLoggedInUserJwtObject","fetchLoggedInUserJwtToken","fetchLoggedInUserObject","user","fetchLoggedInUserExpirationEpochSeconds","fetchLoggedInUserRemainingSeconds","updateLoggedInUserFromTokenString","token","JwtRatchet","decodeTokenNoVerify","setLoggedInUserWrapper","updateRecentLoginsFromWardenEntrySummary","loginData","currentWrapper","newToken","sendExpiringCode","processWardenLoginResults","res","saveRecentLogin","updateRecentLoginsFromLoggedInUserWrapper","executeWebAuthnBasedLogin","executeWebAuthnLoginToWardenLoginResults","executeValidationTokenBasedLogin","createUserIfMissing","saveCurrentDeviceAsWebAuthnForCurrentUser","creds","startRegistration","trimToEmpty","deviceLabelGenerator","defaultDeviceLabelGenerator","output","navigator","userAgent","platform","startAuthentication","WardenClientAbstractRecentLoginProvider","entry","list","fetchCache","push","lastLoginEpochMS","updateCache","removeUser","c","fetchAllLogins","Object","assign","clearAllLogins","WardenClientLocalStorageLoggedInUserProvider","localStorageKey","notNullUndefinedOrOnlyWhitespaceString","localStorage","getItem","wrapper","setItem","removeItem","WardenClientLocalStorageRecentLoginProvider","super","WardenClientTransientMemoryLoggedInUserProvider","WardenClientTransientMemoryRecentLoginProvider","_cache"],"mappings":"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"}