@tern-secure/auth 1.1.0-canary.v20251008131428 → 1.1.0-canary.v20251019190011

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 (100) hide show
  1. package/dist/cjs/{resources → auth}/AuthCookieManager.js +12 -1
  2. package/dist/cjs/auth/AuthCookieManager.js.map +1 -0
  3. package/dist/cjs/auth/cookies/session.js +83 -0
  4. package/dist/cjs/auth/cookies/session.js.map +1 -0
  5. package/dist/cjs/auth/request.js +159 -0
  6. package/dist/cjs/auth/request.js.map +1 -0
  7. package/dist/cjs/index.js +2 -0
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/instance/TernAuth.js +163 -19
  10. package/dist/cjs/instance/TernAuth.js.map +1 -1
  11. package/dist/cjs/instance/events.js +3 -2
  12. package/dist/cjs/instance/events.js.map +1 -1
  13. package/dist/cjs/instance/jwtClient.js +72 -0
  14. package/dist/cjs/instance/jwtClient.js.map +1 -0
  15. package/dist/cjs/resources/Base.js +7 -0
  16. package/dist/cjs/resources/Base.js.map +1 -1
  17. package/dist/cjs/resources/Session.js +105 -0
  18. package/dist/cjs/resources/Session.js.map +1 -0
  19. package/dist/cjs/resources/SignIn.js +25 -27
  20. package/dist/cjs/resources/SignIn.js.map +1 -1
  21. package/dist/cjs/resources/Token.js +32 -0
  22. package/dist/cjs/resources/Token.js.map +1 -0
  23. package/dist/cjs/resources/UserData.js +43 -0
  24. package/dist/cjs/resources/UserData.js.map +1 -0
  25. package/dist/cjs/resources/cookie.js +154 -0
  26. package/dist/cjs/resources/cookie.js.map +1 -0
  27. package/dist/cjs/resources/internal.js +4 -2
  28. package/dist/cjs/resources/internal.js.map +1 -1
  29. package/dist/cjs/utils/jwt.js +46 -0
  30. package/dist/cjs/utils/jwt.js.map +1 -0
  31. package/dist/cjs/utils/mapDecode.js +33 -0
  32. package/dist/cjs/utils/mapDecode.js.map +1 -0
  33. package/dist/esm/{resources → auth}/AuthCookieManager.js +13 -4
  34. package/dist/esm/auth/AuthCookieManager.js.map +1 -0
  35. package/dist/esm/auth/cookies/session.js +58 -0
  36. package/dist/esm/auth/cookies/session.js.map +1 -0
  37. package/dist/esm/auth/request.js +134 -0
  38. package/dist/esm/auth/request.js.map +1 -0
  39. package/dist/esm/index.js +2 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/instance/TernAuth.js +166 -21
  42. package/dist/esm/instance/TernAuth.js.map +1 -1
  43. package/dist/esm/instance/events.js +3 -2
  44. package/dist/esm/instance/events.js.map +1 -1
  45. package/dist/esm/instance/jwtClient.js +47 -0
  46. package/dist/esm/instance/jwtClient.js.map +1 -0
  47. package/dist/esm/resources/Base.js +7 -0
  48. package/dist/esm/resources/Base.js.map +1 -1
  49. package/dist/esm/resources/Session.js +81 -0
  50. package/dist/esm/resources/Session.js.map +1 -0
  51. package/dist/esm/resources/SignIn.js +25 -27
  52. package/dist/esm/resources/SignIn.js.map +1 -1
  53. package/dist/esm/resources/Token.js +8 -0
  54. package/dist/esm/resources/Token.js.map +1 -0
  55. package/dist/esm/resources/UserData.js +19 -0
  56. package/dist/esm/resources/UserData.js.map +1 -0
  57. package/dist/esm/resources/cookie.js +130 -0
  58. package/dist/esm/resources/cookie.js.map +1 -0
  59. package/dist/esm/resources/internal.js +2 -1
  60. package/dist/esm/resources/internal.js.map +1 -1
  61. package/dist/esm/utils/jwt.js +22 -0
  62. package/dist/esm/utils/jwt.js.map +1 -0
  63. package/dist/esm/utils/mapDecode.js +9 -0
  64. package/dist/esm/utils/mapDecode.js.map +1 -0
  65. package/dist/types/{resources → auth}/AuthCookieManager.d.ts +5 -1
  66. package/dist/types/auth/AuthCookieManager.d.ts.map +1 -0
  67. package/dist/types/auth/cookies/session.d.ts +8 -0
  68. package/dist/types/auth/cookies/session.d.ts.map +1 -0
  69. package/dist/types/auth/request.d.ts +49 -0
  70. package/dist/types/auth/request.d.ts.map +1 -0
  71. package/dist/types/index.d.ts +2 -2
  72. package/dist/types/index.d.ts.map +1 -1
  73. package/dist/types/instance/TernAuth.d.ts +27 -5
  74. package/dist/types/instance/TernAuth.d.ts.map +1 -1
  75. package/dist/types/instance/events.d.ts +9 -1
  76. package/dist/types/instance/events.d.ts.map +1 -1
  77. package/dist/types/instance/jwtClient.d.ts +22 -0
  78. package/dist/types/instance/jwtClient.d.ts.map +1 -0
  79. package/dist/types/resources/Base.d.ts +6 -0
  80. package/dist/types/resources/Base.d.ts.map +1 -1
  81. package/dist/types/resources/Session.d.ts +49 -0
  82. package/dist/types/resources/Session.d.ts.map +1 -0
  83. package/dist/types/resources/SignIn.d.ts +8 -6
  84. package/dist/types/resources/SignIn.d.ts.map +1 -1
  85. package/dist/types/resources/Token.d.ts +5 -0
  86. package/dist/types/resources/Token.d.ts.map +1 -0
  87. package/dist/types/resources/UserData.d.ts +8 -0
  88. package/dist/types/resources/UserData.d.ts.map +1 -0
  89. package/dist/types/resources/cookie.d.ts +24 -0
  90. package/dist/types/resources/cookie.d.ts.map +1 -0
  91. package/dist/types/resources/internal.d.ts +2 -1
  92. package/dist/types/resources/internal.d.ts.map +1 -1
  93. package/dist/types/utils/jwt.d.ts +12 -0
  94. package/dist/types/utils/jwt.d.ts.map +1 -0
  95. package/dist/types/utils/mapDecode.d.ts +4 -0
  96. package/dist/types/utils/mapDecode.d.ts.map +1 -0
  97. package/package.json +4 -5
  98. package/dist/cjs/resources/AuthCookieManager.js.map +0 -1
  99. package/dist/esm/resources/AuthCookieManager.js.map +0 -1
  100. package/dist/types/resources/AuthCookieManager.d.ts.map +0 -1
