diff --git a/src/components/pages/admin/services/service/(partials)/cluster-server-views.tsx b/src/components/pages/admin/services/service/(partials)/cluster-server-views.tsx index f690e94..c599d1c 100644 --- a/src/components/pages/admin/services/service/(partials)/cluster-server-views.tsx +++ b/src/components/pages/admin/services/service/(partials)/cluster-server-views.tsx @@ -104,7 +104,14 @@ export default function ServiceClusterServerViews({ data.server?.private_ip == server.private_ip ) { setTimeout(() => { - setTtyd(data.ttyd); + setTtyd( + data.ttyd + ? { + ...data.ttyd, + href: `${window.location.origin}${data.ttyd.url}`, + } + : undefined, + ); }, 2000); } @@ -114,7 +121,14 @@ export default function ServiceClusterServerViews({ data.server?.private_ip == server.private_ip ) { setTimeout(() => { - setTtyd(data.ttyd); + setTtyd( + data.ttyd + ? { + ...data.ttyd, + href: `${window.location.origin}${data.ttyd.url}`, + } + : undefined, + ); }, 2000); } diff --git a/src/data/app-data.ts b/src/data/app-data.ts index d3969fc..40d4be2 100644 --- a/src/data/app-data.ts +++ b/src/data/app-data.ts @@ -22,4 +22,6 @@ export const AppData = { CookieExpirationTime: 1000 * 60 * 60 * 24 * 7, // One Week DynamicPortStart: 4700, + WebPort: 3772, + WebsocketPort: 3773, } as const; diff --git a/src/functions/auth/login-user.ts b/src/functions/auth/login-user.ts index 0e9c35e..2560bf6 100644 --- a/src/functions/auth/login-user.ts +++ b/src/functions/auth/login-user.ts @@ -1,5 +1,5 @@ -import { NextApiResponse } from "next"; -import { ServerResponse } from "http"; +import { NextApiRequest, NextApiResponse } from "next"; +import { IncomingMessage, ServerResponse } from "http"; import NSQLite from "@moduletrace/nsqlite"; import { NSQLITE_TURBOCI_ADMIN_USERS, NSQLiteTables } from "../../db/types"; import { User } from "../../types"; @@ -12,6 +12,7 @@ import dayjs from "dayjs"; import grabCookieNames from "../../utils/grab-cookie-names"; type Params = { + req: NextApiRequest | IncomingMessage; res: NextApiResponse | ServerResponse; user_id?: string | number; password?: string; @@ -19,6 +20,7 @@ type Params = { }; export default async function loginUser({ + req, res, user_id, password, @@ -119,10 +121,10 @@ export default async function loginUser({ name: auth_key_cookie_name, value: encrypted_payload || "", options: { - secure: process.env.DOMAIN !== "localhost", + secure: req.headers.origin !== "localhost", path: "/", expires: expiration_date, - domain: process.env.DOMAIN, + domain: req.headers.origin, }, }, { @@ -131,7 +133,7 @@ export default async function loginUser({ options: { path: "/", expires: expiration_date, - domain: process.env.DOMAIN, + domain: req.headers.origin, }, }, ]); diff --git a/src/functions/auth/logout-user.ts b/src/functions/auth/logout-user.ts index ada047e..d21d7a5 100644 --- a/src/functions/auth/logout-user.ts +++ b/src/functions/auth/logout-user.ts @@ -1,15 +1,17 @@ -import { NextApiResponse } from "next"; -import { ServerResponse } from "http"; +import { NextApiRequest, NextApiResponse } from "next"; +import { IncomingMessage, ServerResponse } from "http"; import { deleteCookie } from "../../utils/cookies-actions"; import { APIResponseObject } from "@moduletrace/datasquirel/dist/package-shared/types"; import grabCookieNames from "../../utils/grab-cookie-names"; type Params = { res: NextApiResponse | ServerResponse; + req: NextApiRequest | IncomingMessage; }; export default async function logoutUser({ res, + req, }: Params): Promise { const { auth_key_cookie_name, csrf_cookie_name } = grabCookieNames(); @@ -18,14 +20,14 @@ export default async function logoutUser({ name: auth_key_cookie_name, options: { path: "/", - domain: process.env.DOMAIN, + domain: req.headers.origin, }, }, { name: csrf_cookie_name, options: { path: "/", - domain: process.env.DOMAIN, + domain: req.headers.origin, }, }, ]); diff --git a/src/functions/pages/admin/default-admin-props.ts b/src/functions/pages/admin/default-admin-props.ts index 3d79c9f..e4c7d9e 100644 --- a/src/functions/pages/admin/default-admin-props.ts +++ b/src/functions/pages/admin/default-admin-props.ts @@ -36,9 +36,6 @@ export default async function defaultAdminProps({ const deployment = grabTurboCiConfig(); const deployment_id = readFileSync(TURBOCI_DEPLOYMENT_ID_FILE, "utf-8"); - const host = process.env.HOST || null; - const ws_url = `${host?.replace(/^http/, "ws")}/ws`; - const service = query.service_name ? deployment.services.find( (srv) => srv.service_name == query.service_name, @@ -101,8 +98,6 @@ export default async function defaultAdminProps({ deployment_id, service, children_services, - ws_url, - host, }; let finalProps = _.merge(props, propsFnProps, defaultPageProps); diff --git a/src/functions/ttyd/grab-ttyd-service-info.ts b/src/functions/ttyd/grab-ttyd-service-info.ts index f4aa0ae..d0d5a90 100644 --- a/src/functions/ttyd/grab-ttyd-service-info.ts +++ b/src/functions/ttyd/grab-ttyd-service-info.ts @@ -48,7 +48,7 @@ export default async function grabTtydServerInfo({ const available_port = getNextAvailablePort(); - let url = `${process.env.HOST}/ttyd/${available_port}`; + let url = `/ttyd/${available_port}`; let cmd = ``; diff --git a/src/hooks/use-app-init.ts b/src/hooks/use-app-init.ts index 7654df8..c12a67c 100644 --- a/src/hooks/use-app-init.ts +++ b/src/hooks/use-app-init.ts @@ -6,8 +6,6 @@ import useWebSocketEventHandler from "@/twui/components/hooks/useWebSocketEventH import { date } from "zod"; export default function useAppInit(pageProps: PagePropsType) { - const wsURL = pageProps.ws_url || ""; - const { user } = pageProps; const [toast, setToast] = React.useState({ @@ -15,7 +13,7 @@ export default function useAppInit(pageProps: PagePropsType) { }); const { socket, sendData } = useWebSocket({ - url: wsURL, + url: "/ws", disableReconnect: false, keepAliveDuration: 5000, }); diff --git a/src/pages/api/admin/settings.ts b/src/pages/api/admin/settings.ts index 61d370b..f788357 100644 --- a/src/pages/api/admin/settings.ts +++ b/src/pages/api/admin/settings.ts @@ -51,7 +51,11 @@ export default async function handler( data: update, }); - const updated = await loginUser({ res, user_id: user.id }); + const updated = await loginUser({ + res, + user_id: user.id, + req, + }); return res.json(updated); } catch (error: any) { diff --git a/src/pages/api/auth/login.ts b/src/pages/api/auth/login.ts index 40cc820..c9e2eac 100644 --- a/src/pages/api/auth/login.ts +++ b/src/pages/api/auth/login.ts @@ -25,6 +25,7 @@ export default async function handler( res, email_or_username: email || username, password, + req, }); return res.json(logged_in_user); diff --git a/src/pages/api/auth/signup.ts b/src/pages/api/auth/signup.ts index 17ababa..e76c611 100644 --- a/src/pages/api/auth/signup.ts +++ b/src/pages/api/auth/signup.ts @@ -125,6 +125,7 @@ export default async function handler( const logged_in_user = await loginUser({ res, user_id: newly_inserted_user.id, + req, }); return res.json(logged_in_user); diff --git a/src/pages/auth/logout.tsx b/src/pages/auth/logout.tsx index 5c6c561..ed9b1bb 100644 --- a/src/pages/auth/logout.tsx +++ b/src/pages/auth/logout.tsx @@ -12,7 +12,10 @@ export default function LogoutPage() { } export const getServerSideProps: GetServerSideProps = async (ctx) => { - await logoutUser({ res: ctx.res }); + await logoutUser({ + res: ctx.res, + req: ctx.req, + }); return { redirect: { diff --git a/src/server/index.ts b/src/server/index.ts index 383862a..356f7ac 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,7 +1,8 @@ import { createServer } from "http"; import next from "next"; +import { AppData } from "../data/app-data"; -const port = parseInt(process.env.PORT || "3000", 10); +const port = AppData["WebPort"] || 3000; const dev = process.env.NODE_ENV !== "production"; const app = next({ dev }); const handle = app.getRequestHandler(); @@ -12,14 +13,6 @@ app.prepare().then(() => { return; } - const full_href = `${process.env.HOST}${req.url}`; - - const url = new URL(full_href); - - if (url.pathname.match(/^\/api\//)) { - return; - } - handle(req, res); }).listen(port); diff --git a/src/types/index.ts b/src/types/index.ts index 70ffb8d..b79a307 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -196,8 +196,6 @@ export type PagePropsType = { deployment_id?: string | null; service?: ParsedDeploymentServiceConfig | null; children_services?: ParsedDeploymentServiceConfig[] | null; - ws_url?: string | null; - host?: string | null; deployment_users?: NSQLITE_TURBOCI_ADMIN_USERS[] | null; deployment_user?: NSQLITE_TURBOCI_ADMIN_USERS | null; }; @@ -288,6 +286,7 @@ export type ToastType = { export type TtydInfoObject = { url: string; + href?: string; port: number; }; diff --git a/src/websocket/index.ts b/src/websocket/index.ts index a7f82ae..67a88b2 100644 --- a/src/websocket/index.ts +++ b/src/websocket/index.ts @@ -1,3 +1,4 @@ +import { AppData } from "../data/app-data"; import { WebSocketConnectedUserData, WebSocketData } from "../types"; import socketClose from "./socket-close"; import socketInit from "./socket-init"; @@ -43,7 +44,7 @@ const server = Bun.serve({ idleTimeout: 600, maxPayloadLength: 1024 * 1024 * 10, }, - port: process.env.WEB_SOCKET_PORT, + port: AppData["WebsocketPort"], }); console.log(`Websocket Listening on http://${server.hostname}:${server.port}`); diff --git a/test.env b/test.env index 47be0be..c6b5832 100644 --- a/test.env +++ b/test.env @@ -1,2 +1,8 @@ DSQL_ENCRYPTION_PASSWORD= -DSQL_ENCRYPTION_SALT= \ No newline at end of file +DSQL_ENCRYPTION_SALT= + +WEB_SOCKET_PORT=3773 +PORT=3772 +HOST=http://localhost:46079 + +DOMAIN=localhost \ No newline at end of file