@tern-secure/auth 1.1.0-canary.v20251108045933 → 1.1.0-canary.v20251125170702

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 (275) hide show
  1. package/dist/492_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  2. package/dist/687_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  3. package/dist/68_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  4. package/dist/framework_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  5. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  6. package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  7. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
  8. package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  9. package/dist/ternsecure.browser.js +30 -0
  10. package/dist/ternsecure.css +2 -0
  11. package/dist/ternsecure.js +17 -0
  12. package/dist/ternsecure.mjs +17 -0
  13. package/dist/types/auth/AuthCookieManager.d.ts +0 -1
  14. package/dist/types/auth/cookies/authTime_cookie.d.ts +0 -1
  15. package/dist/types/index.browser.d.ts +1 -0
  16. package/dist/types/index.d.ts +3 -10
  17. package/dist/types/instance/c_coreApiClient.d.ts +2 -2
  18. package/dist/types/instance/constants.d.ts +3 -0
  19. package/dist/types/instance/coreApiClient.d.ts +0 -1
  20. package/dist/types/instance/events.d.ts +0 -1
  21. package/dist/types/instance/{TernAuth.d.ts → ternsecure.d.ts} +31 -7
  22. package/dist/types/lib/utils.d.ts +2 -0
  23. package/dist/types/resources/Base.d.ts +16 -3
  24. package/dist/types/resources/Error.d.ts +0 -1
  25. package/dist/types/resources/Session.d.ts +2 -2
  26. package/dist/types/resources/SignIn.d.ts +27 -10
  27. package/dist/types/resources/SignUp.d.ts +12 -10
  28. package/dist/types/resources/internal.d.ts +1 -2
  29. package/dist/types/ui/Renderer.d.ts +26 -0
  30. package/dist/types/ui/common/ProviderInitialIcon.d.ts +6 -0
  31. package/dist/types/ui/common/VerificationCodeCard.d.ts +12 -0
  32. package/dist/types/ui/common/VerificationLinkCard.d.ts +7 -0
  33. package/dist/types/ui/common/constants.d.ts +8 -0
  34. package/dist/types/ui/common/index.d.ts +3 -0
  35. package/dist/types/ui/components/sign-in/ResetPassword.d.ts +1 -0
  36. package/dist/types/ui/components/sign-in/ResetPasswordSuccess.d.ts +1 -0
  37. package/dist/types/ui/components/sign-in/SignIn.d.ts +4 -0
  38. package/dist/types/ui/components/sign-in/SignInEmailLinkCard.d.ts +2 -0
  39. package/dist/types/ui/components/sign-in/SignInFactorOne.d.ts +1 -0
  40. package/dist/types/ui/components/sign-in/SignInFactorOneCodeForm.d.ts +7 -0
  41. package/dist/types/ui/components/sign-in/SignInFactorOnePasswordCard.d.ts +6 -0
  42. package/dist/types/ui/components/sign-in/SignInFactorOnePhoneCodeCard.d.ts +7 -0
  43. package/dist/types/ui/components/sign-in/SignInPassword.d.ts +8 -0
  44. package/dist/types/ui/components/sign-in/SignInSocialButtons.d.ts +1 -0
  45. package/dist/types/ui/components/sign-in/SignInStart.d.ts +7 -0
  46. package/dist/types/ui/components/sign-in/SignInVerifyEmail.d.ts +1 -0
  47. package/dist/types/ui/components/sign-in/index.d.ts +4 -0
  48. package/dist/types/ui/components/sign-up/SignUp.d.ts +8 -0
  49. package/dist/types/ui/components/sign-up/SignUpEmailLinkCard.d.ts +2 -0
  50. package/dist/types/ui/components/sign-up/SignUpSocialButtons.d.ts +1 -0
  51. package/dist/types/ui/components/sign-up/SignUpStart.d.ts +1 -0
  52. package/dist/types/ui/components/sign-up/SignUpVerifyEmail.d.ts +1 -0
  53. package/dist/types/ui/components/sign-up/index.d.ts +2 -0
  54. package/dist/types/ui/components/sign-up/util.d.ts +14 -0
  55. package/dist/types/ui/components/user-button/index.d.ts +1 -0
  56. package/dist/types/ui/components/user-button/userButton.d.ts +1 -0
  57. package/dist/types/ui/ctx/TernAuthContext.d.ts +4 -0
  58. package/dist/types/ui/ctx/TernAuthUIComponentCtx.d.ts +8 -0
  59. package/dist/types/ui/ctx/TernSecureContextWrapper.d.ts +8 -0
  60. package/dist/types/ui/ctx/TernSecureOptions.d.ts +10 -0
  61. package/dist/types/ui/ctx/components/SignIn.d.ts +21 -0
  62. package/dist/types/ui/ctx/components/SignUp.d.ts +14 -0
  63. package/dist/types/ui/ctx/components/UserButton.d.ts +10 -0
  64. package/dist/types/ui/ctx/components/index.d.ts +3 -0
  65. package/dist/types/ui/ctx/index.d.ts +4 -0
  66. package/dist/types/ui/ctx/utils.d.ts +3 -0
  67. package/dist/types/ui/customize/FieldControl.d.ts +15 -0
  68. package/dist/types/ui/customize/FieldLabelControl.d.ts +11 -0
  69. package/dist/types/ui/customize/Form.d.ts +36 -0
  70. package/dist/types/ui/elements/CodeControl.d.ts +47 -0
  71. package/dist/types/ui/elements/ErrorCard.d.ts +10 -0
  72. package/dist/types/ui/elements/LoadingCard.d.ts +1 -0
  73. package/dist/types/ui/elements/RouterLink.d.ts +42 -0
  74. package/dist/types/ui/elements/SocialButtons.d.ts +6 -0
  75. package/dist/types/ui/elements/TimerButton.d.ts +9 -0
  76. package/dist/types/ui/elements/alert.d.ts +8 -0
  77. package/dist/types/ui/elements/avatar.d.ts +6 -0
  78. package/dist/types/ui/elements/button.d.ts +10 -0
  79. package/dist/types/ui/elements/card.d.ts +9 -0
  80. package/dist/types/ui/elements/ctx/CardStateCtx.d.ts +26 -0
  81. package/dist/types/ui/elements/ctx/index.d.ts +1 -0
  82. package/dist/types/ui/elements/field.d.ts +24 -0
  83. package/dist/types/ui/elements/index.d.ts +16 -0
  84. package/dist/types/ui/elements/input.d.ts +3 -0
  85. package/dist/types/ui/elements/label.d.ts +4 -0
  86. package/dist/types/ui/elements/separator.d.ts +4 -0
  87. package/dist/types/ui/hooks/index.d.ts +6 -0
  88. package/dist/types/ui/hooks/useEmailLink.d.ts +11 -0
  89. package/dist/types/ui/hooks/useFetch.d.ts +44 -0
  90. package/dist/types/ui/hooks/useLoadingStatus.d.ts +14 -0
  91. package/dist/types/ui/hooks/useNavigateToFlowStart.d.ts +3 -0
  92. package/dist/types/ui/hooks/useSafeState.d.ts +9 -0
  93. package/dist/types/ui/hooks/useWindowEventListener.d.ts +3 -0
  94. package/dist/types/ui/icons/index.d.ts +13 -0
  95. package/dist/types/ui/lazyLoading/common.d.ts +2 -0
  96. package/dist/types/ui/lazyLoading/components.d.ts +11 -0
  97. package/dist/types/ui/lazyLoading/providersCtx.d.ts +26 -0
  98. package/dist/types/ui/portal/index.d.ts +12 -0
  99. package/dist/types/ui/router/BaseRouter.d.ts +21 -0
  100. package/dist/types/ui/router/HashRouter.d.ts +8 -0
  101. package/dist/types/ui/router/PathRouter.d.ts +8 -0
  102. package/dist/types/ui/router/Route.d.ts +19 -0
  103. package/dist/types/ui/router/RouterCtx.d.ts +32 -0
  104. package/dist/types/ui/router/Switch.d.ts +4 -0
  105. package/dist/types/ui/router/index.d.ts +7 -0
  106. package/dist/types/ui/router/newPaths.d.ts +1 -0
  107. package/dist/types/ui/router/pathToRegexp.d.ts +127 -0
  108. package/dist/types/ui/types.d.ts +18 -0
  109. package/dist/types/ui/utils/form.d.ts +19 -0
  110. package/dist/types/ui/utils/index.d.ts +1 -0
  111. package/dist/types/ui/utils/sleep.d.ts +1 -0
  112. package/dist/types/utils/construct.d.ts +3 -1
  113. package/dist/types/utils/index.d.ts +1 -1
  114. package/dist/types/utils/normalizeRoutingOptions.d.ts +6 -0
  115. package/dist/types/utils/path.d.ts +0 -1
  116. package/dist/types/utils/querystring.d.ts +0 -1
  117. package/dist/types/utils/redirectUrls.d.ts +4 -9
  118. package/dist/types/utils/windowNavigate.d.ts +0 -1
  119. package/dist/ui-common_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  120. package/dist/userbutton_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  121. package/dist/vendors_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
  122. package/package.json +63 -24
  123. package/dist/cjs/auth/AuthCookieManager.js +0 -113
  124. package/dist/cjs/auth/AuthCookieManager.js.map +0 -1
  125. package/dist/cjs/auth/cookies/authTime_cookie.js +0 -62
  126. package/dist/cjs/auth/cookies/authTime_cookie.js.map +0 -1
  127. package/dist/cjs/auth/request.js +0 -159
  128. package/dist/cjs/auth/request.js.map +0 -1
  129. package/dist/cjs/global.d.js +0 -2
  130. package/dist/cjs/global.d.js.map +0 -1
  131. package/dist/cjs/index.js +0 -47
  132. package/dist/cjs/index.js.map +0 -1
  133. package/dist/cjs/instance/TernAuth.js +0 -524
  134. package/dist/cjs/instance/TernAuth.js.map +0 -1
  135. package/dist/cjs/instance/TernAuthServer.js +0 -95
  136. package/dist/cjs/instance/TernAuthServer.js.map +0 -1
  137. package/dist/cjs/instance/c_coreApiClient.js +0 -264
  138. package/dist/cjs/instance/c_coreApiClient.js.map +0 -1
  139. package/dist/cjs/instance/coreApiClient.js +0 -255
  140. package/dist/cjs/instance/coreApiClient.js.map +0 -1
  141. package/dist/cjs/instance/events.js +0 -39
  142. package/dist/cjs/instance/events.js.map +0 -1
  143. package/dist/cjs/instance/jwtClient.js +0 -72
  144. package/dist/cjs/instance/jwtClient.js.map +0 -1
  145. package/dist/cjs/resources/Base.js +0 -137
  146. package/dist/cjs/resources/Base.js.map +0 -1
  147. package/dist/cjs/resources/Error.js +0 -31
  148. package/dist/cjs/resources/Error.js.map +0 -1
  149. package/dist/cjs/resources/Session.js +0 -105
  150. package/dist/cjs/resources/Session.js.map +0 -1
  151. package/dist/cjs/resources/SignIn.js +0 -256
  152. package/dist/cjs/resources/SignIn.js.map +0 -1
  153. package/dist/cjs/resources/SignUp.js +0 -72
  154. package/dist/cjs/resources/SignUp.js.map +0 -1
  155. package/dist/cjs/resources/Token.js +0 -32
  156. package/dist/cjs/resources/Token.js.map +0 -1
  157. package/dist/cjs/resources/UserData.js +0 -43
  158. package/dist/cjs/resources/UserData.js.map +0 -1
  159. package/dist/cjs/resources/cookie.js +0 -154
  160. package/dist/cjs/resources/cookie.js.map +0 -1
  161. package/dist/cjs/resources/index.js +0 -23
  162. package/dist/cjs/resources/index.js.map +0 -1
  163. package/dist/cjs/resources/internal.js +0 -35
  164. package/dist/cjs/resources/internal.js.map +0 -1
  165. package/dist/cjs/utils/construct.js +0 -253
  166. package/dist/cjs/utils/construct.js.map +0 -1
  167. package/dist/cjs/utils/index.js +0 -29
  168. package/dist/cjs/utils/index.js.map +0 -1
  169. package/dist/cjs/utils/jwt.js +0 -46
  170. package/dist/cjs/utils/jwt.js.map +0 -1
  171. package/dist/cjs/utils/mapDecode.js +0 -33
  172. package/dist/cjs/utils/mapDecode.js.map +0 -1
  173. package/dist/cjs/utils/path.js +0 -33
  174. package/dist/cjs/utils/path.js.map +0 -1
  175. package/dist/cjs/utils/querystring.js +0 -70
  176. package/dist/cjs/utils/querystring.js.map +0 -1
  177. package/dist/cjs/utils/redirectUrls.js +0 -156
  178. package/dist/cjs/utils/redirectUrls.js.map +0 -1
  179. package/dist/cjs/utils/windowNavigate.js +0 -45
  180. package/dist/cjs/utils/windowNavigate.js.map +0 -1
  181. package/dist/esm/auth/AuthCookieManager.js +0 -89
  182. package/dist/esm/auth/AuthCookieManager.js.map +0 -1
  183. package/dist/esm/auth/cookies/authTime_cookie.js +0 -38
  184. package/dist/esm/auth/cookies/authTime_cookie.js.map +0 -1
  185. package/dist/esm/auth/request.js +0 -134
  186. package/dist/esm/auth/request.js.map +0 -1
  187. package/dist/esm/global.d.js +0 -1
  188. package/dist/esm/global.d.js.map +0 -1
  189. package/dist/esm/index.js +0 -16
  190. package/dist/esm/index.js.map +0 -1
  191. package/dist/esm/instance/TernAuth.js +0 -510
  192. package/dist/esm/instance/TernAuth.js.map +0 -1
  193. package/dist/esm/instance/TernAuthServer.js +0 -73
  194. package/dist/esm/instance/TernAuthServer.js.map +0 -1
  195. package/dist/esm/instance/c_coreApiClient.js +0 -236
  196. package/dist/esm/instance/c_coreApiClient.js.map +0 -1
  197. package/dist/esm/instance/coreApiClient.js +0 -226
  198. package/dist/esm/instance/coreApiClient.js.map +0 -1
  199. package/dist/esm/instance/events.js +0 -14
  200. package/dist/esm/instance/events.js.map +0 -1
  201. package/dist/esm/instance/jwtClient.js +0 -47
  202. package/dist/esm/instance/jwtClient.js.map +0 -1
  203. package/dist/esm/resources/Base.js +0 -113
  204. package/dist/esm/resources/Base.js.map +0 -1
  205. package/dist/esm/resources/Error.js +0 -9
  206. package/dist/esm/resources/Error.js.map +0 -1
  207. package/dist/esm/resources/Session.js +0 -81
  208. package/dist/esm/resources/Session.js.map +0 -1
  209. package/dist/esm/resources/SignIn.js +0 -240
  210. package/dist/esm/resources/SignIn.js.map +0 -1
  211. package/dist/esm/resources/SignUp.js +0 -48
  212. package/dist/esm/resources/SignUp.js.map +0 -1
  213. package/dist/esm/resources/Token.js +0 -8
  214. package/dist/esm/resources/Token.js.map +0 -1
  215. package/dist/esm/resources/UserData.js +0 -19
  216. package/dist/esm/resources/UserData.js.map +0 -1
  217. package/dist/esm/resources/cookie.js +0 -130
  218. package/dist/esm/resources/cookie.js.map +0 -1
  219. package/dist/esm/resources/index.js +0 -2
  220. package/dist/esm/resources/index.js.map +0 -1
  221. package/dist/esm/resources/internal.js +0 -8
  222. package/dist/esm/resources/internal.js.map +0 -1
  223. package/dist/esm/utils/construct.js +0 -215
  224. package/dist/esm/utils/construct.js.map +0 -1
  225. package/dist/esm/utils/index.js +0 -5
  226. package/dist/esm/utils/index.js.map +0 -1
  227. package/dist/esm/utils/jwt.js +0 -22
  228. package/dist/esm/utils/jwt.js.map +0 -1
  229. package/dist/esm/utils/mapDecode.js +0 -9
  230. package/dist/esm/utils/mapDecode.js.map +0 -1
  231. package/dist/esm/utils/path.js +0 -9
  232. package/dist/esm/utils/path.js.map +0 -1
  233. package/dist/esm/utils/querystring.js +0 -45
  234. package/dist/esm/utils/querystring.js.map +0 -1
  235. package/dist/esm/utils/redirectUrls.js +0 -132
  236. package/dist/esm/utils/redirectUrls.js.map +0 -1
  237. package/dist/esm/utils/windowNavigate.js +0 -19
  238. package/dist/esm/utils/windowNavigate.js.map +0 -1
  239. package/dist/types/auth/AuthCookieManager.d.ts.map +0 -1
  240. package/dist/types/auth/cookies/authTime_cookie.d.ts.map +0 -1
  241. package/dist/types/auth/request.d.ts +0 -49
  242. package/dist/types/auth/request.d.ts.map +0 -1
  243. package/dist/types/index.d.ts.map +0 -1
  244. package/dist/types/instance/TernAuth.d.ts.map +0 -1
  245. package/dist/types/instance/TernAuthServer.d.ts +0 -32
  246. package/dist/types/instance/TernAuthServer.d.ts.map +0 -1
  247. package/dist/types/instance/c_coreApiClient.d.ts.map +0 -1
  248. package/dist/types/instance/coreApiClient.d.ts.map +0 -1
  249. package/dist/types/instance/events.d.ts.map +0 -1
  250. package/dist/types/instance/jwtClient.d.ts +0 -22
  251. package/dist/types/instance/jwtClient.d.ts.map +0 -1
  252. package/dist/types/resources/Base.d.ts.map +0 -1
  253. package/dist/types/resources/Error.d.ts.map +0 -1
  254. package/dist/types/resources/Session.d.ts.map +0 -1
  255. package/dist/types/resources/SignIn.d.ts.map +0 -1
  256. package/dist/types/resources/SignUp.d.ts.map +0 -1
  257. package/dist/types/resources/Token.d.ts +0 -5
  258. package/dist/types/resources/Token.d.ts.map +0 -1
  259. package/dist/types/resources/UserData.d.ts +0 -8
  260. package/dist/types/resources/UserData.d.ts.map +0 -1
  261. package/dist/types/resources/cookie.d.ts +0 -24
  262. package/dist/types/resources/cookie.d.ts.map +0 -1
  263. package/dist/types/resources/index.d.ts +0 -2
  264. package/dist/types/resources/index.d.ts.map +0 -1
  265. package/dist/types/resources/internal.d.ts.map +0 -1
  266. package/dist/types/utils/construct.d.ts.map +0 -1
  267. package/dist/types/utils/index.d.ts.map +0 -1
  268. package/dist/types/utils/jwt.d.ts +0 -12
  269. package/dist/types/utils/jwt.d.ts.map +0 -1
  270. package/dist/types/utils/mapDecode.d.ts +0 -4
  271. package/dist/types/utils/mapDecode.d.ts.map +0 -1
  272. package/dist/types/utils/path.d.ts.map +0 -1
  273. package/dist/types/utils/querystring.d.ts.map +0 -1
  274. package/dist/types/utils/redirectUrls.d.ts.map +0 -1
  275. package/dist/types/utils/windowNavigate.d.ts.map +0 -1