@@ -22,6 +22,7 @@ __export(AuthCookieManager_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(AuthCookieManager_exports);
24
24
  var import_cookie = require("@tern-secure/shared/cookie");
25
+ var import_session = require("./cookies/session");
25
26
  const CSRF_COOKIE_NAME = "_session_terncf";
26
27
  const CSRF_COOKIE_OPTIONS = {
27
28
  secure: true,
@@ -31,8 +32,12 @@ const CSRF_COOKIE_OPTIONS = {
31
32
  };
32
33
  class AuthCookieManager {
33
34
  csrfCookieHandler = (0, import_cookie.cookieHandler)(CSRF_COOKIE_NAME);
35
+ sessionCookie;
36
+ idTokenCookie;
34
37
  constructor() {
35
38
  this.ensureCSRFToken();
39
+ this.sessionCookie = (0, import_session.createSessionCookie)();
40
+ this.idTokenCookie = (0, import_session.createIdTokenCookie)();
36
41
  }
37
42
  generateCSRFToken() {
38
43
  const array = new Uint8Array(32);
@@ -49,7 +54,7 @@ class AuthCookieManager {
49
54
  }
50
55
  /**
51
56
  * Set CSRFcookie
52
- */
57
+ */
53
58
  setCSRFToken(token) {
54
59
  try {
55
60
  if (token.token) {
@@ -71,6 +76,12 @@ class AuthCookieManager {
71
76
  return void 0;
72
77
  }
73
78
  }
79
+ getSessionCookie() {
80
+ return this.sessionCookie.get();
81
+ }
82
+ getIdTokenCookie() {
83
+ return this.idTokenCookie.get();
84
+ }
74
85
  /**
75
86
  * Clear all authentication cookies
76
87
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/AuthCookieManager.ts"],"sourcesContent":["import type { CookieAttributes } from '@tern-secure/shared/cookie';\nimport { cookieHandler } from '@tern-secure/shared/cookie';\n\nimport type { SessionCookieHandler } from './cookies/session';\nimport { createIdTokenCookie, createSessionCookie } from './cookies/session';\n\nconst CSRF_COOKIE_NAME = '_session_terncf';\n\ntype CSRFToken = {\n token: string | null;\n};\n\ntype CookieOptions = CookieAttributes;\n\nconst CSRF_COOKIE_OPTIONS: CookieOptions = {\n secure: true,\n sameSite: 'strict',\n expires: 1 / 24, //1 hour\n};\n\n/**\n * AuthCookieManger class for managing authentication state and cookies\n */\nexport class AuthCookieManager {\n private readonly csrfCookieHandler = cookieHandler(CSRF_COOKIE_NAME);\n private sessionCookie: SessionCookieHandler;\n private idTokenCookie: SessionCookieHandler;\n\n constructor() {\n this.ensureCSRFToken();\n this.sessionCookie = createSessionCookie();\n this.idTokenCookie = createIdTokenCookie();\n }\n\n private generateCSRFToken(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n }\n\n private ensureCSRFToken(): string {\n let ctoken = this.getCSRFToken();\n if (!ctoken) {\n ctoken = this.generateCSRFToken();\n this.setCSRFToken({ token: ctoken });\n }\n return ctoken;\n }\n\n /**\n * Set CSRFcookie\n */\n\n setCSRFToken(token: CSRFToken): void {\n try {\n if (token.token) {\n this.csrfCookieHandler.set(token.token, CSRF_COOKIE_OPTIONS);\n }\n } catch (error) {\n console.error('Failed to set CSRF token:', error);\n throw new Error('Unable to store CSRF token');\n }\n }\n\n /**\n * Get CSRF token from cookies\n */\n getCSRFToken(): string | undefined {\n try {\n return this.csrfCookieHandler.get();\n } catch (error) {\n console.error('Failed to get CSRF token:', error);\n return undefined;\n }\n }\n\n public getSessionCookie() {\n return this.sessionCookie.get();\n }\n\n public getIdTokenCookie() {\n return this.idTokenCookie.get();\n }\n\n /**\n * Clear all authentication cookies\n */\n clearAuth(): void {\n try {\n this.csrfCookieHandler.remove();\n } catch (error) {\n console.error('Failed to clear auth cookies:', error);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA8B;AAG9B,qBAAyD;AAEzD,MAAM,mBAAmB;AAQzB,MAAM,sBAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS,IAAI;AAAA;AACf;AAKO,MAAM,kBAAkB;AAAA,EACZ,wBAAoB,6BAAc,gBAAgB;AAAA,EAC3D;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,gBAAgB;AACrB,SAAK,oBAAgB,oCAAoB;AACzC,SAAK,oBAAgB,oCAAoB;AAAA,EAC3C;AAAA,EAEQ,oBAA4B;AAClC,UAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,WAAO,gBAAgB,KAAK;AAC5B,WAAO,MAAM,KAAK,OAAO,UAAQ,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,EAC9E;AAAA,EAEQ,kBAA0B;AAChC,QAAI,SAAS,KAAK,aAAa;AAC/B,QAAI,CAAC,QAAQ;AACX,eAAS,KAAK,kBAAkB;AAChC,WAAK,aAAa,EAAE,OAAO,OAAO,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,OAAwB;AACnC,QAAI;AACF,UAAI,MAAM,OAAO;AACf,aAAK,kBAAkB,IAAI,MAAM,OAAO,mBAAmB;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAmC;AACjC,QAAI;AACF,aAAO,KAAK,kBAAkB,IAAI;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,mBAAmB;AACxB,WAAO,KAAK,cAAc,IAAI;AAAA,EAChC;AAAA,EAEO,mBAAmB;AACxB,WAAO,KAAK,cAAc,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI;AACF,WAAK,kBAAkB,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var session_exports = {};
20
+ __export(session_exports, {
21
+ createIdTokenCookie: () => createIdTokenCookie,
22
+ createSessionCookie: () => createSessionCookie
23
+ });
24
+ module.exports = __toCommonJS(session_exports);
25
+ var import_cookie = require("@tern-secure/shared/cookie");
26
+ const SESSION_COOKIE_NAME = "__session";
27
+ const ID_TOKEN_COOKIE_NAME = "FIREBASE_[DEFAULT]";
28
+ const REFRESH_TOKEN_COOKIE_NAME = "FIREBASEID_[DEFAULT]";
29
+ const CUSTOM_COOKIE_NAME = "__custom";
30
+ const createSessionCookie = () => {
31
+ const sessionCookie = (0, import_cookie.cookieHandler)(SESSION_COOKIE_NAME);
32
+ const set = (token) => {
33
+ sessionCookie.set(token, {
34
+ httpOnly: false,
35
+ secure: true,
36
+ sameSite: "strict",
37
+ path: "/"
38
+ });
39
+ };
40
+ const remove = () => {
41
+ sessionCookie.remove({
42
+ path: "/"
43
+ });
44
+ };
45
+ const get = () => {
46
+ return sessionCookie.get();
47
+ };
48
+ return {
49
+ set,
50
+ remove,
51
+ get
52
+ };
53
+ };
54
+ const createIdTokenCookie = () => {
55
+ const prefix = (0, import_cookie.getCookiePrefix)();
56
+ const cookieName = (0, import_cookie.getCookieName)(ID_TOKEN_COOKIE_NAME, prefix);
57
+ const sessionCookie = (0, import_cookie.cookieHandler)(cookieName);
58
+ const set = (token) => {
59
+ sessionCookie.set(token, {
60
+ httpOnly: false,
61
+ secure: true,
62
+ sameSite: "strict",
63
+ path: "/"
64
+ });
65
+ };
66
+ const remove = () => {
67
+ sessionCookie.remove({
68
+ path: "/"
69
+ });
70
+ };
71
+ const get = () => sessionCookie.get();
72
+ return {
73
+ set,
74
+ remove,
75
+ get
76
+ };
77
+ };
78
+ // Annotate the CommonJS export names for ESM import in node:
79
+ 0 && (module.exports = {
80
+ createIdTokenCookie,
81
+ createSessionCookie
82
+ });
83
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/auth/cookies/session.ts"],"sourcesContent":["import { cookieHandler, getCookieName, getCookiePrefix } from '@tern-secure/shared/cookie';\n\nconst SESSION_COOKIE_NAME = '__session';\nconst ID_TOKEN_COOKIE_NAME = 'FIREBASE_[DEFAULT]';\nconst REFRESH_TOKEN_COOKIE_NAME = 'FIREBASEID_[DEFAULT]';\nconst CUSTOM_COOKIE_NAME = '__custom';\n\nexport type SessionCookieHandler = {\n set: (token: string) => void;\n remove: () => void;\n get: () => string | undefined;\n};\n\nexport const createSessionCookie = (): SessionCookieHandler => {\n const sessionCookie = cookieHandler(SESSION_COOKIE_NAME);\n\n const set = (token: string) => {\n sessionCookie.set(token, {\n httpOnly: false,\n secure: true,\n sameSite: 'strict',\n path: '/',\n });\n };\n\n const remove = () => {\n sessionCookie.remove({\n path: '/',\n });\n };\n\n const get = () => {\n return sessionCookie.get();\n };\n\n return {\n set,\n remove,\n get,\n };\n};\n\nexport const createIdTokenCookie = (): SessionCookieHandler => {\n const prefix = getCookiePrefix();\n const cookieName = getCookieName(ID_TOKEN_COOKIE_NAME, prefix);\n const sessionCookie = cookieHandler(cookieName);\n\n const set = (token: string) => {\n sessionCookie.set(token, {\n httpOnly: false,\n secure: true,\n sameSite: 'strict',\n path: '/',\n });\n };\n\n const remove = () => {\n sessionCookie.remove({\n path: '/',\n });\n };\n\n const get = () => sessionCookie.get();\n\n return {\n set,\n remove,\n get,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA8D;AAE9D,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B;AAClC,MAAM,qBAAqB;AAQpB,MAAM,sBAAsB,MAA4B;AAC7D,QAAM,oBAAgB,6BAAc,mBAAmB;AAEvD,QAAM,MAAM,CAAC,UAAkB;AAC7B,kBAAc,IAAI,OAAO;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,OAAO;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM;AAChB,WAAO,cAAc,IAAI;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,sBAAsB,MAA4B;AAC7D,QAAM,aAAS,+BAAgB;AAC/B,QAAM,iBAAa,6BAAc,sBAAsB,MAAM;AAC7D,QAAM,oBAAgB,6BAAc,UAAU;AAE9C,QAAM,MAAM,CAAC,UAAkB;AAC7B,kBAAc,IAAI,OAAO;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,OAAO;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM,cAAc,IAAI;AAEpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var request_exports = {};
20
+ __export(request_exports, {
21
+ ClientAuthRequest: () => ClientAuthRequest,
22
+ createClientAuthRequest: () => createClientAuthRequest
23
+ });
24
+ module.exports = __toCommonJS(request_exports);
25
+ var import_cookie = require("../resources/cookie");
26
+ var import_UserData = require("../resources/UserData");
27
+ class ClientAuthRequest {
28
+ cookie;
29
+ userData;
30
+ constructor() {
31
+ this.cookie = new import_cookie.Cookie();
32
+ this.userData = new import_UserData.UserData();
33
+ }
34
+ /**
35
+ * Get UserData
36
+ */
37
+ async getUserData() {
38
+ try {
39
+ const response = await this.userData.get();
40
+ if (response == null ? void 0 : response.response) {
41
+ return response.response;
42
+ }
43
+ return null;
44
+ } catch (error) {
45
+ console.error("[ClientAuthRequest] Failed to get user data:", error);
46
+ throw error;
47
+ }
48
+ }
49
+ /**
50
+ * Get ID token from httpOnly cookies
51
+ */
52
+ async getIdTokenFromCookie() {
53
+ try {
54
+ return await this.cookie.getIdToken();
55
+ } catch (error) {
56
+ return {
57
+ success: false,
58
+ error: `Failed to retrieve ID token from cookies: ${error instanceof Error ? error.message : String(error)}`
59
+ };
60
+ }
61
+ }
62
+ /**
63
+ * Get session token from httpOnly cookies
64
+ */
65
+ async getSessionTokenFromCookie() {
66
+ try {
67
+ return await this.cookie.getSessionToken();
68
+ } catch (error) {
69
+ return {
70
+ success: false,
71
+ error: `Failed to retrieve session token from cookies: ${error instanceof Error ? error.message : String(error)}`
72
+ };
73
+ }
74
+ }
75
+ /**
76
+ * Get refresh token from httpOnly cookies
77
+ */
78
+ async getRefreshTokenFromCookie() {
79
+ try {
80
+ return await this.cookie.getRefreshToken();
81
+ } catch (error) {
82
+ return {
83
+ success: false,
84
+ error: `Failed to retrieve refresh token from cookies: ${error instanceof Error ? error.message : String(error)}`
85
+ };
86
+ }
87
+ }
88
+ /**
89
+ * Get custom token from httpOnly cookies
90
+ */
91
+ async getCustomTokenFromCookie() {
92
+ try {
93
+ return await this.cookie.getCustomToken();
94
+ } catch (error) {
95
+ return {
96
+ success: false,
97
+ error: `Failed to retrieve custom token from cookies: ${error instanceof Error ? error.message : String(error)}`
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Get all tokens from httpOnly cookies
103
+ */
104
+ async getAllTokensFromCookies() {
105
+ try {
106
+ return await this.cookie.getAllTokens();
107
+ } catch (error) {
108
+ const errorMessage = `Failed to retrieve tokens from cookies: ${error instanceof Error ? error.message : String(error)}`;
109
+ return {
110
+ idToken: { success: false, error: errorMessage },
111
+ sessionToken: { success: false, error: errorMessage },
112
+ refreshToken: { success: false, error: errorMessage },
113
+ customToken: { success: false, error: errorMessage }
114
+ };
115
+ }
116
+ }
117
+ /**
118
+ * Check if a specific token exists in cookies
119
+ */
120
+ async hasTokenInCookie(tokenType) {
121
+ try {
122
+ return await this.cookie.hasToken(tokenType);
123
+ } catch (error) {
124
+ console.error(`[ClientAuthRequest] Failed to check ${tokenType} existence:`, error);
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * Get user data using token from cookies
130
+ * First tries to get ID token from cookies, then uses it for user data request
131
+ */
132
+ async getUserDataWithCookieToken() {
133
+ try {
134
+ const idTokenResult = await this.getIdTokenFromCookie();
135
+ if (!idTokenResult.success || !idTokenResult.token) {
136
+ console.warn("[ClientAuthRequest] No ID token available in cookies for user data request");
137
+ return null;
138
+ }
139
+ const userData = new import_UserData.UserData();
140
+ const response = await userData.get();
141
+ if (response == null ? void 0 : response.response) {
142
+ return response.response;
143
+ }
144
+ return null;
145
+ } catch (error) {
146
+ console.error("[ClientAuthRequest] Failed to get user data with cookie token:", error);
147
+ throw error;
148
+ }
149
+ }
150
+ }
151
+ function createClientAuthRequest() {
152
+ return new ClientAuthRequest();
153
+ }
154
+ // Annotate the CommonJS export names for ESM import in node:
155
+ 0 && (module.exports = {
156
+ ClientAuthRequest,
157
+ createClientAuthRequest
158
+ });
159
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/request.ts"],"sourcesContent":["import type { TernSecureUserData } from '@tern-secure/types';\n\nimport type { TokenResult } from '../resources/cookie';\nimport { Cookie } from '../resources/cookie';\nimport { UserData } from '../resources/UserData';\n\nexport interface UserDataParams {\n idToken: string;\n}\n\n/**\n * Client-side authentication request functionality\n * Uses backend API calls through the configured apiUrl\n */\nexport class ClientAuthRequest {\n private cookie: Cookie;\n private userData: UserData;\n\n constructor() {\n this.cookie = new Cookie();\n this.userData = new UserData();\n }\n\n /**\n * Get UserData\n */\n async getUserData(): Promise<TernSecureUserData | null> {\n try {\n const response = await this.userData.get();\n\n if (response?.response) {\n return response.response as TernSecureUserData;\n }\n\n return null;\n } catch (error) {\n console.error('[ClientAuthRequest] Failed to get user data:', error);\n throw error;\n }\n }\n\n /**\n * Get ID token from httpOnly cookies\n */\n async getIdTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getIdToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve ID token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get session token from httpOnly cookies\n */\n async getSessionTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getSessionToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve session token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get refresh token from httpOnly cookies\n */\n async getRefreshTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getRefreshToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve refresh token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get custom token from httpOnly cookies\n */\n async getCustomTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getCustomToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve custom token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get all tokens from httpOnly cookies\n */\n async getAllTokensFromCookies(): Promise<Record<string, TokenResult>> {\n try {\n return await this.cookie.getAllTokens();\n } catch (error) {\n const errorMessage = `Failed to retrieve tokens from cookies: ${error instanceof Error ? error.message : String(error)}`;\n return {\n idToken: { success: false, error: errorMessage },\n sessionToken: { success: false, error: errorMessage },\n refreshToken: { success: false, error: errorMessage },\n customToken: { success: false, error: errorMessage },\n };\n }\n }\n\n /**\n * Check if a specific token exists in cookies\n */\n async hasTokenInCookie(\n tokenType: 'idToken' | 'sessionToken' | 'refreshToken' | 'customToken',\n ): Promise<boolean> {\n try {\n return await this.cookie.hasToken(tokenType);\n } catch (error) {\n console.error(`[ClientAuthRequest] Failed to check ${tokenType} existence:`, error);\n return false;\n }\n }\n\n /**\n * Get user data using token from cookies\n * First tries to get ID token from cookies, then uses it for user data request\n */\n async getUserDataWithCookieToken(): Promise<TernSecureUserData | null> {\n try {\n const idTokenResult = await this.getIdTokenFromCookie();\n\n if (!idTokenResult.success || !idTokenResult.token) {\n console.warn('[ClientAuthRequest] No ID token available in cookies for user data request');\n return null;\n }\n\n const userData = new UserData();\n const response = await userData.get();\n\n if (response?.response) {\n return response.response as TernSecureUserData;\n }\n\n return null;\n } catch (error) {\n console.error('[ClientAuthRequest] Failed to get user data with cookie token:', error);\n throw error;\n }\n }\n}\n\nexport function createClientAuthRequest(): ClientAuthRequest {\n return new ClientAuthRequest();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAAuB;AACvB,sBAAyB;AAUlB,MAAM,kBAAkB;AAAA,EACrB;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,SAAS,IAAI,qBAAO;AACzB,SAAK,WAAW,IAAI,yBAAS;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAkD;AACtD,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,SAAS,IAAI;AAEzC,UAAI,qCAAU,UAAU;AACtB,eAAO,SAAS;AAAA,MAClB;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,gDAAgD,KAAK;AACnE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAA6C;AACjD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,WAAW;AAAA,IACtC,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,6CAA6C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5G;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BAAkD;AACtD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,gBAAgB;AAAA,IAC3C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,kDAAkD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACjH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BAAkD;AACtD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,gBAAgB;AAAA,IAC3C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,kDAAkD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACjH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BAAiD;AACrD,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,eAAe;AAAA,IAC1C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAChH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAgE;AACpE,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,aAAa;AAAA,IACxC,SAAS,OAAO;AACd,YAAM,eAAe,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACtH,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,OAAO,aAAa;AAAA,QAC/C,cAAc,EAAE,SAAS,OAAO,OAAO,aAAa;AAAA,QACpD,cAAc,EAAE,SAAS,OAAO,OAAO,aAAa;AAAA,QACpD,aAAa,EAAE,SAAS,OAAO,OAAO,aAAa;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,WACkB;AAClB,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,SAAS,SAAS;AAAA,IAC7C,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,SAAS,eAAe,KAAK;AAClF,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,6BAAiE;AACrE,QAAI;AACF,YAAM,gBAAgB,MAAM,KAAK,qBAAqB;AAEtD,UAAI,CAAC,cAAc,WAAW,CAAC,cAAc,OAAO;AAClD,gBAAQ,KAAK,4EAA4E;AACzF,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,IAAI,yBAAS;AAC9B,YAAM,WAAW,MAAM,SAAS,IAAI;AAEpC,UAAI,qCAAU,UAAU;AACtB,eAAO,SAAS;AAAA,MAClB;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,kEAAkE,KAAK;AACrF,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,0BAA6C;AAC3D,SAAO,IAAI,kBAAkB;AAC/B;","names":[]}
package/dist/cjs/index.js CHANGED
@@ -23,6 +23,7 @@ __export(index_exports, {
23
23
  TernSecureAuth: () => import_TernAuth.TernSecureAuth,
24
24
  TernSecureBase: () => import_internal.TernSecureBase,
25
25
  TernServerAuth: () => import_TernAuthServer.TernServerAuth,
26
+ buildURL: () => import_internal.buildURL,
26
27
  coreApiClient: () => import_coreApiClient.coreApiClient
27
28
  });
28
29
  module.exports = __toCommonJS(index_exports);
@@ -37,6 +38,7 @@ var import_internal = require("./resources/internal");
37
38
  TernSecureAuth,
38
39
  TernSecureBase,
39
40
  TernServerAuth,
41
+ buildURL,
40
42
  coreApiClient
41
43
  });
42
44
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export { TernSecureAuth } from './instance/TernAuth';\nexport type { TernAuth } from './instance/TernAuth';\nexport { TernServerAuth } from './instance/TernAuthServer';\nexport type { TernServerAuthOptions, AuthenticatedApp } from './instance/TernAuthServer';\n\nexport { CoreApiClient, coreApiClient } from './instance/coreApiClient';\nexport type { \n ApiResponse, \n ApiResponseJSON, \n RequestOptions,\n BeforeRequestHook,\n AfterResponseHook\n} from './instance/coreApiClient';\n\nexport { SignIn, TernSecureBase } from './resources/internal';\n\nexport type {\n TernSecureConfig,\n SignInFormValuesTree,\n SignInResponseTree,\n ResendEmailVerification,\n TernSecureUser,\n TernSecureState\n} from '@tern-secure/types';"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA+B;AAE/B,4BAA+B;AAG/B,2BAA6C;AAS7C,sBAAuC;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export { TernSecureAuth } from './instance/TernAuth';\nexport type { TernAuth } from './instance/TernAuth';\nexport { TernServerAuth } from './instance/TernAuthServer';\nexport type { TernServerAuthOptions, AuthenticatedApp } from './instance/TernAuthServer';\n\nexport { CoreApiClient, coreApiClient } from './instance/coreApiClient';\nexport type { \n ApiResponse, \n ApiResponseJSON, \n RequestOptions,\n BeforeRequestHook,\n AfterResponseHook\n} from './instance/coreApiClient';\n\nexport { SignIn, TernSecureBase, buildURL } from './resources/internal';\n\nexport type {\n AuthErrorTree,\n TernSecureConfig,\n SignInFormValues,\n SignInProps,\n SignUpProps,\n SignInResponse,\n SignInRedirectUrl,\n SignUpRedirectUrl,\n ResendEmailVerification,\n TernSecureUser,\n TernSecureState\n} from '@tern-secure/types';"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA+B;AAE/B,4BAA+B;AAG/B,2BAA6C;AAS7C,sBAAiD;","names":[]}
@@ -29,18 +29,20 @@ var import_utils = require("@tern-secure/shared/utils");
29
29
  var import_app = require("firebase/app");
30
30
  var import_auth = require("firebase/auth");
31
31
  var import_installations = require("firebase/installations");
32
+ var import_request = require("../auth/request");
32
33
  var import_internal = require("../resources/internal");
33
34
  var import_construct = require("../utils/construct");
34
35
  var import_c_coreApiClient = require("./c_coreApiClient");
35
36
  var import_events = require("./events");
37
+ var import_jwtClient = require("./jwtClient");
36
38
  function inBrowser() {
37
39
  return typeof window !== "undefined";
38
40
  }
39
41
  class TernSecureAuth {
40
- static version = "1.1.0-canary.v20251008131428";
42
+ static version = "1.1.0-canary.v20251019190011";
41
43
  static sdkMetadata = {
42
44
  name: "@tern-secure/auth",
43
- version: "1.1.0-canary.v20251008131428",
45
+ version: "1.1.0-canary.v20251019190011",
44
46
  environment: process.env.NODE_ENV || "production"
45
47
  };
46
48
  static instance = null;
@@ -62,9 +64,11 @@ class TernSecureAuth {
62
64
  #listeners = [];
63
65
  #options = {};
64
66
  #authCookieManager;
67
+ #clientAuthRequest;
65
68
  #publicEventBus = (0, import_ternStatusEvent.createTernAuthEventBus)();
66
69
  signIn;
67
70
  signUp;
71
+ session;
68
72
  get isReady() {
69
73
  return this.status === "ready";
70
74
  }
@@ -115,6 +119,15 @@ class TernSecureAuth {
115
119
  import_internal.TernSecureBase.ternsecure = this;
116
120
  }
117
121
  getApiClient = () => this.#apiClient;
122
+ /**
123
+ * Get user data for the provided ID token via backend API
124
+ */
125
+ async getUserData() {
126
+ if (!this.#clientAuthRequest) {
127
+ throw new Error("Client auth request not initialized");
128
+ }
129
+ return this.#clientAuthRequest.getUserData();
130
+ }
118
131
  setLoading(isLoading) {
119
132
  this.isLoading = isLoading;
120
133
  }
@@ -124,6 +137,9 @@ class TernSecureAuth {
124
137
  _internal_getOption(key) {
125
138
  return this.#options[key];
126
139
  }
140
+ _internal_getAllOptions() {
141
+ return Object.freeze({ ...this.#options });
142
+ }
127
143
  static getorCreateInstance(options) {
128
144
  if (!this.instance) {
129
145
  this.instance = new TernSecureAuth(options);
@@ -154,11 +170,19 @@ class TernSecureAuth {
154
170
  throw new Error("apiUrl is required to initialize TernSecureAuth");
155
171
  }
156
172
  this.initializeFirebaseApp(this.#options.ternSecureConfig);
157
- this.authStateUnsubscribe = this.initAuthStateListener();
173
+ const isBrowserCookiePersistence = this.#options.persistence === "browserCookie";
174
+ if (!isBrowserCookiePersistence) {
175
+ this.authStateUnsubscribe = this.initAuthStateListener();
176
+ }
158
177
  this.#authCookieManager = new import_internal.AuthCookieManager();
159
178
  this.csrfToken = this.#authCookieManager.getCSRFToken();
179
+ this.#clientAuthRequest = (0, import_request.createClientAuthRequest)();
160
180
  this.signIn = new import_internal.SignIn(this.auth, this.csrfToken);
161
181
  this.signUp = new import_internal.SignUp(this.auth);
182
+ import_events.eventBus.on(import_events.events.SessionChanged, () => {
183
+ this.#setCreatedActiveSession(this.user || null);
184
+ this.#emit();
185
+ });
162
186
  this.#setStatus("ready");
163
187
  this.#publicEventBus.emit(import_ternStatusEvent.ternEvents.Status, "ready");
164
188
  return this;
@@ -183,6 +207,35 @@ class TernSecureAuth {
183
207
  this.#configureEmulator();
184
208
  (0, import_installations.getInstallations)(this.firebaseClientApp);
185
209
  }
210
+ /**
211
+ * use when cookie are not httpOnly
212
+ */
213
+ initClient = () => {
214
+ var _a;
215
+ const idTokenInCookie = (_a = this.#authCookieManager) == null ? void 0 : _a.getIdTokenCookie();
216
+ const jwtClient = (0, import_jwtClient.createClientFromJwt)(idTokenInCookie || null);
217
+ this.user = jwtClient;
218
+ this.#emit();
219
+ };
220
+ /**
221
+ * @deprecated will be removed in future releases.
222
+ */
223
+ initClientAuthRequest = () => {
224
+ var _a;
225
+ (_a = this.#clientAuthRequest) == null ? void 0 : _a.getIdTokenFromCookie().then((idTokenInCookie) => {
226
+ const { token } = idTokenInCookie;
227
+ const jwtClient = (0, import_jwtClient.createClientFromJwt)(token || null);
228
+ this.user = jwtClient;
229
+ this.#emit();
230
+ }).catch((error) => {
231
+ console.error(
232
+ "[ternauth] Error during client auth request initialization:",
233
+ error
234
+ );
235
+ this.user = null;
236
+ this.#emit();
237
+ });
238
+ };
186
239
  signOut = async (options) => {
187
240
  const redirectUrl = (options == null ? void 0 : options.redirectUrl) || this.#constructAfterSignOutUrl();
188
241
  if (options == null ? void 0 : options.onBeforeSignOut) {
@@ -196,16 +249,29 @@ class TernSecureAuth {
196
249
  window.location.href = redirectUrl;
197
250
  }
198
251
  import_events.eventBus.emit(import_events.events.UserSignOut, null);
199
- import_events.eventBus.emit(import_events.events.TokenRefreshed, { token: null });
252
+ import_events.eventBus.emit(import_events.events.TokenUpdate, { token: null });
200
253
  this.#emit();
201
254
  };
202
255
  get currentSession() {
203
256
  return this.signedInSession;
204
257
  }
258
+ initAuthListener() {
259
+ (async () => {
260
+ await this.auth.authStateReady();
261
+ const user = this.auth.currentUser;
262
+ this._currentUser = user;
263
+ this.user = user;
264
+ await this.updateCurrentSession();
265
+ this.#emit();
266
+ })();
267
+ return () => {
268
+ };
269
+ }
205
270
  initAuthStateListener() {
206
271
  return (0, import_auth.onAuthStateChanged)(this.auth, async (user) => {
207
272
  await this.auth.authStateReady();
208
273
  this._currentUser = user;
274
+ this.user = user;
209
275
  await this.updateCurrentSession();
210
276
  this.#emit();
211
277
  });
@@ -214,10 +280,18 @@ class TernSecureAuth {
214
280
  return (0, import_auth.onIdTokenChanged)(this.auth, async (user) => {
215
281
  await this.auth.authStateReady();
216
282
  this._currentUser = user;
283
+ this.user = user;
217
284
  await this.updateCurrentSession();
218
285
  this.#emit();
219
286
  });
220
287
  }
288
+ async getIdToken() {
289
+ await this.auth.authStateReady();
290
+ if (!this.auth.currentUser) {
291
+ return null;
292
+ }
293
+ return (0, import_auth.getIdToken)(this.auth.currentUser);
294
+ }
221
295
  onAuthStateChanged(callback) {
222
296
  return (0, import_auth.onAuthStateChanged)(this.auth, callback);
223
297
  }
@@ -238,7 +312,8 @@ class TernSecureAuth {
238
312
  issuedAtTime: res.issuedAtTime,
239
313
  expirationTime: res.expirationTime,
240
314
  authTime: res.authTime,
241
- signInProvider: res.signInProvider || "unknown"
315
+ signInProvider: res.signInProvider || "unknown",
316
+ signInSecondFactor: res.signInSecondFactor
242
317
  };
243
318
  } catch (error) {
244
319
  console.error("[TernSecureAuth] Error updating session:", error);
@@ -250,7 +325,7 @@ class TernSecureAuth {
250
325
  const result = await (0, import_auth.getRedirectResult)(this.auth);
251
326
  if (result) {
252
327
  return {
253
- success: true,
328
+ status: "success",
254
329
  user: result.user
255
330
  };
256
331
  }
@@ -258,13 +333,15 @@ class TernSecureAuth {
258
333
  } catch (error) {
259
334
  const authError = (0, import_errors.handleFirebaseAuthError)(error);
260
335
  return {
261
- success: false,
336
+ status: "error",
262
337
  message: authError.message,
263
- error: authError.code,
264
- user: null
338
+ error: authError.code
265
339
  };
266
340
  }
267
341
  }
342
+ getRedirectResult = async () => {
343
+ throw new Error("getRedirectResult not implemented");
344
+ };
268
345
  addListener = (listener) => {
269
346
  this.#listeners.push(listener);
270
347
  if (this._currentUser) {
@@ -284,6 +361,24 @@ class TernSecureAuth {
284
361
  off = (...args) => {
285
362
  this.#publicEventBus.off(...args);
286
363
  };
364
+ createActiveSession = async ({
365
+ session,
366
+ redirectUrl
367
+ }) => {
368
+ try {
369
+ if (!session) {
370
+ throw new Error("No session provided to createActiveSession");
371
+ }
372
+ const sessionResult = await session.getIdTokenResult();
373
+ const sessionData = new import_internal.Session(sessionResult);
374
+ await sessionData.create(this.csrfToken || "");
375
+ await this.redirectAfterSignIn();
376
+ this.#setCreatedActiveSession(session);
377
+ this.#emit();
378
+ } catch (error) {
379
+ console.error("[TernSecureAuth] Error creating active session:", error);
380
+ }
381
+ };
287
382
  initialize(options) {
288
383
  this._initialize(options);
289
384
  return Promise.resolve();
@@ -366,9 +461,9 @@ class TernSecureAuth {
366
461
  if (effectiveRedirectUrl) {
367
462
  if (inBrowser()) {
368
463
  const absoluteRedirectUrl = new URL(effectiveRedirectUrl, window.location.origin).href;
369
- (_a = paramsForBuildUrl.searchParams) == null ? void 0 : _a.set("redirect", absoluteRedirectUrl);
464
+ (_a = paramsForBuildUrl.searchParams) == null ? void 0 : _a.set("redirect_url", absoluteRedirectUrl);
370
465
  } else {
371
- (_b = paramsForBuildUrl.searchParams) == null ? void 0 : _b.set("redirect", effectiveRedirectUrl);
466
+ (_b = paramsForBuildUrl.searchParams) == null ? void 0 : _b.set("redirect_url", effectiveRedirectUrl);
372
467
  }
373
468
  }
374
469
  const constructedUrl = (0, import_construct.buildURL)(paramsForBuildUrl, {
@@ -390,12 +485,60 @@ class TernSecureAuth {
390
485
  }
391
486
  return this.constructUrlWithAuthRedirect(constructedUrl);
392
487
  };
488
+ #constructAfterSignInUrl = () => {
489
+ if (!inBrowser()) {
490
+ return "/";
491
+ }
492
+ let redirectPath = void 0;
493
+ const defaultRedirectPath = "/";
494
+ if (this.#options.signInForceRedirectUrl) {
495
+ redirectPath = this.#options.signInForceRedirectUrl;
496
+ }
497
+ if (!redirectPath) {
498
+ const urlParams = new URLSearchParams(window.location.search);
499
+ const redirectPathFromParams = urlParams.get("redirect_url");
500
+ if (redirectPathFromParams) {
501
+ redirectPath = redirectPathFromParams;
502
+ }
503
+ }
504
+ if (!redirectPath) {
505
+ redirectPath = defaultRedirectPath;
506
+ }
507
+ const currentPath = window.location.pathname;
508
+ if ((0, import_construct.hasRedirectLoop)(currentPath, redirectPath)) {
509
+ return defaultRedirectPath;
510
+ }
511
+ return this.constructUrlWithAuthRedirect(redirectPath);
512
+ };
393
513
  #constructAfterSignOutUrl = () => {
394
514
  if (!this.#options.afterSignOutUrl) {
395
515
  return "/";
396
516
  }
397
517
  return this.constructUrlWithAuthRedirect(this.#options.afterSignOutUrl);
398
518
  };
519
+ redirectToSignIn = async (options) => {
520
+ if (inBrowser()) {
521
+ const url = this.constructSignInUrl(options);
522
+ window.location.href = url;
523
+ }
524
+ return;
525
+ };
526
+ redirectToSignUp = async (options) => {
527
+ if (inBrowser()) {
528
+ const redirectUrl = this.constructSignUpUrl();
529
+ window.location.href = redirectUrl;
530
+ }
531
+ return;
532
+ };
533
+ redirectAfterSignIn = async () => {
534
+ if (inBrowser()) {
535
+ const destinationUrl = this.#constructAfterSignInUrl();
536
+ window.location.href = destinationUrl;
537
+ }
538
+ };
539
+ redirectAfterSignUp = () => {
540
+ throw new Error("redirectAfterSignUp is not implemented yet");
541
+ };
399
542
  constructSignInUrl = (options) => {
400
543
  return this.#buildUrl("signInUrl", { ...options });
401
544
  };
@@ -413,13 +556,11 @@ class TernSecureAuth {
413
556
  };
414
557
  };
415
558
  #emit = () => {
416
- if (this._currentUser) {
417
- for (const listener of this.#listeners) {
418
- listener({
419
- user: this._currentUser,
420
- session: this.signedInSession
421
- });
422
- }
559
+ for (const listener of this.#listeners) {
560
+ listener({
561
+ user: this.user,
562
+ session: this.signedInSession
563
+ });
423
564
  }
424
565
  };
425
566
  #setStatus(newStatus) {
@@ -431,8 +572,11 @@ class TernSecureAuth {
431
572
  }
432
573
  }
433
574
  }
575
+ #setCreatedActiveSession = (session) => {
576
+ this.user = session;
577
+ };
434
578
  #setPersistence = () => {
435
- const persistenceType = this.#options.persistence || "none";
579
+ const persistenceType = this.#options.persistence;
436
580
  switch (persistenceType) {
437
581
  case "browserCookie":
438
582
  return import_auth.inMemoryPersistence;