@forward-software/react-auth 1.1.0 → 2.0.1
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.
- package/LICENSE +2 -2
- package/README.md +91 -44
- package/dist/auth.d.ts +237 -0
- package/dist/auth.js +215 -0
- package/dist/index.d.ts +2 -21
- package/dist/index.js +1 -8
- package/dist/{types/eventEmitter.d.ts → utils.d.ts} +17 -10
- package/dist/utils.js +30 -0
- package/package.json +30 -59
- package/src/auth.tsx +546 -0
- package/src/index.ts +2 -0
- package/src/{types/eventEmitter.ts → utils.ts} +25 -2
- package/dist/react-auth.cjs.development.js +0 -789
- package/dist/react-auth.cjs.development.js.map +0 -1
- package/dist/react-auth.cjs.production.min.js +0 -2
- package/dist/react-auth.cjs.production.min.js.map +0 -1
- package/dist/react-auth.esm.js +0 -781
- package/dist/react-auth.esm.js.map +0 -1
- package/dist/types/deferred.d.ts +0 -7
- package/dist/types/index.d.ts +0 -56
- package/src/index.tsx +0 -98
- package/src/types/deferred.ts +0 -18
- package/src/types/index.ts +0 -298
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-auth.cjs.development.js","sources":["../src/types/deferred.ts","../src/types/eventEmitter.ts","../src/types/index.ts","../src/index.tsx"],"sourcesContent":["export class Deferred<T> {\n private promise: Promise<T>;\n\n public resolve!: (value: T | PromiseLike<T>) => void;\n\n public reject!: (reason?: any) => void;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n\n public getPromise(): Promise<T> {\n return this.promise;\n }\n}\n","type EventsMap = Record<string, any>;\n\nexport type EventKey<T extends EventsMap> = string & keyof T;\n\nexport type EventReceiver<T> = (params: T) => void;\n\ninterface Emitter<T extends EventsMap> {\n on<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>): void;\n off<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>): void;\n emit<K extends EventKey<T>>(eventName: K, params: T[K]): void;\n}\n\n// TODO: Improve -> `listeners` are unbounded -- don't use this in practice!\nexport function createEventEmitter<T extends EventsMap>(): Emitter<T> {\n const listeners: {\n [K in keyof EventsMap]?: Array<(p: EventsMap[K]) => void>;\n } = {};\n\n return {\n on(key, fn) {\n listeners[key] = (listeners[key] || []).concat(fn);\n },\n off(key, fn) {\n listeners[key] = (listeners[key] || []).filter(f => f !== fn);\n },\n emit(key, data) {\n (listeners[key] || []).forEach(function(fn) {\n try {\n fn(data);\n } catch {}\n });\n },\n };\n}\n","import { Deferred } from './deferred';\nimport { createEventEmitter, EventKey, EventReceiver } from './eventEmitter';\n\ntype AuthTokens = {};\n\ntype AuthCredentials = {};\n\ntype AuthEventsMap<E extends Error> = {\n initSuccess: undefined;\n\n initFailed: E;\n\n loginStarted: undefined;\n\n loginSuccess: undefined;\n\n loginFailed: E;\n\n refreshStarted: undefined;\n\n refreshSuccess: undefined;\n\n refreshFailed: E;\n\n logoutStarted: undefined;\n\n logoutSuccess: undefined;\n\n logoutFailed: E;\n};\n\ntype SubscribeFn = () => void;\n\ntype UnsubscribeFn = () => boolean;\n\ntype AuthClientState<T> = {\n isAuthenticated: boolean;\n\n isInitialized: boolean;\n\n tokens: Partial<T>;\n};\n\nexport abstract class BaseAuthClient<\n T = AuthTokens,\n C = AuthCredentials,\n E extends Error = Error\n> {\n private _state: Readonly<AuthClientState<T>> = {\n isAuthenticated: false,\n isInitialized: false,\n tokens: {},\n };\n\n // refresh queue - used to avoid concurrency issue during Token refresh\n private refreshQ: Array<Deferred<boolean>> = [];\n\n private eventEmitter = createEventEmitter<AuthEventsMap<E>>();\n\n private subscribers: Set<SubscribeFn> = new Set();\n\n //\n // Getters\n //\n\n public get isInitialized() {\n return this._state.isInitialized;\n }\n\n public get isAuthenticated() {\n return this._state.isAuthenticated;\n }\n\n public get tokens() {\n return this._state.tokens;\n }\n\n //\n // Public methods\n //\n\n public async init(): Promise<boolean> {\n try {\n await this.onInit();\n\n this.setState({\n isInitialized: true,\n });\n\n this.emit('initSuccess', undefined);\n } catch (error) {\n this.setState({\n isInitialized: false,\n });\n\n this.emit('initFailed', error as E);\n }\n\n await this.onPostInit?.();\n\n return this.isInitialized;\n }\n\n public async login(credentials?: C): Promise<boolean> {\n this.emit('loginStarted', undefined);\n\n await this.onPreLogin?.();\n\n let isSuccess: boolean = false;\n\n try {\n const tokens = await this.onLogin(credentials);\n\n this.setState({\n isAuthenticated: true,\n tokens,\n });\n\n this.emit('loginSuccess', undefined);\n\n isSuccess = true;\n } catch (err) {\n this.setState({\n isAuthenticated: false,\n tokens: {},\n });\n\n this.emit('loginFailed', err as E);\n\n isSuccess = false;\n }\n\n await this.onPostLogin?.(isSuccess);\n\n return this.isAuthenticated;\n }\n\n public async refresh(minValidity?: number): Promise<boolean> {\n const deferred = new Deferred<boolean>();\n\n this.runRefresh(deferred, minValidity);\n\n return deferred.getPromise();\n }\n\n public async logout(): Promise<void> {\n this.emit('logoutStarted', undefined);\n\n await this.onPreLogout?.();\n\n let isSuccess: boolean = false;\n\n try {\n await this.onLogout();\n\n this.setState({\n isAuthenticated: false,\n tokens: {},\n });\n\n this.emit('logoutSuccess', undefined);\n\n isSuccess = true;\n } catch (err) {\n this.emit('logoutFailed', err as E);\n\n isSuccess = false;\n }\n\n await this.onPostLogout?.(isSuccess);\n }\n\n public on<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n listener: EventReceiver<AuthEventsMap<E>[K]>\n ): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n public off<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n listener: EventReceiver<AuthEventsMap<E>[K]>\n ): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n // Should be declared like this to avoid binding issues when used by useSyncExternalStore\n public subscribe = (subscription: SubscribeFn): UnsubscribeFn => {\n this.subscribers.add(subscription);\n\n return () => this.subscribers.delete(subscription);\n };\n\n // Should be declared like this to avoid binding issues when used by useSyncExternalStore\n public getSnapshot = (): AuthClientState<T> => {\n return this._state;\n };\n\n //\n // Protected methods\n //\n\n protected setState(stateUpdate: Partial<AuthClientState<T>>): void {\n this._state = {\n ...this._state,\n ...stateUpdate,\n };\n\n this.notifySubscribers();\n }\n\n //\n // Private methods\n //\n\n private async runRefresh(\n deferred: Deferred<boolean>,\n minValidity?: number\n ): Promise<void> {\n // Add deferred Promise to refresh queue\n this.refreshQ.push(deferred);\n\n // If refresh queue already has promises enqueued do not attempt a new refresh - one is already in progress\n if (this.refreshQ.length !== 1) {\n return;\n }\n\n this.emit('refreshStarted', undefined);\n\n await this.onPreRefresh?.();\n\n let isAuthenticated: boolean = false;\n let tokens: Partial<T> = {};\n\n try {\n tokens = await this.onRefresh(minValidity);\n isAuthenticated = true;\n\n this.emit('refreshSuccess', undefined);\n } catch (err) {\n isAuthenticated = false;\n\n this.emit('refreshFailed', err as E);\n }\n\n this.setState({\n isAuthenticated,\n tokens,\n });\n\n await this.onPostRefresh?.(isAuthenticated);\n\n for (let p = this.refreshQ.pop(); p != null; p = this.refreshQ.pop()) {\n p.resolve(isAuthenticated);\n }\n }\n\n private emit<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n error: AuthEventsMap<E>[K]\n ): void {\n this.eventEmitter.emit(eventName, error);\n }\n\n private notifySubscribers() {\n this.subscribers.forEach(s => {\n try {\n s();\n } catch {}\n });\n }\n\n //\n // Abstract methods\n //\n\n protected abstract onInit(): Promise<void>;\n\n protected onPostInit?(): Promise<void>;\n\n protected onPreLogin?(): Promise<void>;\n\n protected abstract onLogin(credentials?: C): Promise<T>;\n\n protected onPostLogin?(isSuccess: boolean): Promise<void>;\n\n protected onPreRefresh?(): Promise<void>;\n\n protected abstract onRefresh(minValidity?: number): Promise<T>;\n\n protected onPostRefresh?(isSuccess: boolean): Promise<void>;\n\n protected onPreLogout?(): Promise<void>;\n\n protected abstract onLogout(): Promise<void>;\n\n protected onPostLogout?(isSuccess: boolean): Promise<void>;\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\n\nimport { BaseAuthClient } from './types';\n\n/**\n * Props that can be passed to AuthProvider\n */\nexport type AuthProviderProps = {\n children?: React.ReactNode;\n\n /**\n * An optional component to display if AuthClient initialization failed.\n */\n ErrorComponent?: JSX.Element;\n\n /**\n * An optional component to display while AuthClient instance is being initialized.\n */\n LoadingComponent?: JSX.Element;\n};\n\ntype AuthProviderState = {\n isAuthenticated: boolean;\n\n isInitialized: boolean;\n};\n\ntype AuthContext<C extends BaseAuthClient> = AuthProviderState & {\n authClient: C;\n};\n\nexport function createAuth<C extends BaseAuthClient>(authClient: C) {\n // Create a React context containing a BaseAuthClient instance.\n const authContext = createContext<AuthContext<C> | null>(null);\n\n // Create the React Context Provider for the BaseAuthClient instance.\n const AuthProvider: React.FC<AuthProviderProps> = ({\n children,\n ErrorComponent,\n LoadingComponent,\n }) => {\n const [isInitFailed, setInitFailed] = useState(false);\n const { isAuthenticated, isInitialized } = useSyncExternalStore(\n authClient.subscribe,\n authClient.getSnapshot\n );\n\n useEffect(() => {\n async function initAuthClient() {\n // Call init function\n const initSuccess = await authClient.init();\n setInitFailed(!initSuccess);\n }\n\n // Init AuthClient\n initAuthClient();\n }, []);\n\n if (!!ErrorComponent && isInitFailed) {\n return ErrorComponent;\n }\n\n if (!!LoadingComponent && !isInitialized) {\n return LoadingComponent;\n }\n\n return (\n <authContext.Provider\n value={{\n authClient,\n isAuthenticated,\n isInitialized,\n }}\n >\n {children}\n </authContext.Provider>\n );\n };\n\n // Retrieve the AuthClient from the current context\n const useAuthClient = function(): C {\n const ctx = useContext(authContext);\n\n if (!ctx) {\n throw new Error('useAuthClient hook should be used inside AuthProvider');\n }\n\n return ctx.authClient;\n };\n\n return {\n AuthProvider,\n useAuthClient,\n };\n}\n\nexport { BaseAuthClient };\n"],"names":["Deferred","promise","Promise","resolve","reject","getPromise","createEventEmitter","listeners","on","key","fn","concat","off","filter","f","emit","data","forEach","BaseAuthClient","isAuthenticated","isInitialized","tokens","Set","subscription","subscribers","add","_state","init","onInit","setState","undefined","onPostInit","login","credentials","onPreLogin","isSuccess","onLogin","onPostLogin","refresh","minValidity","deferred","runRefresh","logout","onPreLogout","onLogout","onPostLogout","eventName","listener","eventEmitter","stateUpdate","notifySubscribers","refreshQ","push","length","onPreRefresh","onRefresh","onPostRefresh","p","pop","error","s","createAuth","authClient","authContext","createContext","AuthProvider","children","ErrorComponent","LoadingComponent","useState","isInitFailed","setInitFailed","useSyncExternalStore","subscribe","getSnapshot","useEffect","initAuthClient","initSuccess","React","Provider","value","useAuthClient","ctx","useContext","Error"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,e=require("react"),r=(t=e)&&"object"==typeof t&&"default"in t?t.default:t,n=require("use-sync-external-store/shim");function i(){i=function(){return t};var t={},e=Object.prototype,r=e.hasOwnProperty,n=Object.defineProperty||function(t,e,r){t[e]=r.value},o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",u=o.toStringTag||"@@toStringTag";function c(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,r){return t[e]=r}}function h(t,e,r,i){var o=Object.create((e&&e.prototype instanceof p?e:p).prototype),a=new P(i||[]);return n(o,"_invoke",{value:L(t,r,a)}),o}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=h;var l={};function p(){}function v(){}function d(){}var y={};c(y,a,(function(){return this}));var g=Object.getPrototypeOf,m=g&&g(g(_([])));m&&m!==e&&r.call(m,a)&&(y=m);var w=d.prototype=p.prototype=Object.create(y);function b(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function x(t,e){var i;n(this,"_invoke",{value:function(n,o){function a(){return new e((function(i,a){!function n(i,o,a,s){var u=f(t[i],t,o);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==typeof h&&r.call(h,"__await")?e.resolve(h.__await).then((function(t){n("next",t,a,s)}),(function(t){n("throw",t,a,s)})):e.resolve(h).then((function(t){c.value=t,a(c)}),(function(t){return n("throw",t,a,s)}))}s(u.arg)}(n,o,i,a)}))}return i=i?i.then(a,a):a()}})}function L(t,e,r){var n="suspendedStart";return function(i,o){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===i)throw o;return{value:void 0,done:!0}}for(r.method=i,r.arg=o;;){var a=r.delegate;if(a){var s=E(a,r);if(s){if(s===l)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=f(t,e,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===l)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}function E(t,e){var r=t.iterator[e.method];if(void 0===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=void 0,E(t,e),"throw"===e.method))return l;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return l}var n=f(r,t.iterator,e.arg);if("throw"===n.type)return e.method="throw",e.arg=n.arg,e.delegate=null,l;var i=n.arg;return i?i.done?(e[t.resultName]=i.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,l):i:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,l)}function k(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function S(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function P(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(k,this),this.reset(!0)}function _(t){if(t){var e=t[a];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:j}}function j(){return{value:void 0,done:!0}}return v.prototype=d,n(w,"constructor",{value:d,configurable:!0}),n(d,"constructor",{value:v,configurable:!0}),v.displayName=c(d,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===v||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,d):(t.__proto__=d,c(t,u,"GeneratorFunction")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},b(x.prototype),c(x.prototype,s,(function(){return this})),t.AsyncIterator=x,t.async=function(e,r,n,i,o){void 0===o&&(o=Promise);var a=new x(h(e,r,n,i),o);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},b(w),c(w,u,"Generator"),c(w,a,(function(){return this})),c(w,"toString",(function(){return"[object Generator]"})),t.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},t.values=_,P.prototype={constructor:P,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(S),!t)for(var e in this)"t"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return a.type="throw",a.arg=t,e.next=r,n&&(e.method="next",e.arg=void 0),!!n}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),u=r.call(o,"finallyLoc");if(s&&u){if(this.prev<o.catchLoc)return n(o.catchLoc,!0);if(this.prev<o.finallyLoc)return n(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return n(o.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return n(o.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=t,a.arg=e,o?(this.method="next",this.next=o.finallyLoc,l):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),l},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),S(r),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;S(r)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:_(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=void 0),l}},t}function o(t,e,r,n,i,o,a){try{var s=t[o](a),u=s.value}catch(t){return void r(t)}s.done?e(u):Promise.resolve(u).then(n,i)}function a(t){return function(){var e=this,r=arguments;return new Promise((function(n,i){var a=t.apply(e,r);function s(t){o(a,n,i,s,u,"next",t)}function u(t){o(a,n,i,s,u,"throw",t)}s(void 0)}))}}function s(){return(s=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(this,arguments)}var u=function(){function t(){var t=this;this.promise=new Promise((function(e,r){t.reject=r,t.resolve=e}))}return t.prototype.getPromise=function(){return this.promise},t}();exports.BaseAuthClient=function(){function t(){var t,e=this;this._state={isAuthenticated:!1,isInitialized:!1,tokens:{}},this.refreshQ=[],this.eventEmitter=(t={},{on:function(e,r){t[e]=(t[e]||[]).concat(r)},off:function(e,r){t[e]=(t[e]||[]).filter((function(t){return t!==r}))},emit:function(e,r){(t[e]||[]).forEach((function(t){try{t(r)}catch(t){}}))}}),this.subscribers=new Set,this.subscribe=function(t){return e.subscribers.add(t),function(){return e.subscribers.delete(t)}},this.getSnapshot=function(){return e._state}}var e,r,n=t.prototype;return n.init=function(){var t=a(i().mark((function t(){var e;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.onInit();case 3:this.setState({isInitialized:!0}),this.emit("initSuccess",void 0),t.next=11;break;case 7:t.prev=7,t.t0=t.catch(0),this.setState({isInitialized:!1}),this.emit("initFailed",t.t0);case 11:return t.next=13,null==(e=this.onPostInit)?void 0:e.call(this);case 13:return t.abrupt("return",this.isInitialized);case 14:case"end":return t.stop()}}),t,this,[[0,7]])})));return function(){return t.apply(this,arguments)}}(),n.login=function(){var t=a(i().mark((function t(e){var r,n,o;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.emit("loginStarted",void 0),t.next=3,null==(r=this.onPreLogin)?void 0:r.call(this);case 3:return o=!1,t.prev=4,t.next=7,this.onLogin(e);case 7:this.setState({isAuthenticated:!0,tokens:t.sent}),this.emit("loginSuccess",void 0),o=!0,t.next=18;break;case 13:t.prev=13,t.t0=t.catch(4),this.setState({isAuthenticated:!1,tokens:{}}),this.emit("loginFailed",t.t0),o=!1;case 18:return t.next=20,null==(n=this.onPostLogin)?void 0:n.call(this,o);case 20:return t.abrupt("return",this.isAuthenticated);case 21:case"end":return t.stop()}}),t,this,[[4,13]])})));return function(e){return t.apply(this,arguments)}}(),n.refresh=function(){var t=a(i().mark((function t(e){var r;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=new u,this.runRefresh(r,e),t.abrupt("return",r.getPromise());case 3:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),n.logout=function(){var t=a(i().mark((function t(){var e,r,n;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.emit("logoutStarted",void 0),t.next=3,null==(e=this.onPreLogout)?void 0:e.call(this);case 3:return n=!1,t.prev=4,t.next=7,this.onLogout();case 7:this.setState({isAuthenticated:!1,tokens:{}}),this.emit("logoutSuccess",void 0),n=!0,t.next=16;break;case 12:t.prev=12,t.t0=t.catch(4),this.emit("logoutFailed",t.t0),n=!1;case 16:return t.next=18,null==(r=this.onPostLogout)?void 0:r.call(this,n);case 18:case"end":return t.stop()}}),t,this,[[4,12]])})));return function(){return t.apply(this,arguments)}}(),n.on=function(t,e){this.eventEmitter.on(t,e)},n.off=function(t,e){this.eventEmitter.off(t,e)},n.setState=function(t){this._state=s({},this._state,t),this.notifySubscribers()},n.runRefresh=function(){var t=a(i().mark((function t(e,r){var n,o,a,s,u;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.refreshQ.push(e),1===this.refreshQ.length){t.next=3;break}return t.abrupt("return");case 3:return this.emit("refreshStarted",void 0),t.next=6,null==(n=this.onPreRefresh)?void 0:n.call(this);case 6:return a=!1,s={},t.prev=8,t.next=11,this.onRefresh(r);case 11:s=t.sent,a=!0,this.emit("refreshSuccess",void 0),t.next=20;break;case 16:t.prev=16,t.t0=t.catch(8),a=!1,this.emit("refreshFailed",t.t0);case 20:return this.setState({isAuthenticated:a,tokens:s}),t.next=23,null==(o=this.onPostRefresh)?void 0:o.call(this,a);case 23:for(u=this.refreshQ.pop();null!=u;u=this.refreshQ.pop())u.resolve(a);case 24:case"end":return t.stop()}}),t,this,[[8,16]])})));return function(e,r){return t.apply(this,arguments)}}(),n.emit=function(t,e){this.eventEmitter.emit(t,e)},n.notifySubscribers=function(){this.subscribers.forEach((function(t){try{t()}catch(t){}}))},e=t,(r=[{key:"isInitialized",get:function(){return this._state.isInitialized}},{key:"isAuthenticated",get:function(){return this._state.isAuthenticated}},{key:"tokens",get:function(){return this._state.tokens}}])&&function(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}(e.prototype,r),Object.defineProperty(e,"prototype",{writable:!1}),t}(),exports.createAuth=function(t){var o=e.createContext(null);return{AuthProvider:function(s){var u=s.children,c=s.ErrorComponent,h=s.LoadingComponent,f=e.useState(!1),l=f[0],p=f[1],v=n.useSyncExternalStore(t.subscribe,t.getSnapshot),d=v.isAuthenticated,y=v.isInitialized;return e.useEffect((function(){function e(){return(e=a(i().mark((function e(){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.init();case 2:p(!e.sent);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),c&&l?c:h&&!y?h:r.createElement(o.Provider,{value:{authClient:t,isAuthenticated:d,isInitialized:y}},u)},useAuthClient:function(){var t=e.useContext(o);if(!t)throw new Error("useAuthClient hook should be used inside AuthProvider");return t.authClient}}};
|
|
2
|
-
//# sourceMappingURL=react-auth.cjs.production.min.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-auth.cjs.production.min.js","sources":["../src/types/deferred.ts","../src/types/index.ts","../src/types/eventEmitter.ts","../src/index.tsx"],"sourcesContent":["export class Deferred<T> {\n private promise: Promise<T>;\n\n public resolve!: (value: T | PromiseLike<T>) => void;\n\n public reject!: (reason?: any) => void;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n\n public getPromise(): Promise<T> {\n return this.promise;\n }\n}\n","import { Deferred } from './deferred';\nimport { createEventEmitter, EventKey, EventReceiver } from './eventEmitter';\n\ntype AuthTokens = {};\n\ntype AuthCredentials = {};\n\ntype AuthEventsMap<E extends Error> = {\n initSuccess: undefined;\n\n initFailed: E;\n\n loginStarted: undefined;\n\n loginSuccess: undefined;\n\n loginFailed: E;\n\n refreshStarted: undefined;\n\n refreshSuccess: undefined;\n\n refreshFailed: E;\n\n logoutStarted: undefined;\n\n logoutSuccess: undefined;\n\n logoutFailed: E;\n};\n\ntype SubscribeFn = () => void;\n\ntype UnsubscribeFn = () => boolean;\n\ntype AuthClientState<T> = {\n isAuthenticated: boolean;\n\n isInitialized: boolean;\n\n tokens: Partial<T>;\n};\n\nexport abstract class BaseAuthClient<\n T = AuthTokens,\n C = AuthCredentials,\n E extends Error = Error\n> {\n private _state: Readonly<AuthClientState<T>> = {\n isAuthenticated: false,\n isInitialized: false,\n tokens: {},\n };\n\n // refresh queue - used to avoid concurrency issue during Token refresh\n private refreshQ: Array<Deferred<boolean>> = [];\n\n private eventEmitter = createEventEmitter<AuthEventsMap<E>>();\n\n private subscribers: Set<SubscribeFn> = new Set();\n\n //\n // Getters\n //\n\n public get isInitialized() {\n return this._state.isInitialized;\n }\n\n public get isAuthenticated() {\n return this._state.isAuthenticated;\n }\n\n public get tokens() {\n return this._state.tokens;\n }\n\n //\n // Public methods\n //\n\n public async init(): Promise<boolean> {\n try {\n await this.onInit();\n\n this.setState({\n isInitialized: true,\n });\n\n this.emit('initSuccess', undefined);\n } catch (error) {\n this.setState({\n isInitialized: false,\n });\n\n this.emit('initFailed', error as E);\n }\n\n await this.onPostInit?.();\n\n return this.isInitialized;\n }\n\n public async login(credentials?: C): Promise<boolean> {\n this.emit('loginStarted', undefined);\n\n await this.onPreLogin?.();\n\n let isSuccess: boolean = false;\n\n try {\n const tokens = await this.onLogin(credentials);\n\n this.setState({\n isAuthenticated: true,\n tokens,\n });\n\n this.emit('loginSuccess', undefined);\n\n isSuccess = true;\n } catch (err) {\n this.setState({\n isAuthenticated: false,\n tokens: {},\n });\n\n this.emit('loginFailed', err as E);\n\n isSuccess = false;\n }\n\n await this.onPostLogin?.(isSuccess);\n\n return this.isAuthenticated;\n }\n\n public async refresh(minValidity?: number): Promise<boolean> {\n const deferred = new Deferred<boolean>();\n\n this.runRefresh(deferred, minValidity);\n\n return deferred.getPromise();\n }\n\n public async logout(): Promise<void> {\n this.emit('logoutStarted', undefined);\n\n await this.onPreLogout?.();\n\n let isSuccess: boolean = false;\n\n try {\n await this.onLogout();\n\n this.setState({\n isAuthenticated: false,\n tokens: {},\n });\n\n this.emit('logoutSuccess', undefined);\n\n isSuccess = true;\n } catch (err) {\n this.emit('logoutFailed', err as E);\n\n isSuccess = false;\n }\n\n await this.onPostLogout?.(isSuccess);\n }\n\n public on<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n listener: EventReceiver<AuthEventsMap<E>[K]>\n ): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n public off<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n listener: EventReceiver<AuthEventsMap<E>[K]>\n ): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n // Should be declared like this to avoid binding issues when used by useSyncExternalStore\n public subscribe = (subscription: SubscribeFn): UnsubscribeFn => {\n this.subscribers.add(subscription);\n\n return () => this.subscribers.delete(subscription);\n };\n\n // Should be declared like this to avoid binding issues when used by useSyncExternalStore\n public getSnapshot = (): AuthClientState<T> => {\n return this._state;\n };\n\n //\n // Protected methods\n //\n\n protected setState(stateUpdate: Partial<AuthClientState<T>>): void {\n this._state = {\n ...this._state,\n ...stateUpdate,\n };\n\n this.notifySubscribers();\n }\n\n //\n // Private methods\n //\n\n private async runRefresh(\n deferred: Deferred<boolean>,\n minValidity?: number\n ): Promise<void> {\n // Add deferred Promise to refresh queue\n this.refreshQ.push(deferred);\n\n // If refresh queue already has promises enqueued do not attempt a new refresh - one is already in progress\n if (this.refreshQ.length !== 1) {\n return;\n }\n\n this.emit('refreshStarted', undefined);\n\n await this.onPreRefresh?.();\n\n let isAuthenticated: boolean = false;\n let tokens: Partial<T> = {};\n\n try {\n tokens = await this.onRefresh(minValidity);\n isAuthenticated = true;\n\n this.emit('refreshSuccess', undefined);\n } catch (err) {\n isAuthenticated = false;\n\n this.emit('refreshFailed', err as E);\n }\n\n this.setState({\n isAuthenticated,\n tokens,\n });\n\n await this.onPostRefresh?.(isAuthenticated);\n\n for (let p = this.refreshQ.pop(); p != null; p = this.refreshQ.pop()) {\n p.resolve(isAuthenticated);\n }\n }\n\n private emit<K extends EventKey<AuthEventsMap<E>>>(\n eventName: K,\n error: AuthEventsMap<E>[K]\n ): void {\n this.eventEmitter.emit(eventName, error);\n }\n\n private notifySubscribers() {\n this.subscribers.forEach(s => {\n try {\n s();\n } catch {}\n });\n }\n\n //\n // Abstract methods\n //\n\n protected abstract onInit(): Promise<void>;\n\n protected onPostInit?(): Promise<void>;\n\n protected onPreLogin?(): Promise<void>;\n\n protected abstract onLogin(credentials?: C): Promise<T>;\n\n protected onPostLogin?(isSuccess: boolean): Promise<void>;\n\n protected onPreRefresh?(): Promise<void>;\n\n protected abstract onRefresh(minValidity?: number): Promise<T>;\n\n protected onPostRefresh?(isSuccess: boolean): Promise<void>;\n\n protected onPreLogout?(): Promise<void>;\n\n protected abstract onLogout(): Promise<void>;\n\n protected onPostLogout?(isSuccess: boolean): Promise<void>;\n}\n","type EventsMap = Record<string, any>;\n\nexport type EventKey<T extends EventsMap> = string & keyof T;\n\nexport type EventReceiver<T> = (params: T) => void;\n\ninterface Emitter<T extends EventsMap> {\n on<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>): void;\n off<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>): void;\n emit<K extends EventKey<T>>(eventName: K, params: T[K]): void;\n}\n\n// TODO: Improve -> `listeners` are unbounded -- don't use this in practice!\nexport function createEventEmitter<T extends EventsMap>(): Emitter<T> {\n const listeners: {\n [K in keyof EventsMap]?: Array<(p: EventsMap[K]) => void>;\n } = {};\n\n return {\n on(key, fn) {\n listeners[key] = (listeners[key] || []).concat(fn);\n },\n off(key, fn) {\n listeners[key] = (listeners[key] || []).filter(f => f !== fn);\n },\n emit(key, data) {\n (listeners[key] || []).forEach(function(fn) {\n try {\n fn(data);\n } catch {}\n });\n },\n };\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\n\nimport { BaseAuthClient } from './types';\n\n/**\n * Props that can be passed to AuthProvider\n */\nexport type AuthProviderProps = {\n children?: React.ReactNode;\n\n /**\n * An optional component to display if AuthClient initialization failed.\n */\n ErrorComponent?: JSX.Element;\n\n /**\n * An optional component to display while AuthClient instance is being initialized.\n */\n LoadingComponent?: JSX.Element;\n};\n\ntype AuthProviderState = {\n isAuthenticated: boolean;\n\n isInitialized: boolean;\n};\n\ntype AuthContext<C extends BaseAuthClient> = AuthProviderState & {\n authClient: C;\n};\n\nexport function createAuth<C extends BaseAuthClient>(authClient: C) {\n // Create a React context containing a BaseAuthClient instance.\n const authContext = createContext<AuthContext<C> | null>(null);\n\n // Create the React Context Provider for the BaseAuthClient instance.\n const AuthProvider: React.FC<AuthProviderProps> = ({\n children,\n ErrorComponent,\n LoadingComponent,\n }) => {\n const [isInitFailed, setInitFailed] = useState(false);\n const { isAuthenticated, isInitialized } = useSyncExternalStore(\n authClient.subscribe,\n authClient.getSnapshot\n );\n\n useEffect(() => {\n async function initAuthClient() {\n // Call init function\n const initSuccess = await authClient.init();\n setInitFailed(!initSuccess);\n }\n\n // Init AuthClient\n initAuthClient();\n }, []);\n\n if (!!ErrorComponent && isInitFailed) {\n return ErrorComponent;\n }\n\n if (!!LoadingComponent && !isInitialized) {\n return LoadingComponent;\n }\n\n return (\n <authContext.Provider\n value={{\n authClient,\n isAuthenticated,\n isInitialized,\n }}\n >\n {children}\n </authContext.Provider>\n );\n };\n\n // Retrieve the AuthClient from the current context\n const useAuthClient = function(): C {\n const ctx = useContext(authContext);\n\n if (!ctx) {\n throw new Error('useAuthClient hook should be used inside AuthProvider');\n }\n\n return ctx.authClient;\n };\n\n return {\n AuthProvider,\n useAuthClient,\n };\n}\n\nexport { BaseAuthClient };\n"],"names":["Deferred","this","promise","Promise","resolve","reject","_this","getPromise","listeners","isAuthenticated","isInitialized","tokens","on","key","fn","concat","off","filter","f","emit","data","forEach","Set","subscription","subscribers","add","_state","_proto","init","_context","onInit","setState","undefined","onPostInit","_this$onPostInit","login","credentials","_context2","onPreLogin","_this$onPreLogin","isSuccess","onLogin","onPostLogin","_this$onPostLogin","refresh","minValidity","deferred","runRefresh","logout","_context4","onPreLogout","_this$onPreLogout","onLogout","onPostLogout","_this$onPostLogout","eventName","listener","eventEmitter","stateUpdate","notifySubscribers","refreshQ","push","length","_context5","onPreRefresh","_this$onPreRefresh","onRefresh","onPostRefresh","_this$onPostRefresh","p","pop","error","s","get","authClient","authContext","createContext","AuthProvider","children","ErrorComponent","LoadingComponent","useState","isInitFailed","setInitFailed","useSyncExternalStore","subscribe","getSnapshot","useEffect","_initAuthClient","initAuthClient","React","Provider","value","useAuthClient","ctx","useContext","Error"],"mappings":"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"}
|