@tern-secure/backend 1.1.5 → 1.1.7

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 (159) hide show
  1. package/admin/package.json +5 -0
  2. package/dist/adapters/PostgresAdapter.d.ts +8 -0
  3. package/dist/adapters/PostgresAdapter.d.ts.map +1 -0
  4. package/dist/adapters/RedisAdapter.d.ts +10 -0
  5. package/dist/adapters/RedisAdapter.d.ts.map +1 -0
  6. package/dist/adapters/index.d.ts +13 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/types.d.ts +30 -0
  9. package/dist/adapters/types.d.ts.map +1 -0
  10. package/dist/admin/gemini_sessionTernSecure.d.ts +10 -0
  11. package/dist/admin/gemini_sessionTernSecure.d.ts.map +1 -0
  12. package/dist/admin/index.d.ts +8 -0
  13. package/dist/admin/index.d.ts.map +1 -0
  14. package/dist/admin/index.js +705 -0
  15. package/dist/admin/index.js.map +1 -0
  16. package/dist/admin/index.mjs +512 -0
  17. package/dist/admin/index.mjs.map +1 -0
  18. package/dist/admin/nextSessionTernSecure.d.ts +28 -0
  19. package/dist/admin/nextSessionTernSecure.d.ts.map +1 -0
  20. package/dist/admin/sessionTernSecure.d.ts +6 -0
  21. package/dist/admin/sessionTernSecure.d.ts.map +1 -0
  22. package/dist/admin/tenant.d.ts.map +1 -0
  23. package/dist/api/createBackendApi.d.ts +8 -0
  24. package/dist/api/createBackendApi.d.ts.map +1 -0
  25. package/dist/api/endpoints/SessionApi.d.ts +12 -0
  26. package/dist/api/endpoints/SessionApi.d.ts.map +1 -0
  27. package/dist/api/endpoints/index.d.ts +2 -0
  28. package/dist/api/endpoints/index.d.ts.map +1 -0
  29. package/dist/api/index.d.ts +2 -0
  30. package/dist/api/index.d.ts.map +1 -0
  31. package/dist/api/request.d.ts +36 -0
  32. package/dist/api/request.d.ts.map +1 -0
  33. package/dist/chunk-JFOTE3Y5.mjs +157 -0
  34. package/dist/chunk-JFOTE3Y5.mjs.map +1 -0
  35. package/dist/chunk-WZYVAHZ3.mjs +318 -0
  36. package/dist/chunk-WZYVAHZ3.mjs.map +1 -0
  37. package/dist/constants.d.ts +63 -0
  38. package/dist/constants.d.ts.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +1307 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/index.mjs +839 -0
  44. package/dist/index.mjs.map +1 -0
  45. package/dist/instance/backendFireInstance.d.ts +7 -0
  46. package/dist/instance/backendFireInstance.d.ts.map +1 -0
  47. package/dist/instance/backendInstance.d.ts +20 -0
  48. package/dist/instance/backendInstance.d.ts.map +1 -0
  49. package/dist/instance/backendInstanceEdge.d.ts +13 -0
  50. package/dist/instance/backendInstanceEdge.d.ts.map +1 -0
  51. package/dist/jwt/algorithms.d.ts +3 -0
  52. package/dist/jwt/algorithms.d.ts.map +1 -0
  53. package/dist/jwt/cryptoKeys.d.ts +3 -0
  54. package/dist/jwt/cryptoKeys.d.ts.map +1 -0
  55. package/dist/jwt/guardReturn.d.ts +3 -0
  56. package/dist/jwt/guardReturn.d.ts.map +1 -0
  57. package/dist/jwt/index.d.ts +4 -0
  58. package/dist/jwt/index.d.ts.map +1 -0
  59. package/dist/jwt/index.js +332 -0
  60. package/dist/jwt/index.js.map +1 -0
  61. package/dist/jwt/index.mjs +139 -0
  62. package/dist/jwt/index.mjs.map +1 -0
  63. package/dist/jwt/jwt.d.ts +4 -0
  64. package/dist/jwt/jwt.d.ts.map +1 -0
  65. package/dist/jwt/signJwt.d.ts +5 -0
  66. package/dist/jwt/signJwt.d.ts.map +1 -0
  67. package/dist/jwt/types.d.ts +8 -0
  68. package/dist/jwt/types.d.ts.map +1 -0
  69. package/dist/jwt/verifyContent.d.ts +7 -0
  70. package/dist/jwt/verifyContent.d.ts.map +1 -0
  71. package/dist/jwt/verifyJwt.d.ts +12 -0
  72. package/dist/jwt/verifyJwt.d.ts.map +1 -0
  73. package/dist/runtime/browser/crypto.mjs +1 -0
  74. package/dist/runtime/node/crypto.js +1 -0
  75. package/dist/runtime/node/crypto.mjs +1 -0
  76. package/dist/runtime.d.ts +26 -0
  77. package/dist/runtime.d.ts.map +1 -0
  78. package/dist/ternsecureauth.d.ts.map +1 -0
  79. package/dist/tokens/authstate.d.ts +61 -0
  80. package/dist/tokens/authstate.d.ts.map +1 -0
  81. package/dist/tokens/keys.d.ts +16 -0
  82. package/dist/tokens/keys.d.ts.map +1 -0
  83. package/dist/tokens/request.d.ts +16 -0
  84. package/dist/tokens/request.d.ts.map +1 -0
  85. package/dist/tokens/requestFire.d.ts +17 -0
  86. package/dist/tokens/requestFire.d.ts.map +1 -0
  87. package/dist/tokens/sessionConfig.d.ts +14 -0
  88. package/dist/tokens/sessionConfig.d.ts.map +1 -0
  89. package/dist/tokens/ternSecureRequest.d.ts +20 -0
  90. package/dist/tokens/ternSecureRequest.d.ts.map +1 -0
  91. package/dist/tokens/ternUrl.d.ts +15 -0
  92. package/dist/tokens/ternUrl.d.ts.map +1 -0
  93. package/dist/tokens/types.d.ts +41 -0
  94. package/dist/tokens/types.d.ts.map +1 -0
  95. package/dist/tokens/verify.d.ts +11 -0
  96. package/dist/tokens/verify.d.ts.map +1 -0
  97. package/dist/utils/admin-init.d.ts +13 -0
  98. package/dist/utils/admin-init.d.ts.map +1 -0
  99. package/dist/{types/utils → utils}/config.d.ts +1 -1
  100. package/dist/utils/config.d.ts.map +1 -0
  101. package/dist/utils/enableDebugLogging.d.ts +5 -0
  102. package/dist/utils/enableDebugLogging.d.ts.map +1 -0
  103. package/dist/utils/errors.d.ts +29 -0
  104. package/dist/utils/errors.d.ts.map +1 -0
  105. package/dist/utils/gemini_admin-init.d.ts +10 -0
  106. package/dist/utils/gemini_admin-init.d.ts.map +1 -0
  107. package/dist/utils/logger.d.ts +28 -0
  108. package/dist/utils/logger.d.ts.map +1 -0
  109. package/dist/utils/mapDecode.d.ts +4 -0
  110. package/dist/utils/mapDecode.d.ts.map +1 -0
  111. package/dist/utils/options.d.ts +5 -0
  112. package/dist/utils/options.d.ts.map +1 -0
  113. package/dist/utils/path.d.ts +4 -0
  114. package/dist/utils/path.d.ts.map +1 -0
  115. package/dist/utils/redis.d.ts +10 -0
  116. package/dist/utils/redis.d.ts.map +1 -0
  117. package/dist/utils/rfc4648.d.ts +26 -0
  118. package/dist/utils/rfc4648.d.ts.map +1 -0
  119. package/jwt/package.json +5 -0
  120. package/package.json +58 -10
  121. package/dist/cjs/admin/sessionTernSecure.js +0 -256
  122. package/dist/cjs/admin/sessionTernSecure.js.map +0 -1
  123. package/dist/cjs/admin/tenant.js +0 -68
  124. package/dist/cjs/admin/tenant.js.map +0 -1
  125. package/dist/cjs/global.d.js +0 -2
  126. package/dist/cjs/global.d.js.map +0 -1
  127. package/dist/cjs/index.js +0 -48
  128. package/dist/cjs/index.js.map +0 -1
  129. package/dist/cjs/ternsecureauth.js +0 -40
  130. package/dist/cjs/ternsecureauth.js.map +0 -1
  131. package/dist/cjs/utils/admin-init.js +0 -60
  132. package/dist/cjs/utils/admin-init.js.map +0 -1
  133. package/dist/cjs/utils/config.js +0 -113
  134. package/dist/cjs/utils/config.js.map +0 -1
  135. package/dist/esm/admin/sessionTernSecure.js +0 -226
  136. package/dist/esm/admin/sessionTernSecure.js.map +0 -1
  137. package/dist/esm/admin/tenant.js +0 -43
  138. package/dist/esm/admin/tenant.js.map +0 -1
  139. package/dist/esm/global.d.js +0 -1
  140. package/dist/esm/global.d.js.map +0 -1
  141. package/dist/esm/index.js +0 -24
  142. package/dist/esm/index.js.map +0 -1
  143. package/dist/esm/ternsecureauth.js +0 -16
  144. package/dist/esm/ternsecureauth.js.map +0 -1
  145. package/dist/esm/utils/admin-init.js +0 -24
  146. package/dist/esm/utils/admin-init.js.map +0 -1
  147. package/dist/esm/utils/config.js +0 -84
  148. package/dist/esm/utils/config.js.map +0 -1
  149. package/dist/types/admin/sessionTernSecure.d.ts +0 -36
  150. package/dist/types/admin/sessionTernSecure.d.ts.map +0 -1
  151. package/dist/types/admin/tenant.d.ts.map +0 -1
  152. package/dist/types/index.d.ts +0 -5
  153. package/dist/types/index.d.ts.map +0 -1
  154. package/dist/types/ternsecureauth.d.ts.map +0 -1
  155. package/dist/types/utils/admin-init.d.ts +0 -5
  156. package/dist/types/utils/admin-init.d.ts.map +0 -1
  157. package/dist/types/utils/config.d.ts.map +0 -1
  158. /package/dist/{types/admin → admin}/tenant.d.ts +0 -0
  159. /package/dist/{types/ternsecureauth.d.ts → ternsecureauth.d.ts} +0 -0