@@ -1,510 +0,0 @@
1
- import { handleFirebaseAuthError } from "@tern-secure/shared/errors";
2
- import { createTernAuthEventBus, ternEvents } from "@tern-secure/shared/ternStatusEvent";
3
- import { stripScheme } from "@tern-secure/shared/url";
4
- import { handleValueOrFn } from "@tern-secure/shared/utils";
5
- import { getApps, initializeApp } from "firebase/app";
6
- import {
7
- browserLocalPersistence,
8
- browserPopupRedirectResolver,
9
- browserSessionPersistence,
10
- connectAuthEmulator,
11
- getIdToken,
12
- getRedirectResult,
13
- initializeAuth,
14
- inMemoryPersistence,
15
- onAuthStateChanged,
16
- onIdTokenChanged
17
- } from "firebase/auth";
18
- import { getInstallations } from "firebase/installations";
19
- import { AuthCookieManager, Session, SignIn, SignUp, TernSecureBase } from "../resources/internal";
20
- import { ALLOWED_PROTOCOLS, buildURL, stripOrigin, windowNavigate } from "../utils/";
21
- import { RedirectUrls } from "../utils/redirectUrls";
22
- import { createCoreApiClient } from "./c_coreApiClient";
23
- import { eventBus, events } from "./events";
24
- function inBrowser() {
25
- return typeof window !== "undefined";
26
- }
27
- class TernSecureAuth {
28
- static version = "1.1.0-canary.v20251108045933";
29
- static sdkMetadata = {
30
- name: "@tern-secure/auth",
31
- version: "1.1.0-canary.v20251108045933",
32
- environment: process.env.NODE_ENV || "production"
33
- };
34
- static instance = null;
35
- _currentUser = null;
36
- signedInSession = null;
37
- firebaseClientApp;
38
- authStateUnsubscribe = null;
39
- auth;
40
- csrfToken;
41
- isLoading = false;
42
- error = null;
43
- user = null;
44
- __internal_country;
45
- #domain;
46
- #apiClient;
47
- #apiUrl;
48
- #instanceType;
49
- #status = "loading";
50
- #listeners = [];
51
- #options = {};
52
- #authCookieManager;
53
- #publicEventBus = createTernAuthEventBus();
54
- signIn;
55
- signUp;
56
- session;
57
- get isReady() {
58
- return this.status === "ready";
59
- }
60
- get status() {
61
- return this.#status;
62
- }
63
- get version() {
64
- return TernSecureAuth.version;
65
- }
66
- set sdkMetadata(metadata) {
67
- TernSecureAuth.sdkMetadata = metadata;
68
- }
69
- get sdkMetadata() {
70
- return TernSecureAuth.sdkMetadata;
71
- }
72
- get requiresVerification() {
73
- return this.#options.requiresVerification ?? true;
74
- }
75
- get apiUrl() {
76
- return this.#apiUrl;
77
- }
78
- get domain() {
79
- if (inBrowser()) {
80
- const strippedDomainString = stripScheme(
81
- handleValueOrFn(this.#domain, new URL(window.location.href))
82
- );
83
- if (this.#instanceType === "production") {
84
- return strippedDomainString;
85
- }
86
- return strippedDomainString;
87
- }
88
- return "";
89
- }
90
- get instanceType() {
91
- return this.#instanceType;
92
- }
93
- constructor(options) {
94
- var _a;
95
- this.#domain = (_a = options == null ? void 0 : options.ternSecureConfig) == null ? void 0 : _a.authDomain;
96
- this.#apiUrl = (options == null ? void 0 : options.apiUrl) || "";
97
- this.#instanceType = process.env.NODE_ENV || "production";
98
- this.#apiClient = createCoreApiClient({
99
- domain: this.#domain,
100
- apiUrl: options == null ? void 0 : options.apiUrl,
101
- instanceType: this.instanceType
102
- });
103
- this.#publicEventBus.emit(ternEvents.Status, "loading");
104
- TernSecureBase.ternsecure = this;
105
- }
106
- getApiClient = () => this.#apiClient;
107
- setLoading(isLoading) {
108
- this.isLoading = isLoading;
109
- }
110
- authCookieManager() {
111
- return this.#authCookieManager;
112
- }
113
- _internal_getOption(key) {
114
- return this.#options[key];
115
- }
116
- _internal_getAllOptions() {
117
- return Object.freeze({ ...this.#options });
118
- }
119
- static getOrCreateInstance(options) {
120
- if (!this.instance) {
121
- this.instance = new TernSecureAuth(options);
122
- }
123
- return this.instance;
124
- }
125
- static clearInstance() {
126
- if (TernSecureAuth.instance) {
127
- if (TernSecureAuth.instance.authStateUnsubscribe) {
128
- TernSecureAuth.instance.authStateUnsubscribe();
129
- TernSecureAuth.instance.authStateUnsubscribe = null;
130
- }
131
- TernSecureAuth.instance = null;
132
- }
133
- }
134
- static initialize(options) {
135
- const instance = this.getOrCreateInstance(options);
136
- instance.#initialize(options);
137
- return instance;
138
- }
139
- initialize = async (options) => {
140
- void this.#initialize(options || {});
141
- };
142
- static create(options) {
143
- const instance = this.getOrCreateInstance();
144
- void instance.initialize(options);
145
- return instance;
146
- }
147
- #initialize = (options) => {
148
- this.#options = this.#initOptions(options);
149
- try {
150
- if (!this.#options.ternSecureConfig) {
151
- throw new Error("TernSecureConfig is required to initialize TernSecureAuth");
152
- }
153
- if (!this.#options.apiUrl) {
154
- throw new Error("apiUrl is required to initialize TernSecureAuth");
155
- }
156
- this.initializeFirebaseApp(this.#options.ternSecureConfig, {
157
- appName: this.#options.appName,
158
- tenantId: this.#options.tenantId
159
- });
160
- const isBrowserCookiePersistence = this.#options.persistence === "browserCookie";
161
- if (!isBrowserCookiePersistence) {
162
- this.authStateUnsubscribe = this.initAuthStateListener();
163
- }
164
- this.#authCookieManager = new AuthCookieManager();
165
- this.csrfToken = this.#authCookieManager.getCSRFToken();
166
- this.signIn = new SignIn(this.auth, this.csrfToken);
167
- this.signUp = new SignUp(this.auth);
168
- eventBus.on(events.SessionChanged, () => {
169
- this.#setCreatedActiveSession(this.user || null);
170
- this.#emit();
171
- });
172
- this.#setStatus("ready");
173
- this.#publicEventBus.emit(ternEvents.Status, "ready");
174
- } catch (error) {
175
- this.error = error;
176
- this.#setStatus("error");
177
- this.#publicEventBus.emit(ternEvents.Status, "error");
178
- throw error;
179
- }
180
- };
181
- initializeFirebaseApp(config, options) {
182
- const appName = (options == null ? void 0 : options.appName) || "[DEFAULT]";
183
- this.firebaseClientApp = getApps().length === 0 ? initializeApp(config, appName) : getApps()[0];
184
- const persistence = this.#setPersistence();
185
- const auth = initializeAuth(this.firebaseClientApp, {
186
- persistence,
187
- popupRedirectResolver: browserPopupRedirectResolver
188
- });
189
- this.auth = auth;
190
- if (options == null ? void 0 : options.tenantId) {
191
- this.auth.tenantId = options.tenantId;
192
- }
193
- this.#configureEmulator();
194
- getInstallations(this.firebaseClientApp);
195
- }
196
- signOut = async (options) => {
197
- const redirectUrl = (options == null ? void 0 : options.redirectUrl) || this.#constructAfterSignOutUrl();
198
- if (options == null ? void 0 : options.onBeforeSignOut) {
199
- await options.onBeforeSignOut();
200
- }
201
- await this.auth.signOut();
202
- if (options == null ? void 0 : options.onAfterSignOut) {
203
- await options.onAfterSignOut();
204
- }
205
- await this.navigate(redirectUrl);
206
- eventBus.emit(events.UserSignOut, null);
207
- eventBus.emit(events.TokenUpdate, { token: null });
208
- this.#emit();
209
- };
210
- get currentSession() {
211
- return this.signedInSession;
212
- }
213
- initAuthListener() {
214
- (async () => {
215
- await this.auth.authStateReady();
216
- const user = this.auth.currentUser;
217
- this._currentUser = user;
218
- this.user = user;
219
- await this.updateCurrentSession();
220
- this.#emit();
221
- })();
222
- return () => {
223
- };
224
- }
225
- initAuthStateListener() {
226
- return onAuthStateChanged(this.auth, async (user) => {
227
- await this.auth.authStateReady();
228
- this._currentUser = user;
229
- this.user = user;
230
- await this.updateCurrentSession();
231
- this.#emit();
232
- });
233
- }
234
- _onIdTokenChanged() {
235
- return onIdTokenChanged(this.auth, async (user) => {
236
- await this.auth.authStateReady();
237
- this._currentUser = user;
238
- this.user = user;
239
- await this.updateCurrentSession();
240
- this.#emit();
241
- });
242
- }
243
- async getIdToken() {
244
- await this.auth.authStateReady();
245
- if (!this.auth.currentUser) {
246
- return null;
247
- }
248
- return getIdToken(this.auth.currentUser);
249
- }
250
- onAuthStateChanged(callback) {
251
- return onAuthStateChanged(this.auth, callback);
252
- }
253
- onIdTokenChanged(callback) {
254
- return onIdTokenChanged(this.auth, callback);
255
- }
256
- async updateCurrentSession() {
257
- if (!this._currentUser) {
258
- this.signedInSession = null;
259
- return;
260
- }
261
- try {
262
- const res = await this._currentUser.getIdTokenResult();
263
- this.signedInSession = {
264
- status: "active",
265
- token: res.token,
266
- claims: res.claims,
267
- issuedAtTime: res.issuedAtTime,
268
- expirationTime: res.expirationTime,
269
- authTime: res.authTime,
270
- signInProvider: res.signInProvider || "unknown",
271
- signInSecondFactor: res.signInSecondFactor
272
- };
273
- } catch (error) {
274
- console.error("[TernSecureAuth] Error updating session:", error);
275
- this.signedInSession = null;
276
- }
277
- }
278
- checkRedirectResult = async () => {
279
- try {
280
- const result = await getRedirectResult(this.auth);
281
- if (result) {
282
- return {
283
- status: "success",
284
- user: result.user
285
- };
286
- }
287
- return null;
288
- } catch (error) {
289
- const authError = handleFirebaseAuthError(error);
290
- return {
291
- status: "error",
292
- message: authError.message,
293
- error: authError.code
294
- };
295
- }
296
- };
297
- getRedirectResult = async () => {
298
- return this.checkRedirectResult();
299
- };
300
- addListener = (listener) => {
301
- this.#listeners.push(listener);
302
- if (this._currentUser) {
303
- listener({
304
- user: this._currentUser,
305
- session: this.signedInSession
306
- });
307
- }
308
- const unsubscribe = () => {
309
- this.#listeners = this.#listeners.filter((l) => l !== listener);
310
- };
311
- return unsubscribe;
312
- };
313
- on = (...args) => {
314
- this.#publicEventBus.on(...args);
315
- };
316
- off = (...args) => {
317
- this.#publicEventBus.off(...args);
318
- };
319
- createActiveSession = async ({
320
- session,
321
- redirectUrl
322
- }) => {
323
- try {
324
- if (!session) {
325
- throw new Error("No session provided to createActiveSession");
326
- }
327
- const sessionResult = await session.getIdTokenResult();
328
- const sessionData = new Session(sessionResult);
329
- await sessionData.create(this.csrfToken || "");
330
- if (redirectUrl) {
331
- await this.navigate(this.constructUrlWithAuthRedirect(redirectUrl));
332
- }
333
- this.#setCreatedActiveSession(session);
334
- this.#emit();
335
- } catch (error) {
336
- console.error("[TernSecureAuth] Error creating active session:", error);
337
- }
338
- };
339
- navigate = async (to, options) => {
340
- if (!to || !inBrowser()) {
341
- return;
342
- }
343
- let toURL = new URL(to, window.location.href);
344
- if (!this.#allowedRedirectProtocols.includes(toURL.protocol)) {
345
- console.warn(
346
- `TernSecureAuth: "${toURL.protocol}" is not a valid protocol. Redirecting to "/" instead. If you think this is a mistake, please open an issue.`
347
- );
348
- toURL = new URL("/", window.location.href);
349
- }
350
- const customNavigate = (options == null ? void 0 : options.replace) && this.#options.routerReplace ? this.#options.routerReplace : this.#options.routerPush;
351
- if (toURL.origin !== "null" && toURL.origin !== window.location.origin || !customNavigate) {
352
- windowNavigate(toURL);
353
- return;
354
- }
355
- const metadata = {
356
- ...(options == null ? void 0 : options.metadata) ? { __internal_metadata: options == null ? void 0 : options.metadata } : {},
357
- windowNavigate
358
- };
359
- return await customNavigate(stripOrigin(toURL), metadata);
360
- };
361
- constructUrlWithAuthRedirect = (to) => {
362
- if (this.#instanceType === "production") {
363
- return to;
364
- }
365
- const baseUrl = window.location.origin;
366
- const url = new URL(to, baseUrl);
367
- if (url.origin === window.location.origin) {
368
- return url.href;
369
- }
370
- return url.toString();
371
- };
372
- #buildUrl = (key, options) => {
373
- if (!key || !this.isReady) {
374
- return "";
375
- }
376
- const baseUrlConfig = key === "signInUrl" ? this.#options.signInUrl : this.#options.signUpUrl;
377
- const defaultPagePath = key === "signInUrl" ? "/sign-in" : "/sign-up";
378
- const base = baseUrlConfig || defaultPagePath;
379
- const redirectUrls = new RedirectUrls(this.#options, options).toSearchParams();
380
- const constructedUrl = buildURL(
381
- {
382
- base,
383
- hashSearchParams: [redirectUrls]
384
- },
385
- {
386
- stringify: true,
387
- skipOrigin: false
388
- }
389
- );
390
- return this.constructUrlWithAuthRedirect(constructedUrl);
391
- };
392
- #constructAfterSignInUrl = () => {
393
- return this.constructUrlWithAuthRedirect(new RedirectUrls(this.#options).getAfterSignInUrl());
394
- };
395
- #constructAfterSignOutUrl = () => {
396
- if (!this.#options.afterSignOutUrl) {
397
- return "/";
398
- }
399
- return this.constructUrlWithAuthRedirect(this.#options.afterSignOutUrl);
400
- };
401
- redirectToSignIn = async (options) => {
402
- if (inBrowser()) {
403
- return this.navigate(this.constructSignInUrl(options));
404
- }
405
- return;
406
- };
407
- redirectToSignUp = async (options) => {
408
- if (inBrowser()) {
409
- return this.navigate(this.constructSignUpUrl());
410
- }
411
- return;
412
- };
413
- redirectAfterSignIn = async () => {
414
- if (inBrowser()) {
415
- return this.navigate(this.#constructAfterSignInUrl());
416
- }
417
- return;
418
- };
419
- redirectAfterSignUp = () => {
420
- throw new Error("redirectAfterSignUp is not implemented yet");
421
- };
422
- constructSignInUrl = (options) => {
423
- return this.#buildUrl("signInUrl", {
424
- ...options,
425
- signInForceRedirectUrl: (options == null ? void 0 : options.signInForceRedirectUrl) || window.location.href
426
- });
427
- };
428
- constructSignUpUrl = (options) => {
429
- return this.#buildUrl("signUpUrl", {
430
- ...options,
431
- signUpForceRedirectUrl: (options == null ? void 0 : options.signUpForceRedirectUrl) || window.location.href
432
- });
433
- };
434
- get #allowedRedirectProtocols() {
435
- let allowedProtocols = ALLOWED_PROTOCOLS;
436
- if (this.#options.allowedRedirectProtocols) {
437
- allowedProtocols = allowedProtocols.concat(this.#options.allowedRedirectProtocols);
438
- }
439
- return allowedProtocols;
440
- }
441
- __internal_setCountry = (country) => {
442
- if (!this.__internal_country) {
443
- this.__internal_country = country;
444
- }
445
- };
446
- #initOptions = (options) => {
447
- return {
448
- ...options
449
- };
450
- };
451
- #emit = () => {
452
- for (const listener of this.#listeners) {
453
- listener({
454
- user: this.user,
455
- session: this.signedInSession
456
- });
457
- }
458
- };
459
- #setStatus(newStatus) {
460
- if (this.#status !== newStatus) {
461
- this.#status = newStatus;
462
- this.#publicEventBus.emit(ternEvents.Status, this.#status);
463
- if (newStatus === "ready") {
464
- this.#publicEventBus.emit(ternEvents.Status, "ready");
465
- }
466
- }
467
- }
468
- #setCreatedActiveSession = (session) => {
469
- this.user = session;
470
- this._currentUser = session;
471
- };
472
- #setPersistence = () => {
473
- const persistenceType = this.#options.persistence;
474
- switch (persistenceType) {
475
- case "browserCookie":
476
- return inMemoryPersistence;
477
- case "session":
478
- return browserSessionPersistence;
479
- case "local":
480
- return browserLocalPersistence;
481
- case "none":
482
- default:
483
- return inMemoryPersistence;
484
- }
485
- };
486
- #emulatorHost = () => {
487
- if (typeof process === "undefined") return void 0;
488
- return process.env.FIREBASE_AUTH_EMULATOR_HOST;
489
- };
490
- #configureEmulator = () => {
491
- const host = this.#emulatorHost();
492
- const isDev = this.#instanceType === "development";
493
- const shouldUseEmulator = isDev && !!host;
494
- if (!shouldUseEmulator || !host) {
495
- return;
496
- }
497
- const emulatorUrl = host.startsWith("http") ? host : `http://${host}`;
498
- try {
499
- connectAuthEmulator(this.auth, emulatorUrl, { disableWarnings: false });
500
- console.warn(`[TernSecure] Firebase Auth Emulator connected at ${emulatorUrl}`);
501
- } catch (error) {
502
- console.error("[TernSecure] Error connecting to Firebase Auth Emulator:", error);
503
- }
504
- };
505
- }
506
- export {
507
- TernSecureAuth,
508
- inBrowser
509
- };
510
- //# sourceMappingURL=TernAuth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/instance/TernAuth.ts"],"sourcesContent":["import { handleFirebaseAuthError } from '@tern-secure/shared/errors';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { stripScheme } from '@tern-secure/shared/url';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSession,\n DomainOrProxyUrl,\n InstanceType,\n ListenerCallback,\n NavigateOptions,\n RedirectOptions,\n SessionResource,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignInResponse,\n SignOut,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernAuthSDK,\n TernSecureAuth as TernSecureAuthInterface,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n TernSecureConfig,\n TernSecureResources,\n TernSecureUser,\n UnsubscribeCallback,\n} from '@tern-secure/types';\nimport type { FirebaseApp } from 'firebase/app';\nimport { getApps, initializeApp } from 'firebase/app';\nimport type { Auth, Auth as TernAuth } from 'firebase/auth';\nimport {\n browserLocalPersistence,\n browserPopupRedirectResolver,\n browserSessionPersistence,\n connectAuthEmulator,\n getIdToken,\n getRedirectResult,\n initializeAuth,\n inMemoryPersistence,\n onAuthStateChanged,\n onIdTokenChanged,\n} from 'firebase/auth';\nimport { getInstallations } from 'firebase/installations';\n\nimport { AuthCookieManager, Session, SignIn, SignUp, TernSecureBase } from '../resources/internal';\nimport { ALLOWED_PROTOCOLS, buildURL, stripOrigin, windowNavigate } from '../utils/';\nimport { RedirectUrls } from '../utils/redirectUrls';\nimport { type ApiClient, createCoreApiClient } from './c_coreApiClient';\nimport { eventBus, events } from './events';\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nexport { TernAuth };\n\n/**\n * Firebase implementation of the TernSecureAuth interface\n */\nexport class TernSecureAuth implements TernSecureAuthInterface {\n public static version: string = PACKAGE_VERSION;\n public static sdkMetadata: TernAuthSDK = {\n name: PACKAGE_NAME,\n version: PACKAGE_VERSION,\n environment: process.env.NODE_ENV || 'production',\n };\n private static instance: TernSecureAuth | null = null;\n private _currentUser: TernSecureUser | null = null;\n private signedInSession: SignedInSession | null = null;\n private firebaseClientApp: FirebaseApp | undefined;\n private authStateUnsubscribe: (() => void) | null = null;\n private auth!: Auth;\n private csrfToken: string | undefined;\n public isLoading = false;\n public error: Error | null = null;\n public user: TernSecureUser | null | undefined = null;\n public __internal_country?: string | null;\n #domain: DomainOrProxyUrl['domain'];\n #apiClient: ApiClient;\n #apiUrl: string;\n #instanceType?: InstanceType;\n #status: TernSecureAuthInterface['status'] = 'loading';\n #listeners: Array<(emission: TernSecureResources) => void> = [];\n #options: TernSecureAuthOptions = {};\n #authCookieManager?: AuthCookieManager;\n #publicEventBus = createTernAuthEventBus();\n\n signIn!: SignInResource | null | undefined;\n signUp!: SignUpResource | null | undefined;\n session!: SessionResource | null | undefined;\n\n get isReady(): boolean {\n return this.status === 'ready';\n }\n\n get status(): TernSecureAuthInterface['status'] {\n return this.#status;\n }\n\n get version(): string {\n return TernSecureAuth.version;\n }\n\n set sdkMetadata(metadata: TernAuthSDK) {\n TernSecureAuth.sdkMetadata = metadata;\n }\n\n get sdkMetadata(): TernAuthSDK {\n return TernSecureAuth.sdkMetadata;\n }\n\n get requiresVerification(): boolean {\n return this.#options.requiresVerification ?? true;\n }\n\n get apiUrl(): string {\n return this.#apiUrl;\n }\n\n get domain(): string {\n if (inBrowser()) {\n const strippedDomainString = stripScheme(\n handleValueOrFn(this.#domain, new URL(window.location.href)),\n );\n if (this.#instanceType === 'production') {\n return strippedDomainString;\n }\n return strippedDomainString;\n }\n return '';\n }\n\n get instanceType() {\n return this.#instanceType;\n }\n\n public constructor(options?: TernSecureAuthOptions) {\n this.#domain = options?.ternSecureConfig?.authDomain;\n this.#apiUrl = options?.apiUrl || '';\n this.#instanceType = (process.env.NODE_ENV as InstanceType) || 'production';\n\n this.#apiClient = createCoreApiClient({\n domain: this.#domain,\n apiUrl: options?.apiUrl,\n instanceType: this.instanceType as InstanceType,\n });\n\n this.#publicEventBus.emit(ternEvents.Status, 'loading');\n TernSecureBase.ternsecure = this;\n }\n\n public getApiClient = (): ApiClient => this.#apiClient;\n\n public setLoading(isLoading: boolean): void {\n this.isLoading = isLoading;\n }\n\n public authCookieManager(): AuthCookieManager | undefined {\n return this.#authCookieManager;\n }\n\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] {\n return this.#options[key];\n }\n\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.#options });\n }\n\n static getOrCreateInstance(options?: TernSecureAuthOptions): TernSecureAuth {\n if (!this.instance) {\n this.instance = new TernSecureAuth(options);\n }\n return this.instance;\n }\n\n static clearInstance() {\n if (TernSecureAuth.instance) {\n if (TernSecureAuth.instance.authStateUnsubscribe) {\n TernSecureAuth.instance.authStateUnsubscribe();\n TernSecureAuth.instance.authStateUnsubscribe = null;\n }\n TernSecureAuth.instance = null;\n }\n }\n\n public static initialize(options: TernSecureAuthOptions): TernSecureAuth {\n const instance = this.getOrCreateInstance(options);\n instance.#initialize(options);\n return instance;\n }\n\n initialize = async (options?: TernSecureAuthOptions): Promise<void> => {\n void this.#initialize(options || {});\n };\n\n public static create(options: TernSecureAuthOptions): TernSecureAuth {\n const instance = this.getOrCreateInstance();\n void instance.initialize(options);\n return instance;\n }\n\n #initialize = (options: TernSecureAuthOptions): void => {\n this.#options = this.#initOptions(options);\n\n try {\n if (!this.#options.ternSecureConfig) {\n throw new Error('TernSecureConfig is required to initialize TernSecureAuth');\n }\n\n if (!this.#options.apiUrl) {\n throw new Error('apiUrl is required to initialize TernSecureAuth');\n }\n\n this.initializeFirebaseApp(this.#options.ternSecureConfig, {\n appName: this.#options.appName,\n tenantId: this.#options.tenantId,\n });\n\n const isBrowserCookiePersistence = this.#options.persistence === 'browserCookie';\n\n if (!isBrowserCookiePersistence) {\n this.authStateUnsubscribe = this.initAuthStateListener();\n }\n\n this.#authCookieManager = new AuthCookieManager();\n this.csrfToken = this.#authCookieManager.getCSRFToken();\n\n this.signIn = new SignIn(this.auth, this.csrfToken);\n this.signUp = new SignUp(this.auth);\n\n eventBus.on(events.SessionChanged, () => {\n this.#setCreatedActiveSession(this.user || null);\n this.#emit();\n });\n\n this.#setStatus('ready');\n this.#publicEventBus.emit(ternEvents.Status, 'ready');\n\n //return this;\n } catch (error) {\n this.error = error as Error;\n this.#setStatus('error');\n this.#publicEventBus.emit(ternEvents.Status, 'error');\n throw error;\n }\n };\n\n private initializeFirebaseApp(\n config: TernSecureConfig,\n options?: { appName?: string; tenantId?: string },\n ): void {\n const appName = options?.appName || '[DEFAULT]';\n this.firebaseClientApp = getApps().length === 0 ? initializeApp(config, appName) : getApps()[0];\n\n const persistence = this.#setPersistence();\n const auth = initializeAuth(this.firebaseClientApp, {\n persistence,\n popupRedirectResolver: browserPopupRedirectResolver,\n });\n\n this.auth = auth;\n\n if (options?.tenantId) {\n this.auth.tenantId = options.tenantId;\n }\n\n this.#configureEmulator();\n\n getInstallations(this.firebaseClientApp);\n }\n\n public signOut: SignOut = async (options?: SignOutOptions) => {\n const redirectUrl = options?.redirectUrl || this.#constructAfterSignOutUrl();\n if (options?.onBeforeSignOut) {\n await options.onBeforeSignOut();\n }\n\n await this.auth.signOut();\n\n if (options?.onAfterSignOut) {\n await options.onAfterSignOut();\n }\n\n await this.navigate(redirectUrl);\n\n eventBus.emit(events.UserSignOut, null);\n eventBus.emit(events.TokenUpdate, { token: null });\n this.#emit();\n };\n\n get currentSession(): SignedInSession | null {\n return this.signedInSession;\n }\n\n private initAuthListener(): () => void {\n (async () => {\n await this.auth.authStateReady();\n const user = this.auth.currentUser as TernSecureUser | null;\n this._currentUser = user;\n this.user = user;\n await this.updateCurrentSession();\n this.#emit();\n })();\n\n // Return a no-op unsubscribe function since we're not setting up a listener\n return () => {\n // No-op: nothing to unsubscribe from\n };\n }\n\n private initAuthStateListener(): () => void {\n return onAuthStateChanged(this.auth, async (user: TernSecureUser | null) => {\n await this.auth.authStateReady();\n this._currentUser = user;\n this.user = user;\n await this.updateCurrentSession();\n\n this.#emit();\n });\n }\n\n private _onIdTokenChanged(): () => void {\n return onIdTokenChanged(this.auth, async (user: TernSecureUser | null) => {\n await this.auth.authStateReady();\n this._currentUser = user;\n this.user = user;\n await this.updateCurrentSession();\n\n this.#emit();\n });\n }\n\n private async getIdToken(): Promise<string | null> {\n await this.auth.authStateReady();\n if (!this.auth.currentUser) {\n return null;\n }\n return getIdToken(this.auth.currentUser);\n }\n\n public onAuthStateChanged(callback: (cb: any) => void): () => void {\n return onAuthStateChanged(this.auth, callback);\n }\n\n public onIdTokenChanged(callback: (cb: any) => void): () => void {\n return onIdTokenChanged(this.auth, callback);\n }\n\n private async updateCurrentSession(): Promise<void> {\n if (!this._currentUser) {\n this.signedInSession = null;\n return;\n }\n\n try {\n const res = await this._currentUser.getIdTokenResult();\n this.signedInSession = {\n status: 'active',\n token: res.token,\n claims: res.claims,\n issuedAtTime: res.issuedAtTime,\n expirationTime: res.expirationTime,\n authTime: res.authTime,\n signInProvider: res.signInProvider || 'unknown',\n signInSecondFactor: res.signInSecondFactor,\n };\n } catch (error) {\n console.error('[TernSecureAuth] Error updating session:', error);\n this.signedInSession = null;\n }\n }\n\n private checkRedirectResult = async (): Promise<SignInResponse | null> => {\n try {\n const result = await getRedirectResult(this.auth);\n if (result) {\n return {\n status: 'success',\n user: result.user as TernSecureUser,\n };\n }\n return null;\n } catch (error) {\n const authError = handleFirebaseAuthError(error);\n return {\n status: 'error',\n message: authError.message,\n error: authError.code,\n };\n }\n };\n\n public getRedirectResult = async (): Promise<any> => {\n return this.checkRedirectResult();\n };\n\n public addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n this.#listeners.push(listener);\n if (this._currentUser) {\n listener({\n user: this._currentUser,\n session: this.signedInSession,\n });\n }\n\n const unsubscribe = () => {\n this.#listeners = this.#listeners.filter(l => l !== listener);\n };\n return unsubscribe;\n };\n\n public on: TernSecureAuthInterface['on'] = (...args) => {\n this.#publicEventBus.on(...args);\n };\n\n public off: TernSecureAuthInterface['off'] = (...args) => {\n this.#publicEventBus.off(...args);\n };\n\n public createActiveSession: CreateActiveSession = async ({\n session,\n redirectUrl,\n }): Promise<void> => {\n try {\n if (!session) {\n throw new Error('No session provided to createActiveSession');\n }\n const sessionResult = await session.getIdTokenResult();\n const sessionData = new Session(sessionResult);\n await sessionData.create(this.csrfToken || '');\n\n if (redirectUrl) {\n await this.navigate(this.constructUrlWithAuthRedirect(redirectUrl));\n }\n\n this.#setCreatedActiveSession(session);\n this.#emit();\n } catch (error) {\n console.error('[TernSecureAuth] Error creating active session:', error);\n }\n };\n\n public navigate = async (to: string | undefined, options?: NavigateOptions): Promise<unknown> => {\n if (!to || !inBrowser()) {\n return;\n }\n\n let toURL = new URL(to, window.location.href);\n\n if (!this.#allowedRedirectProtocols.includes(toURL.protocol)) {\n console.warn(\n `TernSecureAuth: \"${toURL.protocol}\" is not a valid protocol. Redirecting to \"/\" instead. If you think this is a mistake, please open an issue.`,\n );\n toURL = new URL('/', window.location.href);\n }\n\n const customNavigate =\n options?.replace && this.#options.routerReplace\n ? this.#options.routerReplace\n : this.#options.routerPush;\n\n if ((toURL.origin !== 'null' && toURL.origin !== window.location.origin) || !customNavigate) {\n windowNavigate(toURL);\n return;\n }\n\n const metadata = {\n ...(options?.metadata ? { __internal_metadata: options?.metadata } : {}),\n windowNavigate,\n };\n\n // React router only wants the path, search or hash portion.\n return await customNavigate(stripOrigin(toURL), metadata);\n };\n\n public constructUrlWithAuthRedirect = (to: string): string => {\n if (this.#instanceType === 'production') {\n return to;\n }\n const baseUrl = window.location.origin;\n const url = new URL(to, baseUrl);\n\n if (url.origin === window.location.origin) {\n return url.href;\n }\n\n return url.toString();\n };\n\n #buildUrl = (key: 'signInUrl' | 'signUpUrl', options: RedirectOptions): string => {\n if (!key || !this.isReady) {\n return '';\n }\n\n const baseUrlConfig = key === 'signInUrl' ? this.#options.signInUrl : this.#options.signUpUrl;\n const defaultPagePath = key === 'signInUrl' ? '/sign-in' : '/sign-up';\n const base = baseUrlConfig || defaultPagePath;\n\n const redirectUrls = new RedirectUrls(this.#options, options).toSearchParams();\n const constructedUrl = buildURL(\n {\n base,\n hashSearchParams: [redirectUrls],\n },\n {\n stringify: true,\n skipOrigin: false,\n },\n );\n return this.constructUrlWithAuthRedirect(constructedUrl);\n };\n\n #constructAfterSignInUrl = (): string => {\n return this.constructUrlWithAuthRedirect(new RedirectUrls(this.#options).getAfterSignInUrl());\n };\n\n #constructAfterSignOutUrl = (): string => {\n if (!this.#options.afterSignOutUrl) {\n return '/';\n }\n return this.constructUrlWithAuthRedirect(this.#options.afterSignOutUrl);\n };\n\n public redirectToSignIn = async (options?: SignInRedirectOptions): Promise<unknown> => {\n if (inBrowser()) {\n return this.navigate(this.constructSignInUrl(options));\n }\n return;\n };\n\n public redirectToSignUp = async (options?: SignUpRedirectOptions): Promise<unknown> => {\n if (inBrowser()) {\n return this.navigate(this.constructSignUpUrl());\n }\n return;\n };\n\n public redirectAfterSignIn = async (): Promise<unknown> => {\n if (inBrowser()) {\n return this.navigate(this.#constructAfterSignInUrl());\n }\n return;\n };\n\n redirectAfterSignUp = (): void => {\n throw new Error('redirectAfterSignUp is not implemented yet');\n };\n\n public constructSignInUrl = (options?: SignInRedirectOptions): string => {\n return this.#buildUrl('signInUrl', {\n ...options,\n signInForceRedirectUrl: options?.signInForceRedirectUrl || window.location.href,\n });\n };\n\n public constructSignUpUrl = (options?: SignUpRedirectOptions): string => {\n return this.#buildUrl('signUpUrl', {\n ...options,\n signUpForceRedirectUrl: options?.signUpForceRedirectUrl || window.location.href,\n });\n };\n\n get #allowedRedirectProtocols() {\n let allowedProtocols = ALLOWED_PROTOCOLS;\n\n if (this.#options.allowedRedirectProtocols) {\n allowedProtocols = allowedProtocols.concat(this.#options.allowedRedirectProtocols);\n }\n\n return allowedProtocols;\n }\n\n __internal_setCountry = (country: string | null) => {\n if (!this.__internal_country) {\n this.__internal_country = country;\n }\n };\n\n #initOptions = (options: TernSecureAuthOptions): TernSecureAuthOptions => {\n return {\n ...options,\n };\n };\n\n #emit = (): void => {\n for (const listener of this.#listeners) {\n listener({\n user: this.user,\n session: this.signedInSession,\n });\n }\n };\n\n #setStatus(newStatus: TernSecureAuthStatus): void {\n if (this.#status !== newStatus) {\n this.#status = newStatus;\n this.#publicEventBus.emit(ternEvents.Status, this.#status);\n\n if (newStatus === 'ready') {\n this.#publicEventBus.emit(ternEvents.Status, 'ready');\n }\n }\n }\n\n #setCreatedActiveSession = (session: TernSecureUser | null) => {\n this.user = session;\n this._currentUser = session;\n };\n\n #setPersistence = () => {\n const persistenceType = this.#options.persistence;\n\n switch (persistenceType) {\n case 'browserCookie':\n return inMemoryPersistence;\n case 'session':\n return browserSessionPersistence;\n case 'local':\n return browserLocalPersistence;\n case 'none':\n default:\n return inMemoryPersistence;\n }\n };\n\n #emulatorHost = (): string | undefined => {\n if (typeof process === 'undefined') return undefined;\n return process.env.FIREBASE_AUTH_EMULATOR_HOST;\n };\n\n #configureEmulator = (): void => {\n const host = this.#emulatorHost();\n const isDev = this.#instanceType === 'development';\n const shouldUseEmulator = isDev && !!host;\n if (!shouldUseEmulator || !host) {\n return;\n }\n\n const emulatorUrl = host.startsWith('http') ? host : `http://${host}`;\n\n try {\n //(this.auth as unknown as any)._canInitEmulator = true;\n connectAuthEmulator(this.auth, emulatorUrl, { disableWarnings: false });\n console.warn(`[TernSecure] Firebase Auth Emulator connected at ${emulatorUrl}`);\n } catch (error) {\n console.error('[TernSecure] Error connecting to Firebase Auth Emulator:', error);\n }\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,73 +0,0 @@
1
- import {
2
- initializeServerApp
3
- } from "firebase/app";
4
- import { getAuth, getIdToken } from "firebase/auth";
5
- class TernServerAuth {
6
- static instance = null;
7
- auth;
8
- #options = {};
9
- constructor() {
10
- }
11
- static getInstance() {
12
- if (!this.instance) {
13
- this.instance = new TernServerAuth();
14
- }
15
- return this.instance;
16
- }
17
- static initialize(options) {
18
- const instance = this.getInstance();
19
- instance.#initialize(options);
20
- return instance;
21
- }
22
- #initialize(options) {
23
- this.#options = this.#initOptions(options);
24
- }
25
- static clearInstance() {
26
- this.instance = null;
27
- }
28
- getAuthIdToken = async () => {
29
- await this.auth.authStateReady();
30
- if (!this.auth.currentUser) return;
31
- return await getIdToken(this.auth.currentUser);
32
- };
33
- getAuthenticatedAppFromHeaders = async (headers) => {
34
- const authHeader = headers.get("Authorization");
35
- const idToken = authHeader == null ? void 0 : authHeader.split("Bearer ")[1];
36
- let appSettings = {};
37
- appSettings = {
38
- releaseOnDeref: headers
39
- };
40
- if (idToken && idToken.trim()) {
41
- appSettings.authIdToken = idToken;
42
- }
43
- return this.getServerApp(appSettings);
44
- };
45
- getServerApp = async (appSettings) => {
46
- const firebaseServerConfig = this.#options.firebaseServerConfig;
47
- if (!firebaseServerConfig) {
48
- throw new Error(
49
- "Firebase server configuration is required to initialize the server app"
50
- );
51
- }
52
- const firebaseServerApp = initializeServerApp(
53
- firebaseServerConfig,
54
- appSettings || {}
55
- );
56
- this.auth = getAuth(firebaseServerApp);
57
- await this.auth.authStateReady();
58
- return {
59
- firebaseServerApp,
60
- currentUser: this.auth.currentUser,
61
- auth: this.auth
62
- };
63
- };
64
- #initOptions = (options) => {
65
- return {
66
- ...options
67
- };
68
- };
69
- }
70
- export {
71
- TernServerAuth
72
- };
73
- //# sourceMappingURL=TernAuthServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/instance/TernAuthServer.ts"],"sourcesContent":["import type { TernSecureConfig, TernSecureUser } from \"@tern-secure/types\";\nimport type {\n FirebaseServerApp,\n FirebaseServerAppSettings} from \"firebase/app\";\nimport {\n initializeServerApp\n} from \"firebase/app\";\nimport type { Auth} from \"firebase/auth\";\nimport { getAuth, getIdToken } from \"firebase/auth\";\n\ntype TernSecureServerConfig = {\n apiKey: string;\n};\nexport interface TernServerAuthOptions {\n firebaseConfig?: TernSecureConfig;\n firebaseServerConfig?: TernSecureServerConfig;\n authIdToken?: string;\n}\n\nexport interface AuthenticatedApp {\n firebaseServerApp: FirebaseServerApp;\n auth: Auth;\n currentUser?: TernSecureUser | null;\n}\n\nexport class TernServerAuth {\n private static instance: TernServerAuth | null = null;\n private auth!: Auth;\n #options: TernServerAuthOptions = {};\n\n public constructor() {}\n\n static getInstance(): TernServerAuth {\n if (!this.instance) {\n this.instance = new TernServerAuth();\n }\n return this.instance;\n }\n\n public static initialize(options: TernServerAuthOptions): TernServerAuth {\n const instance = this.getInstance();\n instance.#initialize(options);\n return instance;\n }\n\n #initialize(options: TernServerAuthOptions): void {\n this.#options = this.#initOptions(options);\n }\n\n static clearInstance(): void {\n this.instance = null;\n }\n\n getAuthIdToken = async (): Promise<string | undefined> => {\n await this.auth.authStateReady();\n if (!this.auth.currentUser) return;\n return await getIdToken(this.auth.currentUser);\n };\n\n getAuthenticatedAppFromHeaders = async (headers: {\n get: (key: string) => string | null;\n }): Promise<AuthenticatedApp> => {\n const authHeader = headers.get(\"Authorization\");\n const idToken = authHeader?.split(\"Bearer \")[1];\n\n let appSettings: FirebaseServerAppSettings = {};\n\n appSettings = {\n releaseOnDeref: headers,\n };\n\n if (idToken && idToken.trim()) {\n appSettings.authIdToken = idToken;\n }\n\n return this.getServerApp(appSettings);\n };\n\n getServerApp = async (\n appSettings?: FirebaseServerAppSettings\n ): Promise<AuthenticatedApp> => {\n const firebaseServerConfig = this.#options.firebaseServerConfig;\n if (!firebaseServerConfig) {\n throw new Error(\n \"Firebase server configuration is required to initialize the server app\"\n );\n }\n\n const firebaseServerApp = initializeServerApp(\n firebaseServerConfig,\n appSettings || {}\n );\n\n this.auth = getAuth(firebaseServerApp);\n await this.auth.authStateReady();\n\n return {\n firebaseServerApp,\n currentUser: this.auth.currentUser,\n auth: this.auth,\n };\n };\n\n #initOptions = (options?: TernServerAuthOptions): TernServerAuthOptions => {\n return {\n ...options,\n };\n };\n}\n"],"mappings":"AAIA;AAAA,EACE;AAAA,OACK;AAEP,SAAS,SAAS,kBAAkB;AAiB7B,MAAM,eAAe;AAAA,EAC1B,OAAe,WAAkC;AAAA,EACzC;AAAA,EACR,WAAkC,CAAC;AAAA,EAE5B,cAAc;AAAA,EAAC;AAAA,EAEtB,OAAO,cAA8B;AACnC,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,IAAI,eAAe;AAAA,IACrC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAc,WAAW,SAAgD;AACvE,UAAM,WAAW,KAAK,YAAY;AAClC,aAAS,YAAY,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAAsC;AAChD,SAAK,WAAW,KAAK,aAAa,OAAO;AAAA,EAC3C;AAAA,EAEA,OAAO,gBAAsB;AAC3B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,iBAAiB,YAAyC;AACxD,UAAM,KAAK,KAAK,eAAe;AAC/B,QAAI,CAAC,KAAK,KAAK,YAAa;AAC5B,WAAO,MAAM,WAAW,KAAK,KAAK,WAAW;AAAA,EAC/C;AAAA,EAEA,iCAAiC,OAAO,YAEP;AAC/B,UAAM,aAAa,QAAQ,IAAI,eAAe;AAC9C,UAAM,UAAU,yCAAY,MAAM,WAAW;AAE7C,QAAI,cAAyC,CAAC;AAE9C,kBAAc;AAAA,MACZ,gBAAgB;AAAA,IAClB;AAEA,QAAI,WAAW,QAAQ,KAAK,GAAG;AAC7B,kBAAY,cAAc;AAAA,IAC5B;AAEA,WAAO,KAAK,aAAa,WAAW;AAAA,EACtC;AAAA,EAEA,eAAe,OACb,gBAC8B;AAC9B,UAAM,uBAAuB,KAAK,SAAS;AAC3C,QAAI,CAAC,sBAAsB;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,eAAe,CAAC;AAAA,IAClB;AAEA,SAAK,OAAO,QAAQ,iBAAiB;AACrC,UAAM,KAAK,KAAK,eAAe;AAE/B,WAAO;AAAA,MACL;AAAA,MACA,aAAa,KAAK,KAAK;AAAA,MACvB,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,eAAe,CAAC,YAA2D;AACzE,WAAO;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AACF;","names":[]}