@tern-secure/nextjs 5.1.8 → 5.1.10

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 (284) hide show
  1. package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js +31 -0
  2. package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
  3. package/dist/cjs/app-router/admin/actions.js +62 -0
  4. package/dist/cjs/app-router/admin/actions.js.map +1 -0
  5. package/dist/cjs/app-router/admin/constants.js +29 -0
  6. package/dist/cjs/app-router/admin/constants.js.map +1 -0
  7. package/dist/cjs/app-router/admin/fnValidators.js +295 -0
  8. package/dist/cjs/app-router/admin/fnValidators.js.map +1 -0
  9. package/dist/cjs/app-router/admin/index.js +16 -3
  10. package/dist/cjs/app-router/admin/index.js.map +1 -1
  11. package/dist/cjs/app-router/admin/responses.js +120 -0
  12. package/dist/cjs/app-router/admin/responses.js.map +1 -0
  13. package/dist/cjs/app-router/admin/sessionHandlers.js +167 -0
  14. package/dist/cjs/app-router/admin/sessionHandlers.js.map +1 -0
  15. package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js +84 -0
  16. package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
  17. package/dist/cjs/app-router/admin/types.js +127 -0
  18. package/dist/cjs/app-router/admin/types.js.map +1 -0
  19. package/dist/cjs/app-router/admin/utils.js +107 -0
  20. package/dist/cjs/app-router/admin/utils.js.map +1 -0
  21. package/dist/cjs/app-router/admin/validators.js +217 -0
  22. package/dist/cjs/app-router/admin/validators.js.map +1 -0
  23. package/dist/cjs/app-router/client/TernSecureProvider.js +2 -6
  24. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
  25. package/dist/cjs/app-router/server/auth.js +100 -0
  26. package/dist/cjs/app-router/server/auth.js.map +1 -0
  27. package/dist/cjs/app-router/server/utils.js +87 -0
  28. package/dist/cjs/app-router/server/utils.js.map +1 -0
  29. package/dist/cjs/boundary/components.js +4 -7
  30. package/dist/cjs/boundary/components.js.map +1 -1
  31. package/dist/cjs/{components/uiComponents.js → constants.js} +17 -18
  32. package/dist/cjs/constants.js.map +1 -0
  33. package/dist/cjs/errors.js.map +1 -1
  34. package/dist/cjs/index.js +4 -9
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/server/constant.js +38 -0
  37. package/dist/cjs/server/constant.js.map +1 -0
  38. package/dist/cjs/server/edge-session.js +118 -24
  39. package/dist/cjs/server/edge-session.js.map +1 -1
  40. package/dist/cjs/server/headers-utils.js +70 -0
  41. package/dist/cjs/server/headers-utils.js.map +1 -0
  42. package/dist/cjs/server/index.js +8 -6
  43. package/dist/cjs/server/index.js.map +1 -1
  44. package/dist/cjs/server/jwt-edge.js +47 -19
  45. package/dist/cjs/server/jwt-edge.js.map +1 -1
  46. package/dist/cjs/server/jwt.js +11 -4
  47. package/dist/cjs/server/jwt.js.map +1 -1
  48. package/dist/cjs/server/nextErrors.js +131 -0
  49. package/dist/cjs/server/nextErrors.js.map +1 -0
  50. package/dist/cjs/server/nextFetcher.js +31 -0
  51. package/dist/cjs/server/nextFetcher.js.map +1 -0
  52. package/dist/cjs/server/node/SessionTernSecure.js +55 -0
  53. package/dist/cjs/server/node/SessionTernSecure.js.map +1 -0
  54. package/dist/cjs/server/{auth.js → node/auth.js} +11 -20
  55. package/dist/cjs/server/node/auth.js.map +1 -0
  56. package/dist/cjs/server/node/index.js +40 -0
  57. package/dist/cjs/server/node/index.js.map +1 -0
  58. package/dist/cjs/server/node/node-session.js +60 -0
  59. package/dist/cjs/server/node/node-session.js.map +1 -0
  60. package/dist/cjs/server/node/ternSecureNodeMiddleware.js +182 -0
  61. package/dist/cjs/server/node/ternSecureNodeMiddleware.js.map +1 -0
  62. package/dist/cjs/server/protect.js +90 -0
  63. package/dist/cjs/server/protect.js.map +1 -0
  64. package/dist/cjs/server/redirect.js +84 -0
  65. package/dist/cjs/server/redirect.js.map +1 -0
  66. package/dist/cjs/server/routeMatcher.js +36 -0
  67. package/dist/cjs/server/routeMatcher.js.map +1 -0
  68. package/dist/cjs/server/sdk-versions.js +43 -0
  69. package/dist/cjs/server/sdk-versions.js.map +1 -0
  70. package/dist/cjs/server/session-store.js.map +1 -1
  71. package/dist/cjs/server/ternSecureEdgeMiddleware.js +298 -0
  72. package/dist/cjs/server/ternSecureEdgeMiddleware.js.map +1 -0
  73. package/dist/cjs/server/ternSecureFireMiddleware.js +192 -0
  74. package/dist/cjs/server/ternSecureFireMiddleware.js.map +1 -0
  75. package/dist/cjs/server/types.js.map +1 -1
  76. package/dist/cjs/server/utils.js +115 -2
  77. package/dist/cjs/server/utils.js.map +1 -1
  78. package/dist/cjs/types.js.map +1 -1
  79. package/dist/cjs/utils/NextCookieAdapter.js +44 -0
  80. package/dist/cjs/utils/NextCookieAdapter.js.map +1 -0
  81. package/dist/cjs/utils/allNextProviderProps.js +10 -24
  82. package/dist/cjs/utils/allNextProviderProps.js.map +1 -1
  83. package/dist/cjs/utils/config.js +38 -2
  84. package/dist/cjs/utils/config.js.map +1 -1
  85. package/dist/cjs/utils/construct.js.map +1 -1
  86. package/dist/cjs/utils/fireconfig.js +38 -0
  87. package/dist/cjs/utils/fireconfig.js.map +1 -0
  88. package/dist/cjs/utils/logger.js +101 -0
  89. package/dist/cjs/utils/logger.js.map +1 -0
  90. package/dist/cjs/utils/redis.js +33 -0
  91. package/dist/cjs/utils/redis.js.map +1 -0
  92. package/dist/cjs/utils/response.js +38 -0
  93. package/dist/cjs/utils/response.js.map +1 -0
  94. package/dist/cjs/utils/serverRedirectAuth.js +39 -0
  95. package/dist/cjs/utils/serverRedirectAuth.js.map +1 -0
  96. package/dist/cjs/utils/ternsecure-sw.js +1 -1
  97. package/dist/cjs/utils/ternsecure-sw.js.map +1 -1
  98. package/dist/cjs/utils/withLogger.js +82 -0
  99. package/dist/cjs/utils/withLogger.js.map +1 -0
  100. package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js +30 -0
  101. package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
  102. package/dist/esm/app-router/admin/actions.js +40 -0
  103. package/dist/esm/app-router/admin/actions.js.map +1 -0
  104. package/dist/esm/app-router/admin/constants.js +5 -0
  105. package/dist/esm/app-router/admin/constants.js.map +1 -0
  106. package/dist/esm/app-router/admin/fnValidators.js +270 -0
  107. package/dist/esm/app-router/admin/fnValidators.js.map +1 -0
  108. package/dist/esm/app-router/admin/index.js +16 -2
  109. package/dist/esm/app-router/admin/index.js.map +1 -1
  110. package/dist/esm/app-router/admin/responses.js +93 -0
  111. package/dist/esm/app-router/admin/responses.js.map +1 -0
  112. package/dist/esm/app-router/admin/sessionHandlers.js +131 -0
  113. package/dist/esm/app-router/admin/sessionHandlers.js.map +1 -0
  114. package/dist/esm/app-router/admin/ternsecureNextjsHandler.js +62 -0
  115. package/dist/esm/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
  116. package/dist/esm/app-router/admin/types.js +98 -0
  117. package/dist/esm/app-router/admin/types.js.map +1 -0
  118. package/dist/esm/app-router/admin/utils.js +80 -0
  119. package/dist/esm/app-router/admin/utils.js.map +1 -0
  120. package/dist/esm/app-router/admin/validators.js +189 -0
  121. package/dist/esm/app-router/admin/validators.js.map +1 -0
  122. package/dist/esm/app-router/client/TernSecureProvider.js +2 -6
  123. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  124. package/dist/esm/app-router/server/auth.js +81 -0
  125. package/dist/esm/app-router/server/auth.js.map +1 -0
  126. package/dist/esm/app-router/server/utils.js +51 -0
  127. package/dist/esm/app-router/server/utils.js.map +1 -0
  128. package/dist/esm/boundary/components.js +4 -7
  129. package/dist/esm/boundary/components.js.map +1 -1
  130. package/dist/esm/constants.js +17 -0
  131. package/dist/esm/constants.js.map +1 -0
  132. package/dist/esm/errors.js.map +1 -1
  133. package/dist/esm/index.js +5 -11
  134. package/dist/esm/index.js.map +1 -1
  135. package/dist/esm/server/constant.js +11 -0
  136. package/dist/esm/server/constant.js.map +1 -0
  137. package/dist/esm/server/edge-session.js +113 -22
  138. package/dist/esm/server/edge-session.js.map +1 -1
  139. package/dist/esm/server/headers-utils.js +41 -0
  140. package/dist/esm/server/headers-utils.js.map +1 -0
  141. package/dist/esm/server/index.js +9 -3
  142. package/dist/esm/server/index.js.map +1 -1
  143. package/dist/esm/server/jwt-edge.js +48 -20
  144. package/dist/esm/server/jwt-edge.js.map +1 -1
  145. package/dist/esm/server/jwt.js +12 -5
  146. package/dist/esm/server/jwt.js.map +1 -1
  147. package/dist/esm/server/nextErrors.js +97 -0
  148. package/dist/esm/server/nextErrors.js.map +1 -0
  149. package/dist/esm/server/nextFetcher.js +7 -0
  150. package/dist/esm/server/nextFetcher.js.map +1 -0
  151. package/dist/esm/server/node/SessionTernSecure.js +31 -0
  152. package/dist/esm/server/node/SessionTernSecure.js.map +1 -0
  153. package/dist/esm/server/{auth.js → node/auth.js} +11 -20
  154. package/dist/esm/server/node/auth.js.map +1 -0
  155. package/dist/esm/server/node/index.js +19 -0
  156. package/dist/esm/server/node/index.js.map +1 -0
  157. package/dist/esm/server/node/node-session.js +36 -0
  158. package/dist/esm/server/node/node-session.js.map +1 -0
  159. package/dist/esm/server/node/ternSecureNodeMiddleware.js +165 -0
  160. package/dist/esm/server/node/ternSecureNodeMiddleware.js.map +1 -0
  161. package/dist/esm/server/protect.js +66 -0
  162. package/dist/esm/server/protect.js.map +1 -0
  163. package/dist/esm/server/redirect.js +60 -0
  164. package/dist/esm/server/redirect.js.map +1 -0
  165. package/dist/esm/server/routeMatcher.js +12 -0
  166. package/dist/esm/server/routeMatcher.js.map +1 -0
  167. package/dist/esm/server/sdk-versions.js +8 -0
  168. package/dist/esm/server/sdk-versions.js.map +1 -0
  169. package/dist/esm/server/session-store.js.map +1 -1
  170. package/dist/esm/server/ternSecureEdgeMiddleware.js +286 -0
  171. package/dist/esm/server/ternSecureEdgeMiddleware.js.map +1 -0
  172. package/dist/esm/server/ternSecureFireMiddleware.js +179 -0
  173. package/dist/esm/server/ternSecureFireMiddleware.js.map +1 -0
  174. package/dist/esm/server/utils.js +99 -1
  175. package/dist/esm/server/utils.js.map +1 -1
  176. package/dist/esm/types.js.map +1 -1
  177. package/dist/esm/utils/NextCookieAdapter.js +20 -0
  178. package/dist/esm/utils/NextCookieAdapter.js.map +1 -0
  179. package/dist/esm/utils/allNextProviderProps.js +10 -24
  180. package/dist/esm/utils/allNextProviderProps.js.map +1 -1
  181. package/dist/esm/utils/config.js +34 -1
  182. package/dist/esm/utils/config.js.map +1 -1
  183. package/dist/esm/utils/construct.js +1 -1
  184. package/dist/esm/utils/construct.js.map +1 -1
  185. package/dist/esm/utils/fireconfig.js +14 -0
  186. package/dist/esm/utils/fireconfig.js.map +1 -0
  187. package/dist/esm/utils/logger.js +74 -0
  188. package/dist/esm/utils/logger.js.map +1 -0
  189. package/dist/esm/utils/redis.js +9 -0
  190. package/dist/esm/utils/redis.js.map +1 -0
  191. package/dist/esm/utils/response.js +13 -0
  192. package/dist/esm/utils/response.js.map +1 -0
  193. package/dist/esm/utils/serverRedirectAuth.js +17 -0
  194. package/dist/esm/utils/serverRedirectAuth.js.map +1 -0
  195. package/dist/esm/utils/ternsecure-sw.js +1 -1
  196. package/dist/esm/utils/ternsecure-sw.js.map +1 -1
  197. package/dist/esm/utils/withLogger.js +57 -0
  198. package/dist/esm/utils/withLogger.js.map +1 -0
  199. package/package.json +21 -7
  200. package/server/node/package.json +5 -0
  201. package/server/package.json +5 -0
  202. package/dist/cjs/app-router/admin/sessionHandler.js +0 -74
  203. package/dist/cjs/app-router/admin/sessionHandler.js.map +0 -1
  204. package/dist/cjs/app-router/client/actions.js +0 -4
  205. package/dist/cjs/app-router/client/actions.js.map +0 -1
  206. package/dist/cjs/components/uiComponents.js.map +0 -1
  207. package/dist/cjs/server/auth.js.map +0 -1
  208. package/dist/cjs/server/ternSecureMiddleware.js +0 -95
  209. package/dist/cjs/server/ternSecureMiddleware.js.map +0 -1
  210. package/dist/cjs/utils/tern-ui-script.js +0 -78
  211. package/dist/cjs/utils/tern-ui-script.js.map +0 -1
  212. package/dist/esm/app-router/admin/sessionHandler.js +0 -50
  213. package/dist/esm/app-router/admin/sessionHandler.js.map +0 -1
  214. package/dist/esm/app-router/client/actions.js +0 -3
  215. package/dist/esm/app-router/client/actions.js.map +0 -1
  216. package/dist/esm/components/uiComponents.js +0 -21
  217. package/dist/esm/components/uiComponents.js.map +0 -1
  218. package/dist/esm/server/auth.js.map +0 -1
  219. package/dist/esm/server/ternSecureMiddleware.js +0 -69
  220. package/dist/esm/server/ternSecureMiddleware.js.map +0 -1
  221. package/dist/esm/utils/tern-ui-script.js +0 -44
  222. package/dist/esm/utils/tern-ui-script.js.map +0 -1
  223. package/dist/types/app-router/admin/index.d.ts +0 -2
  224. package/dist/types/app-router/admin/index.d.ts.map +0 -1
  225. package/dist/types/app-router/admin/sessionHandler.d.ts +0 -3
  226. package/dist/types/app-router/admin/sessionHandler.d.ts.map +0 -1
  227. package/dist/types/app-router/client/TernSecureProvider.d.ts +0 -25
  228. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +0 -1
  229. package/dist/types/app-router/client/actions.d.ts +0 -2
  230. package/dist/types/app-router/client/actions.d.ts.map +0 -1
  231. package/dist/types/app-router/route-handler/internal-route.d.ts +0 -2
  232. package/dist/types/app-router/route-handler/internal-route.d.ts.map +0 -1
  233. package/dist/types/boundary/components.d.ts +0 -2
  234. package/dist/types/boundary/components.d.ts.map +0 -1
  235. package/dist/types/boundary/hooks.d.ts +0 -2
  236. package/dist/types/boundary/hooks.d.ts.map +0 -1
  237. package/dist/types/components/uiComponents.d.ts +0 -6
  238. package/dist/types/components/uiComponents.d.ts.map +0 -1
  239. package/dist/types/errors.d.ts +0 -44
  240. package/dist/types/errors.d.ts.map +0 -1
  241. package/dist/types/index.d.ts +0 -5
  242. package/dist/types/index.d.ts.map +0 -1
  243. package/dist/types/server/auth.d.ts +0 -23
  244. package/dist/types/server/auth.d.ts.map +0 -1
  245. package/dist/types/server/crypto.d.ts +0 -3
  246. package/dist/types/server/crypto.d.ts.map +0 -1
  247. package/dist/types/server/ctx-store.d.ts +0 -24
  248. package/dist/types/server/ctx-store.d.ts.map +0 -1
  249. package/dist/types/server/edge-session.d.ts +0 -4
  250. package/dist/types/server/edge-session.d.ts.map +0 -1
  251. package/dist/types/server/index.d.ts +0 -4
  252. package/dist/types/server/index.d.ts.map +0 -1
  253. package/dist/types/server/jwt-edge.d.ts +0 -20
  254. package/dist/types/server/jwt-edge.d.ts.map +0 -1
  255. package/dist/types/server/jwt.d.ts +0 -20
  256. package/dist/types/server/jwt.d.ts.map +0 -1
  257. package/dist/types/server/session-store.d.ts +0 -30
  258. package/dist/types/server/session-store.d.ts.map +0 -1
  259. package/dist/types/server/ternSecureMiddleware.d.ts +0 -20
  260. package/dist/types/server/ternSecureMiddleware.d.ts.map +0 -1
  261. package/dist/types/server/types.d.ts +0 -26
  262. package/dist/types/server/types.d.ts.map +0 -1
  263. package/dist/types/server/utils.d.ts +0 -22
  264. package/dist/types/server/utils.d.ts.map +0 -1
  265. package/dist/types/types.d.ts +0 -112
  266. package/dist/types/types.d.ts.map +0 -1
  267. package/dist/types/utils/admin-init.d.ts +0 -2
  268. package/dist/types/utils/admin-init.d.ts.map +0 -1
  269. package/dist/types/utils/allNextProviderProps.d.ts +0 -6
  270. package/dist/types/utils/allNextProviderProps.d.ts.map +0 -1
  271. package/dist/types/utils/client-init.d.ts +0 -2
  272. package/dist/types/utils/client-init.d.ts.map +0 -1
  273. package/dist/types/utils/config.d.ts +0 -35
  274. package/dist/types/utils/config.d.ts.map +0 -1
  275. package/dist/types/utils/construct.d.ts +0 -38
  276. package/dist/types/utils/construct.d.ts.map +0 -1
  277. package/dist/types/utils/create-styles.d.ts +0 -99
  278. package/dist/types/utils/create-styles.d.ts.map +0 -1
  279. package/dist/types/utils/redirect.d.ts +0 -9
  280. package/dist/types/utils/redirect.d.ts.map +0 -1
  281. package/dist/types/utils/tern-ui-script.d.ts +0 -9
  282. package/dist/types/utils/tern-ui-script.d.ts.map +0 -1
  283. package/dist/types/utils/ternsecure-sw.d.ts +0 -8
  284. package/dist/types/utils/ternsecure-sw.d.ts.map +0 -1
