@sylphx/sdk 0.12.2 → 0.13.8

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.
@@ -681,6 +681,33 @@ function authCookieJsonResponse(ctx, data) {
681
681
  setAuthCookiesMiddleware(response, ctx.namespace, data);
682
682
  return response;
683
683
  }
684
+ function sessionMetadataBody(sessionToken, user) {
685
+ const payload = decodeJwtPayload(sessionToken);
686
+ const userId = payload?.sub ?? user.id;
687
+ const expiresAt = typeof payload?.exp === "number" ? new Date(payload.exp * 1e3).toISOString() : new Date(Date.now() + SESSION_TOKEN_LIFETIME * 1e3).toISOString();
688
+ return {
689
+ success: true,
690
+ session: {
691
+ id: `platform:${userId}`,
692
+ userId,
693
+ expiresAt
694
+ },
695
+ user
696
+ };
697
+ }
698
+ function setRestoredSessionCookies(response, ctx, restored) {
699
+ setAuthCookiesMiddleware(response, ctx.namespace, restored.tokens);
700
+ if (restored.activeOrganization) {
701
+ setActiveOrganizationCookies(response, ctx, restored.activeOrganization);
702
+ }
703
+ }
704
+ async function refreshSessionFromCookie(request, ctx, previousSessionToken) {
705
+ const refreshToken = request.cookies.get(ctx.cookieNames.REFRESH)?.value;
706
+ if (!refreshToken) return null;
707
+ const refreshedTokens = await refreshTokens(refreshToken, ctx);
708
+ if (!refreshedTokens) return null;
709
+ return restoreOrganizationScopeAfterRefresh(request, ctx, refreshedTokens, previousSessionToken);
710
+ }
684
711
  function headersForProjectAuth(ctx) {
685
712
  return {
686
713
  "Content-Type": "application/json",
@@ -768,35 +795,28 @@ async function handleVerifyTwoFactor(request, ctx) {
768
795
  }
769
796
  return authCookieJsonResponse(ctx, data);
770
797
  }
771
- function handleSession(request, ctx) {
798
+ async function handleSession(request, ctx) {
772
799
  if (request.method !== "GET") {
773
800
  return NextResponse.json({ error: "Method not allowed" }, { status: 405 });
774
801
  }
775
802
  const sessionToken = request.cookies.get(ctx.cookieNames.SESSION)?.value;
776
- const userCookieValue = request.cookies.get(ctx.cookieNames.USER)?.value;
777
- let userCookie = userCookieValue ? parseUserCookie2(userCookieValue) : null;
778
- if (!userCookie && userCookieValue) {
779
- try {
780
- userCookie = parseUserCookie2(decodeURIComponent(userCookieValue));
781
- } catch {
782
- userCookie = null;
783
- }
803
+ const userCookie = parseUserCookie2(request.cookies.get(ctx.cookieNames.USER)?.value);
804
+ if (sessionToken && !isTokenExpired(sessionToken) && userCookie?.user) {
805
+ return NextResponse.json(sessionMetadataBody(sessionToken, userCookie.user));
806
+ }
807
+ const restored = await refreshSessionFromCookie(request, ctx, sessionToken);
808
+ if (restored) {
809
+ const response2 = NextResponse.json(
810
+ sessionMetadataBody(restored.tokens.accessToken, restored.tokens.user)
811
+ );
812
+ setRestoredSessionCookies(response2, ctx, restored);
813
+ return response2;
784
814
  }
785
- if (!sessionToken || isTokenExpired(sessionToken) || !userCookie?.user) {
786
- return NextResponse.json({ success: true, session: null, user: null });
815
+ const response = NextResponse.json({ success: true, session: null, user: null });
816
+ if (sessionToken || request.cookies.has(ctx.cookieNames.REFRESH) || userCookie) {
817
+ clearAuthCookiesMiddleware(response, ctx.namespace);
787
818
  }
788
- const payload = decodeJwtPayload(sessionToken);
789
- const userId = payload?.sub ?? userCookie.user.id;
790
- const expiresAt = typeof payload?.exp === "number" ? new Date(payload.exp * 1e3).toISOString() : new Date(userCookie.expiresAt).toISOString();
791
- return NextResponse.json({
792
- success: true,
793
- session: {
794
- id: `platform:${userId}`,
795
- userId,
796
- expiresAt
797
- },
798
- user: userCookie.user
799
- });
819
+ return response;
800
820
  }
801
821
  async function handleOAuthProviders(ctx) {
802
822
  const res = await fetch(`${ctx.platformUrl}/v1/auth/oauth-providers`, {
@@ -999,19 +1019,29 @@ async function handleSignOut(request, ctx) {
999
1019
  ctx.log("Signout complete");
1000
1020
  return response;
1001
1021
  }
1002
- function handleToken(request, ctx) {
1022
+ async function handleToken(request, ctx) {
1003
1023
  ctx.log("Token request");
1004
1024
  const sessionToken = request.cookies.get(ctx.cookieNames.SESSION)?.value;
1005
- if (!sessionToken) {
1006
- ctx.log("No session token");
1007
- return NextResponse.json({ error: "Not authenticated", accessToken: null }, { status: 401 });
1008
- }
1009
- if (isTokenExpired(sessionToken)) {
1010
- ctx.log("Session token expired");
1011
- return NextResponse.json({ error: "Session expired", accessToken: null }, { status: 401 });
1025
+ if (sessionToken && !isTokenExpired(sessionToken)) {
1026
+ ctx.log("Token returned");
1027
+ return NextResponse.json({ accessToken: sessionToken });
1028
+ }
1029
+ const restored = await refreshSessionFromCookie(request, ctx, sessionToken);
1030
+ if (restored) {
1031
+ ctx.log("Token refreshed and returned");
1032
+ const response2 = NextResponse.json({ accessToken: restored.tokens.accessToken });
1033
+ setRestoredSessionCookies(response2, ctx, restored);
1034
+ return response2;
1035
+ }
1036
+ ctx.log(sessionToken ? "Session token expired" : "No session token");
1037
+ const response = NextResponse.json(
1038
+ { error: sessionToken ? "Session expired" : "Not authenticated", accessToken: null },
1039
+ { status: 401 }
1040
+ );
1041
+ if (sessionToken || request.cookies.has(ctx.cookieNames.REFRESH)) {
1042
+ clearAuthCookiesMiddleware(response, ctx.namespace);
1012
1043
  }
1013
- ctx.log("Token returned");
1014
- return NextResponse.json({ accessToken: sessionToken });
1044
+ return response;
1015
1045
  }
1016
1046
  function resolveOrgScopedTokenExpiresIn(data) {
1017
1047
  if (typeof data.expiresIn === "number") return data.expiresIn;