@@ -0,0 +1,139 @@
1
+ import {
2
+ ternDecodeJwt
3
+ } from "../chunk-WZYVAHZ3.mjs";
4
+
5
+ // src/jwt/guardReturn.ts
6
+ function createJwtGuard(decodedFn) {
7
+ return (...args) => {
8
+ const { data, errors } = decodedFn(...args);
9
+ if (errors) {
10
+ throw errors[0];
11
+ }
12
+ return data;
13
+ };
14
+ }
15
+
16
+ // src/jwt/jwt.ts
17
+ import { createRemoteJWKSet, decodeJwt, jwtVerify } from "jose";
18
+ var FIREBASE_ID_TOKEN_URL = "https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com";
19
+ var FIREBASE_SESSION_CERT_URL = "https://identitytoolkit.googleapis.com/v1/sessionCookiePublicKeys";
20
+ var idTokenJWKS = null;
21
+ var sessionJWKS = null;
22
+ var getIdTokenJWKS = () => {
23
+ if (!idTokenJWKS) {
24
+ idTokenJWKS = createRemoteJWKSet(new URL(FIREBASE_ID_TOKEN_URL), {
25
+ cacheMaxAge: 36e5,
26
+ // 1 hour
27
+ timeoutDuration: 5e3,
28
+ // 5 seconds
29
+ cooldownDuration: 3e4
30
+ // 30 seconds between retries
31
+ });
32
+ }
33
+ return idTokenJWKS;
34
+ };
35
+ var getSessionJWKS = () => {
36
+ if (!sessionJWKS) {
37
+ sessionJWKS = createRemoteJWKSet(new URL(FIREBASE_SESSION_CERT_URL), {
38
+ cacheMaxAge: 36e5,
39
+ // 1 hour
40
+ timeoutDuration: 5e3,
41
+ // 5 seconds
42
+ cooldownDuration: 3e4
43
+ // 30 seconds between retries
44
+ });
45
+ }
46
+ return sessionJWKS;
47
+ };
48
+ async function verifyToken(token, isSessionCookie = false) {
49
+ try {
50
+ const projectId = process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID;
51
+ if (!projectId) {
52
+ throw new Error("Firebase Project ID is not configured");
53
+ }
54
+ const { decoded } = decodeJwt(token);
55
+ if (!decoded) {
56
+ throw new Error("Invalid token format");
57
+ }
58
+ let retries = 3;
59
+ let lastError = null;
60
+ while (retries > 0) {
61
+ try {
62
+ const JWKS = isSessionCookie ? getSessionJWKS() : getIdTokenJWKS();
63
+ const { payload } = await jwtVerify(token, JWKS, {
64
+ issuer: isSessionCookie ? "https://session.firebase.google.com/" + projectId : "https://securetoken.google.com/" + projectId,
65
+ audience: projectId,
66
+ algorithms: ["RS256"]
67
+ });
68
+ const firebasePayload = payload;
69
+ const now = Math.floor(Date.now() / 1e3);
70
+ if (firebasePayload.exp <= now) {
71
+ throw new Error("Token has expired");
72
+ }
73
+ if (firebasePayload.iat > now) {
74
+ throw new Error("Token issued time is in the future");
75
+ }
76
+ if (!firebasePayload.sub) {
77
+ throw new Error("Token subject is empty");
78
+ }
79
+ if (firebasePayload.auth_time > now) {
80
+ throw new Error("Token auth time is in the future");
81
+ }
82
+ return {
83
+ valid: true,
84
+ uid: firebasePayload.sub,
85
+ sub: firebasePayload.sub,
86
+ email: firebasePayload.email,
87
+ email_verified: firebasePayload.email_verified,
88
+ auth_time: firebasePayload.auth_time,
89
+ iat: firebasePayload.iat,
90
+ exp: firebasePayload.exp,
91
+ aud: firebasePayload.aud,
92
+ iss: firebasePayload.iss,
93
+ firebase: firebasePayload.firebase,
94
+ phone_number: firebasePayload.phone_number,
95
+ picture: firebasePayload.picture
96
+ };
97
+ } catch (error) {
98
+ lastError = error;
99
+ if (error instanceof Error && error.name === "JWKSNoMatchingKey") {
100
+ console.warn(`JWKS retry attempt ${4 - retries}:`, error.message);
101
+ retries--;
102
+ if (retries > 0) {
103
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
104
+ continue;
105
+ }
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ throw lastError || new Error("Failed to verify token after retries");
111
+ } catch (error) {
112
+ console.error("Token verification details:", {
113
+ error: error instanceof Error ? {
114
+ name: error.name,
115
+ message: error.message,
116
+ stack: error.stack
117
+ } : error,
118
+ decoded: decodeJwt(token),
119
+ isSessionCookie
120
+ });
121
+ return {
122
+ valid: false,
123
+ error: {
124
+ success: false,
125
+ message: error instanceof Error ? error.message : "Invalid token",
126
+ code: "INVALID_TOKEN"
127
+ }
128
+ };
129
+ }
130
+ }
131
+
132
+ // src/jwt/index.ts
133
+ var ternDecodeJwt2 = createJwtGuard(ternDecodeJwt);
134
+ export {
135
+ ternDecodeJwt2 as ternDecodeJwt,
136
+ ternDecodeJwt as ternDecodeJwtUnguarded,
137
+ verifyToken
138
+ };
139
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/jwt/guardReturn.ts","../../src/jwt/jwt.ts","../../src/jwt/index.ts"],"sourcesContent":["import { type JwtReturnType } from \"./types\";\n\nexport function createJwtGuard<T extends (...args: any[]) => JwtReturnType<any, any>>(decodedFn: T) {\n return (...args: Parameters<T>): NonNullable<Awaited<ReturnType<T>>['data']> | never => {\n const { data, errors } = decodedFn(...args);\n\n if (errors) {\n throw errors[0];\n }\n\n return data;\n };\n}\n","import type {\n DecodedIdToken,\n TernVerificationResult,\n} from \"@tern-secure/types\";\nimport { createRemoteJWKSet, decodeJwt,jwtVerify } from \"jose\";\n\n\nexport type FirebaseIdTokenPayload = DecodedIdToken;\n\n// Firebase public key endpoints\nconst FIREBASE_ID_TOKEN_URL =\n \"https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com\";\nconst FIREBASE_SESSION_CERT_URL =\n \"https://identitytoolkit.googleapis.com/v1/sessionCookiePublicKeys\";\n\n//const FIREBASE_NEW_SESSION_PK = \"https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys\"\n\n// Simple in-memory cache for JWKS\nlet idTokenJWKS: ReturnType<typeof createRemoteJWKSet> | null = null;\nlet sessionJWKS: ReturnType<typeof createRemoteJWKSet> | null = null;\n\nconst getIdTokenJWKS = () => {\n if (!idTokenJWKS) {\n idTokenJWKS = createRemoteJWKSet(new URL(FIREBASE_ID_TOKEN_URL), {\n cacheMaxAge: 3600000, // 1 hour\n timeoutDuration: 5000, // 5 seconds\n cooldownDuration: 30000, // 30 seconds between retries\n });\n }\n return idTokenJWKS;\n};\n\nconst getSessionJWKS = () => {\n if (!sessionJWKS) {\n sessionJWKS = createRemoteJWKSet(new URL(FIREBASE_SESSION_CERT_URL), {\n cacheMaxAge: 3600000, // 1 hour\n timeoutDuration: 5000, // 5 seconds\n cooldownDuration: 30000, // 30 seconds between retries\n });\n }\n return sessionJWKS;\n};\n\n\n\nexport async function verifyToken(\n token: string,\n isSessionCookie = false\n): Promise<TernVerificationResult> {\n try {\n const projectId = process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID;\n if (!projectId) {\n throw new Error(\"Firebase Project ID is not configured\");\n }\n\n const { decoded } = decodeJwt(token);\n if (!decoded) {\n throw new Error(\"Invalid token format\");\n }\n\n let retries = 3;\n let lastError: Error | null = null;\n\n while (retries > 0) {\n try {\n // Use different JWKS based on token type\n const JWKS = isSessionCookie ? getSessionJWKS() : getIdTokenJWKS();\n\n const { payload } = await jwtVerify(token, JWKS, {\n issuer: isSessionCookie\n ? \"https://session.firebase.google.com/\" + projectId\n : \"https://securetoken.google.com/\" + projectId,\n audience: projectId,\n algorithms: [\"RS256\"],\n });\n\n const firebasePayload = payload as unknown as FirebaseIdTokenPayload;\n const now = Math.floor(Date.now() / 1000);\n\n // Verify token claims\n if (firebasePayload.exp <= now) {\n throw new Error(\"Token has expired\");\n }\n\n if (firebasePayload.iat > now) {\n throw new Error(\"Token issued time is in the future\");\n }\n\n if (!firebasePayload.sub) {\n throw new Error(\"Token subject is empty\");\n }\n\n if (firebasePayload.auth_time > now) {\n throw new Error(\"Token auth time is in the future\");\n }\n\n return {\n valid: true,\n uid: firebasePayload.sub,\n sub: firebasePayload.sub,\n email: firebasePayload.email,\n email_verified: firebasePayload.email_verified,\n auth_time: firebasePayload.auth_time,\n iat: firebasePayload.iat,\n exp: firebasePayload.exp,\n aud: firebasePayload.aud,\n iss: firebasePayload.iss,\n firebase: firebasePayload.firebase,\n phone_number: firebasePayload.phone_number,\n picture: firebasePayload.picture,\n };\n } catch (error) {\n lastError = error as Error;\n if (error instanceof Error && error.name === \"JWKSNoMatchingKey\") {\n console.warn(`JWKS retry attempt ${4 - retries}:`, error.message);\n retries--;\n if (retries > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n continue;\n }\n }\n throw error;\n }\n }\n\n throw lastError || new Error(\"Failed to verify token after retries\");\n } catch (error) {\n console.error(\"Token verification details:\", {\n error:\n error instanceof Error\n ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n : error,\n decoded: decodeJwt(token),\n isSessionCookie,\n });\n\n return {\n valid: false,\n error: {\n success: false,\n message: error instanceof Error ? error.message : \"Invalid token\",\n code: \"INVALID_TOKEN\",\n },\n };\n }\n}\n","import { createJwtGuard } from './guardReturn';\nimport { ternDecodeJwt as _ternDecodeJwt } from './verifyJwt';\n\nexport const ternDecodeJwt = createJwtGuard(_ternDecodeJwt);\nexport { ternDecodeJwt as ternDecodeJwtUnguarded } from './verifyJwt';\n\nexport * from './jwt';"],"mappings":"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","names":["ternDecodeJwt"]}
@@ -0,0 +1,4 @@
1
+ import type { DecodedIdToken, TernVerificationResult } from "@tern-secure/types";
2
+ export type FirebaseIdTokenPayload = DecodedIdToken;
3
+ export declare function verifyToken(token: string, isSessionCookie?: boolean): Promise<TernVerificationResult>;
4
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/jwt/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAsCpD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,eAAe,UAAQ,GACtB,OAAO,CAAC,sBAAsB,CAAC,CAqGjC"}
@@ -0,0 +1,5 @@
1
+ export interface SignJwtOptions {
2
+ algorithm?: string;
3
+ header?: Record<string, unknown>;
4
+ }
5
+ //# sourceMappingURL=signJwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signJwt.d.ts","sourceRoot":"","sources":["../../src/jwt/signJwt.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
@@ -0,0 +1,8 @@
1
+ export type JwtReturnType<R, E extends Error> = {
2
+ data: R;
3
+ errors?: undefined;
4
+ } | {
5
+ data?: undefined;
6
+ errors: [E];
7
+ };
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jwt/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,IACxC;IACE,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,GACD;IACE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;CACb,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const verifyHeaderType: (typ?: unknown) => void;
2
+ export declare const verifyHeaderKid: (kid?: unknown) => void;
3
+ export declare const verifyHeaderAlgorithm: (alg: string) => void;
4
+ export declare const verifySubClaim: (sub?: string) => void;
5
+ export declare const verifyExpirationClaim: (exp: number | undefined, clockSkewInMs: number) => void;
6
+ export declare const verifyIssuedAtClaim: (iat: number | undefined, clockSkewInMs: number) => void;
7
+ //# sourceMappingURL=verifyContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyContent.d.ts","sourceRoot":"","sources":["../../src/jwt/verifyContent.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,GAAI,MAAM,OAAO,SAW7C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO,SAW5C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,SAOhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,SAO1C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,GAAG,SAAS,EAAE,eAAe,MAAM,SAmBnF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,GAAG,SAAS,EAAE,eAAe,MAAM,SAuBjF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DecodedIdToken, Jwt, JWTPayload } from '@tern-secure/types';
2
+ import { TokenVerificationError } from '../utils/errors';
3
+ import type { JwtReturnType } from './types';
4
+ export type VerifyJwtOptions = {
5
+ audience?: string | string[];
6
+ clockSkewInMs?: number;
7
+ key: JsonWebKey | string;
8
+ };
9
+ export declare function verifySignature(jwt: Jwt, key: JsonWebKey | string): Promise<JwtReturnType<JWTPayload, Error>>;
10
+ export declare function ternDecodeJwt(token: string): JwtReturnType<Jwt, TokenVerificationError>;
11
+ export declare function verifyJwt(token: string, options: VerifyJwtOptions): Promise<JwtReturnType<DecodedIdToken, TokenVerificationError>>;
12
+ //# sourceMappingURL=verifyJwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyJwt.d.ts","sourceRoot":"","sources":["../../src/jwt/verifyJwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOzE,OAAO,EAAE,sBAAsB,EAAgC,MAAM,iBAAiB,CAAC;AAIvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAU7C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,UAAU,GAAG,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,eAAe,CACnC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,UAAU,GAAG,MAAM,GACvB,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAoB3C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,sBAAsB,CAAC,CA2CvF;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC,CAmChE"}
@@ -0,0 +1 @@
1
+ export const webcrypto = crypto;
@@ -0,0 +1 @@
1
+ module.exports.webcrypto = require('node:crypto').webcrypto;
@@ -0,0 +1 @@
1
+ export { webcrypto } from 'node:crypto';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This file exports APIs that vary across runtimes (i.e. Node & Browser - V8 isolates)
3
+ * as a singleton object.
4
+ *
5
+ * Runtime polyfills are written in VanillaJS for now to avoid TS complication. Moreover,
6
+ * due to this issue https://github.com/microsoft/TypeScript/issues/44848, there is not a good way
7
+ * to tell Typescript which conditional import to use during build type.
8
+ *
9
+ * The Runtime type definition ensures type safety for now.
10
+ * Runtime js modules are copied into dist folder with bash script.
11
+ *
12
+ * TODO: Support TS runtime modules
13
+ */
14
+ type Runtime = {
15
+ crypto: Crypto;
16
+ fetch: typeof globalThis.fetch;
17
+ AbortController: typeof globalThis.AbortController;
18
+ Blob: typeof globalThis.Blob;
19
+ FormData: typeof globalThis.FormData;
20
+ Headers: typeof globalThis.Headers;
21
+ Request: typeof globalThis.Request;
22
+ Response: typeof globalThis.Response;
23
+ };
24
+ export declare const runtime: Runtime;
25
+ export {};
26
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,KAAK,OAAO,GAAG;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,eAAe,EAAE,OAAO,UAAU,CAAC,eAAe,CAAC;IACnD,IAAI,EAAE,OAAO,UAAU,CAAC,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,UAAU,CAAC,QAAQ,CAAC;IACrC,OAAO,EAAE,OAAO,UAAU,CAAC,OAAO,CAAC;IACnC,OAAO,EAAE,OAAO,UAAU,CAAC,OAAO,CAAC;IACnC,QAAQ,EAAE,OAAO,UAAU,CAAC,QAAQ,CAAC;CACtC,CAAC;AAUF,eAAO,MAAM,OAAO,EAAE,OAYrB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ternsecureauth.d.ts","sourceRoot":"","sources":["../src/ternsecureauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;WAEzC,mBAAmB,IAAI,sBAAsB;IAO3D,MAAM,CAAC,aAAa;CAIvB"}
@@ -0,0 +1,61 @@
1
+ import type { CheckAuthorizationFromSessionClaims, DecodedIdToken } from '@tern-secure/types';
2
+ import type { JWTPayload } from 'jose';
3
+ import type { TokenVerificationErrorReason } from '../utils/errors';
4
+ import type { TernSecureRequest } from './ternSecureRequest';
5
+ export declare const AuthStatus: {
6
+ readonly SignedIn: "signed-in";
7
+ readonly SignedOut: "signed-out";
8
+ };
9
+ export type AuthStatus = (typeof AuthStatus)[keyof typeof AuthStatus];
10
+ export declare const AuthErrorReason: {
11
+ readonly SessionTokenAndUATMissing: "session-token-and-uat-missing";
12
+ readonly SessionTokenMissing: "session-token-missing";
13
+ readonly SessionTokenExpired: "session-token-expired";
14
+ readonly SessionTokenIATBeforeClientUAT: "session-token-iat-before-client-uat";
15
+ readonly SessionTokenNBF: "session-token-nbf";
16
+ readonly SessionTokenIatInTheFuture: "session-token-iat-in-the-future";
17
+ readonly ActiveOrganizationMismatch: "active-organization-mismatch";
18
+ readonly UnexpectedError: "unexpected-error";
19
+ };
20
+ export type AuthErrorReason = (typeof AuthErrorReason)[keyof typeof AuthErrorReason];
21
+ export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;
22
+ export type SignedInAuthObject = {
23
+ sessionClaims: DecodedIdToken;
24
+ userId: string;
25
+ token: string;
26
+ require: CheckAuthorizationFromSessionClaims;
27
+ error: string | null;
28
+ };
29
+ export type SignedOutAuthObject = {
30
+ sessionClaims: null;
31
+ userId: null;
32
+ require: CheckAuthorizationFromSessionClaims;
33
+ error: string | null;
34
+ };
35
+ export type SignedInState = {
36
+ status: typeof AuthStatus.SignedIn;
37
+ reason: null;
38
+ isSignedIn: true;
39
+ auth: () => SignedInAuthObject;
40
+ token: string;
41
+ headers: Headers;
42
+ };
43
+ export type SignedOutState = {
44
+ status: typeof AuthStatus.SignedOut;
45
+ reason: string;
46
+ isSignedIn: false;
47
+ auth: () => SignedOutAuthObject;
48
+ token: null;
49
+ headers: Headers;
50
+ };
51
+ export type RequestState = SignedInState | SignedOutState;
52
+ export interface BackendInstance {
53
+ ternSecureRequest: TernSecureRequest;
54
+ requestState: RequestState;
55
+ }
56
+ export type AuthObject = SignedInAuthObject | SignedOutAuthObject;
57
+ export declare function signedInAuthObject(sessionToken: string, sessionClaims: JWTPayload): SignedInAuthObject;
58
+ export declare function signedOutAuthObject(): SignedOutAuthObject;
59
+ export declare function signedIn(sessionClaims: JWTPayload, headers: Headers | undefined, token: string): SignedInState;
60
+ export declare function signedOut(reason: AuthReason, headers?: Headers): SignedOutState;
61
+ //# sourceMappingURL=authstate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authstate.d.ts","sourceRoot":"","sources":["../../src/tokens/authstate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mCAAmC,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,eAAO,MAAM,UAAU;;;CAGb,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,4BAA4B,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mCAAmC,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,IAAI,CAAC;IACpB,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,EAAE,mCAAmC,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,UAAU,CAAC,QAAQ,CAAC;IACnC,MAAM,EAAE,IAAI,CAAC;IACb,UAAU,EAAE,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,UAAU,CAAC,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,KAAK,CAAC;IAClB,IAAI,EAAE,MAAM,mBAAmB,CAAC;IAChC,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,cAAc,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAmClE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,UAAU,GACxB,kBAAkB,CAWpB;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,CAOzD;AAED,wBAAgB,QAAQ,CACtB,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,OAAO,YAAgB,EAChC,KAAK,EAAE,MAAM,GACZ,aAAa,CAUf;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,OAAuB,GAAG,cAAc,CAS9F"}
@@ -0,0 +1,16 @@
1
+ import { type RemoteJWKSetOptions } from 'jose';
2
+ export type PublicKeys = {
3
+ [key: string]: string;
4
+ };
5
+ export type LoadJWKFromRemoteOptions = RemoteJWKSetOptions & {
6
+ kid: string;
7
+ keyURL?: string;
8
+ skipJwksCache?: boolean;
9
+ };
10
+ export declare function loadJWKFromRemote({ keyURL, skipJwksCache, kid, }: LoadJWKFromRemoteOptions): Promise<string>;
11
+ export declare const getCacheStats: () => {
12
+ localExpiry: number;
13
+ googleExpiry: number;
14
+ cacheCount: number;
15
+ };
16
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/tokens/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAUhD,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAOnD,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,GAAG;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAwCF,wBAAsB,iBAAiB,CAAC,EACtC,MAAuC,EACvC,aAAa,EACb,GAAG,GACJ,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B5C;AAiCD,eAAO,MAAM,aAAa;;;;CAIxB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ApiClient } from '../api';
2
+ import { type buildTimeOptions, type RuntimeOptions } from '../utils/options';
3
+ import type { RequestState } from './authstate';
4
+ import type { RequestOptions } from './types';
5
+ export declare function authenticateRequest(request: Request, options: RequestOptions): Promise<RequestState>;
6
+ /**
7
+ * @internal
8
+ */
9
+ export type CreateAuthenticateRequestOptions = {
10
+ options: buildTimeOptions;
11
+ apiClient: ApiClient;
12
+ };
13
+ export declare function createAuthenticateRequest(params: CreateAuthenticateRequestOptions): {
14
+ authenticateRequest: (request: Request, options?: RuntimeOptions) => Promise<RequestState>;
15
+ };
16
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/tokens/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAwC9C,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,YAAY,CAAC,CAqCvB;AAED;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC7C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gCAAgC;mCAIpC,OAAO,YAAW,cAAc;EAQ7E"}
@@ -0,0 +1,17 @@
1
+ import type { RequestState } from './authstate';
2
+ import type { AuthenticateFireRequestOptions } from './types';
3
+ type RuntimeOptions = Omit<AuthenticateFireRequestOptions, 'firebaseConfig'>;
4
+ type FirebaseOptions = Partial<Pick<AuthenticateFireRequestOptions, 'firebaseConfig'>>;
5
+ export declare function mergePreDefinedOptions<T extends Record<string, any>>(preDefinedOptions: T, options: Partial<T>): T;
6
+ export declare function authenticateRequest(request: Request, options: AuthenticateFireRequestOptions): Promise<RequestState>;
7
+ /**
8
+ * @internal
9
+ */
10
+ export type CreateFireAuthenticateRequestOptions = {
11
+ options: FirebaseOptions;
12
+ };
13
+ export declare function createFireAuthenticateRequest(params: CreateFireAuthenticateRequestOptions): {
14
+ authenticateRequest: (request: Request, options?: RuntimeOptions) => Promise<RequestState>;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=requestFire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestFire.d.ts","sourceRoot":"","sources":["../../src/tokens/requestFire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,8BAA8B,EAAkB,MAAM,SAAS,CAAC;AAG9E,KAAK,cAAc,GAAG,IAAI,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,CAAC;AAE7E,KAAK,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,CAAC,CAAC;AASvF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClE,iBAAiB,EAAE,CAAC,EACpB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAClB,CAAC,CAOH;AAuCD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,CAqCvB;AAED;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oCAAoC;mCAG5C,OAAO,YAAW,cAAc;EAQ7E"}
@@ -0,0 +1,14 @@
1
+ import type { RequestOptions } from "./types";
2
+ export declare const getSessionConfig: (options?: RequestOptions) => {
3
+ COOKIE_NAME: string | undefined;
4
+ DEFAULT_EXPIRES_IN_MS: number | undefined;
5
+ DEFAULT_EXPIRES_IN_SECONDS: number;
6
+ REVOKE_REFRESH_TOKENS_ON_SIGNOUT: boolean | undefined;
7
+ };
8
+ export declare const getCookieOptions: (options?: RequestOptions) => {
9
+ httpOnly: boolean | undefined;
10
+ secure: boolean | undefined;
11
+ sameSite: "lax" | "strict" | "none" | undefined;
12
+ path: string | undefined;
13
+ };
14
+ //# sourceMappingURL=sessionConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionConfig.d.ts","sourceRoot":"","sources":["../../src/tokens/sessionConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,eAAO,MAAM,gBAAgB,GAAI,UAAU,cAAc;;;;;CASxD,CAAC;AAGF,eAAO,MAAM,gBAAgB,GAAI,UAAU,cAAc;;;;;CASxD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { TernUrl } from "./ternUrl";
2
+ declare class TernSecureRequest extends Request {
3
+ readonly ternUrl: TernUrl;
4
+ readonly cookies: Map<string, string | undefined>;
5
+ constructor(input: TernSecureRequest | Request | RequestInfo, init?: RequestInit);
6
+ toJSON(): {
7
+ url: string;
8
+ method: string;
9
+ headers: string;
10
+ ternUrl: string;
11
+ cookies: string;
12
+ };
13
+ private deriveUrlFromHeaders;
14
+ private getFirstValueFromHeader;
15
+ private parseCookies;
16
+ private decodeCookieValue;
17
+ }
18
+ export declare const createTernSecureRequest: (...args: ConstructorParameters<typeof TernSecureRequest>) => TernSecureRequest;
19
+ export type { TernSecureRequest };
20
+ //# sourceMappingURL=ternSecureRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ternSecureRequest.d.ts","sourceRoot":"","sources":["../../src/tokens/ternSecureRequest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,cAAM,iBAAkB,SAAQ,OAAO;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;gBAGhD,KAAK,EAAE,iBAAiB,GAAG,OAAO,GAAG,WAAW,EAChD,IAAI,CAAC,EAAE,WAAW;IASb,MAAM;;;;;;;IAUb,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;CAG1B;AAED,eAAO,MAAM,uBAAuB,GAClC,GAAG,MAAM,qBAAqB,CAAC,OAAO,iBAAiB,CAAC,KACvD,iBAIF,CAAC;AAEF,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ declare class TernUrl extends URL {
2
+ isCrossOrigin(other: URL | string): boolean;
3
+ }
4
+ export type WithTernUrl<T> = T & {
5
+ /**
6
+ * When a NextJs app is hosted on a platform different from Vercel
7
+ * or inside a container (Netlify, Fly.io, AWS Amplify, docker etc),
8
+ * req.url is always set to `localhost:3000` instead of the actual host of the app.
9
+ *
10
+ */
11
+ ternUrl: TernUrl;
12
+ };
13
+ export declare const createTernUrl: (...args: ConstructorParameters<typeof TernUrl>) => TernUrl;
14
+ export type { TernUrl };
15
+ //# sourceMappingURL=ternUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ternUrl.d.ts","sourceRoot":"","sources":["../../src/tokens/ternUrl.ts"],"names":[],"mappings":"AAAA,cAAM,OAAQ,SAAQ,GAAG;IAChB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;CAGzC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;IAC/B;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,GAAG,MAAM,qBAAqB,CAAC,OAAO,OAAO,CAAC,KAC7C,OAEF,CAAC;AAEF,YAAY,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { CheckRevokedOptions } from '../adapters';
2
+ import type { ApiClient } from '../api';
3
+ import type { TernSecureConfig, VerifyTokenVOptions } from './verify';
4
+ export type SessionCookieAttributes = {
5
+ path?: string;
6
+ domain?: string;
7
+ expires?: Date;
8
+ maxAge?: number;
9
+ secure?: boolean;
10
+ httpOnly?: boolean;
11
+ sameSite?: 'lax' | 'strict' | 'none';
12
+ };
13
+ export type SessionCookieFromMiddleware = {
14
+ name: string;
15
+ attributes: SessionCookieAttributes;
16
+ revokeRefreshTokensOnSignOut?: boolean;
17
+ };
18
+ export type MiddlewareCookiesOptions = {
19
+ session_cookie: SessionCookieFromMiddleware;
20
+ };
21
+ export type RequestOptions = {
22
+ tenantId?: string;
23
+ signInUrl?: string;
24
+ signUpUrl?: string;
25
+ checkRevoked?: CheckRevokedOptions;
26
+ cookies?: MiddlewareCookiesOptions;
27
+ apiClient?: ApiClient;
28
+ apiUrl?: string;
29
+ apiVersion?: string;
30
+ } & VerifyTokenVOptions;
31
+ export type AuthenticateFireRequestOptions = {
32
+ signInUrl?: string;
33
+ signUpUrl?: string;
34
+ checkRevoked?: CheckRevokedOptions;
35
+ cookies?: MiddlewareCookiesOptions;
36
+ apiClient?: ApiClient;
37
+ apiUrl?: string;
38
+ apiVersion?: string;
39
+ firebaseConfig?: TernSecureConfig;
40
+ } & VerifyTokenVOptions;
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tokens/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAC,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,uBAAuB,CAAC;IACpC,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,2BAA2B,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,mBAAmB,CAAC;AAExB,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,gBAAgB,CAAA;CAClC,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { DecodedIdToken, TernSecureConfig } from '@tern-secure/types';
2
+ import type { JwtReturnType } from '../jwt/types';
3
+ import { type VerifyJwtOptions } from '../jwt/verifyJwt';
4
+ import { TokenVerificationError } from '../utils/errors';
5
+ import type { LoadJWKFromRemoteOptions } from './keys';
6
+ export type VerifyTokenVOptions = Omit<VerifyJwtOptions, 'key'> & Omit<LoadJWKFromRemoteOptions, 'kid'> & {
7
+ jwtKey?: string;
8
+ };
9
+ export { TernSecureConfig };
10
+ export declare function verifyToken(token: string, options: VerifyTokenVOptions): Promise<JwtReturnType<DecodedIdToken, TokenVerificationError>>;
11
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tokens/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAgC,MAAM,iBAAiB,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAGvD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,GAAG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC,CA2ChE"}
@@ -0,0 +1,13 @@
1
+ import admin from 'firebase-admin';
2
+ export declare const adminTernSecureAuth: admin.auth.Auth;
3
+ export declare const adminTernSecureDb: admin.firestore.Firestore;
4
+ export declare const TernSecureTenantManager: admin.auth.TenantManager;
5
+ /**
6
+ * Gets the appropriate Firebase Auth instance.
7
+ * If a tenantId is provided, it returns the Auth instance for that tenant.
8
+ * Otherwise, it returns the default project-level Auth instance.
9
+ * @param tenantId - The optional tenant ID.
10
+ * @returns An admin.auth.Auth instance.
11
+ */
12
+ export declare function getAuthForTenant(tenantId?: string): admin.auth.Auth;
13
+ //# sourceMappingURL=admin-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-init.d.ts","sourceRoot":"","sources":["../../src/utils/admin-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAkBnC,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAmB,CAAC;AACjE,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,SAA6B,CAAC;AAC9E,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,aAA4C,CAAC;AAE9F;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAKnE"}
@@ -1,4 +1,4 @@
1
- import { TernSecureConfig, ConfigValidationResult, TernSecureAdminConfig, AdminConfigValidationResult } from '@tern-secure/types';
1
+ import type { AdminConfigValidationResult, ConfigValidationResult, TernSecureAdminConfig, TernSecureConfig } from '@tern-secure/types';
2
2
  /**
3
3
  * Loads Firebase configuration from environment variables
4
4
  * @returns {TernSecureConfig} Firebase configuration object
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,gBAQhC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,gBAAgB,KAAG,sBAuBzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAO,gBAWnC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,qBAIjC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,qBAAqB,KAAG,2BAoBnE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,qBAWxC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { LogLevel } from "./logger";
2
+ export declare function enableDebugLogging(): void;
3
+ export declare function disableDebugLogging(): void;
4
+ export declare function setLogLevel(level: LogLevel): void;
5
+ //# sourceMappingURL=enableDebugLogging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableDebugLogging.d.ts","sourceRoot":"","sources":["../../src/utils/enableDebugLogging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,QAAQ,EAAe,MAAM,UAAU,CAAA;AAE5D,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAGjD"}
@@ -0,0 +1,29 @@
1
+ export type TokenCarrier = 'header' | 'cookie';
2
+ export declare const TokenVerificationErrorReason: {
3
+ TokenExpired: string;
4
+ TokenInvalid: string;
5
+ TokenInvalidAlgorithm: string;
6
+ TokenInvalidAuthorizedParties: string;
7
+ TokenInvalidSignature: string;
8
+ TokenNotActiveYet: string;
9
+ TokenIatInTheFuture: string;
10
+ TokenVerificationFailed: string;
11
+ InvalidSecretKey: string;
12
+ LocalJWKMissing: string;
13
+ RemoteJWKFailedToLoad: string;
14
+ RemoteJWKInvalid: string;
15
+ RemoteJWKMissing: string;
16
+ JWKFailedToResolve: string;
17
+ JWKKidMismatch: string;
18
+ };
19
+ export type TokenVerificationErrorReason = (typeof TokenVerificationErrorReason)[keyof typeof TokenVerificationErrorReason];
20
+ export declare class TokenVerificationError extends Error {
21
+ reason: TokenVerificationErrorReason;
22
+ tokenCarrier?: TokenCarrier;
23
+ constructor({ message, reason, }: {
24
+ message: string;
25
+ reason: TokenVerificationErrorReason;
26
+ });
27
+ getFullMessage(): string;
28
+ }
29
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;CAgBxC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GACtC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,OAAO,4BAA4B,CAAC,CAAC;AAEnF,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,EAAE,4BAA4B,CAAC;IACrC,YAAY,CAAC,EAAE,YAAY,CAAC;gBAEhB,EACV,OAAO,EACP,MAAM,GACP,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,4BAA4B,CAAC;KACtC;IASM,cAAc;CAKpB"}
@@ -0,0 +1,10 @@
1
+ import admin from 'firebase-admin';
2
+ /**
3
+ * Gets the appropriate Firebase Auth instance.
4
+ * If a tenantId is provided, it returns the Auth instance for that tenant.
5
+ * Otherwise, it returns the default project-level Auth instance.
6
+ * @param tenantId - The optional tenant ID.
7
+ * @returns An admin.auth.Auth instance.
8
+ */
9
+ export declare function getAuthForTenant(tenantId?: string): admin.auth.Auth;
10
+ //# sourceMappingURL=gemini_admin-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini_admin-init.d.ts","sourceRoot":"","sources":["../../src/utils/gemini_admin-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAoBnC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAKnE"}