@@ -0,0 +1,60 @@
1
+ const buildUrl = (_baseUrl, _targetUrl, _returnBackUrl) => {
2
+ if (_baseUrl === "") {
3
+ return legacyBuildUrl(_targetUrl.toString(), _returnBackUrl?.toString());
4
+ }
5
+ const baseUrl = new URL(_baseUrl);
6
+ const returnBackUrl = _returnBackUrl ? new URL(_returnBackUrl, baseUrl) : void 0;
7
+ const res = new URL(_targetUrl, baseUrl);
8
+ if (returnBackUrl) {
9
+ res.searchParams.set("redirect_url", returnBackUrl.toString());
10
+ }
11
+ return res.toString();
12
+ };
13
+ const legacyBuildUrl = (targetUrl, redirectUrl) => {
14
+ let url;
15
+ if (!targetUrl.startsWith("http")) {
16
+ if (!redirectUrl || !redirectUrl.startsWith("http")) {
17
+ throw new Error("destination url or return back url should be an absolute path url!");
18
+ }
19
+ const baseURL = new URL(redirectUrl);
20
+ url = new URL(targetUrl, baseURL.origin);
21
+ } else {
22
+ url = new URL(targetUrl);
23
+ }
24
+ if (redirectUrl) {
25
+ url.searchParams.set("redirect_url", redirectUrl);
26
+ }
27
+ return url.toString();
28
+ };
29
+ const createRedirect = (params) => {
30
+ const { redirectAdapter, signInUrl, signUpUrl, baseUrl } = params;
31
+ const redirectToSignUp = ({ returnBackUrl } = {}) => {
32
+ if (!signUpUrl) {
33
+ throw new Error("SignUp URL is not defined");
34
+ }
35
+ const pathToSignUpUrl = `${baseUrl}/sign-up`;
36
+ function buildSignUpUrl(signIn) {
37
+ if (!signIn) {
38
+ return;
39
+ }
40
+ const url = new URL(signIn, baseUrl);
41
+ url.pathname = `${url.pathname}/create`;
42
+ return url.toString();
43
+ }
44
+ const targetUrl = signUpUrl || buildSignUpUrl(signInUrl) || pathToSignUpUrl;
45
+ return redirectAdapter(buildUrl(baseUrl, targetUrl, returnBackUrl));
46
+ };
47
+ const redirectToSignIn = ({ returnBackUrl } = {}) => {
48
+ if (!signInUrl) {
49
+ throw new Error("SignIn URL is not defined");
50
+ }
51
+ const pathToSignInUrl = `${baseUrl}/sign-in`;
52
+ const targetUrl = signInUrl || pathToSignInUrl;
53
+ return redirectAdapter(buildUrl(baseUrl, targetUrl, returnBackUrl));
54
+ };
55
+ return { redirectToSignUp, redirectToSignIn };
56
+ };
57
+ export {
58
+ createRedirect
59
+ };
60
+ //# sourceMappingURL=redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/redirect.ts"],"sourcesContent":["\nconst buildUrl = (\n _baseUrl: string | URL,\n _targetUrl: string | URL,\n _returnBackUrl?: string | URL | null,\n) => {\n if (_baseUrl === '') {\n return legacyBuildUrl(_targetUrl.toString(), _returnBackUrl?.toString());\n }\n\n const baseUrl = new URL(_baseUrl);\n const returnBackUrl = _returnBackUrl ? new URL(_returnBackUrl, baseUrl) : undefined;\n const res = new URL(_targetUrl, baseUrl);\n\n if (returnBackUrl) {\n res.searchParams.set('redirect_url', returnBackUrl.toString());\n }\n return res.toString();\n};\n\n\n\nconst legacyBuildUrl = (targetUrl: string, redirectUrl?: string) => {\n let url;\n if (!targetUrl.startsWith('http')) {\n if (!redirectUrl || !redirectUrl.startsWith('http')) {\n throw new Error('destination url or return back url should be an absolute path url!');\n }\n\n const baseURL = new URL(redirectUrl);\n url = new URL(targetUrl, baseURL.origin);\n } else {\n url = new URL(targetUrl);\n }\n\n if (redirectUrl) {\n url.searchParams.set('redirect_url', redirectUrl);\n }\n\n return url.toString();\n};\n\n\ntype RedirectAdapter<RedirectReturn> = (url: string) => RedirectReturn;\ntype RedirectToParams = { returnBackUrl?: string | URL | null };\nexport type RedirectFun<ReturnType> = (params?: RedirectToParams) => ReturnType;\n\n/**\n * @internal\n */\ntype CreateRedirect = <ReturnType>(params: {\n redirectAdapter: RedirectAdapter<ReturnType>;\n baseUrl: URL | string;\n signInUrl?: URL | string;\n signUpUrl?: URL | string;\n}) => {\n redirectToSignIn: RedirectFun<ReturnType>;\n redirectToSignUp: RedirectFun<ReturnType>;\n};\n\n\nexport const createRedirect: CreateRedirect = params => {\n const { redirectAdapter, signInUrl, signUpUrl, baseUrl } = params;\n\n const redirectToSignUp = ({ returnBackUrl }: RedirectToParams = {}) => {\n if (!signUpUrl) {\n throw new Error(\"SignUp URL is not defined\");\n }\n\n const pathToSignUpUrl = `${baseUrl}/sign-up`;\n \n function buildSignUpUrl(signIn: string | URL | undefined) {\n if (!signIn) {\n return;\n }\n const url = new URL(signIn, baseUrl);\n url.pathname = `${url.pathname}/create`;\n return url.toString();\n }\n\n const targetUrl = signUpUrl || buildSignUpUrl(signInUrl) || pathToSignUpUrl;\n\n\n return redirectAdapter(buildUrl(baseUrl, targetUrl, returnBackUrl));\n };\n\n const redirectToSignIn = ({ returnBackUrl }: RedirectToParams = {}) => {\n if (!signInUrl) {\n throw new Error(\"SignIn URL is not defined\");\n }\n\n const pathToSignInUrl = `${baseUrl}/sign-in`;\n const targetUrl = signInUrl || pathToSignInUrl;\n\n return redirectAdapter(buildUrl(baseUrl, targetUrl, returnBackUrl));\n };\n\n return { redirectToSignUp, redirectToSignIn };\n};"],"mappings":"AACA,MAAM,WAAW,CACf,UACA,YACA,mBACG;AACH,MAAI,aAAa,IAAI;AACnB,WAAO,eAAe,WAAW,SAAS,GAAG,gBAAgB,SAAS,CAAC;AAAA,EACzE;AAEA,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,QAAM,gBAAgB,iBAAiB,IAAI,IAAI,gBAAgB,OAAO,IAAI;AAC1E,QAAM,MAAM,IAAI,IAAI,YAAY,OAAO;AAEvC,MAAI,eAAe;AACjB,QAAI,aAAa,IAAI,gBAAgB,cAAc,SAAS,CAAC;AAAA,EAC/D;AACA,SAAO,IAAI,SAAS;AACtB;AAIA,MAAM,iBAAiB,CAAC,WAAmB,gBAAyB;AAClE,MAAI;AACJ,MAAI,CAAC,UAAU,WAAW,MAAM,GAAG;AACjC,QAAI,CAAC,eAAe,CAAC,YAAY,WAAW,MAAM,GAAG;AACnD,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAEA,UAAM,UAAU,IAAI,IAAI,WAAW;AACnC,UAAM,IAAI,IAAI,WAAW,QAAQ,MAAM;AAAA,EACzC,OAAO;AACL,UAAM,IAAI,IAAI,SAAS;AAAA,EACzB;AAEA,MAAI,aAAa;AACf,QAAI,aAAa,IAAI,gBAAgB,WAAW;AAAA,EAClD;AAEA,SAAO,IAAI,SAAS;AACtB;AAqBO,MAAM,iBAAiC,YAAU;AACtD,QAAM,EAAE,iBAAiB,WAAW,WAAW,QAAQ,IAAI;AAE3D,QAAM,mBAAmB,CAAC,EAAE,cAAc,IAAsB,CAAC,MAAM;AACrE,QAAI,CAAC,WAAW;AACZ,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAEA,UAAM,kBAAkB,GAAG,OAAO;AAElC,aAAS,eAAe,QAAkC;AACxD,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,MAAM,IAAI,IAAI,QAAQ,OAAO;AACnC,UAAI,WAAW,GAAG,IAAI,QAAQ;AAC9B,aAAO,IAAI,SAAS;AAAA,IACtB;AAEA,UAAM,YAAY,aAAa,eAAe,SAAS,KAAK;AAG5D,WAAO,gBAAgB,SAAS,SAAS,WAAW,aAAa,CAAC;AAAA,EACpE;AAEA,QAAM,mBAAmB,CAAC,EAAE,cAAc,IAAsB,CAAC,MAAM;AACrE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,kBAAkB,GAAG,OAAO;AAClC,UAAM,YAAY,aAAa;AAE/B,WAAO,gBAAgB,SAAS,SAAS,WAAW,aAAa,CAAC;AAAA,EACpE;AAEA,SAAO,EAAE,kBAAkB,iBAAiB;AAC9C;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { createPathMatcher } from "@tern-secure/shared/pathMatcher";
2
+ const createRouteMatcher = (routes) => {
3
+ if (typeof routes === "function") {
4
+ return (request) => routes(request);
5
+ }
6
+ const pathMatcher = createPathMatcher(routes);
7
+ return (request) => pathMatcher(request.nextUrl.pathname);
8
+ };
9
+ export {
10
+ createRouteMatcher
11
+ };
12
+ //# sourceMappingURL=routeMatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/routeMatcher.ts"],"sourcesContent":["import { createPathMatcher, type WithPathPatternWildcard } from '@tern-secure/shared/pathMatcher';\nimport type { Autocomplete } from '@tern-secure/types';\nimport type Link from 'next/link';\nimport type { NextRequest } from 'next/server';\n\ntype NextTypedRoute<T = Parameters<typeof Link>['0']['href']> = T extends string ? T : never;\ntype RouteMatcherWithNextTypedRoutes = Autocomplete<\n WithPathPatternWildcard<NextTypedRoute> | NextTypedRoute\n>;\n\nexport type RouteMatcherParams =\n | Array<RegExp | RouteMatcherWithNextTypedRoutes>\n | RouteMatcherWithNextTypedRoutes\n | RegExp\n | ((req: NextRequest) => boolean);\n/**\n * Create a route matcher function for public paths\n */\nexport const createRouteMatcher = (routes: RouteMatcherParams) => {\n if (typeof routes === 'function') {\n return (request: NextRequest) => routes(request);\n }\n\n const pathMatcher = createPathMatcher(routes);\n return (request: NextRequest) => pathMatcher(request.nextUrl.pathname);\n};\n"],"mappings":"AAAA,SAAS,yBAAuD;AAkBzD,MAAM,qBAAqB,CAAC,WAA+B;AAChE,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,CAAC,YAAyB,OAAO,OAAO;AAAA,EACjD;AAEA,QAAM,cAAc,kBAAkB,MAAM;AAC5C,SAAO,CAAC,YAAyB,YAAY,QAAQ,QAAQ,QAAQ;AACvE;","names":[]}
@@ -0,0 +1,8 @@
1
+ import nextPkg from "next/package.json";
2
+ const isNext13 = nextPkg.version.startsWith("13.");
3
+ const isNextWithUnstableServerActions = isNext13 || nextPkg.version.startsWith("14.0");
4
+ export {
5
+ isNext13,
6
+ isNextWithUnstableServerActions
7
+ };
8
+ //# sourceMappingURL=sdk-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/sdk-versions.ts"],"sourcesContent":["import nextPkg from 'next/package.json';\n\nconst isNext13 = nextPkg.version.startsWith('13.');\n\n/**\n * Those versions are affected by a bundling issue that will break the application if `node:fs` is used inside a server function.\n * The affected versions are >=next@13.5.4 and <=next@14.0.4\n */\nconst isNextWithUnstableServerActions = isNext13 || nextPkg.version.startsWith('14.0');\n\nexport { isNext13, isNextWithUnstableServerActions };\n"],"mappings":"AAAA,OAAO,aAAa;AAEpB,MAAM,WAAW,QAAQ,QAAQ,WAAW,KAAK;AAMjD,MAAM,kCAAkC,YAAY,QAAQ,QAAQ,WAAW,MAAM;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/session-store.ts"],"sourcesContent":["import { cache } from \"react\"\r\nimport type { User } from \"./types\"\r\n\r\n/**\r\n * Simple in-memory session store\r\n * In a real app, this would be backed by Redis/etc\r\n */\r\nclass SessionStore {\r\n private static instance: SessionStore\r\n private sessions: Map<string, User>\r\n private currentSessionId: string | null = null\r\n\r\n private constructor() {\r\n this.sessions = new Map()\r\n }\r\n\r\n static getInstance(): SessionStore {\r\n if (!SessionStore.instance) {\r\n SessionStore.instance = new SessionStore()\r\n }\r\n return SessionStore.instance\r\n }\r\n\r\n setUser(sessionId: string, user: User) {\r\n console.log(\"SessionStore: Setting user:\", { sessionId, user })\r\n this.sessions.set(sessionId, user)\r\n this.currentSessionId = sessionId\r\n }\r\n\r\n getUser(sessionId: string): User | null {\r\n return this.sessions.get(sessionId) || null\r\n }\r\n\r\n getCurrentUser(): User | null {\r\n if (!this.currentSessionId) return null\r\n return this.sessions.get(this.currentSessionId) || null\r\n }\r\n\r\n removeUser(sessionId: string) {\r\n this.sessions.delete(sessionId)\r\n }\r\n\r\n clear() {\r\n this.sessions.clear()\r\n }\r\n\r\n debug() {\r\n return {\r\n sessionsCount: this.sessions.size,\r\n currentSessionId: this.currentSessionId,\r\n sessions: Array.from(this.sessions.entries())\r\n }\r\n}\r\n}\r\n\r\n// Export singleton instance\r\nexport const sessionStore = SessionStore.getInstance()\r\n\r\n/**\r\n * Cached function to get user from session store\r\n * Uses React cache for SSR optimization\r\n */\r\nexport const getVerifiedUser = cache((sessionId: string): User | null => {\r\n return sessionStore.getUser(sessionId)\r\n})\r\n\r\n"],"mappings":"AAAA,SAAS,aAAa;AAOtB,MAAM,aAAa;AAAA,EACjB,OAAe;AAAA,EACP;AAAA,EACA,mBAAkC;AAAA,EAElC,cAAc;AACpB,SAAK,WAAW,oBAAI,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO,cAA4B;AACjC,QAAI,CAAC,aAAa,UAAU;AAC1B,mBAAa,WAAW,IAAI,aAAa;AAAA,IAC3C;AACA,WAAO,aAAa;AAAA,EACtB;AAAA,EAEA,QAAQ,WAAmB,MAAY;AACrC,YAAQ,IAAI,+BAA+B,EAAE,WAAW,KAAK,CAAC;AAC9D,SAAK,SAAS,IAAI,WAAW,IAAI;AACjC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,QAAQ,WAAgC;AACtC,WAAO,KAAK,SAAS,IAAI,SAAS,KAAK;AAAA,EACzC;AAAA,EAEA,iBAA8B;AAC5B,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,WAAO,KAAK,SAAS,IAAI,KAAK,gBAAgB,KAAK;AAAA,EACrD;AAAA,EAEA,WAAW,WAAmB;AAC5B,SAAK,SAAS,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,QAAQ;AACN,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,QAAQ;AACN,WAAO;AAAA,MACL,eAAe,KAAK,SAAS;AAAA,MAC7B,kBAAkB,KAAK;AAAA,MACvB,UAAU,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;AAAA,IAC9C;AAAA,EACJ;AACA;AAGO,MAAM,eAAe,aAAa,YAAY;AAM9C,MAAM,kBAAkB,MAAM,CAAC,cAAmC;AACvE,SAAO,aAAa,QAAQ,SAAS;AACvC,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/session-store.ts"],"sourcesContent":["import { cache } from \"react\"\r\n\r\nimport type { User } from \"./types\"\r\n\r\n/**\r\n * Simple in-memory session store\r\n * In a real app, this would be backed by Redis/etc\r\n */\r\nclass SessionStore {\r\n private static instance: SessionStore\r\n private sessions: Map<string, User>\r\n private currentSessionId: string | null = null\r\n\r\n private constructor() {\r\n this.sessions = new Map()\r\n }\r\n\r\n static getInstance(): SessionStore {\r\n if (!SessionStore.instance) {\r\n SessionStore.instance = new SessionStore()\r\n }\r\n return SessionStore.instance\r\n }\r\n\r\n setUser(sessionId: string, user: User) {\r\n console.log(\"SessionStore: Setting user:\", { sessionId, user })\r\n this.sessions.set(sessionId, user)\r\n this.currentSessionId = sessionId\r\n }\r\n\r\n getUser(sessionId: string): User | null {\r\n return this.sessions.get(sessionId) || null\r\n }\r\n\r\n getCurrentUser(): User | null {\r\n if (!this.currentSessionId) return null\r\n return this.sessions.get(this.currentSessionId) || null\r\n }\r\n\r\n removeUser(sessionId: string) {\r\n this.sessions.delete(sessionId)\r\n }\r\n\r\n clear() {\r\n this.sessions.clear()\r\n }\r\n\r\n debug() {\r\n return {\r\n sessionsCount: this.sessions.size,\r\n currentSessionId: this.currentSessionId,\r\n sessions: Array.from(this.sessions.entries())\r\n }\r\n}\r\n}\r\n\r\n// Export singleton instance\r\nexport const sessionStore = SessionStore.getInstance()\r\n\r\n/**\r\n * Cached function to get user from session store\r\n * Uses React cache for SSR optimization\r\n */\r\nexport const getVerifiedUser = cache((sessionId: string): User | null => {\r\n return sessionStore.getUser(sessionId)\r\n})\r\n\r\n"],"mappings":"AAAA,SAAS,aAAa;AAQtB,MAAM,aAAa;AAAA,EACjB,OAAe;AAAA,EACP;AAAA,EACA,mBAAkC;AAAA,EAElC,cAAc;AACpB,SAAK,WAAW,oBAAI,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO,cAA4B;AACjC,QAAI,CAAC,aAAa,UAAU;AAC1B,mBAAa,WAAW,IAAI,aAAa;AAAA,IAC3C;AACA,WAAO,aAAa;AAAA,EACtB;AAAA,EAEA,QAAQ,WAAmB,MAAY;AACrC,YAAQ,IAAI,+BAA+B,EAAE,WAAW,KAAK,CAAC;AAC9D,SAAK,SAAS,IAAI,WAAW,IAAI;AACjC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,QAAQ,WAAgC;AACtC,WAAO,KAAK,SAAS,IAAI,SAAS,KAAK;AAAA,EACzC;AAAA,EAEA,iBAA8B;AAC5B,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,WAAO,KAAK,SAAS,IAAI,KAAK,gBAAgB,KAAK;AAAA,EACrD;AAAA,EAEA,WAAW,WAAmB;AAC5B,SAAK,SAAS,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,QAAQ;AACN,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,QAAQ;AACN,WAAO;AAAA,MACL,eAAe,KAAK,SAAS;AAAA,MAC7B,kBAAkB,KAAK;AAAA,MACvB,UAAU,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;AAAA,IAC9C;AAAA,EACJ;AACA;AAGO,MAAM,eAAe,aAAa,YAAY;AAM9C,MAAM,kBAAkB,MAAM,CAAC,cAAmC;AACvE,SAAO,aAAa,QAAQ,SAAS;AACvC,CAAC;","names":[]}
@@ -0,0 +1,286 @@
1
+ import {
2
+ constants,
3
+ createBackendInstanceClient,
4
+ createTernSecureRequest,
5
+ enableDebugLogging
6
+ } from "@tern-secure/backend";
7
+ import { notFound as nextjsNotFound } from "next/navigation";
8
+ import { NextResponse } from "next/server";
9
+ import { isRedirect, setHeader } from "../utils/response";
10
+ import { serverRedirectWithAuth } from "../utils/serverRedirectAuth";
11
+ import { createEdgeCompatibleLogger } from "../utils/withLogger";
12
+ import { API_URL, API_VERSION, SIGN_IN_URL, SIGN_UP_URL } from "./constant";
13
+ import {
14
+ isNextjsNotFoundError,
15
+ isNextjsRedirectError,
16
+ isRedirectToSignInError,
17
+ isRedirectToSignUpError,
18
+ nextjsRedirectError,
19
+ redirectToSignInError,
20
+ redirectToSignUpError
21
+ } from "./nextErrors";
22
+ import { createProtect } from "./protect";
23
+ import { createRedirect } from "./redirect";
24
+ import { decorateRequest } from "./utils";
25
+ const backendClientDefaultOptions = {
26
+ apiUrl: API_URL,
27
+ apiVersion: API_VERSION
28
+ };
29
+ const ternSecureBackendClient = async () => {
30
+ return createBackendClientWithOptions({});
31
+ };
32
+ const createBackendClientWithOptions = (options) => {
33
+ return createBackendInstanceClient({
34
+ ...backendClientDefaultOptions,
35
+ ...options
36
+ });
37
+ };
38
+ const ternSecureMiddleware = (...args) => {
39
+ const [request, event] = parseRequestAndEvent(args);
40
+ const [handler, params] = parseHandlerAndOptions(args);
41
+ const middleware = () => {
42
+ const withAuthNextMiddleware = async (request2, event2) => {
43
+ const resolvedParams = typeof params === "function" ? await params(request2) : params;
44
+ const signInUrl = resolvedParams.signInUrl || SIGN_IN_URL;
45
+ const signUpUrl = resolvedParams.signUpUrl || SIGN_UP_URL;
46
+ const options = {
47
+ signInUrl,
48
+ signUpUrl,
49
+ ...resolvedParams
50
+ };
51
+ const logger = createEdgeCompatibleLogger(options.debug);
52
+ if (options.debug) {
53
+ enableDebugLogging();
54
+ }
55
+ const reqBackendClient = await ternSecureBackendClient();
56
+ const ternSecureRequest = createTernSecureRequest(request2);
57
+ const requestStateClient = await reqBackendClient.authenticateRequest(
58
+ ternSecureRequest,
59
+ options
60
+ );
61
+ const authObjectClient = requestStateClient.auth();
62
+ const { redirectToSignIn } = createMiddlewareRedirects(ternSecureRequest);
63
+ const { redirectToSignUp } = createMiddlewareRedirects(ternSecureRequest);
64
+ const protect = await createMiddlewareProtect(
65
+ ternSecureRequest,
66
+ authObjectClient,
67
+ redirectToSignIn
68
+ );
69
+ const authObj = Object.assign(authObjectClient, {
70
+ redirectToSignIn,
71
+ redirectToSignUp
72
+ });
73
+ const authHandler = () => Promise.resolve(authObj);
74
+ authHandler.protect = protect;
75
+ let handlerResult = NextResponse.next();
76
+ try {
77
+ const userHandlerResult = await handler?.(authHandler, request2, event2);
78
+ handlerResult = userHandlerResult || handlerResult;
79
+ } catch (error) {
80
+ handlerResult = handleControlError(error, ternSecureRequest, request2);
81
+ }
82
+ if (requestStateClient.headers) {
83
+ requestStateClient.headers.forEach((value, key) => {
84
+ handlerResult.headers.append(key, value);
85
+ });
86
+ }
87
+ if (isRedirect(handlerResult)) {
88
+ return serverRedirectWithAuth(ternSecureRequest, handlerResult);
89
+ }
90
+ decorateRequest(ternSecureRequest, handlerResult, requestStateClient);
91
+ return handlerResult;
92
+ };
93
+ const fireNextMiddleware = async (request2) => {
94
+ console.log("[TernSecureMiddleware] Firebase Request URL:", request2.url);
95
+ if (isFirebaseCookieRequest(request2)) {
96
+ const options = typeof params === "function" ? await params(request2) : params;
97
+ rewriteFirebaseRequest(options, request2);
98
+ return handleFirebaseAuthRequest(request2);
99
+ }
100
+ };
101
+ const nextMiddleware = async (request2, event2) => {
102
+ if (isFirebaseRequest(request2)) {
103
+ return fireNextMiddleware(request2, event2);
104
+ }
105
+ return withAuthNextMiddleware(request2, event2);
106
+ };
107
+ if (request && event) {
108
+ return nextMiddleware(request, event);
109
+ }
110
+ return nextMiddleware;
111
+ };
112
+ return middleware();
113
+ };
114
+ const parseRequestAndEvent = (args) => {
115
+ return [
116
+ args[0] instanceof Request ? args[0] : void 0,
117
+ args[0] instanceof Request ? args[1] : void 0
118
+ ];
119
+ };
120
+ const parseHandlerAndOptions = (args) => {
121
+ return [
122
+ typeof args[0] === "function" ? args[0] : void 0,
123
+ (args.length === 2 ? args[1] : typeof args[0] === "function" ? {} : args[0]) || {}
124
+ ];
125
+ };
126
+ const isFirebaseRequest = (request) => request.nextUrl.pathname.startsWith("/__/");
127
+ const rewriteFirebaseRequest = (options, request) => {
128
+ const newUrl = new URL(request.url);
129
+ newUrl.host = options.firebaseOptions?.authDomain || "";
130
+ newUrl.port = "";
131
+ return NextResponse.rewrite(newUrl);
132
+ };
133
+ const finalTarget = (request) => {
134
+ const finalTargetUrl = request.nextUrl.searchParams.get("finalTarget");
135
+ return finalTargetUrl ? new URL(finalTargetUrl, request.url) : void 0;
136
+ };
137
+ const isFirebaseCookieRequest = (request) => request.nextUrl.pathname === "/__cookies__";
138
+ const createMiddlewareRedirects = (ternSecureRequest) => {
139
+ const redirectToSignIn = (opts = {}) => {
140
+ const url = ternSecureRequest.ternUrl.toString();
141
+ redirectToSignInError(url, opts.returnBackUrl);
142
+ };
143
+ const redirectToSignUp = (opts = {}) => {
144
+ const url = ternSecureRequest.ternUrl.toString();
145
+ redirectToSignUpError(url, opts.returnBackUrl);
146
+ };
147
+ return { redirectToSignIn, redirectToSignUp };
148
+ };
149
+ const createMiddlewareProtect = (ternSecureRequest, authObject, redirectToSignIn) => {
150
+ return async (params, options) => {
151
+ const notFound = () => nextjsNotFound();
152
+ const redirect = (url) => nextjsRedirectError(url, {
153
+ redirectUrl: url
154
+ });
155
+ return createProtect({
156
+ request: ternSecureRequest,
157
+ redirect,
158
+ notFound,
159
+ authObject,
160
+ redirectToSignIn
161
+ })(params, options);
162
+ };
163
+ };
164
+ const redirectAdapter = (url) => {
165
+ return NextResponse.redirect(url, {
166
+ headers: { [constants.Headers.TernSecureRedirectTo]: "true" }
167
+ });
168
+ };
169
+ const handleControlError = (error, ternSecureRequest, nextrequest) => {
170
+ if (isNextjsNotFoundError(error)) {
171
+ return setHeader(
172
+ NextResponse.rewrite(new URL(`/tern_${Date.now()}`, nextrequest.url)),
173
+ constants.Headers.AuthReason,
174
+ "protect-rewrite"
175
+ );
176
+ }
177
+ const isRedirectToSignIn = isRedirectToSignInError(error);
178
+ const isRedirectToSignUp = isRedirectToSignUpError(error);
179
+ if (isRedirectToSignIn || isRedirectToSignUp) {
180
+ const redirect = createRedirect({
181
+ redirectAdapter,
182
+ baseUrl: ternSecureRequest.ternUrl,
183
+ signInUrl: SIGN_IN_URL,
184
+ signUpUrl: SIGN_UP_URL
185
+ });
186
+ const { returnBackUrl } = error;
187
+ return redirect[isRedirectToSignIn ? "redirectToSignIn" : "redirectToSignUp"]({
188
+ returnBackUrl
189
+ });
190
+ }
191
+ if (isNextjsRedirectError(error)) {
192
+ return redirectAdapter(error.redirectUrl);
193
+ }
194
+ throw error;
195
+ };
196
+ const handleFirebaseAuthRequest = async (request) => {
197
+ console.log("Checking for __cookies__ path");
198
+ const isDevMode = process.env.NODE_ENV === "development";
199
+ const ID_TOKEN_COOKIE_NAME = isDevMode ? `__dev_FIREBASE_[DEFAULT]` : `__HOST-FIREBASE_[DEFAULT]`;
200
+ const REFRESH_TOKEN_COOKIE_NAME = isDevMode ? "__dev_FIREBASEID_[DEFAULT]" : `__HOST-FIREBASEID_[DEFAULT]`;
201
+ const ID_TOKEN_COOKIE = {
202
+ path: "/",
203
+ secure: !isDevMode,
204
+ sameSite: "strict",
205
+ partitioned: true,
206
+ name: ID_TOKEN_COOKIE_NAME,
207
+ maxAge: 3456e4,
208
+ priority: "high"
209
+ };
210
+ const REFRESH_TOKEN_COOKIE = {
211
+ ...ID_TOKEN_COOKIE,
212
+ httpOnly: true,
213
+ name: REFRESH_TOKEN_COOKIE_NAME
214
+ };
215
+ if (request.nextUrl.pathname === "/__cookies__") {
216
+ console.log("Handling /__cookies__ request");
217
+ const method = request.method;
218
+ if (method === "DELETE") {
219
+ const response2 = new NextResponse("");
220
+ response2.cookies.delete({ ...ID_TOKEN_COOKIE, maxAge: 0 });
221
+ response2.cookies.delete({ ...REFRESH_TOKEN_COOKIE, maxAge: 0 });
222
+ return response2;
223
+ }
224
+ const headers = {};
225
+ const headerNames = [
226
+ "content-type",
227
+ "X-Firebase-Client",
228
+ "X-Firebase-gmpid",
229
+ "X-Firebase-AppCheck",
230
+ "X-Client-Version"
231
+ ];
232
+ headerNames.forEach((headerName) => {
233
+ const headerValue = request.headers.get(headerName);
234
+ if (headerValue) {
235
+ headers[headerName] = headerValue;
236
+ }
237
+ });
238
+ const finalTargetParam = request.nextUrl.searchParams.get("finalTarget");
239
+ const url = new URL(finalTargetParam || "");
240
+ let body = request.body;
241
+ const isTokenRequest = !!url.pathname.match(/^(\/securetoken\.googleapis\.com)?\/v1\/token/);
242
+ const isSignInRequest = !!url.pathname.match(
243
+ /^(\/identitytoolkit\.googleapis\.com)?\/v1\/accounts:signInWith/
244
+ );
245
+ if (!isTokenRequest && !isSignInRequest)
246
+ throw new Error("Could not determine the request type to proxy");
247
+ if (isTokenRequest) {
248
+ body = await request.text();
249
+ const bodyParams = new URLSearchParams(body.trim());
250
+ if (bodyParams.has("refresh_token")) {
251
+ const refreshToken2 = request.cookies.get(REFRESH_TOKEN_COOKIE.name)?.value;
252
+ if (refreshToken2) {
253
+ bodyParams.set("refresh_token", refreshToken2);
254
+ body = bodyParams.toString();
255
+ }
256
+ }
257
+ }
258
+ const response = await fetch(url, { method, body, headers });
259
+ const json = await response.json();
260
+ if (!response.ok) {
261
+ return NextResponse.json(json, { status: response.status, statusText: response.statusText });
262
+ }
263
+ let refreshToken, idToken, maxAge;
264
+ if (isSignInRequest) {
265
+ refreshToken = json.refreshToken;
266
+ idToken = json.idToken;
267
+ maxAge = json.expiresIn;
268
+ json.refreshToken = "REDACTED";
269
+ } else {
270
+ refreshToken = json.refresh_token;
271
+ idToken = json.id_token;
272
+ maxAge = json.expires_in;
273
+ json.refresh_token = "REDACTED";
274
+ }
275
+ const nextResponse = NextResponse.json(json);
276
+ if (idToken) nextResponse.cookies.set({ ...ID_TOKEN_COOKIE, maxAge, value: idToken });
277
+ if (refreshToken) nextResponse.cookies.set({ ...REFRESH_TOKEN_COOKIE, value: refreshToken });
278
+ return nextResponse;
279
+ }
280
+ return null;
281
+ };
282
+ export {
283
+ redirectAdapter,
284
+ ternSecureMiddleware
285
+ };
286
+ //# sourceMappingURL=ternSecureEdgeMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/ternSecureEdgeMiddleware.ts"],"sourcesContent":["import type {\r\n AuthObject,\r\n RequestOptions,\r\n TernSecureRequest,\r\n} from '@tern-secure/backend';\r\nimport {\r\n constants,\r\n createBackendInstanceClient,\r\n createTernSecureRequest,\r\n enableDebugLogging,\r\n} from '@tern-secure/backend';\r\nimport type {\r\n TernSecureConfig,\r\n} from '@tern-secure/types';\r\nimport { notFound as nextjsNotFound } from 'next/navigation';\r\nimport type { NextMiddleware,NextRequest } from 'next/server';\r\nimport { NextResponse } from 'next/server';\r\n\r\nimport { isRedirect, setHeader } from '../utils/response';\r\nimport { serverRedirectWithAuth } from '../utils/serverRedirectAuth';\r\nimport { createEdgeCompatibleLogger } from '../utils/withLogger';\r\nimport { API_URL, API_VERSION,SIGN_IN_URL, SIGN_UP_URL } from './constant';\r\nimport {\r\n isNextjsNotFoundError,\r\n isNextjsRedirectError,\r\n isRedirectToSignInError,\r\n isRedirectToSignUpError,\r\n nextjsRedirectError,\r\n redirectToSignInError,\r\n redirectToSignUpError,\r\n} from './nextErrors';\r\nimport { type AuthProtect,createProtect } from './protect';\r\nimport { createRedirect, type RedirectFun } from './redirect';\r\nimport type {\r\n NextMiddlewareEvtParam,\r\n NextMiddlewareRequestParam,\r\n NextMiddlewareReturn,\r\n} from './types';\r\nimport { decorateRequest } from './utils';\r\n\r\nexport type MiddlewareAuthObject = AuthObject & {\r\n redirectToSignIn: RedirectFun<Response>;\r\n redirectToSignUp: RedirectFun<Response>;\r\n};\r\n\r\nexport interface MiddlewareAuth {\r\n (): Promise<MiddlewareAuthObject>;\r\n\r\n protect: AuthProtect;\r\n}\r\n\r\ntype MiddlewareHandler = (\r\n auth: MiddlewareAuth,\r\n request: NextMiddlewareRequestParam,\r\n event: NextMiddlewareEvtParam,\r\n) => NextMiddlewareReturn;\r\n\r\nexport interface MiddlewareOptions extends RequestOptions {\r\n debug?: boolean;\r\n firebaseOptions?: TernSecureConfig;\r\n}\r\ntype MiddlewareOptionsCallback = (\r\n req: NextRequest,\r\n) => MiddlewareOptions | Promise<MiddlewareOptions>;\r\n\r\ninterface TernSecureMiddleware {\r\n /**\r\n * @example\r\n * export default ternSecureMiddleware((auth, request, event) => { ... }, options);\r\n */\r\n (handler: MiddlewareHandler, options?: MiddlewareOptions): NextMiddleware;\r\n\r\n /**\r\n * @example\r\n * export default ternSecureMiddleware((auth, request, event) => { ... }, (req) => options);\r\n */\r\n (handler: MiddlewareHandler, options?: MiddlewareOptionsCallback): NextMiddleware;\r\n\r\n /**\r\n * @example\r\n * export default ternSecureMiddleware(options);\r\n */\r\n (options?: MiddlewareOptions): NextMiddleware;\r\n /**\r\n * @example\r\n * export default ternSecureMiddleware;\r\n */\r\n (request: NextMiddlewareRequestParam, event: NextMiddlewareEvtParam): NextMiddlewareReturn;\r\n}\r\n\r\nconst backendClientDefaultOptions = {\r\n apiUrl: API_URL,\r\n apiVersion: API_VERSION,\r\n};\r\n\r\nconst ternSecureBackendClient = async () => {\r\n return createBackendClientWithOptions({});\r\n};\r\n\r\nconst createBackendClientWithOptions: typeof createBackendInstanceClient = options => {\r\n return createBackendInstanceClient({\r\n ...backendClientDefaultOptions,\r\n ...options,\r\n });\r\n};\r\n\r\nexport const ternSecureMiddleware = ((\r\n ...args: unknown[]\r\n): NextMiddleware | NextMiddlewareReturn => {\r\n const [request, event] = parseRequestAndEvent(args);\r\n const [handler, params] = parseHandlerAndOptions(args);\r\n\r\n const middleware = () => {\r\n const withAuthNextMiddleware: NextMiddleware = async (request, event) => {\r\n const resolvedParams = typeof params === 'function' ? await params(request) : params;\r\n const signInUrl = resolvedParams.signInUrl || SIGN_IN_URL;\r\n const signUpUrl = resolvedParams.signUpUrl || SIGN_UP_URL;\r\n\r\n const options = {\r\n signInUrl,\r\n signUpUrl,\r\n ...resolvedParams,\r\n };\r\n\r\n const logger = createEdgeCompatibleLogger(options.debug);\r\n\r\n if (options.debug) {\r\n enableDebugLogging();\r\n }\r\n\r\n //const { authObject, headers: authHeaders } =\r\n // await authenticateMiddlewareRequest(request, checkRevoked, logger);\r\n\r\n //const reqBackend = await createBackendInstanceEdge(request, checkRevoked);\r\n const reqBackendClient = await ternSecureBackendClient();\r\n //const requestState = reqBackend.requestState;\r\n //const authObject = requestState.auth();\r\n //const authHeaders = requestState.headers;\r\n\r\n const ternSecureRequest = createTernSecureRequest(request);\r\n\r\n const requestStateClient = await reqBackendClient.authenticateRequest(\r\n ternSecureRequest,\r\n options,\r\n );\r\n\r\n const authObjectClient = requestStateClient.auth();\r\n\r\n const { redirectToSignIn } = createMiddlewareRedirects(ternSecureRequest);\r\n\r\n const { redirectToSignUp } = createMiddlewareRedirects(ternSecureRequest);\r\n\r\n const protect = await createMiddlewareProtect(\r\n ternSecureRequest,\r\n authObjectClient,\r\n redirectToSignIn,\r\n );\r\n\r\n const authObj: MiddlewareAuthObject = Object.assign(authObjectClient, {\r\n redirectToSignIn,\r\n redirectToSignUp,\r\n });\r\n\r\n const authHandler = () => Promise.resolve(authObj);\r\n authHandler.protect = protect;\r\n\r\n let handlerResult: Response = NextResponse.next();\r\n\r\n try {\r\n const userHandlerResult = await handler?.(authHandler, request, event);\r\n handlerResult = userHandlerResult || handlerResult;\r\n } catch (error: any) {\r\n handlerResult = handleControlError(error, ternSecureRequest, request);\r\n }\r\n\r\n if (requestStateClient.headers) {\r\n requestStateClient.headers.forEach((value, key) => {\r\n handlerResult.headers.append(key, value);\r\n });\r\n }\r\n\r\n if (isRedirect(handlerResult)) {\r\n return serverRedirectWithAuth(ternSecureRequest, handlerResult);\r\n }\r\n\r\n decorateRequest(ternSecureRequest, handlerResult, requestStateClient);\r\n return handlerResult;\r\n };\r\n\r\n const fireNextMiddleware: NextMiddleware = async (request) => {\r\n console.log('[TernSecureMiddleware] Firebase Request URL:', request.url);\r\n if (isFirebaseCookieRequest(request)) {\r\n const options = typeof params === 'function' ? await params(request) : params;\r\n rewriteFirebaseRequest(options, request);\r\n return handleFirebaseAuthRequest(request);\r\n }\r\n };\r\n\r\n const nextMiddleware: NextMiddleware = async (request, event) => {\r\n if (isFirebaseRequest(request)) {\r\n return fireNextMiddleware(request, event);\r\n }\r\n return withAuthNextMiddleware(request, event);\r\n };\r\n\r\n if (request && event) {\r\n return nextMiddleware(request, event);\r\n }\r\n\r\n return nextMiddleware;\r\n };\r\n return middleware();\r\n}) as TernSecureMiddleware;\r\n\r\nconst parseRequestAndEvent = (args: unknown[]) => {\r\n return [\r\n args[0] instanceof Request ? args[0] : undefined,\r\n args[0] instanceof Request ? args[1] : undefined,\r\n ] as [NextMiddlewareRequestParam | undefined, NextMiddlewareEvtParam | undefined];\r\n};\r\n\r\nconst parseHandlerAndOptions = (args: unknown[]) => {\r\n return [\r\n typeof args[0] === 'function' ? args[0] : undefined,\r\n (args.length === 2 ? args[1] : typeof args[0] === 'function' ? {} : args[0]) || {},\r\n ] as [MiddlewareHandler | undefined, MiddlewareOptions | MiddlewareOptionsCallback];\r\n};\r\n\r\nconst isFirebaseRequest = (request: NextMiddlewareRequestParam) =>\r\n request.nextUrl.pathname.startsWith('/__/');\r\n\r\nconst rewriteFirebaseRequest = (options: MiddlewareOptions, request: NextMiddlewareRequestParam) => {\r\n const newUrl = new URL(request.url);\r\n newUrl.host = options.firebaseOptions?.authDomain || '';\r\n newUrl.port = '';\r\n return NextResponse.rewrite(newUrl);\r\n}\r\n\r\nconst finalTarget = (request: NextMiddlewareRequestParam) => {\r\n const finalTargetUrl = request.nextUrl.searchParams.get('finalTarget');\r\n return finalTargetUrl ? new URL(finalTargetUrl, request.url) : undefined;\r\n};\r\n\r\nconst isFirebaseCookieRequest = (request: NextMiddlewareRequestParam) =>\r\n request.nextUrl.pathname === '/__cookies__';\r\n\r\n/**\r\n * Create middleware redirect functions\r\n */\r\nconst createMiddlewareRedirects = (ternSecureRequest: TernSecureRequest) => {\r\n const redirectToSignIn: MiddlewareAuthObject['redirectToSignIn'] = (opts = {}) => {\r\n const url = ternSecureRequest.ternUrl.toString();\r\n redirectToSignInError(url, opts.returnBackUrl);\r\n };\r\n\r\n const redirectToSignUp: MiddlewareAuthObject['redirectToSignUp'] = (opts = {}) => {\r\n const url = ternSecureRequest.ternUrl.toString();\r\n redirectToSignUpError(url, opts.returnBackUrl);\r\n };\r\n\r\n return { redirectToSignIn, redirectToSignUp };\r\n};\r\n\r\nconst createMiddlewareProtect = (\r\n ternSecureRequest: TernSecureRequest,\r\n authObject: AuthObject,\r\n redirectToSignIn: RedirectFun<Response>,\r\n) => {\r\n return (async (params: any, options: any) => {\r\n const notFound = () => nextjsNotFound();\r\n\r\n const redirect = (url: string) =>\r\n nextjsRedirectError(url, {\r\n redirectUrl: url,\r\n });\r\n\r\n return createProtect({\r\n request: ternSecureRequest,\r\n redirect,\r\n notFound,\r\n authObject,\r\n redirectToSignIn,\r\n })(params, options);\r\n }) as unknown as Promise<AuthProtect>;\r\n};\r\n\r\nexport const redirectAdapter = (url: string | URL) => {\r\n return NextResponse.redirect(url, {\r\n headers: { [constants.Headers.TernSecureRedirectTo]: 'true' },\r\n });\r\n};\r\n\r\n/**\r\n * Handle control flow errors in middleware\r\n */\r\nconst handleControlError = (\r\n error: any,\r\n ternSecureRequest: TernSecureRequest,\r\n nextrequest: NextRequest,\r\n): Response => {\r\n if (isNextjsNotFoundError(error)) {\r\n return setHeader(\r\n NextResponse.rewrite(new URL(`/tern_${Date.now()}`, nextrequest.url)),\r\n constants.Headers.AuthReason,\r\n 'protect-rewrite',\r\n );\r\n }\r\n\r\n const isRedirectToSignIn = isRedirectToSignInError(error);\r\n const isRedirectToSignUp = isRedirectToSignUpError(error);\r\n\r\n if (isRedirectToSignIn || isRedirectToSignUp) {\r\n const redirect = createRedirect({\r\n redirectAdapter,\r\n baseUrl: ternSecureRequest.ternUrl,\r\n signInUrl: SIGN_IN_URL,\r\n signUpUrl: SIGN_UP_URL,\r\n });\r\n\r\n const { returnBackUrl } = error;\r\n\r\n return redirect[isRedirectToSignIn ? 'redirectToSignIn' : 'redirectToSignUp']({\r\n returnBackUrl,\r\n });\r\n }\r\n\r\n if (isNextjsRedirectError(error)) {\r\n return redirectAdapter(error.redirectUrl);\r\n }\r\n\r\n throw error;\r\n};\r\n\r\nconst handleFirebaseAuthRequest = async (\r\n request: NextRequest,\r\n): Promise<NextResponse | null> => {\r\n\r\n console.log('Checking for __cookies__ path');\r\n\r\n const isDevMode = process.env.NODE_ENV === 'development';\r\n const ID_TOKEN_COOKIE_NAME = isDevMode ? `__dev_FIREBASE_[DEFAULT]` : `__HOST-FIREBASE_[DEFAULT]`;\r\n const REFRESH_TOKEN_COOKIE_NAME = isDevMode\r\n ? '__dev_FIREBASEID_[DEFAULT]'\r\n : `__HOST-FIREBASEID_[DEFAULT]`;\r\n const ID_TOKEN_COOKIE = {\r\n path: '/',\r\n secure: !isDevMode,\r\n sameSite: 'strict',\r\n partitioned: true,\r\n name: ID_TOKEN_COOKIE_NAME,\r\n maxAge: 34560000,\r\n priority: 'high',\r\n } as const;\r\n const REFRESH_TOKEN_COOKIE = {\r\n ...ID_TOKEN_COOKIE,\r\n httpOnly: true,\r\n name: REFRESH_TOKEN_COOKIE_NAME,\r\n } as const;\r\n\r\n if (request.nextUrl.pathname === '/__cookies__') {\r\n console.log('Handling /__cookies__ request');\r\n const method = request.method;\r\n if (method === 'DELETE') {\r\n const response = new NextResponse('');\r\n response.cookies.delete({ ...ID_TOKEN_COOKIE, maxAge: 0 });\r\n response.cookies.delete({ ...REFRESH_TOKEN_COOKIE, maxAge: 0 });\r\n return response;\r\n }\r\n\r\n const headers: Record<string, string> = {};\r\n const headerNames = [\r\n 'content-type',\r\n 'X-Firebase-Client',\r\n 'X-Firebase-gmpid',\r\n 'X-Firebase-AppCheck',\r\n 'X-Client-Version',\r\n ];\r\n\r\n headerNames.forEach(headerName => {\r\n const headerValue = request.headers.get(headerName);\r\n if (headerValue) {\r\n headers[headerName] = headerValue;\r\n }\r\n });\r\n\r\n const finalTargetParam = request.nextUrl.searchParams.get('finalTarget');\r\n\r\n const url = new URL(finalTargetParam || '');\r\n let body: ReadableStream<any> | string | null = request.body;\r\n\r\n const isTokenRequest = !!url.pathname.match(/^(\\/securetoken\\.googleapis\\.com)?\\/v1\\/token/);\r\n const isSignInRequest = !!url.pathname.match(\r\n /^(\\/identitytoolkit\\.googleapis\\.com)?\\/v1\\/accounts:signInWith/,\r\n );\r\n\r\n if (!isTokenRequest && !isSignInRequest)\r\n throw new Error('Could not determine the request type to proxy');\r\n\r\n if (isTokenRequest) {\r\n body = await request.text();\r\n const bodyParams = new URLSearchParams(body.trim());\r\n if (bodyParams.has('refresh_token')) {\r\n const refreshToken = request.cookies.get(REFRESH_TOKEN_COOKIE.name)?.value;\r\n if (refreshToken) {\r\n bodyParams.set('refresh_token', refreshToken);\r\n body = bodyParams.toString();\r\n }\r\n }\r\n }\r\n\r\n const response = await fetch(url, { method, body, headers });\r\n const json = await response.json();\r\n\r\n if (!response.ok) {\r\n return NextResponse.json(json, { status: response.status, statusText: response.statusText });\r\n }\r\n\r\n let refreshToken, idToken, maxAge;\r\n if (isSignInRequest) {\r\n refreshToken = json.refreshToken;\r\n idToken = json.idToken;\r\n maxAge = json.expiresIn;\r\n json.refreshToken = 'REDACTED';\r\n } else {\r\n refreshToken = json.refresh_token;\r\n idToken = json.id_token;\r\n maxAge = json.expires_in;\r\n json.refresh_token = 'REDACTED';\r\n }\r\n\r\n const nextResponse = NextResponse.json(json);\r\n if (idToken) nextResponse.cookies.set({ ...ID_TOKEN_COOKIE, maxAge, value: idToken });\r\n if (refreshToken) nextResponse.cookies.set({ ...REFRESH_TOKEN_COOKIE, value: refreshToken });\r\n return nextResponse;\r\n }\r\n return null;\r\n};\r\n"],"mappings":"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","names":["request","event","response","refreshToken"]}
@@ -0,0 +1,179 @@
1
+ import {
2
+ constants,
3
+ createFireClient,
4
+ createTernSecureRequest
5
+ } from "@tern-secure/backend";
6
+ import { notFound as nextjsNotFound } from "next/navigation";
7
+ import { NextResponse } from "next/server";
8
+ import { isRedirect, setHeader } from "../utils/response";
9
+ import { serverRedirectWithAuth } from "../utils/serverRedirectAuth";
10
+ import { API_URL, API_VERSION, SIGN_IN_URL, SIGN_UP_URL } from "./constant";
11
+ import {
12
+ isNextjsNotFoundError,
13
+ isNextjsRedirectError,
14
+ isRedirectToSignInError,
15
+ isRedirectToSignUpError,
16
+ nextjsRedirectError,
17
+ redirectToSignInError,
18
+ redirectToSignUpError
19
+ } from "./nextErrors";
20
+ import { createProtect } from "./protect";
21
+ import { createRedirect } from "./redirect";
22
+ import { decorateRequest } from "./utils";
23
+ const backendClientDefaultOptions = {
24
+ apiUrl: API_URL,
25
+ apiVersion: API_VERSION
26
+ };
27
+ const ternSecureFireClient = async () => {
28
+ return createFireClientWithOptions({});
29
+ };
30
+ const createFireClientWithOptions = (options) => {
31
+ return createFireClient({
32
+ ...backendClientDefaultOptions,
33
+ ...options
34
+ });
35
+ };
36
+ const ternSecureMiddleware = (...args) => {
37
+ const [request, event] = parseRequestAndEvent(args);
38
+ const [handler, params] = parseHandlerAndOptions(args);
39
+ const middleware = () => {
40
+ const runMiddleware = async (request2, event2) => {
41
+ const resolvedParams = typeof params === "function" ? await params(request2) : params;
42
+ const signInUrl = resolvedParams.signInUrl || SIGN_IN_URL;
43
+ const signUpUrl = resolvedParams.signUpUrl || SIGN_UP_URL;
44
+ const options = {
45
+ signInUrl,
46
+ signUpUrl,
47
+ ...resolvedParams
48
+ };
49
+ const reqBackendClient = await ternSecureFireClient();
50
+ const ternSecureRequest = createTernSecureRequest(request2);
51
+ const requestStateClient = await reqBackendClient.authenticateRequest(
52
+ ternSecureRequest,
53
+ options
54
+ );
55
+ const authObjectClient = requestStateClient.auth();
56
+ const { redirectToSignIn } = createMiddlewareRedirects(ternSecureRequest);
57
+ const { redirectToSignUp } = createMiddlewareRedirects(ternSecureRequest);
58
+ const protect = await createMiddlewareProtect(
59
+ ternSecureRequest,
60
+ authObjectClient,
61
+ redirectToSignIn
62
+ );
63
+ const authObj = Object.assign(authObjectClient, {
64
+ redirectToSignIn,
65
+ redirectToSignUp
66
+ });
67
+ const authHandler = () => Promise.resolve(authObj);
68
+ authHandler.protect = protect;
69
+ let handlerResult = NextResponse.next();
70
+ try {
71
+ const userHandlerResult = await handler?.(authHandler, request2, event2);
72
+ handlerResult = userHandlerResult || handlerResult;
73
+ } catch (error) {
74
+ handlerResult = handleControlError(error, ternSecureRequest, request2);
75
+ }
76
+ if (requestStateClient.headers) {
77
+ requestStateClient.headers.forEach((value, key) => {
78
+ handlerResult.headers.append(key, value);
79
+ });
80
+ }
81
+ if (isRedirect(handlerResult)) {
82
+ return serverRedirectWithAuth(ternSecureRequest, handlerResult);
83
+ }
84
+ decorateRequest(ternSecureRequest, handlerResult, requestStateClient);
85
+ return handlerResult;
86
+ };
87
+ const nextMiddleware = async (request2, event2) => {
88
+ console.log("[TernSecureMiddleware] Request URL:", request2.url);
89
+ console.log("[TernSecureMiddleware] Request pathname:", request2.nextUrl.pathname);
90
+ return runMiddleware(request2, event2);
91
+ };
92
+ if (request && event) {
93
+ return nextMiddleware(request, event);
94
+ }
95
+ return nextMiddleware;
96
+ };
97
+ return middleware();
98
+ };
99
+ const parseRequestAndEvent = (args) => {
100
+ return [
101
+ args[0] instanceof Request ? args[0] : void 0,
102
+ args[0] instanceof Request ? args[1] : void 0
103
+ ];
104
+ };
105
+ const parseHandlerAndOptions = (args) => {
106
+ return [
107
+ typeof args[0] === "function" ? args[0] : void 0,
108
+ (args.length === 2 ? args[1] : typeof args[0] === "function" ? {} : args[0]) || {}
109
+ ];
110
+ };
111
+ const isFirebaseRequest = (request) => request.nextUrl.pathname.startsWith("/__/");
112
+ const finalTarget = (request) => {
113
+ const finalTargetUrl = request.nextUrl.searchParams.get("finalTarget");
114
+ return finalTargetUrl ? new URL(finalTargetUrl, request.url) : void 0;
115
+ };
116
+ const isFirebaseCookieRequest = (request) => request.nextUrl.pathname === "/__cookies__";
117
+ const createMiddlewareRedirects = (ternSecureRequest) => {
118
+ const redirectToSignIn = (opts = {}) => {
119
+ const url = ternSecureRequest.ternUrl.toString();
120
+ redirectToSignInError(url, opts.returnBackUrl);
121
+ };
122
+ const redirectToSignUp = (opts = {}) => {
123
+ const url = ternSecureRequest.ternUrl.toString();
124
+ redirectToSignUpError(url, opts.returnBackUrl);
125
+ };
126
+ return { redirectToSignIn, redirectToSignUp };
127
+ };
128
+ const createMiddlewareProtect = (ternSecureRequest, authObject, redirectToSignIn) => {
129
+ return async (params, options) => {
130
+ const notFound = () => nextjsNotFound();
131
+ const redirect = (url) => nextjsRedirectError(url, {
132
+ redirectUrl: url
133
+ });
134
+ return createProtect({
135
+ request: ternSecureRequest,
136
+ redirect,
137
+ notFound,
138
+ authObject,
139
+ redirectToSignIn
140
+ })(params, options);
141
+ };
142
+ };
143
+ const redirectAdapter = (url) => {
144
+ return NextResponse.redirect(url, {
145
+ headers: { [constants.Headers.TernSecureRedirectTo]: "true" }
146
+ });
147
+ };
148
+ const handleControlError = (error, ternSecureRequest, nextrequest) => {
149
+ if (isNextjsNotFoundError(error)) {
150
+ return setHeader(
151
+ NextResponse.rewrite(new URL(`/tern_${Date.now()}`, nextrequest.url)),
152
+ constants.Headers.AuthReason,
153
+ "protect-rewrite"
154
+ );
155
+ }
156
+ const isRedirectToSignIn = isRedirectToSignInError(error);
157
+ const isRedirectToSignUp = isRedirectToSignUpError(error);
158
+ if (isRedirectToSignIn || isRedirectToSignUp) {
159
+ const redirect = createRedirect({
160
+ redirectAdapter,
161
+ baseUrl: ternSecureRequest.ternUrl,
162
+ signInUrl: SIGN_IN_URL,
163
+ signUpUrl: SIGN_UP_URL
164
+ });
165
+ const { returnBackUrl } = error;
166
+ return redirect[isRedirectToSignIn ? "redirectToSignIn" : "redirectToSignUp"]({
167
+ returnBackUrl
168
+ });
169
+ }
170
+ if (isNextjsRedirectError(error)) {
171
+ return redirectAdapter(error.redirectUrl);
172
+ }
173
+ throw error;
174
+ };
175
+ export {
176
+ redirectAdapter,
177
+ ternSecureMiddleware
178
+ };
179
+ //# sourceMappingURL=ternSecureFireMiddleware.js.map